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.
- data/.document +1 -0
- data/.manifest +13 -0
- data/ChangeLog +783 -1
- data/DESIGN +0 -8
- data/Documentation/GNUmakefile +1 -1
- data/GIT-VERSION-FILE +1 -1
- data/GIT-VERSION-GEN +1 -1
- data/GNUmakefile +2 -2
- data/HACKING +11 -0
- data/KNOWN_ISSUES +2 -2
- data/LATEST +24 -24
- data/Links +53 -0
- data/NEWS +66 -0
- data/PHILOSOPHY +49 -49
- data/Sandbox +13 -4
- data/TODO +0 -2
- data/TUNING +31 -9
- data/bin/unicorn +2 -1
- data/bin/unicorn_rails +2 -1
- data/examples/big_app_gc.rb +2 -33
- data/examples/nginx.conf +17 -4
- data/ext/unicorn_http/ext_help.h +16 -0
- data/ext/unicorn_http/extconf.rb +1 -0
- data/ext/unicorn_http/global_variables.h +9 -3
- data/ext/unicorn_http/unicorn_http.c +357 -259
- data/ext/unicorn_http/unicorn_http.rl +148 -50
- data/lib/unicorn/configurator.rb +36 -8
- data/lib/unicorn/const.rb +5 -3
- data/lib/unicorn/http_request.rb +1 -3
- data/lib/unicorn/http_server.rb +82 -95
- data/lib/unicorn/oob_gc.rb +61 -50
- data/lib/unicorn/socket_helper.rb +23 -8
- data/lib/unicorn/worker.rb +45 -4
- data/lib/unicorn.rb +8 -6
- data/script/isolate_for_tests +4 -2
- data/t/broken-app.ru +12 -0
- data/t/heartbeat-timeout.ru +12 -0
- data/t/oob_gc.ru +21 -0
- data/t/oob_gc_path.ru +21 -0
- data/t/t0001-reload-bad-config.sh +1 -0
- data/t/t0002-parser-error.sh +64 -1
- data/t/t0004-heartbeat-timeout.sh +69 -0
- data/t/t0009-broken-app.sh +56 -0
- data/t/t0019-max_header_len.sh +49 -0
- data/t/t0020-at_exit-handler.sh +49 -0
- data/t/t9001-oob_gc.sh +47 -0
- data/t/t9002-oob_gc-path.sh +75 -0
- data/test/benchmark/stack.ru +8 -0
- data/test/unit/test_droplet.rb +28 -0
- data/test/unit/test_http_parser.rb +60 -4
- data/test/unit/test_http_parser_ng.rb +54 -0
- data/test/unit/test_response.rb +1 -1
- data/test/unit/test_server.rb +1 -1
- data/test/unit/test_signals.rb +1 -1
- data/test/unit/test_socket_helper.rb +8 -0
- data/test/unit/test_upload.rb +1 -1
- data/unicorn.gemspec +3 -2
- 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
|
data/test/unit/test_response.rb
CHANGED
data/test/unit/test_server.rb
CHANGED
data/test/unit/test_signals.rb
CHANGED
@@ -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
|
data/test/unit/test_upload.rb
CHANGED
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.
|
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.
|
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:
|
4
|
+
hash: 63
|
5
5
|
prerelease:
|
6
6
|
segments:
|
7
|
-
-
|
8
|
-
- 6
|
7
|
+
- 4
|
9
8
|
- 0
|
10
|
-
|
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-
|
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:
|
42
|
+
hash: 11
|
43
43
|
segments:
|
44
44
|
- 2
|
45
|
-
-
|
46
|
-
version: "2.
|
45
|
+
- 4
|
46
|
+
version: "2.4"
|
47
47
|
type: :runtime
|
48
48
|
version_requirements: *id002
|
49
49
|
- !ruby/object:Gem::Dependency
|
50
|
-
name:
|
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
|
-
|
63
|
-
|
60
|
+
- 6
|
61
|
+
version: "0.6"
|
62
|
+
type: :runtime
|
64
63
|
version_requirements: *id003
|
65
64
|
- !ruby/object:Gem::Dependency
|
66
|
-
name:
|
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: *
|
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.
|
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
|