diff --git a/examples/404.rs b/examples/404.rs new file mode 100644 index 00000000..6f40213c --- /dev/null +++ b/examples/404.rs @@ -0,0 +1,46 @@ +//! Run with +//! +//! ```not_rust +//! cargo run --example 404 +//! ``` + +use axum::{ + body::{box_body, Body, BoxBody}, + prelude::*, +}; +use http::{Response, StatusCode}; +use std::net::SocketAddr; +use tower::util::MapResponseLayer; + +#[tokio::main] +async fn main() { + tracing_subscriber::fmt::init(); + + // build our application with a route + let app = route("/", get(handler)) + // make sure this is added as the very last thing + .layer(MapResponseLayer::new(map_404)); + + // run it + let addr = SocketAddr::from(([127, 0, 0, 1], 3000)); + tracing::debug!("listening on {}", addr); + hyper::Server::bind(&addr) + .serve(app.into_make_service()) + .await + .unwrap(); +} + +async fn handler() -> response::Html<&'static str> { + response::Html("

Hello, World!

") +} + +fn map_404(response: Response) -> Response { + if response.status() != StatusCode::NOT_FOUND { + return response; + } + + Response::builder() + .status(StatusCode::NOT_FOUND) + .body(box_body(Body::from("nothing to see here"))) + .unwrap() +} diff --git a/examples/README.md b/examples/README.md index b38e19e4..049df8ea 100644 --- a/examples/README.md +++ b/examples/README.md @@ -16,3 +16,4 @@ - [`sessions`](../examples/sessions.rs) - Sessions and cookies using [`async-session`](https://crates.io/crates/async-session). - [`tls_rustls`](../examples/tls_rustls.rs) - TLS with [`tokio-rustls`](https://crates.io/crates/tokio-rustls). - [`chat`](../examples/chat.rs) - Chat application example. +- [`404`](../examples/404.rs) - Custom 404 page.