summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChris McDonough <chrism@plope.com>2013-08-15 15:30:43 +0200
committerChris McDonough <chrism@plope.com>2013-08-15 15:30:43 +0200
commit655591a473c245963665332dd7ebe875c2eca8d1 (patch)
tree8a76655e4555daeb42ba755384cf814f89c60c6e
parented50366801030f83f78c157059c9ba5f4f81169f (diff)
downloadwaitress-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.txt6
-rw-r--r--waitress/channel.py2
-rw-r--r--waitress/tests/test_functional.py39
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"