summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBert JW Regeer <xistence@0x58.com>2018-08-31 19:49:17 -0600
committerGitHub <noreply@github.com>2018-08-31 19:49:17 -0600
commit45b1adc6534646c7fd0c7b59d903ffc9437f202b (patch)
tree31ccc885ddbe34b58356f43a9a84d64ddcd7a91f
parent14778962fafb44bdd1c2ce1a163d197225a6508a (diff)
parent72fc6d8e6417c34c2f86e9d9cc0ab954fbe36b51 (diff)
downloadwaitress-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.py8
-rw-r--r--waitress/tests/test_task.py34
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()