Create a middleware from an async function.
from_fn requires the function given to
- Be an
async fn.
- Take zero or more
FromRequestParts extractors.
- Take exactly one
FromRequest extractor as the second to last argument.
- Take
Next as the last argument.
- Return something that implements
IntoResponse.
Note that this function doesn't support extracting State. For that, use from_fn_with_state.
Example
use axum::{
Router,
http,
routing::get,
response::Response,
middleware::{self, Next},
extract::Request,
};
async fn my_middleware(
request: Request,
next: Next,
) -> Response {
let response = next.run(request).await;
response
}
let app = Router::new()
.route("/", get(|| async { }))
.layer(middleware::from_fn(my_middleware));
# let app: Router = app;
Running extractors
use axum::{
Router,
extract::Request,
http::{StatusCode, HeaderMap},
middleware::{self, Next},
response::Response,
routing::get,
};
async fn auth(
headers: HeaderMap,
request: Request,
next: Next,
) -> Result<Response, StatusCode> {
match get_token(&headers) {
Some(token) if token_is_valid(token) => {
let response = next.run(request).await;
Ok(response)
}
_ => {
Err(StatusCode::UNAUTHORIZED)
}
}
}
fn get_token(headers: &HeaderMap) -> Option<&str> {
# None
}
fn token_is_valid(token: &str) -> bool {
# false
}
let app = Router::new()
.route("/", get(|| async { }))
.route_layer(middleware::from_fn(auth));
# let app: Router = app;