blob: 807c3db716b06fe997f6a5afeaa3727150c232fd [file] [log] [blame]
use crate::http::shared::RequestDetails;
use crate::streaming::utils::random_id;
use axum::body::Body;
use axum::{
extract::ConnectInfo,
http::{Request, StatusCode},
middleware::Next,
response::Response,
};
use std::net::SocketAddr;
use tokio::time::Instant;
use tracing::{debug, error};
pub async fn request_diagnostics(
ConnectInfo(ip_address): ConnectInfo<SocketAddr>,
mut request: Request<Body>,
next: Next,
) -> Result<Response, StatusCode> {
let request_id = random_id::get_ulid();
let path_and_query = request
.uri()
.path_and_query()
.map(|p| p.as_str())
.unwrap_or("/");
debug!(
"Processing a request {} {} with ID: {request_id} from client with IP address: {ip_address}...",
request.method(),
path_and_query,
);
request.extensions_mut().insert(RequestDetails {
request_id,
ip_address,
});
let now = Instant::now();
let result = Ok(next.run(request).await);
if let Ok(response) = &result {
let status = response.status();
if status >= StatusCode::BAD_REQUEST {
error!("Returning an invalid status code: {status}, IP address: {ip_address}, request ID: {request_id}");
}
}
let elapsed = now.elapsed();
debug!(
"Processed a request with ID: {request_id} from client with IP address: {ip_address} in {} ms.",
elapsed.as_millis()
);
result
}