diff options
-rw-r--r-- | ChangeLog | 8 | ||||
-rw-r--r-- | lib/webrick/httpresponse.rb | 5 | ||||
-rw-r--r-- | test/webrick/test_httpserver.rb | 27 |
3 files changed, 40 insertions, 0 deletions
@@ -1,3 +1,11 @@ +Tue Jun 21 21:50:37 2011 Hiroshi Nakamura <nahi@ruby-lang.org> + + * lib/webrick/httpresponse.rb (HTTPResponse#setup_header): Close + HTTP/1.1 connection when returning an IO object as response body + without setting HTTPResponse#chunked to true. See #855 no.1. + + * test/webrick/test_httpserver.rb: Test it. + Tue Jun 21 21:27:34 2011 KOSAKI Motohiro <kosaki.motohiro@gmail.com> * internal.h: move rb_thread_io_blocking_region() declaration diff --git a/lib/webrick/httpresponse.rb b/lib/webrick/httpresponse.rb index b7c61a2b2f..0d36c0747e 100644 --- a/lib/webrick/httpresponse.rb +++ b/lib/webrick/httpresponse.rb @@ -204,6 +204,11 @@ module WEBrick elsif keep_alive? if chunked? || @header['content-length'] @header['connection'] = "Keep-Alive" + else + msg = "Could not determine content-length of response body. Set content-length of the response or set Response#chunked = true" + @logger.warn(msg) + @header['connection'] = "close" + @keep_alive = false end else @header['connection'] = "close" diff --git a/test/webrick/test_httpserver.rb b/test/webrick/test_httpserver.rb index b4bdd84045..526d72c381 100644 --- a/test/webrick/test_httpserver.rb +++ b/test/webrick/test_httpserver.rb @@ -258,6 +258,33 @@ class TestWEBrickHTTPServer < Test::Unit::TestCase assert_equal(stopped, 1) end + def test_response_io_without_chunked_set + config = { + :ServerName => "localhost" + } + TestWEBrick.start_httpserver(config){|server, addr, port, log| + server.mount_proc("/", lambda { |req, res| + r,w = IO.pipe + # Test for not setting chunked... + # res.chunked = true + res.body = r + w << "foo" + w.close + }) + Thread.pass while server.status != :Running + http = Net::HTTP.new(addr, port) + req = Net::HTTP::Get.new("/") + req['Connection'] = 'Keep-Alive' + begin + timeout(2) do + http.request(req){|res| assert_equal("foo", res.body) } + end + rescue Timeout::Error + flunk('corrupted reponse') + end + } + end + def test_request_handler_callback_is_deprecated requested = 0 config = { |