From 85b9c2642b6b806c0d0c33e5418914893a5789f6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=AD=90=E4=BC=91?= Date: Thu, 16 Jul 2020 02:27:17 +0800 Subject: [PATCH] fix wsgi PATH_INFO encoding (#998) * fix wsgi PATH_INFO encoding * encode root_path * wsgi middleware: Add test for PATH_INFO & SCRIPT_NAME encoding Co-authored-by: Jamie Hewland --- starlette/middleware/wsgi.py | 4 ++-- tests/middleware/test_wsgi.py | 15 +++++++++++++++ 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/starlette/middleware/wsgi.py b/starlette/middleware/wsgi.py index fbc8411b..8f7d9271 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 20272609..c35fda42 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")