unicorn 3.6.0 → 4.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (58) hide show
  1. data/.document +1 -0
  2. data/.manifest +13 -0
  3. data/ChangeLog +783 -1
  4. data/DESIGN +0 -8
  5. data/Documentation/GNUmakefile +1 -1
  6. data/GIT-VERSION-FILE +1 -1
  7. data/GIT-VERSION-GEN +1 -1
  8. data/GNUmakefile +2 -2
  9. data/HACKING +11 -0
  10. data/KNOWN_ISSUES +2 -2
  11. data/LATEST +24 -24
  12. data/Links +53 -0
  13. data/NEWS +66 -0
  14. data/PHILOSOPHY +49 -49
  15. data/Sandbox +13 -4
  16. data/TODO +0 -2
  17. data/TUNING +31 -9
  18. data/bin/unicorn +2 -1
  19. data/bin/unicorn_rails +2 -1
  20. data/examples/big_app_gc.rb +2 -33
  21. data/examples/nginx.conf +17 -4
  22. data/ext/unicorn_http/ext_help.h +16 -0
  23. data/ext/unicorn_http/extconf.rb +1 -0
  24. data/ext/unicorn_http/global_variables.h +9 -3
  25. data/ext/unicorn_http/unicorn_http.c +357 -259
  26. data/ext/unicorn_http/unicorn_http.rl +148 -50
  27. data/lib/unicorn/configurator.rb +36 -8
  28. data/lib/unicorn/const.rb +5 -3
  29. data/lib/unicorn/http_request.rb +1 -3
  30. data/lib/unicorn/http_server.rb +82 -95
  31. data/lib/unicorn/oob_gc.rb +61 -50
  32. data/lib/unicorn/socket_helper.rb +23 -8
  33. data/lib/unicorn/worker.rb +45 -4
  34. data/lib/unicorn.rb +8 -6
  35. data/script/isolate_for_tests +4 -2
  36. data/t/broken-app.ru +12 -0
  37. data/t/heartbeat-timeout.ru +12 -0
  38. data/t/oob_gc.ru +21 -0
  39. data/t/oob_gc_path.ru +21 -0
  40. data/t/t0001-reload-bad-config.sh +1 -0
  41. data/t/t0002-parser-error.sh +64 -1
  42. data/t/t0004-heartbeat-timeout.sh +69 -0
  43. data/t/t0009-broken-app.sh +56 -0
  44. data/t/t0019-max_header_len.sh +49 -0
  45. data/t/t0020-at_exit-handler.sh +49 -0
  46. data/t/t9001-oob_gc.sh +47 -0
  47. data/t/t9002-oob_gc-path.sh +75 -0
  48. data/test/benchmark/stack.ru +8 -0
  49. data/test/unit/test_droplet.rb +28 -0
  50. data/test/unit/test_http_parser.rb +60 -4
  51. data/test/unit/test_http_parser_ng.rb +54 -0
  52. data/test/unit/test_response.rb +1 -1
  53. data/test/unit/test_server.rb +1 -1
  54. data/test/unit/test_signals.rb +1 -1
  55. data/test/unit/test_socket_helper.rb +8 -0
  56. data/test/unit/test_upload.rb +1 -1
  57. data/unicorn.gemspec +3 -2
  58. metadata +44 -16
@@ -237,6 +237,17 @@ class HttpParserNgTest < Test::Unit::TestCase
237
237
  assert @parser.keepalive?
238
238
  end
239
239
 
240
+ def test_chunked_empty
241
+ str = @parser.buf
242
+ req = @parser.env
243
+ str << "PUT / HTTP/1.1\r\ntransfer-Encoding: chunked\r\n\r\n"
244
+ assert_equal req, @parser.parse, "msg=#{str}"
245
+ assert_equal 0, str.size
246
+ tmp = ""
247
+ assert_equal str, @parser.filter_body(tmp, str << "0\r\n\r\n")
248
+ assert_equal "", tmp
249
+ end
250
+
240
251
  def test_two_chunks
241
252
  str = @parser.buf
242
253
  str << "PUT / HTTP/1.1\r\ntransfer-Encoding: chunked\r\n\r\n"
