use axum::{
body::Body,
http::{Method, Request},
middleware::Next,
response::Response,
};
use fancy_log::{LogLevel, log};
pub async fn log_requests(request: Request<Body>, next: Next) -> Response {
let method = request.method().clone();
let path = request.uri().path().to_owned();
if method == Method::POST
|| method == Method::DELETE
|| method == Method::PUT
|| method == Method::PATCH
{
log(LogLevel::Info, &format!("➜ {method} {path}"));
} else {
log(LogLevel::Debug, &format!("➜ {method} {path}"));
}
next.run(request).await
}
#[cfg(test)]
mod tests {
use super::*;
use axum::{
Router,
http::StatusCode,
middleware,
routing::{get, post},
};
use tower::util::ServiceExt;
async fn handler() -> (StatusCode, &'static str) {
(StatusCode::OK, "Success")
}
#[tokio::test]
async fn test_logs_non_mutating_request() {
let app = Router::new()
.route("/", get(handler))
.layer(middleware::from_fn(log_requests));
let request = Request::builder()
.method(Method::GET)
.uri("/")
.body(Body::empty())
.unwrap();
let response = app.oneshot(request).await.unwrap();
assert_eq!(response.status(), StatusCode::OK);
}
#[tokio::test]
async fn test_logs_mutating_request() {
let app = Router::new()
.route("/", post(handler))
.layer(middleware::from_fn(log_requests));
let request = Request::builder()
.method(Method::POST)
.uri("/")
.body(Body::empty())
.unwrap();
let response = app.oneshot(request).await.unwrap();
assert_eq!(response.status(), StatusCode::OK);
}
}