diff options
author | Chris McDonough <chrism@plope.com> | 2013-08-15 15:30:43 +0200 |
---|---|---|
committer | Chris McDonough <chrism@plope.com> | 2013-08-15 15:30:43 +0200 |
commit | 655591a473c245963665332dd7ebe875c2eca8d1 (patch) | |
tree | 8a76655e4555daeb42ba755384cf814f89c60c6e | |
parent | ed50366801030f83f78c157059c9ba5f4f81169f (diff) | |
download | waitress-655591a473c245963665332dd7ebe875c2eca8d1.tar.gz |
half-fix for #4; make the http version of the response match the http version of the request when the server catches an exception
-rw-r--r-- | CHANGES.txt | 6 | ||||
-rw-r--r-- | waitress/channel.py | 2 | ||||
-rw-r--r-- | waitress/tests/test_functional.py | 39 |
3 files changed, 43 insertions, 4 deletions
diff --git a/CHANGES.txt b/CHANGES.txt index 747364e..00c7491 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -1,3 +1,9 @@ +Next release +------------ + +- The HTTP version of the response returned by waitress when it catches an + exception will now match the HTTP request version. + 0.8.6 (2013-08-12) ------------------ diff --git a/waitress/channel.py b/waitress/channel.py index 08fde9f..2d5549f 100644 --- a/waitress/channel.py +++ b/waitress/channel.py @@ -339,8 +339,10 @@ class HTTPChannel(logging_dispatcher, object): else: body = ('The server encountered an unexpected ' 'internal server error') + req_version = request.version request = self.parser_class(self.adj) request.error = InternalServerError(body) + request.version = req_version task = self.error_task_class(self, request) task.service() # must not fail else: diff --git a/waitress/tests/test_functional.py b/waitress/tests/test_functional.py index 4a29d10..c2c45b2 100644 --- a/waitress/tests/test_functional.py +++ b/waitress/tests/test_functional.py @@ -977,8 +977,8 @@ class InternalServerErrorTests(object): def tearDown(self): self.stop_subprocess() - def test_before_start_response(self): - to_send = "GET /before_start_response HTTP/1.1\n\n" + def test_before_start_response_http_10(self): + to_send = "GET /before_start_response HTTP/1.0\n\n" to_send = tobytes(to_send) self.connect() self.sock.send(to_send) @@ -992,8 +992,23 @@ class InternalServerErrorTests(object): self.send_check_error(to_send) self.assertRaises(ConnectionClosed, read_http, fp) - def test_after_start_response(self): - to_send = "GET /after_start_response HTTP/1.1\n\n" + def test_before_start_response_http_11(self): + to_send = "GET /before_start_response HTTP/1.1\n\n" + to_send = tobytes(to_send) + self.connect() + self.sock.send(to_send) + fp = self.sock.makefile('rb', 0) + line, headers, response_body = read_http(fp) + self.assertline(line, '500', 'Internal Server Error', 'HTTP/1.1') + cl = int(headers['content-length']) + self.assertEqual(cl, len(response_body)) + self.assertTrue(response_body.startswith(b'Internal Server Error')) + # connection has been closed + self.send_check_error(to_send) + self.assertRaises(ConnectionClosed, read_http, fp) + + def test_after_start_response_http10(self): + to_send = "GET /after_start_response HTTP/1.0\n\n" to_send = tobytes(to_send) self.connect() self.sock.send(to_send) @@ -1006,6 +1021,22 @@ class InternalServerErrorTests(object): # connection has been closed self.send_check_error(to_send) self.assertRaises(ConnectionClosed, read_http, fp) + + def test_after_start_response_http11(self): + to_send = "GET /after_start_response HTTP/1.1\n\n" + to_send = tobytes(to_send) + self.connect() + self.sock.send(to_send) + fp = self.sock.makefile('rb', 0) + line, headers, response_body = read_http(fp) + self.assertline(line, '500', 'Internal Server Error', 'HTTP/1.1') + cl = int(headers['content-length']) + self.assertEqual(cl, len(response_body)) + self.assertTrue(response_body.startswith(b'Internal Server Error')) + # connection has been closed + self.send_check_error(to_send) + self.assertRaises(ConnectionClosed, read_http, fp) + def test_after_write_cb(self): to_send = "GET /after_write_cb HTTP/1.1\n\n" |