@@ -651,4 +662,47 @@ class HttpParserNgTest < Test::Unit::TestCase
651
662
  assert_equal expect, @parser.parse
652
663
  assert ! @parser.next?
653
664
  end
665
+
666
+ def test_chunk_only
667
+ tmp = ""
668
+ assert_equal @parser, @parser.dechunk!
669
+ assert_nil @parser.filter_body(tmp, "6\r\n")
670
+ assert_equal "", tmp
671
+ assert_nil @parser.filter_body(tmp, "abcdef")
672
+ assert_equal "abcdef", tmp
673
+ assert_nil @parser.filter_body(tmp, "\r\n")
674
+ assert_equal "", tmp
675
+ src = "0\r\n\r\n"
676
+ assert_equal src.object_id, @parser.filter_body(tmp, src).object_id
677
+ assert_equal "", tmp
678
+ end
679
+
680
+ def test_chunk_only_bad_align
681
+ tmp = ""
682
+ assert_equal @parser, @parser.dechunk!
683
+ assert_nil @parser.filter_body(tmp, "6\r\na")
684
+ assert_equal "a", tmp
685
+ assert_nil @parser.filter_body(tmp, "bcde")
686
+ assert_equal "bcde", tmp
687
+ assert_nil @parser.filter_body(tmp, "f\r")
688
+ assert_equal "f", tmp
689
+ src = "\n0\r\n\r\n"
690
+ assert_equal src.object_id, @parser.filter_body(tmp, src).object_id
691
+ assert_equal "", tmp
692
+ end
693
+
694
+ def test_chunk_only_reset_ok
695
+ tmp = ""
696
+ assert_equal @parser, @parser.dechunk!
697
+ src = "1\r\na\r\n0\r\n\r\n"
698
+ assert_nil @parser.filter_body(tmp, src)
699
+ assert_equal "a", tmp
700
+ assert_equal src.object_id, @parser.filter_body(tmp, src).object_id
701
+
702
+ assert_equal @parser, @parser.dechunk!
703
+ src = "0\r\n\r\n"
704
+ assert_equal src.object_id, @parser.filter_body(tmp, src).object_id
705
+ assert_equal "", tmp
706
+ assert_equal src, @parser.filter_body(tmp, src)
707
+ end
654
708
  end
@@ -15,7 +15,7 @@ class ResponseTest < Test::Unit::TestCase
15
15
  include Unicorn::HttpResponse
16
16
 
17
17
  def test_httpdate
18
- before = Time.now.to_i
18
+ before = Time.now.to_i - 1
19
19
  str = httpdate
20
20
  assert_kind_of(String, str)
21
21
  middle = Time.parse(str).to_i
@@ -39,7 +39,7 @@ class WebServerTest < Test::Unit::TestCase
39
39
  redirect_test_io do
40
40
  wait_workers_ready("test_stderr.#$$.log", 1)
41
41
  File.truncate("test_stderr.#$$.log", 0)
42
- @server.stop(true)
42
+ @server.stop(false)
43
43
  end
44
44
  reset_sig_handlers
45
45
  end
@@ -124,7 +124,7 @@ class SignalsTest < Test::Unit::TestCase
124
124
  assert diff > 1.0, "diff was #{diff.inspect}"
125
125
  assert diff < 60.0
126
126
  ensure
127
- Process.kill(:QUIT, pid) rescue nil
127
+ Process.kill(:TERM, pid) rescue nil
128
128
  end
129
129
 
130
130
  def test_response_write
@@ -12,6 +12,7 @@ class TestSocketHelper < Test::Unit::TestCase
12
12
  @log_tmp = Tempfile.new 'logger'
13
13
  @logger = Logger.new(@log_tmp.path)
14
14
  @test_addr = ENV['UNICORN_TEST_ADDR'] || '127.0.0.1'
15
+ @test6_addr = ENV['UNICORN_TEST6_ADDR'] || '::1'
15
16
  GC.disable
16
17
  end
17
18
 
@@ -177,4 +178,11 @@ class TestSocketHelper < Test::Unit::TestCase
177
178
  assert cur > 1
178
179
  end if defined?(TCP_DEFER_ACCEPT)
179
180
 
