50 lines
1.6 KiB
Rust
50 lines
1.6 KiB
Rust
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::<RequestContext>().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
|
|
}
|