Trailing slash normalization
This commit is contained in:
parent
85cacd8bb7
commit
1e0a6062f9
5 changed files with 50 additions and 27 deletions
36
Cargo.lock
generated
36
Cargo.lock
generated
|
@ -138,7 +138,7 @@ dependencies = [
|
|||
"serde_urlencoded",
|
||||
"sync_wrapper 1.0.1",
|
||||
"tokio",
|
||||
"tower",
|
||||
"tower 0.4.13",
|
||||
"tower-layer",
|
||||
"tower-service",
|
||||
"tracing",
|
||||
|
@ -182,7 +182,7 @@ dependencies = [
|
|||
"mime",
|
||||
"pin-project-lite",
|
||||
"serde",
|
||||
"tower",
|
||||
"tower 0.4.13",
|
||||
"tower-layer",
|
||||
"tower-service",
|
||||
"tracing",
|
||||
|
@ -205,9 +205,9 @@ dependencies = [
|
|||
|
||||
[[package]]
|
||||
name = "axum-test"
|
||||
version = "15.3.0"
|
||||
version = "15.7.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "2cd2b6c11bc5e65ec121543c5049b7e07be9e7b5a515df79d01f74a72c6a15f0"
|
||||
checksum = "6c13fee69ea6d727350c4fcb5f9100fda3b6b73bfae33da6b4acd3b6934f6e73"
|
||||
dependencies = [
|
||||
"anyhow",
|
||||
"auto-future",
|
||||
|
@ -227,7 +227,7 @@ dependencies = [
|
|||
"serde_urlencoded",
|
||||
"smallvec",
|
||||
"tokio",
|
||||
"tower",
|
||||
"tower 0.5.0",
|
||||
"url",
|
||||
]
|
||||
|
||||
|
@ -1058,7 +1058,7 @@ dependencies = [
|
|||
"pin-project-lite",
|
||||
"socket2",
|
||||
"tokio",
|
||||
"tower",
|
||||
"tower 0.4.13",
|
||||
"tower-service",
|
||||
"tracing",
|
||||
]
|
||||
|
@ -1685,6 +1685,7 @@ dependencies = [
|
|||
"tokio",
|
||||
"tokio-util",
|
||||
"toml 0.8.19",
|
||||
"tower 0.5.0",
|
||||
"tower-http",
|
||||
"trie-rs",
|
||||
"unicase",
|
||||
|
@ -2939,9 +2940,9 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20"
|
|||
|
||||
[[package]]
|
||||
name = "tokio"
|
||||
version = "1.39.2"
|
||||
version = "1.40.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "daa4fb1bc778bd6f04cbfc4bb2d06a7396a8f299dc33ea1900cedaa316f467b1"
|
||||
checksum = "e2b070231665d27ad9ec9b8df639893f46727666c6767db40317fbe920a5d998"
|
||||
dependencies = [
|
||||
"backtrace",
|
||||
"bytes",
|
||||
|
@ -3047,6 +3048,21 @@ dependencies = [
|
|||
"tracing",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "tower"
|
||||
version = "0.5.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "36b837f86b25d7c0d7988f00a54e74739be6477f2aac6201b8f429a7569991b7"
|
||||
dependencies = [
|
||||
"futures-core",
|
||||
"futures-util",
|
||||
"pin-project-lite",
|
||||
"sync_wrapper 0.1.2",
|
||||
"tokio",
|
||||
"tower-layer",
|
||||
"tower-service",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "tower-http"
|
||||
version = "0.5.2"
|
||||
|
@ -3076,9 +3092,9 @@ dependencies = [
|
|||
|
||||
[[package]]
|
||||
name = "tower-layer"
|
||||
version = "0.3.2"
|
||||
version = "0.3.3"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "c20c8dbed6283a09604c3e69b4b7eeb54e298b8a600d4d5ecb5ad39de609f1d0"
|
||||
checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e"
|
||||
|
||||
[[package]]
|
||||
name = "tower-service"
|
||||
|
|
|
@ -47,7 +47,12 @@ thiserror = "1.0.62"
|
|||
tokio = { version = "1.39", features = ["macros", "rt-multi-thread"] }
|
||||
tokio-util = { version = "0.7.11", features = ["io"] }
|
||||
toml = "0.8.19"
|
||||
tower-http = { version = "0.5.2", features = ["compression-gzip", "fs"] }
|
||||
tower = { version = "0.5.0" }
|
||||
tower-http = { version = "0.5.2", features = [
|
||||
"compression-gzip",
|
||||
"fs",
|
||||
"normalize-path",
|
||||
] }
|
||||
trie-rs = { version = "0.4.2", features = ["serde"] }
|
||||
unicase = "2.7.0"
|
||||
ureq = { version = "2.10.0", default-features = false, features = ["tls"] }
|
||||
|
@ -86,7 +91,7 @@ embed-resource = "2.4.2"
|
|||
winres = "0.1"
|
||||
|
||||
[dev-dependencies]
|
||||
axum-test = "15.3"
|
||||
axum-test = "15.7"
|
||||
bytes = "1.7.1"
|
||||
|
||||
[profile.dev.package.sqlx-macros]
|
||||
|
|
|
@ -1,5 +1,10 @@
|
|||
use axum::{extract::FromRef, Router};
|
||||
use tower_http::{compression::CompressionLayer, services::ServeDir};
|
||||
use axum::{extract::FromRef, Router, ServiceExt};
|
||||
use tower::Layer;
|
||||
use tower_http::{
|
||||
compression::CompressionLayer,
|
||||
normalize_path::{NormalizePath, NormalizePathLayer},
|
||||
services::ServeDir,
|
||||
};
|
||||
|
||||
use crate::app::{self, App};
|
||||
|
||||
|
@ -11,25 +16,28 @@ mod version;
|
|||
#[cfg(test)]
|
||||
pub mod test;
|
||||
|
||||
pub fn make_router(app: App) -> Router {
|
||||
pub fn make_router(app: App) -> NormalizePath<Router> {
|
||||
let swagger = ServeDir::new(&app.swagger_dir_path);
|
||||
|
||||
let static_files = Router::new()
|
||||
.nest_service("/", ServeDir::new(&app.web_dir_path))
|
||||
.layer(CompressionLayer::new());
|
||||
|
||||
Router::new()
|
||||
let router = Router::new()
|
||||
.nest("/api", api::router())
|
||||
.with_state(app.clone())
|
||||
.nest_service("/swagger", swagger)
|
||||
.nest("/", static_files)
|
||||
.nest("/", static_files);
|
||||
|
||||
NormalizePathLayer::trim_trailing_slash().layer(router)
|
||||
}
|
||||
|
||||
pub async fn launch(app: App) -> Result<(), std::io::Error> {
|
||||
let port = app.port;
|
||||
let router = make_router(app);
|
||||
let make_service = ServiceExt::<axum::extract::Request>::into_make_service(router);
|
||||
let listener = tokio::net::TcpListener::bind(format!("0.0.0.0:{port}")).await?;
|
||||
axum::serve(listener, router).await?;
|
||||
axum::serve(listener, make_service).await?;
|
||||
Ok(())
|
||||
}
|
||||
|
||||
|
|
|
@ -76,14 +76,7 @@ pub fn router() -> Router<App> {
|
|||
.route("/songs", post(get_songs)) // post because of https://github.com/whatwg/fetch/issues/551
|
||||
.route("/peaks/*path", get(get_peaks))
|
||||
.route("/thumbnail/*path", get(get_thumbnail))
|
||||
// Workarounds
|
||||
// TODO figure out NormalizePathLayer and remove this
|
||||
// See https://github.com/tokio-rs/axum/discussions/2833
|
||||
.route("/browse/", get(get_browse_root))
|
||||
.route("/flatten/", get(get_flatten_root))
|
||||
.route("/random/", get(get_random))
|
||||
.route("/recent/", get(get_recent))
|
||||
.route("/search/", get(get_search_root))
|
||||
// Layers
|
||||
.layer(CompressionLayer::new().quality(CompressionLevel::Fastest))
|
||||
.layer(DefaultBodyLimit::max(10 * 1024 * 1024)) // 10MB
|
||||
// Uncompressed
|
||||
|
|
|
@ -34,7 +34,8 @@ impl TestService for AxumTestService {
|
|||
|
||||
let app = App::new(5050, paths).await.unwrap();
|
||||
let router = make_router(app);
|
||||
let server = TestServer::new(router).unwrap();
|
||||
let make_service = ServiceExt::<axum::extract::Request>::into_make_service(router);
|
||||
let server = TestServer::new(make_service).unwrap();
|
||||
|
||||
AxumTestService {
|
||||
authorization: None,
|
||||
|
|
Loading…
Add table
Reference in a new issue