unicorn 3.3.0 → 3.3.1

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/GIT-VERSION-GEN CHANGED
@@ -1,7 +1,7 @@
1
1
  #!/bin/sh
2
2
 
3
3
  GVF=GIT-VERSION-FILE
4
- DEF_VER=v3.3.0.GIT
4
+ DEF_VER=v3.3.1.GIT
5
5
 
6
6
  LF='
7
7
  '
data/lib/unicorn/const.rb CHANGED
@@ -7,8 +7,8 @@
7
7
  # improve things much compared to constants.
8
8
  module Unicorn::Const
9
9
 
10
- # The current version of Unicorn, currently 3.3.0
11
- UNICORN_VERSION = "3.3.0"
10
+ # The current version of Unicorn, currently 3.3.1
11
+ UNICORN_VERSION = "3.3.1"
12
12
 
13
13
  # default TCP listen host address (0.0.0.0, all interfaces)
14
14
  DEFAULT_HOST = "0.0.0.0"
@@ -38,7 +38,6 @@ module Unicorn::HttpResponse
38
38
  end
39
39
 
40
40
  body.each { |chunk| socket.write(chunk) }
41
- socket.close # flushes and uncorks the socket immediately
42
41
  ensure
43
42
  body.respond_to?(:close) and body.close
44
43
  end
@@ -538,6 +538,7 @@ class Unicorn::HttpServer
538
538
  end
539
539
  @request.headers? or headers = nil
540
540
  http_response_write(client, status, headers, body)
541
+ client.close # flush and uncork socket immediately, no keepalive
541
542
  rescue => e
542
543
  handle_error(client, e)
543
544
  end
@@ -0,0 +1,23 @@
1
+ #!/bin/sh
2
+ . ./test-lib.sh
3
+ t_plan 4 "write-on-close tests for funky response-bodies"
4
+
5
+ t_begin "setup and start" && {
6
+ unicorn_setup
7
+ unicorn -D -c $unicorn_config write-on-close.ru
8
+ unicorn_wait_start
9
+ }
10
+
11
+ t_begin "write-on-close response body succeeds" && {
12
+ test xGoodbye = x"$(curl -sSf http://$listen/)"
13
+ }
14
+
15
+ t_begin "killing succeeds" && {
16
+ kill $unicorn_pid
17
+ }
18
+
19
+ t_begin "check stderr" && {
20
+ check_stderr
21
+ }
22
+
23
+ t_done
@@ -0,0 +1,11 @@
1
+ class WriteOnClose
2
+ def each(&block)
3
+ @callback = block
4
+ end
5
+
6
+ def close
7
+ @callback.call "7\r\nGoodbye\r\n0\r\n\r\n"
8
+ end
9
+ end
10
+ use Rack::ContentType, "text/plain"
11
+ run(lambda { |_| [ 200, [%w(Transfer-Encoding chunked)], WriteOnClose.new ] })
@@ -27,7 +27,7 @@ class ResponseTest < Test::Unit::TestCase
27
27
  def test_response_headers
28
28
  out = StringIO.new
29
29
  http_response_write(out, 200, {"X-Whatever" => "stuff"}, ["cool"])
30
- assert out.closed?
30
+ assert ! out.closed?
31
31
 
32
32
  assert out.length > 0, "output didn't have data"
33
33
  end
@@ -35,7 +35,7 @@ class ResponseTest < Test::Unit::TestCase
35
35
  def test_response_string_status
36
36
  out = StringIO.new
37
37
  http_response_write(out,'200', {}, [])
38
- assert out.closed?
38
+ assert ! out.closed?
39
39
  assert out.length > 0, "output didn't have data"
40
40
  assert_equal 1, out.string.split(/\r\n/).grep(/^Status: 200 OK/).size
41
41
  end
@@ -43,7 +43,7 @@ class ResponseTest < Test::Unit::TestCase
43
43
  def test_response_200
44
44
  io = StringIO.new
45
45
  http_response_write(io, 200, {}, [])
46
- assert io.closed?
46
+ assert ! io.closed?
47
47
  assert io.length > 0, "output didn't have data"
48
48
  end
49
49
 
