diff --git a/starlette/_utils.py b/starlette/_utils.py index f615eeea..74c9f24f 100644 --- a/starlette/_utils.py +++ b/starlette/_utils.py @@ -2,7 +2,6 @@ from __future__ import annotations import asyncio import functools -import re import sys import typing from contextlib import contextmanager @@ -84,6 +83,18 @@ def collapse_excgroups() -> typing.Generator[None, None, None]: def get_route_path(scope: Scope) -> str: + path: str = scope["path"] root_path = scope.get("root_path", "") - route_path = re.sub(r"^" + root_path + r"(?=/|$)", "", scope["path"]) - return route_path + if not root_path: + return path + + if not path.startswith(root_path): + return path + + if path == root_path: + return "" + + if path[len(root_path)] == "/": + return path[len(root_path) :] + + return path diff --git a/tests/test__utils.py b/tests/test__utils.py index f46775b4..916f460d 100644 --- a/tests/test__utils.py +++ b/tests/test__utils.py @@ -89,6 +89,7 @@ def test_async_nested_partial() -> None: ({"path": "/foo-123/bar", "root_path": "/foo"}, "/foo-123/bar"), ({"path": "/foo/bar", "root_path": "/foo"}, "/bar"), ({"path": "/foo", "root_path": "/foo"}, ""), + ({"path": "/foo/bar", "root_path": "/bar"}, "/foo/bar"), ], ) def test_get_route_path(scope: Scope, expected_result: str) -> None: