Skip to content

Commit edddbeb

Browse files
fix nested fallback actionable also on nested root
1 parent 9e31949 commit edddbeb

File tree

3 files changed

+26
-2
lines changed

3 files changed

+26
-2
lines changed

Diff for: axum/CHANGELOG.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
77

88
# Unreleased
99

10-
- None.
10+
- **fixed:** Fallback handlers on nested routers returning 404
1111

1212
# 0.7.4 (13. January, 2024)
1313

Diff for: axum/src/routing/path_router.rs

+12-1
Original file line numberDiff line numberDiff line change
@@ -180,16 +180,27 @@ where
180180
.expect("no path for route id. This is a bug in axum. Please file an issue");
181181

182182
let path = path_for_nested_route(prefix, inner_path);
183-
183+
let route_nested_root =
184+
IS_FALLBACK && "/".eq(inner_path.as_ref()) && !path.ends_with('/');
185+
let nested_root = match route_nested_root {
186+
true => Some(format!("{path}/")),
187+
false => None,
188+
};
184189
let layer = (
185190
StripPrefix::layer(prefix),
186191
SetNestedPath::layer(path_to_nest_at),
187192
);
188193
match endpoint.layer(layer) {
189194
Endpoint::MethodRouter(method_router) => {
195+
if let Some(nested_root) = nested_root {
196+
self.route(&nested_root, method_router.clone())?;
197+
}
190198
self.route(&path, method_router)?;
191199
}
192200
Endpoint::Route(route) => {
201+
if let Some(nested_root) = nested_root {
202+
self.route_endpoint(&nested_root, Endpoint::Route(route.clone()))?;
203+
}
193204
self.route_endpoint(&path, Endpoint::Route(route))?;
194205
}
195206
}

Diff for: axum/src/routing/tests/nest.rs

+13
Original file line numberDiff line numberDiff line change
@@ -383,6 +383,19 @@ async fn nesting_with_root_inner_router() {
383383
assert_eq!(res.status(), StatusCode::OK);
384384
}
385385

386+
#[tokio::test]
387+
async fn nesting_with_root_inner_fallback() {
388+
let app = Router::new().nest("/router", Router::new().fallback(get(|| async {})));
389+
390+
let client = TestClient::new(app);
391+
392+
let res = client.get("/router").await;
393+
assert_eq!(res.status(), StatusCode::OK);
394+
395+
let res = client.get("/router/").await;
396+
assert_eq!(res.status(), StatusCode::OK);
397+
}
398+
386399
macro_rules! nested_route_test {
387400
(
388401
$name:ident,

0 commit comments

Comments
 (0)