diff --git a/ChangeLog b/ChangeLog index 4d75407f24..ce2e8ea5bc 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,12 @@ +Sun Dec 20 23:43:46 2009 NAKAMURA, Hiroshi + + * lib/net/http.rb (HTTPGenericRequest#send_request_with_body_stream): + increased encoding chunk size for POST request with body_stream + (1K -> 16K). patched by Brian Candler. #1284. + + * test/net/http/test_post_io.rb: added for the patch. It's good if a + patch comes with a test. + Sat Dec 19 09:31:25 2009 Marc-Andre Lafortune * lib/set.rb (initialize): Add check that argument is enumerable diff --git a/lib/net/http.rb b/lib/net/http.rb index 10ec95018a..5a794e6d9f 100644 --- a/lib/net/http.rb +++ b/lib/net/http.rb @@ -1467,6 +1467,8 @@ module Net #:nodoc: include HTTPHeader + BUFSIZE = 16*1024 + def initialize(m, reqbody, resbody, path, initheader = nil) @method = m @request_has_body = reqbody @@ -1552,12 +1554,12 @@ module Net #:nodoc: supply_default_content_type write_header sock, ver, path if chunked? - while s = f.read(1024) + while s = f.read(BUFSIZE) sock.write(sprintf("%x\r\n", s.length) << s << "\r\n") end sock.write "0\r\n\r\n" else - while s = f.read(1024) + while s = f.read(BUFSIZE) sock.write s end end diff --git a/test/net/http/test_post_io.rb b/test/net/http/test_post_io.rb new file mode 100644 index 0000000000..c4093f9347 --- /dev/null +++ b/test/net/http/test_post_io.rb @@ -0,0 +1,32 @@ +require 'test/unit' +require 'net/http' +require 'stringio' + +class HTTPPostIOTest < Test::Unit::TestCase + def test_post_io_chunk_size + t = nil + TCPServer.open("127.0.0.1", 0) {|serv| + _, port, _, _ = serv.addr + t = Thread.new { + begin + req = Net::HTTP::Post.new("/test.cgi") + req['Transfer-Encoding'] = 'chunked' + req.body_stream = StringIO.new("\0" * (16 * 1024 + 1)) + http = Net::HTTP.new("127.0.0.1", port) + res = http.start { |http| http.request(req) } + rescue EOFError, Errno::EPIPE + end + } + sock = serv.accept + begin + assert_match(/chunked/, sock.gets("\r\n\r\n")) + chunk_header = sock.gets.chomp + assert_equal(16 * 1024, chunk_header.to_i(16)) + ensure + sock.close + end + } + ensure + t.join if t + end +end