diff --git a/sanic/response.py b/sanic/response.py index 6807d04c..f26254f5 100644 --- a/sanic/response.py +++ b/sanic/response.py @@ -1,21 +1,18 @@ import ujson -import httptools -from ujson import loads as json_loads -from urllib.parse import parse_qs STATUS_CODES = { - 200: 'OK', - 400: 'Bad Request', - 401: 'Unauthorized', - 402: 'Payment Required', - 403: 'Forbidden', - 404: 'Not Found', - 405: 'Method Not Allowed', - 500: 'Internal Server Error', - 501: 'Not Implemented', - 502: 'Bad Gateway', - 503: 'Service Unavailable', - 504: 'Gateway Timeout', + 200: b'OK', + 400: b'Bad Request', + 401: b'Unauthorized', + 402: b'Payment Required', + 403: b'Forbidden', + 404: b'Not Found', + 405: b'Method Not Allowed', + 500: b'Internal Server Error', + 501: b'Not Implemented', + 502: b'Bad Gateway', + 503: b'Service Unavailable', + 504: b'Gateway Timeout', } @@ -36,24 +33,24 @@ class HTTPResponse: def output(self, version="1.1", keep_alive=False, keep_alive_timeout=None): # This is all returned in a kind-of funky way # We tried to make this as fast as possible in pure python - additional_headers = [] - if keep_alive and not keep_alive_timeout is None: - additional_headers = [b'Keep-Alive: timeout=', str(keep_alive_timeout).encode(), b's\r\n'] + timeout_header = b'' + if keep_alive and keep_alive_timeout: + timeout_header = b'Keep-Alive: timeout=%d\r\n' % keep_alive_timeout + + headers = b'' if self.headers: - for name, value in self.headers.items(): - additional_headers.append('{}: {}\r\n'.format(name, value).encode('utf-8')) - - return b''.join([ - 'HTTP/{} {} {}\r\n'.format(version, self.status, - STATUS_CODES.get(self.status, 'FAIL')).encode(), - b'Content-Type: ', self.content_type.encode(), b'\r\n', - b'Content-Length: ', str(len(self.body)).encode(), b'\r\n', - b'Connection: ', ('keep-alive' if keep_alive else 'close').encode(), b'\r\n', - ] + additional_headers + [ - b'\r\n', - self.body, - ]) - + headers = b''.join(b'%b: %b\r\n' % (name.encode(), value.encode('utf-8')) for name, value in self.headers.items()) + return b'HTTP/%b %d %b\r\nContent-Type: %b\r\nContent-Length: %d\r\nConnection: %b\r\n%b%b\r\n%b' % ( + version.encode(), + self.status, + STATUS_CODES.get(self.status, b'FAIL'), + self.content_type.encode(), + len(self.body), + b'keep-alive' if keep_alive else b'close', + timeout_header, + headers, + self.body + ) def json(body, status=200, headers=None): return HTTPResponse(ujson.dumps(body), headers=headers, status=status,