diff --git a/starlette/middleware/wsgi.py b/starlette/middleware/wsgi.py index fbc8411bf..8f7d92711 100644 --- a/starlette/middleware/wsgi.py +++ b/starlette/middleware/wsgi.py @@ -13,8 +13,8 @@ def build_environ(scope: Scope, body: bytes) -> dict: """ environ = { "REQUEST_METHOD": scope["method"], - "SCRIPT_NAME": scope.get("root_path", ""), - "PATH_INFO": scope["path"], + "SCRIPT_NAME": scope.get("root_path", "").encode("utf8").decode("latin1"), + "PATH_INFO": scope["path"].encode("utf8").decode("latin1"), "QUERY_STRING": scope["query_string"].decode("ascii"), "SERVER_PROTOCOL": f"HTTP/{scope['http_version']}", "wsgi.version": (1, 0), diff --git a/tests/middleware/test_wsgi.py b/tests/middleware/test_wsgi.py index 202726097..c35fda426 100644 --- a/tests/middleware/test_wsgi.py +++ b/tests/middleware/test_wsgi.py @@ -128,3 +128,18 @@ def test_build_environ(): "wsgi.url_scheme": "https", "wsgi.version": (1, 0), } + + +def test_build_environ_encoding() -> None: + scope = { + "type": "http", + "http_version": "1.1", + "method": "GET", + "path": "/小星", + "root_path": "/中国", + "query_string": b"a=123&b=456", + "headers": [], + } + environ = build_environ(scope, b"") + assert environ["SCRIPT_NAME"] == "/中国".encode("utf8").decode("latin-1") + assert environ["PATH_INFO"] == "/小星".encode("utf8").decode("latin-1")