@@ -13,11 +13,15 @@ use crate::types::AE;
1313use association:: pool:: AssociationPools ;
1414use axum:: extract:: { DefaultBodyLimit , Request } ;
1515use axum:: response:: Response ;
16+ use axum:: routing:: IntoMakeService ;
17+ use axum:: ServiceExt ;
1618use std:: net:: SocketAddr ;
1719use std:: time:: Duration ;
1820use tokio:: net:: TcpListener ;
1921use tokio:: signal;
22+ use tower:: Layer ;
2023use tower_http:: cors:: CorsLayer ;
24+ use tower_http:: normalize_path:: NormalizePathLayer ;
2125use tower_http:: timeout:: TimeoutLayer ;
2226use tower_http:: trace;
2327use tracing:: { error, info, level_filters:: LevelFilter , Level } ;
@@ -144,6 +148,9 @@ async fn run(config: AppConfig) -> anyhow::Result<()> {
144148 ) ) )
145149 . with_state ( app_state) ;
146150
151+ let app = NormalizePathLayer :: trim_trailing_slash ( ) . layer ( app) ;
152+ let service = ServiceExt :: < Request > :: into_make_service ( app) ;
153+
147154 let HttpServerConfig {
148155 interface : host,
149156 port,
@@ -159,11 +166,11 @@ async fn run(config: AppConfig) -> anyhow::Result<()> {
159166 "Started DICOMweb server"
160167 ) ;
161168 if config. server . http . graceful_shutdown {
162- axum:: serve ( listener, app )
169+ axum:: serve ( listener, service )
163170 . with_graceful_shutdown ( shutdown_signal ( ) )
164171 . await ?;
165172 } else {
166- axum:: serve ( listener, app ) . await ?;
173+ axum:: serve ( listener, service ) . await ?;
167174 }
168175
169176 Ok ( ( ) )
0 commit comments