181
+ def test_ipv6only
182
+ port = unused_port "#@test6_addr"
183
+ sock = bind_listen "[#@test6_addr]:#{port}", :ipv6only => true
184
+ cur = sock.getsockopt(:IPPROTO_IPV6, :IPV6_V6ONLY).unpack('i')[0]
185
+ assert_equal 1, cur
186
+ rescue Errno::EAFNOSUPPORT
187
+ end if RUBY_VERSION >= "1.9.2"
180
188
  end
@@ -53,7 +53,7 @@ class UploadTest < Test::Unit::TestCase
53
53
  end
54
54
 
55
55
  def teardown
56
- redirect_test_io { @server.stop(true) } if @server
56
+ redirect_test_io { @server.stop(false) } if @server
57
57
  @random.close
58
58
  reset_sig_handlers
59
59
  end
data/unicorn.gemspec CHANGED
@@ -34,9 +34,10 @@ Gem::Specification.new do |s|
34
34
  # commented out. Nevertheless, upgrading to Rails 2.3.4 or later is
35
35
  # *strongly* recommended for security reasons.
36
36
  s.add_dependency(%q<rack>)
37
- s.add_dependency(%q<kgio>, '~> 2.3')
37
+ s.add_dependency(%q<kgio>, '~> 2.4')
38
+ s.add_dependency(%q<raindrops>, '~> 0.6')
38
39
 
39
- s.add_development_dependency('isolate', '~> 3.0.0')
40
+ s.add_development_dependency('isolate', '~> 3.1')
40
41
  s.add_development_dependency('wrongdoc', '~> 1.5')
41
42
 
42
43
  # s.licenses = %w(GPLv2 Ruby) # licenses= method is not in older RubyGems
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: unicorn
3
3
  version: !ruby/object:Gem::Version
4
- hash: 31
4
+ hash: 63
5
5
  prerelease:
6
6
  segments:
7
- - 3
8
- - 6
7
+ - 4
9
8
  - 0
10
- version: 3.6.0
9
+ - 0
10
+ version: 4.0.0
11
11
  platform: ruby
12
12
  authors:
13
13
  - Unicorn hackers
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2011-04-21 00:00:00 Z
18
+ date: 2011-06-27 00:00:00 Z
19
19
  dependencies:
20
20
  - !ruby/object:Gem::Dependency
21
21
  name: rack
@@ -39,15 +39,15 @@ dependencies:
39
39
  requirements:
40
40
  - - ~>
41
41
  - !ruby/object:Gem::Version
42
- hash: 5
42
+ hash: 11
43
43
  segments:
44
44
  - 2
45
- - 3
46
- version: "2.3"
45
+ - 4
46
+ version: "2.4"
47
47
  type: :runtime
48
48
  version_requirements: *id002
49
49
  - !ruby/object:Gem::Dependency
50
- name: isolate
50
+ name: raindrops
51
51
  prerelease: false
52
52
  requirement: &id003 !ruby/object:Gem::Requirement
53
53
  none: false
@@ -56,16 +56,30 @@ dependencies:
56
56
  - !ruby/object:Gem::Version
57
57
  hash: 7
58
58
  segments:
59
- - 3
60
- - 0
61
59
  - 0
62
- version: 3.0.0
63
- type: :development
60
+ - 6
61
+ version: "0.6"
62
+ type: :runtime
64
63
  version_requirements: *id003
65
64
  - !ruby/object:Gem::Dependency
66
- name: wrongdoc
65
+ name: isolate
67
66
  prerelease: false
68
67
  requirement: &id004 !ruby/object:Gem::Requirement
68
+ none: false
69
+ requirements:
70
+ - - ~>
71
+ - !ruby/object:Gem::Version
72
+ hash: 5
73
+ segments:
74
+ - 3
75
+ - 1
76
+ version: "3.1"
77
+ type: :development
78
+ version_requirements: *id004
79
+ - !ruby/object:Gem::Dependency
80
+ name: wrongdoc
81
+ prerelease: false
82
+ requirement: &id005 !ruby/object:Gem::Requirement
69
83
  none: false
70
84
  requirements:
71
85
  - - ~>
@@ -76,7 +90,7 @@ dependencies:
76
90
  - 5
77
91
  version: "1.5"
78
92
  type: :development
