use axum::{ extract::Request, http::{header::HeaderName, HeaderValue}, middleware::Next, response::Response, }; use crate::{ api_response::API_VERSION, request_context::{resolve_request_id, RequestContext, X_REQUEST_ID_HEADER}, }; pub const API_VERSION_HEADER: &str = "x-api-version"; pub const RESPONSE_TIME_HEADER: &str = "x-response-time-ms"; pub const ROUTE_VERSION_HEADER: &str = "x-route-version"; pub async fn propagate_request_id_header(request: Request, next: Next) -> Response { let request_id = resolve_request_id(&request); let request_context = request.extensions().get::().cloned(); let mut response = next.run(request).await; if let Some(request_id) = request_id { if let Ok(header_value) = HeaderValue::from_str(&request_id) { response .headers_mut() .insert(HeaderName::from_static(X_REQUEST_ID_HEADER), header_value); } } if let Ok(header_value) = HeaderValue::from_str(API_VERSION) { response.headers_mut().insert( HeaderName::from_static(API_VERSION_HEADER), header_value.clone(), ); response .headers_mut() .insert(HeaderName::from_static(ROUTE_VERSION_HEADER), header_value); } if let Some(request_context) = request_context { if let Ok(header_value) = HeaderValue::from_str(&request_context.elapsed().to_string()) { response .headers_mut() .insert(HeaderName::from_static(RESPONSE_TIME_HEADER), header_value); } } response }