From 1131c9b50a6a4c0868d0d6fa5e0be077cf8fd1ca Mon Sep 17 00:00:00 2001 From: Vadim Semenov Date: Fri, 22 Jul 2016 22:28:30 +0300 Subject: [PATCH] Fix handling of chunked-encoded requests with uppercase "Transfer-Encoding" value `HTTP1Connection._can_keep_alive` applied lower() to the header's value, but `_read_body` didn't. --- tornado/http1connection.py | 2 +- tornado/test/httpserver_test.py | 19 +++++++++++++++++++ 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/tornado/http1connection.py b/tornado/http1connection.py index d0e91b827..7ee831618 100644 --- a/tornado/http1connection.py +++ b/tornado/http1connection.py @@ -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) diff --git a/tornado/test/httpserver_test.py b/tornado/test/httpserver_test.py index 27052e696..4923152b7 100644 --- a/tornado/test/httpserver_test.py +++ b/tornado/test/httpserver_test.py @@ -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() -- 2.47.2