diff options
author | Alexander Lukanin <alexander.lukanin.13@gmail.com> | 2017-06-06 14:00:06 +0500 |
---|---|---|
committer | Alexander Lukanin <alexander.lukanin.13@gmail.com> | 2017-06-06 14:00:06 +0500 |
commit | bbf2634d558ad2c80878aa3265647af55469c8ce (patch) | |
tree | 904621fcd934da6a588e2aaa84fb54fc2da77dd4 | |
parent | c130bc20b4a04bc090ae127faeac169828baf771 (diff) | |
download | waitress-bbf2634d558ad2c80878aa3265647af55469c8ce.tar.gz |
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 | 17 |
2 files changed, 23 insertions, 2 deletions
diff --git a/waitress/task.py b/waitress/task.py index 4ce410c..1fcc192 100644 --- a/waitress/task.py +++ b/waitress/task.py @@ -231,8 +231,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 2a2759a..283d286 100644 --- a/waitress/tests/test_task.py +++ b/waitress/tests/test_task.py @@ -202,6 +202,23 @@ 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_via_added(self): inst = self._makeOne() inst.request = DummyParser() |