encode / starlette

The little ASGI framework that shines. 🌟
https://www.starlette.io/
BSD 3-Clause "New" or "Revised" License
10.31k stars 949 forks source link

0.35.0 refactor of root_path handling is potentially returning incorrect route #2599

Closed gabriel-f-santos closed 6 months ago

gabriel-f-santos commented 6 months ago

Discussed in https://github.com/encode/starlette/discussions/2495

Originally posted by **robbielaw** February 8, 2024 When running starlette/fastapi behing a proxy we got some errors when calling the app directly. when calling curl http://127.0.0.1:8000/products/, we get: root_path: _/product_ scope['path']: _/products_ route_path: _s_ (after apply the regex - https://github.com/encode/starlette/blob/master/starlette/_utils.py#L96) because the the root_path to be removed if calling directly the app is **"product"** and endpoint path is **/products** **Example Scenario**: libs: ``` starlette==0.37.2 uvicorn==0.29.0 ``` gist: https://gist.github.com/gabriel-f-santos/df75213fe6860e369a1e096611a767e5 run: uvicorn main:app --root-path /product Code causing the error: https://github.com/encode/starlette/blob/master/starlette/_utils.py#L96 ``` def get_route_path(scope: Scope) -> str: root_path = scope.get("root_path", "") route_path = re.sub(r"^" + root_path, "", scope["path"]) return route_path ``` Fix suggestion: ``` def get_route_path(scope: Scope) -> str: root_path = scope.get("root_path", "") route_path = re.sub(r"^" + root_path + r"(?=/|$)", "", scope["path"]) return route_path ``` > [!IMPORTANT] > - We're using [Polar.sh](https://polar.sh/encode) so you can upvote and help fund this issue. > - We receive the funding once the issue is completed & confirmed by you. > - Thank you in advance for helping prioritize & fund our backlog. Fund with Polar