@@ -499,24 +499,30 @@ pub async fn run_server(
499499 None
500500 } ;
501501
502+ // Collect all API routes into a separate router to scope the rate-limiter middleware
503+ let mut api_router = Router :: new ( ) . nest (
504+ "/api/v1" ,
505+ Router :: new ( )
506+ . nest ( "/enrollment" , enrollment:: router ( ) )
507+ . nest ( "/password-reset" , password_reset:: router ( ) )
508+ . nest ( "/client-mfa" , desktop_client_mfa:: router ( ) )
509+ . nest ( "/openid" , openid_login:: router ( ) )
510+ . route ( "/poll" , post ( polling:: info) )
511+ . route ( "/health" , get ( healthcheck) )
512+ . route ( "/health-grpc" , get ( healthcheckgrpc) )
513+ . route ( "/info" , get ( app_info) ) ,
514+ ) ;
515+ if let Some ( conf) = governor_conf {
516+ api_router = api_router. layer ( GovernorLayer :: new ( conf) ) ;
517+ }
518+
502519 // Build axum app
503520 let mut app = Router :: new ( )
504521 . route ( "/" , get ( index) )
505522 . route ( "/{*path}" , get ( index) )
506523 . route ( "/fonts/{*path}" , get ( web_asset) )
507524 . route ( "/assets/{*path}" , get ( web_asset) )
508- . nest (
509- "/api/v1" ,
510- Router :: new ( )
511- . nest ( "/enrollment" , enrollment:: router ( ) )
512- . nest ( "/password-reset" , password_reset:: router ( ) )
513- . nest ( "/client-mfa" , desktop_client_mfa:: router ( ) )
514- . nest ( "/openid" , openid_login:: router ( ) )
515- . route ( "/poll" , post ( polling:: info) )
516- . route ( "/health" , get ( healthcheck) )
517- . route ( "/health-grpc" , get ( healthcheckgrpc) )
518- . route ( "/info" , get ( app_info) ) ,
519- )
525+ . merge ( api_router)
520526 . fallback_service ( get ( handle_404) )
521527 . layer ( middleware:: from_fn_with_state (
522528 shared_state. clone ( ) ,
@@ -546,9 +552,7 @@ pub async fn run_server(
546552 } )
547553 . on_response ( trace:: DefaultOnResponse :: new ( ) . level ( Level :: DEBUG ) ) ,
548554 ) ;
549- if let Some ( conf) = governor_conf {
550- app = app. layer ( GovernorLayer :: new ( conf) ) ;
551- }
555+
552556 // Global request body size limit; all proxy endpoints have small payloads.
553557 app = app. layer ( DefaultBodyLimit :: max ( REQUEST_BODY_LIMIT ) ) ;
554558 // Security headers and version are the outermost layers so that ALL short-circuit
0 commit comments