8
8
use std:: sync:: Arc ;
9
9
use std:: time:: Duration ;
10
10
11
+ use axum:: error_handling:: HandleErrorLayer ;
11
12
use axum:: http:: HeaderName ;
12
13
use axum:: response:: Response ;
13
14
use axum:: routing:: get;
14
- use axum:: { middleware, Router } ;
15
- use hyper:: Request ;
15
+ use axum:: { middleware, BoxError , Router } ;
16
+ use hyper:: { Request , StatusCode } ;
16
17
use torrust_tracker_configuration:: AccessTokens ;
18
+ use tower:: timeout:: TimeoutLayer ;
19
+ use tower:: ServiceBuilder ;
17
20
use tower_http:: compression:: CompressionLayer ;
18
21
use tower_http:: propagate_header:: PropagateHeaderLayer ;
19
22
use tower_http:: request_id:: { MakeRequestUuid , SetRequestIdLayer } ;
@@ -25,6 +28,8 @@ use super::v1::context::health_check::handlers::health_check_handler;
25
28
use super :: v1:: middlewares:: auth:: State ;
26
29
use crate :: core:: Tracker ;
27
30
31
+ const TIMEOUT : Duration = Duration :: from_secs ( 5 ) ;
32
+
28
33
/// Add all API routes to the router.
29
34
#[ allow( clippy:: needless_pass_by_value) ]
30
35
pub fn router ( tracker : Arc < Tracker > , access_tokens : Arc < AccessTokens > ) -> Router {
@@ -73,4 +78,11 @@ pub fn router(tracker: Arc<Tracker>, access_tokens: Arc<AccessTokens>) -> Router
73
78
} ) ,
74
79
)
75
80
. layer ( SetRequestIdLayer :: x_request_id ( MakeRequestUuid ) )
81
+ . layer (
82
+ ServiceBuilder :: new ( )
83
+ // this middleware goes above `TimeoutLayer` because it will receive
84
+ // errors returned by `TimeoutLayer`
85
+ . layer ( HandleErrorLayer :: new ( |_: BoxError | async { StatusCode :: REQUEST_TIMEOUT } ) )
86
+ . layer ( TimeoutLayer :: new ( TIMEOUT ) ) ,
87
+ )
76
88
}
0 commit comments