diff --git a/src/microdot.py b/src/microdot.py index ce11cf7..bb7bad3 100644 --- a/src/microdot.py +++ b/src/microdot.py @@ -310,7 +310,6 @@ class Request(): @staticmethod def _safe_readline(stream): line = stream.readline(Request.max_readline + 1) - print(line, Request.max_readline) if len(line) > Request.max_readline: raise ValueError('line too long') return line @@ -795,7 +794,11 @@ class Microdot(): else: stream = sock - req = Request.create(self, stream, addr) + req = None + try: + req = Request.create(self, stream, addr) + except Exception as exc: # pragma: no cover + print_exception(exc) if req: if req.content_length > req.max_content_length: if 413 in self.error_handlers: @@ -836,11 +839,13 @@ class Microdot(): 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) + else: + res = 'Bad request', 400 + 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() diff --git a/src/microdot_asyncio.py b/src/microdot_asyncio.py index 71035d4..7536078 100644 --- a/src/microdot_asyncio.py +++ b/src/microdot_asyncio.py @@ -218,8 +218,12 @@ class Microdot(BaseMicrodot): self.server.close() async def dispatch_request(self, reader, writer): - req = await Request.create(self, reader, - writer.get_extra_info('peername')) + req = None + try: + req = await Request.create(self, reader, + writer.get_extra_info('peername')) + except Exception as exc: # pragma: no cover + print_exception(exc) if req: if req.content_length > req.max_content_length: if 413 in self.error_handlers: @@ -266,11 +270,13 @@ class Microdot(BaseMicrodot): 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) + else: + res = 'Bad request', 400 + 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 and req: # pragma: no cover print('{method} {path} {status_code}'.format( diff --git a/tests/microdot/test_microdot.py b/tests/microdot/test_microdot.py index 27794db..a6a690e 100644 --- a/tests/microdot/test_microdot.py +++ b/tests/microdot/test_microdot.py @@ -73,7 +73,10 @@ class TestMicrodot(unittest.TestCase): mock_socket._requests.append(fd) self._add_shutdown(app) app.run() - assert fd.response == b'' + self.assertTrue(fd.response.startswith(b'HTTP/1.0 400 N/A\r\n')) + self.assertIn(b'Content-Length: 11\r\n', fd.response) + self.assertIn(b'Content-Type: text/plain\r\n', fd.response) + self.assertTrue(fd.response.endswith(b'\r\n\r\nBad request')) def test_method_decorators(self): app = Microdot() diff --git a/tests/microdot_asyncio/test_microdot_asyncio.py b/tests/microdot_asyncio/test_microdot_asyncio.py index 0aa3e56..28e14b6 100644 --- a/tests/microdot_asyncio/test_microdot_asyncio.py +++ b/tests/microdot_asyncio/test_microdot_asyncio.py @@ -84,7 +84,10 @@ class TestMicrodotAsync(unittest.TestCase): mock_socket._requests.append(fd) self._add_shutdown(app) app.run() - assert fd.response == b'' + self.assertTrue(fd.response.startswith(b'HTTP/1.0 400 N/A\r\n')) + self.assertIn(b'Content-Length: 11\r\n', fd.response) + self.assertIn(b'Content-Type: text/plain\r\n', fd.response) + self.assertTrue(fd.response.endswith(b'\r\n\r\nBad request')) def test_before_after_request(self): app = Microdot()