diff options
author | Bert JW Regeer <xistence@0x58.com> | 2018-08-31 19:49:17 -0600 |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-08-31 19:49:17 -0600 |
commit | 45b1adc6534646c7fd0c7b59d903ffc9437f202b (patch) | |
tree | 31ccc885ddbe34b58356f43a9a84d64ddcd7a91f | |
parent | 14778962fafb44bdd1c2ce1a163d197225a6508a (diff) | |
parent | 72fc6d8e6417c34c2f86e9d9cc0ab954fbe36b51 (diff) | |
download | waitress-45b1adc6534646c7fd0c7b59d903ffc9437f202b.tar.gz |
Merge pull request #166 from alexanderlukanin13/http_204
MUST NOT send Transfer-Encoding or Content-Length for 1xx or 204
-rw-r--r-- | waitress/task.py | 8 | ||||
-rw-r--r-- | waitress/tests/test_task.py | 34 |
2 files changed, 40 insertions, 2 deletions
diff --git a/waitress/task.py b/waitress/task.py index 8b0856a..4cfd9f8 100644 --- a/waitress/task.py +++ b/waitress/task.py @@ -238,8 +238,12 @@ class Task(object): close_on_finish() if not content_length_header: - response_headers.append(('Transfer-Encoding', 'chunked')) - self.chunked_response = True + # RFC 7230: MUST NOT send Transfer-Encoding or Content-Length + # for any response with a status code of 1xx or 204. + if not (self.status.startswith('1') or + self.status.startswith('204')): + response_headers.append(('Transfer-Encoding', 'chunked')) + self.chunked_response = True if not self.close_on_finish: close_on_finish() diff --git a/waitress/tests/test_task.py b/waitress/tests/test_task.py index 2f6c842..15885eb 100644 --- a/waitress/tests/test_task.py +++ b/waitress/tests/test_task.py @@ -211,6 +211,40 @@ class TestTask(unittest.TestCase): self.assertEqual(inst.close_on_finish, True) self.assertTrue(('Connection', 'close') in inst.response_headers) + def test_build_response_header_v11_204_no_content_length_or_transfer_encoding(self): + # RFC 7230: MUST NOT send Transfer-Encoding or Content-Length + # for any response with a status code of 1xx or 204. + inst = self._makeOne() + inst.request = DummyParser() + inst.version = '1.1' + inst.status = '204 No Content' + result = inst.build_response_header() + lines = filter_lines(result) + self.assertEqual(len(lines), 4) + self.assertEqual(lines[0], b'HTTP/1.1 204 No Content') + self.assertEqual(lines[1], b'Connection: close') + self.assertTrue(lines[2].startswith(b'Date:')) + self.assertEqual(lines[3], b'Server: waitress') + self.assertEqual(inst.close_on_finish, True) + self.assertTrue(('Connection', 'close') in inst.response_headers) + + def test_build_response_header_v11_1xx_no_content_length_or_transfer_encoding(self): + # RFC 7230: MUST NOT send Transfer-Encoding or Content-Length + # for any response with a status code of 1xx or 204. + inst = self._makeOne() + inst.request = DummyParser() + inst.version = '1.1' + inst.status = '100 Continue' + result = inst.build_response_header() + lines = filter_lines(result) + self.assertEqual(len(lines), 4) + self.assertEqual(lines[0], b'HTTP/1.1 100 Continue') + self.assertEqual(lines[1], b'Connection: close') + self.assertTrue(lines[2].startswith(b'Date:')) + self.assertEqual(lines[3], b'Server: waitress') + self.assertEqual(inst.close_on_finish, True) + self.assertTrue(('Connection', 'close') in inst.response_headers) + def test_build_response_header_via_added(self): inst = self._makeOne() inst.request = DummyParser() |