diff --git a/lib/puma/client.rb b/lib/puma/client.rb index c395555c..199759c3 100644 --- a/lib/puma/client.rb +++ b/lib/puma/client.rb @@ -147,6 +147,7 @@ module Puma if @partial_part_left <= chunk.size @body << chunk[0..(@partial_part_left-3)] # skip the \r\n chunk = chunk[@partial_part_left..-1] + @partial_part_left = 0 else @body << chunk @partial_part_left -= chunk.size diff --git a/test/test_puma_server.rb b/test/test_puma_server.rb index 94292eed..fc169129 100644 --- a/test/test_puma_server.rb +++ b/test/test_puma_server.rb @@ -658,6 +658,38 @@ EOF assert_equal "hello", body end + def test_chunked_request_pause_between_cr_lf_after_size_of_second_chunk + body = nil + @server.app = proc { |env| + body = env['rack.input'].read + [200, {}, [""]] + } + + @server.add_tcp_listener @host, @port + @server.run + + part1 = 'a' * 4200 + + chunked_body = "#{part1.size.to_s(16)}\r\n#{part1}\r\n1\r\nb\r\n0\r\n\r\n" + + sock = TCPSocket.new @host, @server.connected_port + sock << "PUT /path HTTP/1.1\r\nConnection: close\r\nTransfer-Encoding: chunked\r\n\r\n" + + sleep 0.1 + + sock << chunked_body[0..-10] + + sleep 0.1 + + sock << chunked_body[-9..-1] + + data = sock.read + + assert_equal "HTTP/1.1 200 OK\r\nConnection: close\r\nContent-Length: 0\r\n\r\n", data + assert_equal (part1 + 'b'), body + end + + def test_chunked_request_header_case body = nil @server.app = proc { |env|