File tree 3 files changed +25
-2
lines changed
3 files changed +25
-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,26 @@ 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 = !path. ends_with ( '/' ) && "/" . eq ( inner_path. as_ref ( ) ) ;
184
+ let nested_root = match IS_FALLBACK && route_nested_root {
185
+ true => Some ( format ! ( "{path}/" ) ) ,
186
+ false => None ,
187
+ } ;
184
188
let layer = (
185
189
StripPrefix :: layer ( prefix) ,
186
190
SetNestedPath :: layer ( path_to_nest_at) ,
187
191
) ;
188
192
match endpoint. layer ( layer) {
189
193
Endpoint :: MethodRouter ( method_router) => {
194
+ if let Some ( nested_root) = nested_root {
195
+ self . route ( & nested_root, method_router. clone ( ) ) ?;
196
+ }
190
197
self . route ( & path, method_router) ?;
191
198
}
192
199
Endpoint :: Route ( route) => {
200
+ if let Some ( nested_root) = nested_root {
201
+ self . route_endpoint ( & nested_root, Endpoint :: Route ( route. clone ( ) ) ) ?;
202
+ }
193
203
self . route_endpoint ( & path, Endpoint :: Route ( route) ) ?;
194
204
}
195
205
}
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