blob: a30a7e37c70cc673dff9544b3c6f0cac8439f092 [file] [log] [blame]
/* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
use crate::http::http_server::CompioSocketAddr;
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::time::Instant;
use tracing::{debug, error};
pub async fn request_diagnostics(
ConnectInfo(ip_address): ConnectInfo<CompioSocketAddr>,
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("/");
let ip_address = ip_address.0;
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::NOT_FOUND && 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
}