File tree 3 files changed +26
-2
lines changed
3 files changed +26
-2
lines changed Original file line number Diff line number Diff line change @@ -7,7 +7,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
8
8
# Unreleased
9
9
10
- - None.
10
+ - ** fixed: ** Fallback handlers on nested routers returning 404
11
11
12
12
# 0.7.4 (13. January, 2024)
13
13
Original file line number Diff line number Diff line change @@ -180,16 +180,27 @@ where
180
180
. expect ( "no path for route id. This is a bug in axum. Please file an issue" ) ;
181
181
182
182
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
+ } ;
184
189
let layer = (
185
190
StripPrefix :: layer ( prefix) ,
186
191
SetNestedPath :: layer ( path_to_nest_at) ,
187
192
) ;
188
193
match endpoint. layer ( layer) {
189
194
Endpoint :: MethodRouter ( method_router) => {
195
+ if let Some ( nested_root) = nested_root {
196
+ self . route ( & nested_root, method_router. clone ( ) ) ?;
197
+ }
190
198
self . route ( & path, method_router) ?;
191
199
}
192
200
Endpoint :: Route ( route) => {
201
+ if let Some ( nested_root) = nested_root {
202
+ self . route_endpoint ( & nested_root, Endpoint :: Route ( route. clone ( ) ) ) ?;
203
+ }
193
204
self . route_endpoint ( & path, Endpoint :: Route ( route) ) ?;
194
205
}
195
206
}
Original file line number Diff line number Diff line change @@ -383,6 +383,19 @@ async fn nesting_with_root_inner_router() {
383
383
assert_eq ! ( res. status( ) , StatusCode :: OK ) ;
384
384
}
385
385
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
+
386
399
macro_rules! nested_route_test {
387
400
(
388
401
$name: ident,
You can’t perform that action at this time.
0 commit comments