79
- version_requirements: *id004
93
+ version_requirements: *id005
80
94
  description: |-
81
95
  \Unicorn is an HTTP server for Rack applications designed to only serve
82
96
  fast clients on low-latency, high-bandwidth connections and take
@@ -126,6 +140,7 @@ extra_rdoc_files:
126
140
  - lib/unicorn/worker.rb
127
141
  - ISSUES
128
142
  - Sandbox
143
+ - Links
129
144
  files:
130
145
  - .CHANGELOG.old
131
146
  - .document
@@ -150,6 +165,7 @@ files:
150
165
  - KNOWN_ISSUES
151
166
  - LATEST
152
167
  - LICENSE
168
+ - Links
153
169
  - NEWS
154
170
  - PHILOSOPHY
155
171
  - README
@@ -211,8 +227,12 @@ files:
211
227
  - t/bin/sha1sum.rb
212
228
  - t/bin/unused_listen
213
229
  - t/bin/utee
230
+ - t/broken-app.ru
214
231
  - t/env.ru
232
+ - t/heartbeat-timeout.ru
215
233
  - t/my-tap-lib.sh
234
+ - t/oob_gc.ru
235
+ - t/oob_gc_path.ru
216
236
  - t/pid.ru
217
237
  - t/preread_input.ru
218
238
  - t/rack-input-tests.ru
@@ -252,12 +272,14 @@ files:
252
272
  - t/t0002-config-conflict.sh
253
273
  - t/t0002-parser-error.sh
254
274
  - t/t0003-working_directory.sh
275
+ - t/t0004-heartbeat-timeout.sh
255
276
  - t/t0004-working_directory_broken.sh
256
277
  - t/t0005-working_directory_app.rb.sh
257
278
  - t/t0006-reopen-logs.sh
258
279
  - t/t0006.ru
259
280
  - t/t0007-working_directory_no_embed_cli.sh
260
281
  - t/t0008-back_out_of_upgrade.sh
282
+ - t/t0009-broken-app.sh
261
283
  - t/t0009-winch_ttin.sh
262
284
  - t/t0010-reap-logging.sh
263
285
  - t/t0011-active-unix-socket.sh
@@ -270,6 +292,8 @@ files:
270
292
  - t/t0016-trust-x-forwarded-false.sh
271
293
  - t/t0017-trust-x-forwarded-true.sh
272
294
  - t/t0018-write-on-close.sh
295
+ - t/t0019-max_header_len.sh
296
+ - t/t0020-at_exit-handler.sh
273
297
  - t/t0100-rack-input-tests.sh
274
298
  - t/t0116-client_body_buffer_size.sh
275
299
  - t/t0116.ru
@@ -279,12 +303,15 @@ files:
279
303
  - t/t0303-rails3-alt-working_directory_config.ru.sh
280
304
  - t/t0304-rails3-alt-working_directory_no_embed_cli.sh
281
305
  - t/t9000-preread-input.sh
306
+ - t/t9001-oob_gc.sh
307
+ - t/t9002-oob_gc-path.sh
282
308
  - t/test-lib.sh
283
309
  - t/test-rails3.sh
284
310
  - t/write-on-close.ru
285
311
  - test/aggregate.rb
286
312
  - test/benchmark/README
287
313
  - test/benchmark/dd.ru
314
+ - test/benchmark/stack.ru
288
315
  - test/exec/README
289
316
  - test/exec/test_exec.rb
290
317
  - test/rails/app-1.2.3/.gitignore
@@ -350,6 +377,7 @@ files:
350
377
  - test/rails/test_rails.rb
351
378
  - test/test_helper.rb
352
379
  - test/unit/test_configurator.rb
380
+ - test/unit/test_droplet.rb
353
381
  - test/unit/test_http_parser.rb
354
382
  - test/unit/test_http_parser_ng.rb
355
383
  - test/unit/test_http_parser_xftrust.rb
@@ -395,7 +423,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
395
423
  requirements: []
396
424
 
397
425
  rubyforge_project: mongrel
398
- rubygems_version: 1.7.2
426
+ rubygems_version: 1.8.5
399
427
  signing_key:
400
428
  specification_version: 3
401
429
  summary: Rack HTTP server for fast clients and Unix