From 8260eda522ce0e999642fdcf842370efe48d13a7 Mon Sep 17 00:00:00 2001 From: bigbag Date: Wed, 27 Mar 2019 15:38:09 +0200 Subject: [PATCH] Fix normalize_path_middleware behavior for patch without slash (3669) (#3670) --- CHANGES/3669.bugfix | 1 + aiohttp/web_middlewares.py | 2 +- tests/test_web_middleware.py | 23 ++++++++++++++++++++++- 3 files changed, 24 insertions(+), 2 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..af199190abf 100644 --- a/tests/test_web_middleware.py +++ b/tests/test_web_middleware.py @@ -128,7 +128,9 @@ async def test_add_trailing_when_necessary( ('/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), + ('/resource12345', 404) ]) async def test_remove_trailing_when_necessary(self, path, status, cli) -> None: @@ -276,6 +278,25 @@ async def test_cannot_remove_and_add_slash(self) -> None: web.normalize_path_middleware(append_slash=True, remove_slash=True) +async def test_bug_3669(aiohttp_client): + async def paymethod(request): + return web.Response(text="OK") + + app = web.Application() + app.router.add_route('GET', '/paymethod', paymethod) + app.middlewares.append( + web.normalize_path_middleware(append_slash=False, remove_slash=True) + ) + + client = await aiohttp_client( + app, server_kwargs={'skip_url_asserts': True} + ) + + resp = await client.get('/paymethods') + assert resp.status == 404 + assert resp.url.path != '/paymethod' + + async def test_old_style_middleware(loop, aiohttp_client) -> None: async def handler(request): return web.Response(body=b'OK')