Skip to main content

wae_https/middleware/
request_id.rs

1//! 请求 ID 中间件
2//!
3//! 为每个请求生成唯一的追踪 ID。
4
5use axum::{body::Body, extract::Request, http::Response, middleware::Next};
6use uuid::Uuid;
7
8/// 请求 ID 头名称
9pub const X_REQUEST_ID: &str = "x-request-id";
10
11/// 请求 ID 中间件层
12pub struct RequestIdLayer;
13
14impl RequestIdLayer {
15    /// 创建请求 ID 中间件
16    pub async fn middleware(request: Request, next: Next) -> Response<Body> {
17        let request_id = request
18            .headers()
19            .get(X_REQUEST_ID)
20            .and_then(|v| v.to_str().ok())
21            .map(|s| s.to_string())
22            .unwrap_or_else(|| Uuid::new_v4().to_string());
23
24        let mut response = next.run(request).await;
25        response.headers_mut().insert(X_REQUEST_ID, request_id.parse().unwrap());
26        response
27    }
28}