From: Bulat Khasanov Date: Sun, 8 Sep 2019 03:14:52 +0000 (+0300) Subject: Fix extra data sending at HEAD response with Transfer-Encoding: Chunked X-Git-Tag: v6.1.0b1~56^2~1 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=9c927ffb85aa46194eca5776f67aff74c4b7aa71;p=thirdparty%2Ftornado.git Fix extra data sending at HEAD response with Transfer-Encoding: Chunked --- diff --git a/tornado/http1connection.py b/tornado/http1connection.py index 9b40fd653..5fd37ab86 100644 --- a/tornado/http1connection.py +++ b/tornado/http1connection.py @@ -511,7 +511,10 @@ class HTTP1Connection(httputil.HTTPConnection): % self._expected_content_remaining ) if self._chunking_output: - if not self.stream.closed(): + assert self._request_start_line + if not self.stream.closed() and ( + self.is_client or self._request_start_line.method != "HEAD" + ): self._pending_write = self.stream.write(b"0\r\n\r\n") self._pending_write.add_done_callback(self._on_write_complete) self._write_finished = True diff --git a/tornado/test/httpserver_test.py b/tornado/test/httpserver_test.py index 4ad3ce7e0..7a552d19c 100644 --- a/tornado/test/httpserver_test.py +++ b/tornado/test/httpserver_test.py @@ -770,6 +770,12 @@ class KeepAliveTest(AsyncHTTPTestCase): # be written out in chunks. self.write("".join(chr(i % 256) * 1024 for i in range(512))) + class TransferEncodingChunkedHandler(RequestHandler): + @gen.coroutine + def head(self): + self.write("Hello world") + yield self.flush() + class FinishOnCloseHandler(RequestHandler): def initialize(self, cleanup_event): self.cleanup_event = cleanup_event @@ -790,6 +796,7 @@ class KeepAliveTest(AsyncHTTPTestCase): [ ("/", HelloHandler), ("/large", LargeHandler), + ("/chunked", TransferEncodingChunkedHandler), ( "/finish_on_close", FinishOnCloseHandler, @@ -943,6 +950,16 @@ class KeepAliveTest(AsyncHTTPTestCase): self.assertEqual(self.headers["Connection"], "Keep-Alive") self.close() + @gen_test + def test_keepalive_chunked_head_no_body(self): + yield self.connect() + self.stream.write(b"HEAD /chunked HTTP/1.1\r\n\r\n") + yield self.read_headers() + + self.stream.write(b"HEAD /chunked HTTP/1.1\r\n\r\n") + yield self.read_headers() + self.close() + class GzipBaseTest(object): def get_app(self):