diff --git a/requirements-dev.txt b/requirements-dev.txt index 2da823dc..7c06ed28 100644 --- a/requirements-dev.txt +++ b/requirements-dev.txt @@ -1,5 +1,6 @@ aiofiles aiohttp==1.3.5 +chardet<=2.3.0 beautifulsoup4 coverage httptools diff --git a/sanic/__init__.py b/sanic/__init__.py index b67a3a6a..7bf0994a 100644 --- a/sanic/__init__.py +++ b/sanic/__init__.py @@ -1,6 +1,6 @@ from sanic.app import Sanic from sanic.blueprints import Blueprint -__version__ = '0.4.1' +__version__ = '0.5.0' __all__ = ['Sanic', 'Blueprint'] diff --git a/sanic/app.py b/sanic/app.py index 0567c97a..7b0d8a35 100644 --- a/sanic/app.py +++ b/sanic/app.py @@ -30,7 +30,7 @@ from sanic.websocket import WebSocketProtocol, ConnectionClosed class Sanic: def __init__(self, name=None, router=None, error_handler=None, - load_env=True, + load_env=True, request_class=None, log_config_path=os.path.join(lib_path[0], "default.conf")): conf = None if log_config_path and os.path.exists(log_config_path): @@ -55,6 +55,7 @@ class Sanic: self.name = name self.router = router or Router() + self.request_class = request_class self.error_handler = error_handler or ErrorHandler() self.config = Config(load_env=load_env) self.log_config_path = log_config_path @@ -694,6 +695,7 @@ class Sanic: server_settings = { 'protocol': protocol, + 'request_class': self.request_class, 'host': host, 'port': port, 'sock': sock, diff --git a/sanic/server.py b/sanic/server.py index 57f833ed..bdae20c4 100644 --- a/sanic/server.py +++ b/sanic/server.py @@ -65,6 +65,7 @@ class HttpProtocol(asyncio.Protocol): 'parser', 'request', 'url', 'headers', # request config 'request_handler', 'request_timeout', 'request_max_size', + 'request_class', # enable or disable access log / error log purpose 'has_log_file', # connection management @@ -72,7 +73,7 @@ class HttpProtocol(asyncio.Protocol): def __init__(self, *, loop, request_handler, error_handler, signal=Signal(), connections=set(), request_timeout=60, - request_max_size=None, has_log_file=True): + request_max_size=None, request_class=None, has_log_file=True): self.loop = loop self.transport = None self.request = None @@ -86,6 +87,7 @@ class HttpProtocol(asyncio.Protocol): self.error_handler = error_handler self.request_timeout = request_timeout self.request_max_size = request_max_size + self.request_class = request_class or Request self._total_request_size = 0 self._timeout_handler = None self._last_request_time = None @@ -155,7 +157,7 @@ class HttpProtocol(asyncio.Protocol): self.headers.append((name.decode().casefold(), value.decode())) def on_headers_complete(self): - self.request = Request( + self.request = self.request_class( url_bytes=self.url, headers=CIDict(self.headers), version=self.parser.get_http_version(), @@ -355,7 +357,7 @@ def serve(host, port, request_handler, error_handler, before_start=None, request_timeout=60, ssl=None, sock=None, request_max_size=None, reuse_port=False, loop=None, protocol=HttpProtocol, backlog=100, register_sys_signals=True, run_async=False, connections=None, - signal=Signal(), has_log_file=True): + signal=Signal(), request_class=None, has_log_file=True): """Start asynchronous HTTP Server on an individual process. :param host: Address to host on @@ -380,6 +382,7 @@ def serve(host, port, request_handler, error_handler, before_start=None, :param reuse_port: `True` for multiple workers :param loop: asyncio compatible event loop :param protocol: subclass of asyncio protocol class + :param request_class: Request class to use :param has_log_file: disable/enable access log and error log :return: Nothing """ @@ -402,6 +405,7 @@ def serve(host, port, request_handler, error_handler, before_start=None, error_handler=error_handler, request_timeout=request_timeout, request_max_size=request_max_size, + request_class=request_class, has_log_file=has_log_file ) diff --git a/sanic/testing.py b/sanic/testing.py index 1cad6a7b..787106a6 100644 --- a/sanic/testing.py +++ b/sanic/testing.py @@ -1,3 +1,5 @@ +import traceback + from sanic.log import log HOST = '127.0.0.1' @@ -50,6 +52,8 @@ class SanicTestClient: **request_kwargs) results[-1] = response except Exception as e: + log.error( + 'Exception:\n{}'.format(traceback.format_exc())) exceptions.append(e) self.app.stop()