From 1cf1156f190437a41e8bb69685b12c2ba10e8e48 Mon Sep 17 00:00:00 2001 From: Pavel Liashkov Date: Wed, 27 Mar 2019 13:48:58 +0200 Subject: [PATCH] Fix normalize_path_middleware behavior for patch without slash (3669) --- CHANGES/3669.bugfix | 1 + aiohttp/web_middlewares.py | 2 +- tests/test_web_middleware.py | 9 ++++----- 3 files changed, 6 insertions(+), 6 deletions(-) create mode 100644 CHANGES/3669.bugfix diff --git a/CHANGES/3669.bugfix b/CHANGES/3669.bugfix new file mode 100644 index 00000000000..5cdd3e0337c --- /dev/null +++ b/CHANGES/3669.bugfix @@ -0,0 +1 @@ +Fix ``web_middlewares.normalize_path_middleware`` behavior for patch without slash. \ No newline at end of file diff --git a/aiohttp/web_middlewares.py b/aiohttp/web_middlewares.py index a6a444b42d4..17064f6fb31 100644 --- a/aiohttp/web_middlewares.py +++ b/aiohttp/web_middlewares.py @@ -96,7 +96,7 @@ async def impl(request: Request, handler: _Handler) -> StreamResponse: if merge_slashes and append_slash: paths_to_check.append( re.sub('//+', '/', path + '/')) - if merge_slashes and remove_slash: + if merge_slashes and remove_slash and path.endswith('/'): merged_slashes = re.sub('//+', '/', path) paths_to_check.append(merged_slashes[:-1]) diff --git a/tests/test_web_middleware.py b/tests/test_web_middleware.py index 2eba995d579..5d79e3136f9 100644 --- a/tests/test_web_middleware.py +++ b/tests/test_web_middleware.py @@ -151,7 +151,9 @@ async def test_remove_trailing_when_necessary(self, path, ('/resource2?p1=1&p2=2', 404), ('/resource2/?p1=1&p2=2', 200), ('/resource2/a/b%2Fc', 404), - ('/resource2/a/b%2Fc/', 200) + ('/resource2/a/b%2Fc/', 200), + ('/resource12', 404), + ('/resource123456', 404), ]) async def test_no_trailing_slash_when_disabled( self, path, status, cli): @@ -271,10 +273,6 @@ async def test_remove_and_merge_slash(self, path, status, cli) -> None: assert resp.status == status assert resp.url.query == URL(path).query - async def test_cannot_remove_and_add_slash(self) -> None: - with pytest.raises(AssertionError): - web.normalize_path_middleware(append_slash=True, remove_slash=True) - async def test_old_style_middleware(loop, aiohttp_client) -> None: async def handler(request): @@ -425,6 +423,7 @@ async def handler(request): return web.Response(body=b'OK') class Middleware: + @web.middleware async def call(self, request, handler): resp = await handler(request)