Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix: set correct path_template value for trie node (#3806) #3807

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion litestar/_asgi/routing_trie/mapping.py
Original file line number Diff line number Diff line change
Expand Up @@ -111,7 +111,7 @@ def add_route_to_trie(
next_node_key = component

if next_node_key not in current_node.children:
current_node.children[next_node_key] = create_node(path_template=route.path_format)
current_node.children[next_node_key] = create_node()

current_node.child_keys = set(current_node.children.keys())
current_node = current_node.children[next_node_key]
Expand Down Expand Up @@ -140,6 +140,7 @@ def configure_node(
"""
from litestar.routes import HTTPRoute, WebSocketRoute

node.path_template = route.path_format
if not node.path_parameters:
node.path_parameters = {}

Expand Down
6 changes: 3 additions & 3 deletions litestar/_asgi/routing_trie/types.py
Original file line number Diff line number Diff line change
Expand Up @@ -34,9 +34,9 @@ class RouteTrieNode:
"children",
"is_asgi",
"is_mount",
"is_static",
"is_path_param_node",
"is_path_type",
"is_static",
"path_parameters",
"path_template",
)
Expand Down Expand Up @@ -68,7 +68,7 @@ class RouteTrieNode:
"""The path template string used to lower prometheus cardinality when group_path enabled"""


def create_node(path_template: str = "") -> RouteTrieNode:
def create_node() -> RouteTrieNode:
"""Create a RouteMapNode instance.

Returns:
Expand All @@ -85,5 +85,5 @@ def create_node(path_template: str = "") -> RouteTrieNode:
is_static=False,
is_path_type=False,
path_parameters={},
path_template=path_template,
path_template="",
)
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
import pytest
from prometheus_client import REGISTRY

from litestar import get
from litestar import Controller, Litestar, Request, get
from litestar.contrib.prometheus import PrometheusMiddleware
from litestar.status_codes import HTTP_200_OK
from litestar.testing import TestClient
Expand Down Expand Up @@ -60,3 +60,25 @@ def home(name: str) -> Dict[str, Any]:
assert metrics_exporter_response.status_code == HTTP_200_OK
metrics = metrics_exporter_response.content.decode()
assert expected_path in metrics


def test_correct_population_path_template() -> None:
class TestController(Controller):
path = "/prefix"

@get("/{id_:int}")
async def b(self, request: Request, id_: int) -> str:
return request.scope["path_template"]

@get("/{id_:int}/postfix")
async def a(self, request: Request, id_: int) -> str:
return request.scope["path_template"]

app = Litestar([TestController])

with TestClient(app) as client:
without_postfix_resp = client.get("/prefix/1")
with_postfix_resp = client.get("/prefix/1/postfix")

assert without_postfix_resp.content.decode() == "/prefix/{id_}"
assert with_postfix_resp.content.decode() == "/prefix/{id_}/postfix"
Loading