From 789411fba2d28133ac400cc28d3588f90205a3c6 Mon Sep 17 00:00:00 2001 From: Harm de Wit Date: Wed, 4 Jul 2018 21:41:23 +0200 Subject: [PATCH] Fix chunked ending check --- lib/puma/client.rb | 1 + test/test_puma_server.rb | 49 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 50 insertions(+) diff --git a/lib/puma/client.rb b/lib/puma/client.rb index c395555c..8253245a 100644 --- a/lib/puma/client.rb +++ b/lib/puma/client.rb @@ -168,6 +168,7 @@ module Puma if len == 0 @body.rewind rest = io.read + rest = rest[2..-1] if rest.start_with?("\r\n") @buffer = rest.empty? ? nil : rest @requests_served += 1 @ready = true diff --git a/test/test_puma_server.rb b/test/test_puma_server.rb index 94292eed..5168392f 100644 --- a/test/test_puma_server.rb +++ b/test/test_puma_server.rb @@ -677,6 +677,55 @@ EOF assert_equal "hello", body end + def test_chunked_keep_alive + body = nil + @server.app = proc { |env| + body = env['rack.input'].read + [200, {}, [""]] + } + + @server.add_tcp_listener @host, @port + @server.run + + sock = TCPSocket.new @host, @server.connected_port + sock << "GET / HTTP/1.1\r\nConnection: Keep-Alive\r\nTransfer-Encoding: chunked\r\n\r\n1\r\nh\r\n4\r\nello\r\n0\r\n\r\n" + + h = header(sock) + + assert_equal ["HTTP/1.1 200 OK", "Content-Length: 0"], h + assert_equal "hello", body + + sock.close + end + + def test_chunked_keep_alive_two_back_to_back + body = nil + @server.app = proc { |env| + body = env['rack.input'].read + [200, {}, [""]] + } + + @server.add_tcp_listener @host, @port + @server.run + + sock = TCPSocket.new @host, @server.connected_port + sock << "GET / HTTP/1.1\r\nConnection: Keep-Alive\r\nTransfer-Encoding: chunked\r\n\r\n1\r\nh\r\n4\r\nello\r\n0\r\n\r\n" + + h = header(sock) + assert_equal ["HTTP/1.1 200 OK", "Content-Length: 0"], h + assert_equal "hello", body + + sock << "GET / HTTP/1.1\r\nConnection: Keep-Alive\r\nTransfer-Encoding: chunked\r\n\r\n4\r\ngood\r\n3\r\nbye\r\n0\r\n\r\n" + sleep 0.1 + + h = header(sock) + + assert_equal ["HTTP/1.1 200 OK", "Content-Length: 0"], h + assert_equal "goodbye", body + + sock.close + end + def test_empty_header_values @server.app = proc { |env| [200, {"X-Empty-Header" => ""}, []] }