Accept responses with just a status code (Fixes #263)
This commit is contained in:
@@ -520,8 +520,10 @@ class Response:
|
||||
:param body: The body of the response. If a dictionary or list is given,
|
||||
a JSON formatter is used to generate the body. If a file-like
|
||||
object or an async generator is given, a streaming response is
|
||||
used. If a string is given, it is encoded from UTF-8. Else,
|
||||
the body should be a byte sequence.
|
||||
used. If a string is given, it is encoded from UTF-8. If an
|
||||
integer is given and ``status_code`` isn't given, then the
|
||||
status code is assigned and the body is kept empty. Else, the
|
||||
body should be a byte sequence.
|
||||
:param status_code: The numeric HTTP status code of the response. The
|
||||
default is 200.
|
||||
:param headers: A dictionary of headers to include in the response.
|
||||
@@ -554,11 +556,14 @@ class Response:
|
||||
#: written to the client. Used to exit WebSocket connections cleanly.
|
||||
already_handled = None
|
||||
|
||||
def __init__(self, body='', status_code=200, headers=None, reason=None):
|
||||
if body is None and status_code == 200:
|
||||
def __init__(self, body='', status_code=None, headers=None, reason=None):
|
||||
if body is None and status_code is None:
|
||||
body = ''
|
||||
status_code = 204
|
||||
self.status_code = status_code
|
||||
elif isinstance(body, int) and status_code is None:
|
||||
status_code = int(body)
|
||||
body = ''
|
||||
self.status_code = status_code or 200
|
||||
self.headers = NoCaseDict(headers or {})
|
||||
self.reason = reason
|
||||
if isinstance(body, (dict, list)):
|
||||
|
||||
@@ -109,6 +109,18 @@ class TestResponse(unittest.TestCase):
|
||||
fd.response)
|
||||
self.assertTrue(fd.response.endswith(b'\r\n\r\n[1, "2"]'))
|
||||
|
||||
def test_create_status_code(self):
|
||||
res = Response(202)
|
||||
self.assertEqual(res.status_code, 202)
|
||||
self.assertEqual(res.body, b'')
|
||||
fd = FakeStreamAsync()
|
||||
self._run(res.write(fd))
|
||||
self.assertIn(b'HTTP/1.0 202 N/A\r\n', fd.response)
|
||||
self.assertIn(b'Content-Length: 0\r\n', fd.response)
|
||||
self.assertIn(b'Content-Type: text/plain; charset=UTF-8\r\n',
|
||||
fd.response)
|
||||
self.assertTrue(fd.response.endswith(b'\r\n\r\n'))
|
||||
|
||||
def test_create_from_none(self):
|
||||
res = Response(None)
|
||||
self.assertEqual(res.status_code, 204)
|
||||
@@ -136,10 +148,10 @@ class TestResponse(unittest.TestCase):
|
||||
self.assertTrue(fd.response.endswith(b'\r\n\r\nfoobar'))
|
||||
|
||||
def test_create_from_other(self):
|
||||
res = Response(123)
|
||||
res = Response(23.7)
|
||||
self.assertEqual(res.status_code, 200)
|
||||
self.assertEqual(res.headers, {})
|
||||
self.assertEqual(res.body, 123)
|
||||
self.assertEqual(res.body, 23.7)
|
||||
|
||||
def test_create_with_status_code(self):
|
||||
res = Response('not found', 404)
|
||||
|
||||
Reference in New Issue
Block a user