diff --git a/tremolo/asgi_server.py b/tremolo/asgi_server.py index 8e86e03..63c03a3 100644 --- a/tremolo/asgi_server.py +++ b/tremolo/asgi_server.py @@ -3,7 +3,7 @@ import asyncio from http import HTTPStatus -from urllib.parse import unquote +from urllib.parse import unquote_to_bytes from .exceptions import ( InternalServerError, @@ -63,8 +63,9 @@ async def _handle_http(self): async def headers_received(self): self._scope = { 'asgi': {'version': '3.0'}, - 'http_version': self.request.version.decode('utf-8'), - 'path': unquote(self.request.path.decode('utf-8'), 'utf-8'), + 'http_version': self.request.version.decode('latin-1'), + 'path': unquote_to_bytes( + bytes(self.request.path)).decode('latin-1'), 'raw_path': self.request.path, 'query_string': self.request.query_string, 'root_path': self.options['_root_path'], diff --git a/tremolo/lib/http_protocol.py b/tremolo/lib/http_protocol.py index 8a82745..7d5c319 100644 --- a/tremolo/lib/http_protocol.py +++ b/tremolo/lib/http_protocol.py @@ -2,7 +2,7 @@ import asyncio -from urllib.parse import quote, unquote +from urllib.parse import quote_from_bytes, unquote_to_bytes from .h1parser import ParseHeader from .http_exception import ( @@ -181,8 +181,7 @@ async def handle_exception(self, exc): return self.print_exception( - exc, - quote(unquote(self.request.path.decode('latin-1'))) + exc, quote_from_bytes(unquote_to_bytes(bytes(self.request.path))) ) if isinstance(exc, WebSocketException):