diff --git a/microdot-asyncio/microdot_asyncio.py b/microdot-asyncio/microdot_asyncio.py index 5a9fc5c..f9234c6 100644 --- a/microdot-asyncio/microdot_asyncio.py +++ b/microdot-asyncio/microdot_asyncio.py @@ -17,6 +17,8 @@ class Request(BaseRequest): async def create(stream, client_addr): # request line line = (await stream.readline()).strip().decode() + if not line: # pragma: no cover + return None method, url, http_version = line.split() http_version = http_version.split('/', 1)[1] @@ -103,48 +105,52 @@ class Microdot(BaseMicrodot): async def dispatch_request(self, reader, writer): req = await Request.create(reader, writer.get_extra_info('peername')) - f = self.find_route(req) - try: - res = None - if f: - for handler in self.before_request_handlers: - res = await self._invoke_handler(handler, req) - if res: - break - if res is None: - res = await self._invoke_handler(f, req, **req.url_args) - if isinstance(res, tuple): - res = Response(*res) - elif not isinstance(res, Response): - res = Response(res) - for handler in self.after_request_handlers: - res = await self._invoke_handler(handler, req, res) or res - elif 404 in self.error_handlers: - res = await self._invoke_handler(self.error_handlers[404], req) - else: - res = 'Not found', 404 - except Exception as exc: - print_exception(exc) - res = None - if exc.__class__ in self.error_handlers: - try: + if req: + f = self.find_route(req) + try: + res = None + if f: + for handler in self.before_request_handlers: + res = await self._invoke_handler(handler, req) + if res: + break + if res is None: + res = await self._invoke_handler( + f, req, **req.url_args) + if isinstance(res, tuple): + res = Response(*res) + elif not isinstance(res, Response): + res = Response(res) + for handler in self.after_request_handlers: + res = await self._invoke_handler( + handler, req, res) or res + elif 404 in self.error_handlers: res = await self._invoke_handler( - self.error_handlers[exc.__class__], req, exc) - except Exception as exc2: # pragma: no cover - print_exception(exc2) - if res is None: - if 500 in self.error_handlers: - res = await self._invoke_handler(self.error_handlers[500], - req) + self.error_handlers[404], req) else: - res = 'Internal server error', 500 - if isinstance(res, tuple): - res = Response(*res) - elif not isinstance(res, Response): - res = Response(res) - await res.write(writer) + res = 'Not found', 404 + except Exception as exc: + print_exception(exc) + res = None + if exc.__class__ in self.error_handlers: + try: + res = await self._invoke_handler( + self.error_handlers[exc.__class__], req, exc) + except Exception as exc2: # pragma: no cover + print_exception(exc2) + if res is None: + if 500 in self.error_handlers: + res = await self._invoke_handler( + self.error_handlers[500], req) + else: + res = 'Internal server error', 500 + if isinstance(res, tuple): + res = Response(*res) + elif not isinstance(res, Response): + res = Response(res) + await res.write(writer) await writer.aclose() - if self.debug: # pragma: no cover + if self.debug and req: # pragma: no cover print('{method} {path} {status_code}'.format( method=req.method, path=req.path, status_code=res.status_code)) diff --git a/microdot/microdot.py b/microdot/microdot.py index f8d61c2..61f2d3d 100644 --- a/microdot/microdot.py +++ b/microdot/microdot.py @@ -45,7 +45,7 @@ try: except ImportError: try: import socket - except ImportError: + except ImportError: # pragma: no cover socket = None @@ -102,6 +102,8 @@ class Request(): def create(client_stream, client_addr): # request line line = client_stream.readline().strip().decode() + if not line: # pragma: no cover + return None method, url, http_version = line.split() http_version = http_version.split('/', 1)[1] @@ -362,48 +364,49 @@ class Microdot(): stream = sock req = Request.create(stream, addr) - f = self.find_route(req) - try: - res = None - if f: - for handler in self.before_request_handlers: - res = handler(req) - if res: - break - if res is None: - res = f(req, **req.url_args) - if isinstance(res, tuple): - res = Response(*res) - elif not isinstance(res, Response): - res = Response(res) - for handler in self.after_request_handlers: - res = handler(req, res) or res - elif 404 in self.error_handlers: - res = self.error_handlers[404](req) - else: - res = 'Not found', 404 - except Exception as exc: - print_exception(exc) - res = None - if exc.__class__ in self.error_handlers: - try: - res = self.error_handlers[exc.__class__](req, exc) - except Exception as exc2: # pragma: no cover - print_exception(exc2) - if res is None: - if 500 in self.error_handlers: - res = self.error_handlers[500](req) + if req: + f = self.find_route(req) + try: + res = None + if f: + for handler in self.before_request_handlers: + res = handler(req) + if res: + break + if res is None: + res = f(req, **req.url_args) + if isinstance(res, tuple): + res = Response(*res) + elif not isinstance(res, Response): + res = Response(res) + for handler in self.after_request_handlers: + res = handler(req, res) or res + elif 404 in self.error_handlers: + res = self.error_handlers[404](req) else: - res = 'Internal server error', 500 - if isinstance(res, tuple): - res = Response(*res) - elif not isinstance(res, Response): - res = Response(res) - res.write(stream) + res = 'Not found', 404 + except Exception as exc: + print_exception(exc) + res = None + if exc.__class__ in self.error_handlers: + try: + res = self.error_handlers[exc.__class__](req, exc) + except Exception as exc2: # pragma: no cover + print_exception(exc2) + if res is None: + if 500 in self.error_handlers: + res = self.error_handlers[500](req) + else: + res = 'Internal server error', 500 + if isinstance(res, tuple): + res = Response(*res) + elif not isinstance(res, Response): + res = Response(res) + res.write(stream) stream.close() if stream != sock: # pragma: no cover sock.close() - if self.debug: # pragma: no cover + if self.debug and req: # pragma: no cover print('{method} {path} {status_code}'.format( method=req.method, path=req.path, status_code=res.status_code)) diff --git a/tox.ini b/tox.ini index be6c015..d771450 100644 --- a/tox.ini +++ b/tox.ini @@ -1,5 +1,5 @@ [tox] -envlist=flake8,py35,py36,py37,py38upy +envlist=flake8,py36,py37,py38,py39,upy skipsdist=True skip_missing_interpreters=True @@ -12,12 +12,12 @@ commands= coverage erase deps=coverage basepython= - flake8: python3.7 - py35: python3.5 + flake8: python3.8 py36: python3.6 py37: python3.7 py38: python3.8 - upy: python3.7 + py39: python3.9 + upy: python3.8 [testenv:flake8] deps=