diff --git a/sanic/router.py b/sanic/router.py index 2383b915..0d8305ef 100644 --- a/sanic/router.py +++ b/sanic/router.py @@ -129,18 +129,22 @@ class Router: # Add versions with and without trailing / slashed_methods = self.routes_all.get(uri + '/', frozenset({})) + unslashed_methods = self.routes_all.get(uri[:-1], frozenset({})) if isinstance(methods, Iterable): _slash_is_missing = all(method in slashed_methods for method in methods) + _without_slash_is_missing = all(method in unslashed_methods for + method in methods) else: _slash_is_missing = methods in slashed_methods + _without_slash_is_missing = methods in unslashed_methods slash_is_missing = ( not uri[-1] == '/' and not _slash_is_missing ) without_slash_is_missing = ( uri[-1] == '/' and not - self.routes_all.get(uri[:-1], False) and not + _without_slash_is_missing and not uri == '/' ) # add version with trailing slash diff --git a/tests/test_routes.py b/tests/test_routes.py index b6b62283..fb47203f 100644 --- a/tests/test_routes.py +++ b/tests/test_routes.py @@ -129,6 +129,30 @@ def test_route_strict_slash_default_value_can_be_overwritten(): request, response = app.test_client.get('/get/') assert response.text == 'OK' +def test_route_slashes_overload(): + app = Sanic('test_route_slashes_overload') + + @app.get('/hello/') + def handler(request): + return text('OK') + + @app.post('/hello/') + def handler(request): + return text('OK') + + + request, response = app.test_client.get('/hello') + assert response.text == 'OK' + + request, response = app.test_client.get('/hello/') + assert response.text == 'OK' + + request, response = app.test_client.post('/hello') + assert response.text == 'OK' + + request, response = app.test_client.post('/hello/') + assert response.text == 'OK' + def test_route_optional_slash(): app = Sanic('test_route_optional_slash')