From a238ff5e231c134f9b7c3831564a884e9d15b2c0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mateusz=20Gruszczy=C5=84ski?= Date: Thu, 29 Oct 2026 20:04:58 +0100 Subject: [PATCH] v0.0.2 --- src/routes/mod.rs | 10 +++++++++- src/routes/tests.rs | 28 +++++++++++++--------------- 2 files changed, 22 insertions(+), 16 deletions(-) diff --git a/src/routes/mod.rs b/src/routes/mod.rs index 8b96320..f827592 100644 --- a/src/routes/mod.rs +++ b/src/routes/mod.rs @@ -502,7 +502,15 @@ pub fn create_router( // Use the same base path for routing and authentication cookies. let router = match config.normalized_base_path() { "/" => inner, - base_path => Router::new().nest(base_path, inner), + base_path => { + // Axum nests an inner `/` route at the prefix itself (`/mail`), + // not at the trailing-slash variant (`/mail/`). Serve that variant + // explicitly so both URLs load the same embedded SPA. + let base_path_slash = format!("{}/", base_path.trim_end_matches('/')); + Router::new() + .route(&base_path_slash, get(crate::ui::serve_ui)) + .nest(base_path, inner) + } }; let router = router diff --git a/src/routes/tests.rs b/src/routes/tests.rs index 7fcff00..26897a6 100644 --- a/src/routes/tests.rs +++ b/src/routes/tests.rs @@ -377,21 +377,19 @@ async fn base_path_serves_the_same_embedded_ui() { test_idle_manager(), ); - let response = app - .oneshot( - Request::builder() - .uri("/mail/") - .body(Body::empty()) - .unwrap(), - ) - .await - .unwrap(); - assert_eq!(response.status(), StatusCode::OK); - let body = response.into_body().collect().await.unwrap().to_bytes(); - let html = String::from_utf8(body.to_vec()).unwrap(); - assert!(html.contains("data-base-path=\"/mail\"")); - assert!(html.contains("/mail/assets/app.")); - assert!(html.contains(".js")); + for uri in ["/mail", "/mail/"] { + let response = app + .clone() + .oneshot(Request::builder().uri(uri).body(Body::empty()).unwrap()) + .await + .unwrap(); + assert_eq!(response.status(), StatusCode::OK, "{uri}"); + let body = response.into_body().collect().await.unwrap().to_bytes(); + let html = String::from_utf8(body.to_vec()).unwrap(); + assert!(html.contains("data-base-path=\"/mail\""), "{uri}"); + assert!(html.contains("/mail/assets/app."), "{uri}"); + assert!(html.contains(".js"), "{uri}"); + } } #[tokio::test]