From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on dcvr.yhbt.net X-Spam-Level: X-Spam-ASN: AS8972 85.25.103.0/24 X-Spam-Status: No, score=-1.5 required=3.0 tests=BAYES_00,RCVD_IN_MSPIKE_BL, RCVD_IN_MSPIKE_ZBI,RCVD_IN_XBL,SPF_FAIL,SPF_HELO_FAIL shortcircuit=no autolearn=no autolearn_force=no version=3.4.0 Received: from 80x24.org (atlantic850.dedicatedpanel.com [85.25.103.69]) by dcvr.yhbt.net (Postfix) with ESMTP id DF3611FCBE for ; Mon, 16 May 2016 01:12:47 +0000 (UTC) From: Eric Wong To: yahns-public@yhbt.net Subject: [PATCH] proxy_pass: do not chunk HTTP/1.0 with keep-alive Date: Mon, 16 May 2016 01:12:45 +0000 Message-Id: <20160516011245.30972-1-e@80x24.org> List-Id: Instead, we must drop non-terminated responses since HTTP/1.0 clients do not understand chunked encoding. This is necessary for "ab -k" which still uses HTTP/1.0. --- lib/yahns/proxy_http_response.rb | 8 ++++++-- test/test_proxy_pass.rb | 10 ++++++++++ 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/lib/yahns/proxy_http_response.rb b/lib/yahns/proxy_http_response.rb index c5e7be5..bd274fe 100644 --- a/lib/yahns/proxy_http_response.rb +++ b/lib/yahns/proxy_http_response.rb @@ -105,8 +105,12 @@ def proxy_response_start(res, tip, kcar, req_res) # chunk the response ourselves if the client supports it, # but the backend does not terminate properly - if alive && ! term && (env['HTTP_VERSION'] == 'HTTP/1.1'.freeze) - res << "Transfer-Encoding: chunked\r\n".freeze + if alive && ! term + if env['HTTP_VERSION'] == 'HTTP/1.1'.freeze + res << "Transfer-Encoding: chunked\r\n".freeze + else # we can't persist HTTP/1.0 and HTTP/0.9 w/o Content-Length + alive = false + end end res << (alive ? "Connection: keep-alive\r\n\r\n".freeze : "Connection: close\r\n\r\n".freeze) diff --git a/test/test_proxy_pass.rb b/test/test_proxy_pass.rb index c938976..5dd8058 100644 --- a/test/test_proxy_pass.rb +++ b/test/test_proxy_pass.rb @@ -572,6 +572,16 @@ def check_response_trailer(host, port) end def check_eof_body(host, port) + Timeout.timeout(30) do + s = TCPSocket.new(host, port) + s.write("GET /eof-body-fast HTTP/1.0\r\nConnection:keep-alive\r\n\r\n") + res = s.read + assert_match %r{\AHTTP/1\.[01] 200 OK\r\n}, res + assert_match %r{\r\nConnection: close\r\n}, res + assert_match %r{\r\n\r\neof-body-fast\z}, res + s.close + end + Timeout.timeout(60) do s = TCPSocket.new(host, port) s.write("GET /eof-body-fast HTTP/1.0\r\n\r\n")