]> git.ipfire.org Git - thirdparty/tornado.git/commitdiff
Fix extra data sending at HEAD response with Transfer-Encoding: Chunked
authorBulat Khasanov <afti@yandex.ru>
Sun, 8 Sep 2019 03:14:52 +0000 (06:14 +0300)
committerBulat Khasanov <afti@yandex.ru>
Sun, 8 Sep 2019 13:31:34 +0000 (16:31 +0300)
tornado/http1connection.py
tornado/test/httpserver_test.py

index 9b40fd6539b7cd27a05166d97082a54a78672ef9..5fd37ab86130c3f51515d51c904e7ceaea064486 100644 (file)
@@ -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
index 4ad3ce7e09e8f7bdf8d1bd0d7f8a7afd87c80811..7a552d19cacf0bb9652380cbc46f81e2c54d7b6c 100644 (file)
@@ -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):