Skip to main content

rust_webx_host/
request_id.rs

1//! Request ID middleware —injects a unique `x-request-id` header into every response.
2
3use rust_webx_core::error::Result;
4use rust_webx_core::http::IHttpContext;
5use rust_webx_core::middleware::IMiddleware;
6use std::ops::ControlFlow;
7use uuid::Uuid;
8
9/// Generates a UUID v4 request ID on each request and injects it into the response.
10pub struct RequestIdMiddleware;
11
12impl RequestIdMiddleware {
13    pub fn new() -> Self {
14        Self
15    }
16}
17
18impl Default for RequestIdMiddleware {
19    fn default() -> Self {
20        Self::new()
21    }
22}
23
24#[async_trait::async_trait]
25impl IMiddleware for RequestIdMiddleware {
26    async fn invoke(&self, ctx: &mut dyn IHttpContext) -> Result<ControlFlow<()>> {
27        let id = ctx
28            .request()
29            .header("x-request-id")
30            .map(|s| s.to_string())
31            .unwrap_or_else(|| Uuid::new_v4().to_string());
32        ctx.response_mut().set_header("x-request-id", &id);
33        Ok(ControlFlow::Continue(()))
34    }
35}