Skip to main content

karbon_framework/http/middleware/
request_id.rs

1use axum::{extract::Request, middleware::Next, response::Response};
2use axum::http::HeaderValue;
3
4/// Middleware that adds a unique X-Request-Id header to every request/response.
5/// If the client sends one, it is preserved. Otherwise a new UUID is generated.
6pub async fn request_id(mut request: Request, next: Next) -> Response {
7    let id = match request.headers().get("x-request-id") {
8        Some(existing) => existing.clone(),
9        None => {
10            let id = uuid::Uuid::new_v4().to_string();
11            // UUID hyphenated format is always valid ASCII, safe to unwrap
12            let val = HeaderValue::from_str(&id).expect("UUID is always valid ASCII");
13            request.headers_mut().insert("x-request-id", val.clone());
14            val
15        }
16    };
17
18    let mut response = next.run(request).await;
19    response.headers_mut().insert("x-request-id", id);
20    response
21}