diff --git a/Cargo.lock b/Cargo.lock index 5da1b74..1089907 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -962,6 +962,12 @@ dependencies = [ "pin-project-lite", ] +[[package]] +name = "http-range-header" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ce4ef31cda248bbdb6e6820603b82dfcd9e833db65a43e997a0ccec777d11fe" + [[package]] name = "httparse" version = "1.8.0" @@ -1254,6 +1260,16 @@ version = "0.3.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" +[[package]] +name = "mime_guess" +version = "2.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4192263c238a5f0d0c6bfd21f336a313a4ce1c450542449ca191bb657b4642ef" +dependencies = [ + "mime", + "unicase", +] + [[package]] name = "miniz_oxide" version = "0.7.2" @@ -1783,6 +1799,7 @@ dependencies = [ "futures-util", "stateroom", "tokio", + "tower-http", "tracing", ] @@ -1976,6 +1993,19 @@ dependencies = [ "tungstenite", ] +[[package]] +name = "tokio-util" +version = "0.7.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9cf6b47b3771c49ac75ad09a6162f53ad4b8088b76ac60e8ec1455b31a189fe1" +dependencies = [ + "bytes", + "futures-core", + "futures-sink", + "pin-project-lite", + "tokio", +] + [[package]] name = "toml" version = "0.8.12" @@ -2026,6 +2056,31 @@ dependencies = [ "tracing", ] +[[package]] +name = "tower-http" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e9cd434a998747dd2c4276bc96ee2e0c7a2eadf3cae88e52be55a05fa9053f5" +dependencies = [ + "bitflags", + "bytes", + "futures-util", + "http", + "http-body", + "http-body-util", + "http-range-header", + "httpdate", + "mime", + "mime_guess", + "percent-encoding", + "pin-project-lite", + "tokio", + "tokio-util", + "tower-layer", + "tower-service", + "tracing", +] + [[package]] name = "tower-layer" version = "0.3.2" @@ -2125,6 +2180,15 @@ version = "1.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" +[[package]] +name = "unicase" +version = "2.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f7d2d4dafb69621809a81864c9c1b864479e1235c0dd4e199924b9742439ed89" +dependencies = [ + "version_check", +] + [[package]] name = "unicode-bidi" version = "0.3.15" diff --git a/stateroom-server/Cargo.toml b/stateroom-server/Cargo.toml index 7addee0..a603d47 100644 --- a/stateroom-server/Cargo.toml +++ b/stateroom-server/Cargo.toml @@ -14,4 +14,5 @@ dashmap = "5.5.3" futures-util = "0.3.30" stateroom = {path="../stateroom", version="0.4.1"} tokio = { version = "1.37.0", features = ["rt-multi-thread"] } +tower-http = { version="0.5.2", features=["fs"] } tracing = "0.1.40" diff --git a/stateroom-server/src/lib.rs b/stateroom-server/src/lib.rs index de56358..042981b 100644 --- a/stateroom-server/src/lib.rs +++ b/stateroom-server/src/lib.rs @@ -12,6 +12,7 @@ use std::{ time::Duration, }; use tokio::{net::TcpListener, select}; +use tower_http::services::ServeDir; mod server; @@ -106,10 +107,18 @@ impl Server { pub async fn serve_async(self, factory: impl StateroomServiceFactory) -> std::io::Result<()> { let server_state = Arc::new(ServerState::new(factory)); - let app = Router::new() + let mut app = Router::new() .route("/ws", get(serve_websocket)) .with_state(server_state); + if let Some(static_path) = self.static_path { + app = app.nest_service("/", ServeDir::new(static_path)); + } + + if let Some(client_path) = self.client_path { + app = app.nest_service("/client", ServeDir::new(client_path)); + } + let ip = self.ip.parse::().unwrap(); let addr = SocketAddr::new(ip, self.port); let listener = TcpListener::bind(&addr).await?;