@@ -51,7 +51,7 @@ class ResponseTest < Test::Unit::TestCase
51
51
  code = 400
52
52
  io = StringIO.new
53
53
  http_response_write(io, code, {}, [])
54
- assert io.closed?
54
+ assert ! io.closed?
55
55
  lines = io.string.split(/\r\n/)
56
56
  assert_match(/.* Bad Request$/, lines.first,
57
57
  "wrong default reason phrase")
@@ -60,7 +60,7 @@ class ResponseTest < Test::Unit::TestCase
60
60
  def test_rack_multivalue_headers
61
61
  out = StringIO.new
62
62
  http_response_write(out,200, {"X-Whatever" => "stuff\nbleh"}, [])
63
- assert out.closed?
63
+ assert ! out.closed?
64
64
  assert_match(/^X-Whatever: stuff\r\nX-Whatever: bleh\r\n/, out.string)
65
65
  end
66
66
 
@@ -69,7 +69,7 @@ class ResponseTest < Test::Unit::TestCase
69
69
  def test_status_header_added
70
70
  out = StringIO.new
71
71
  http_response_write(out,200, {"X-Whatever" => "stuff"}, [])
72
- assert out.closed?
72
+ assert ! out.closed?
73
73
  assert_equal 1, out.string.split(/\r\n/).grep(/^Status: 200 OK/i).size
74
74
  end
75
75
 
@@ -80,7 +80,7 @@ class ResponseTest < Test::Unit::TestCase
80
80
  out = StringIO.new
81
81
  header_hash = {"X-Whatever" => "stuff", 'StaTus' => "666" }
82
82
  http_response_write(out,200, header_hash, [])
83
- assert out.closed?
83
+ assert ! out.closed?
84
84
  assert_equal 1, out.string.split(/\r\n/).grep(/^Status: 200 OK/i).size
85
85
  assert_equal 1, out.string.split(/\r\n/).grep(/^Status:/i).size
86
86
  end
@@ -91,7 +91,7 @@ class ResponseTest < Test::Unit::TestCase
91
91
  body.rewind
92
92
  out = StringIO.new
93
93
  http_response_write(out,200, {}, body)
94
- assert out.closed?
94
+ assert ! out.closed?
95
95
  assert body.closed?
96
96
  assert_match(expect_body, out.string.split(/\r\n/).last)
97
97
  end
@@ -99,7 +99,7 @@ class ResponseTest < Test::Unit::TestCase
99
99
  def test_unknown_status_pass_through
100
100
  out = StringIO.new
101
101
  http_response_write(out,"666 I AM THE BEAST", {}, [] )
102
- assert out.closed?
102
+ assert ! out.closed?
103
103
  headers = out.string.split(/\r\n\r\n/).first.split(/\r\n/)
104
104
  assert %r{\AHTTP/\d\.\d 666 I AM THE BEAST\z}.match(headers[0])
105
105
  status = headers.grep(/\AStatus:/i).first
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: 11
4
+ hash: 9
5
5
  prerelease: false
6
6
  segments:
7
7
  - 3
8
8
  - 3
9
- - 0
10
- version: 3.3.0
9
+ - 1
10
+ version: 3.3.1
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-01-05 00:00:00 +00:00
18
+ date: 2011-01-07 00:00:00 +00:00
19
19
  default_executable:
20
20
  dependencies:
21
21
  - !ruby/object:Gem::Dependency
@@ -270,6 +270,7 @@ files:
270
270
  - t/t0015-configurator-internals.sh
271
271
  - t/t0016-trust-x-forwarded-false.sh
272
272
  - t/t0017-trust-x-forwarded-true.sh
273
+ - t/t0018-write-on-close.sh
273
274
  - t/t0100-rack-input-tests.sh
274
275
  - t/t0116-client_body_buffer_size.sh
275
276
  - t/t0116.ru
@@ -281,6 +282,7 @@ files:
281
282
  - t/t9000-preread-input.sh
282
283
  - t/test-lib.sh
283
284
  - t/test-rails3.sh
285
+ - t/write-on-close.ru
284
286
  - test/aggregate.rb
285
287
  - test/benchmark/README
286
288
  - test/benchmark/dd.ru