diff --git a/CHANGES/3278.bugfix b/CHANGES/3278.bugfix new file mode 100644 index 00000000000..bbc6b53b9cc --- /dev/null +++ b/CHANGES/3278.bugfix @@ -0,0 +1 @@ +Keep the query string by `normalize_path_middleware`. diff --git a/aiohttp/web_middlewares.py b/aiohttp/web_middlewares.py index f762f5b8bf5..4e339acab85 100644 --- a/aiohttp/web_middlewares.py +++ b/aiohttp/web_middlewares.py @@ -91,7 +91,7 @@ async def impl(request, handler): resolves, request = await _check_request_resolves( request, path) if resolves: - raise redirect_class(request.raw_path) + raise redirect_class(request.raw_path + query) return await handler(request) diff --git a/tests/test_web_middleware.py b/tests/test_web_middleware.py index e107cc17b1b..3fac4755ffc 100644 --- a/tests/test_web_middleware.py +++ b/tests/test_web_middleware.py @@ -1,6 +1,7 @@ import re import pytest +from yarl import URL from aiohttp import web @@ -115,6 +116,7 @@ async def test_add_trailing_when_necessary( resp = await client.get(path) assert resp.status == status + assert resp.url.query == URL(path).query @pytest.mark.parametrize("path, status", [ ('/resource1', 200), @@ -136,6 +138,7 @@ async def test_remove_trailing_when_necessary(self, path, status, cli): resp = await client.get(path) assert resp.status == status + assert resp.url.query == URL(path).query @pytest.mark.parametrize("path, status", [ ('/resource1', 200), @@ -158,6 +161,7 @@ async def test_no_trailing_slash_when_disabled( resp = await client.get(path) assert resp.status == status + assert resp.url.query == URL(path).query @pytest.mark.parametrize("path, status", [ ('/resource1/a/b', 200), @@ -180,6 +184,7 @@ async def test_merge_slash(self, path, status, cli): resp = await client.get(path) assert resp.status == status + assert resp.url.query == URL(path).query @pytest.mark.parametrize("path, status", [ ('/resource1/a/b', 200), @@ -220,6 +225,7 @@ async def test_append_and_merge_slash(self, path, status, cli): client = await cli(extra_middlewares) resp = await client.get(path) assert resp.status == status + assert resp.url.query == URL(path).query @pytest.mark.parametrize("path, status", [ ('/resource1/a/b', 200), @@ -262,6 +268,7 @@ async def test_remove_and_merge_slash(self, path, status, cli): client = await cli(extra_middlewares) resp = await client.get(path) assert resp.status == status + assert resp.url.query == URL(path).query async def test_cannot_remove_and_add_slash(self): with pytest.raises(AssertionError):