Add example of static-file-server using serve dir with handler as service (#1501)

* add example of static-file-seriver using serve dit with handler as service

* update handle return type in example

Co-authored-by: David Pedersen <david.pdrsn@gmail.com>

* cargo fmt fix

* change error mapping

Co-authored-by: David Pedersen <david.pdrsn@gmail.com>
This commit is contained in:
Konstantin Kostiuk 2022-11-08 21:40:20 +02:00 committed by GitHub
parent 944f388ae0
commit 8d6313afa0
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23

View file

@ -6,6 +6,7 @@
use axum::{
body::Body,
handler::HandlerWithoutStateExt,
http::{Request, StatusCode},
response::IntoResponse,
routing::{get, get_service},
@ -35,8 +36,9 @@ async fn main() {
serve(using_serve_dir(), 3001),
serve(using_serve_dir_with_assets_fallback(), 3002),
serve(using_serve_dir_only_from_root_via_fallback(), 3003),
serve(two_serve_dirs(), 3004),
serve(calling_serve_dir_from_a_handler(), 3005),
serve(using_serve_dir_with_handler_as_service(), 3004),
serve(two_serve_dirs(), 3005),
serve(calling_serve_dir_from_a_handler(), 3006),
);
}
@ -86,6 +88,24 @@ fn using_serve_dir_only_from_root_via_fallback() -> Router {
.fallback_service(serve_dir)
}
fn using_serve_dir_with_handler_as_service() -> Router {
async fn handle_404() -> (StatusCode, &'static str) {
(StatusCode::NOT_FOUND, "Not found")
}
// you can convert handler function to service
let service = handle_404
.into_service()
.map_err(|err| -> std::io::Error { match err {} });
let serve_dir = ServeDir::new("assets").not_found_service(service);
let serve_dir = get_service(serve_dir).handle_error(handle_error);
Router::new()
.route("/foo", get(|| async { "Hi from /foo" }))
.fallback_service(serve_dir)
}
fn two_serve_dirs() -> Router {
// you can also have two `ServeDir`s nested at different paths
let serve_dir_from_assets = get_service(ServeDir::new("assets")).handle_error(handle_error);