]> git.ipfire.org Git - thirdparty/tornado.git/commitdiff
Fix handling of chunked-encoded requests with uppercase "Transfer-Encoding" value 1778/head
authorVadim Semenov <protoss.player@gmail.com>
Fri, 22 Jul 2016 19:28:30 +0000 (22:28 +0300)
committerVadim Semenov <protoss.player@gmail.com>
Fri, 22 Jul 2016 19:28:30 +0000 (22:28 +0300)
`HTTP1Connection._can_keep_alive` applied lower() to the header's value, but
`_read_body` didn't.

tornado/http1connection.py
tornado/test/httpserver_test.py

index d0e91b82766259b0c5c003dff523f8ffb3e90636..7ee83161825db731118f2685d70d010396d439db 100644 (file)
@@ -565,7 +565,7 @@ class HTTP1Connection(httputil.HTTPConnection):
 
         if content_length is not None:
             return self._read_fixed_body(content_length, delegate)
-        if headers.get("Transfer-Encoding") == "chunked":
+        if headers.get("Transfer-Encoding", "").lower() == "chunked":
             return self._read_chunked_body(delegate)
         if self.is_client:
             return self._read_body_until_close(delegate)
index 27052e696ba6f0fdac8a5c4b182a3738175fa049..4923152b747f2c1d158956d5165091ff21418110 100644 (file)
@@ -436,6 +436,25 @@ foo=
 bar
 0
 
+""".replace(b"\n", b"\r\n"))
+        read_stream_body(self.stream, self.stop)
+        headers, response = self.wait()
+        self.assertEqual(json_decode(response), {u'foo': [u'bar']})
+
+    def test_chunked_request_uppercase(self):
+        # As per RFC 2616 section 3.6, "Transfer-Encoding" header's value is
+        # case-insensitive.
+        self.stream.write(b"""\
+POST /echo HTTP/1.1
+Transfer-Encoding: Chunked
+Content-Type: application/x-www-form-urlencoded
+
+4
+foo=
+3
+bar
+0
+
 """.replace(b"\n", b"\r\n"))
         read_stream_body(self.stream, self.stop)
         headers, response = self.wait()