diff --git a/examples/static_file_server.rs b/examples/static_file_server.rs new file mode 100644 index 00000000..265fc47b --- /dev/null +++ b/examples/static_file_server.rs @@ -0,0 +1,27 @@ +use http::StatusCode; +use hyper::Server; +use std::net::SocketAddr; +use tower::make::Shared; +use tower_http::{services::ServeDir, trace::TraceLayer}; +use tower_web::{prelude::*, ServiceExt}; + +#[tokio::main] +async fn main() { + tracing_subscriber::fmt::init(); + + let app = tower_web::routing::nest( + "/static", + ServeDir::new(".").handle_error(|error: std::io::Error| { + ( + StatusCode::INTERNAL_SERVER_ERROR, + format!("Unhandled interal error: {}", error), + ) + }), + ) + .layer(TraceLayer::new_for_http()); + + let addr = SocketAddr::from(([127, 0, 0, 1], 3000)); + tracing::debug!("listening on {}", addr); + let server = Server::bind(&addr).serve(Shared::new(app)); + server.await.unwrap(); +} diff --git a/src/lib.rs b/src/lib.rs index 0c94d5a6..60cc9369 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -514,6 +514,27 @@ //! # }; //! ``` //! +//! `nest` can also be used to serve static files from a directory: +//! +//! ```rust,no_run +//! use tower_web::{prelude::*, ServiceExt, routing::nest}; +//! use tower_http::services::ServeDir; +//! use http::Response; +//! use std::convert::Infallible; +//! use tower::{service_fn, BoxError}; +//! +//! let app = nest( +//! "/images", +//! ServeDir::new("public/images").handle_error(|error: std::io::Error| { +//! // ... +//! }) +//! ); +//! # +//! # async { +//! # hyper::Server::bind(&"".parse().unwrap()).serve(tower::make::Shared::new(app)).await; +//! # }; +//! ``` +//! //! [tower]: https://crates.io/crates/tower //! [tower-http]: https://crates.io/crates/tower-http