use axum::{
body::{Body, Bytes},
extract::Request,
http::StatusCode,
middleware::Next,
response::{IntoResponse, Response},
};
use http_body_util::BodyExt;
async fn print_request_response(
req: Request,
next: Next,
) -> Result<impl IntoResponse, (StatusCode, String)> {
// Process request
let (parts, body) = req.into_parts();
let bytes = body.collect().await
.map_err(|e| (StatusCode::BAD_REQUEST, e.to_string()))?
.to_bytes();
tracing::debug!("request body = {:?}", std::str::from_utf8(&bytes));
let req = Request::from_parts(parts, Body::from(bytes));
// Call handler
let res = next.run(req).await;
// Process response
let (parts, body) = res.into_parts();
let bytes = body.collect().await
.map_err(|e| (StatusCode::BAD_REQUEST, e.to_string()))?
.to_bytes();
tracing::debug!("response body = {:?}", std::str::from_utf8(&bytes));
let res = Response::from_parts(parts, Body::from(bytes));
Ok(res)
}