|
19 | 19 | //! } |
20 | 20 | //! ``` |
21 | 21 | use std::fmt::{self, Debug, Formatter}; |
22 | | - |
| 22 | +use tracing::Instrument; |
23 | 23 | use ulid::Ulid; |
24 | 24 |
|
25 | | -use salvo_core::http::{Request, Response, header::HeaderName}; |
| 25 | +use salvo_core::http::{HeaderValue, Request, Response, header::HeaderName}; |
26 | 26 | use salvo_core::{Depot, FlowCtrl, Handler, async_trait}; |
27 | 27 |
|
28 | 28 | /// Key for incoming flash messages in depot. |
@@ -92,6 +92,11 @@ impl RequestId { |
92 | 92 | self.generator = Box::new(generator); |
93 | 93 | self |
94 | 94 | } |
| 95 | + |
| 96 | + fn generate_id(&self, req: &mut Request, depot: &mut Depot) -> HeaderValue { |
| 97 | + let id = self.generator.generate(req, depot); |
| 98 | + HeaderValue::from_str(&id).expect("invalid header value") |
| 99 | + } |
95 | 100 | } |
96 | 101 |
|
97 | 102 | impl Default for RequestId { |
@@ -137,14 +142,34 @@ impl Handler for RequestId { |
137 | 142 | &self, |
138 | 143 | req: &mut Request, |
139 | 144 | depot: &mut Depot, |
140 | | - _res: &mut Response, |
141 | | - _ctrl: &mut FlowCtrl, |
| 145 | + res: &mut Response, |
| 146 | + ctrl: &mut FlowCtrl, |
142 | 147 | ) { |
143 | | - if !self.overwrite && req.headers().contains_key(&self.header_name) { |
144 | | - return; |
| 148 | + let request_id = match req.headers().get(&self.header_name) { |
| 149 | + None => self.generate_id(req, depot), |
| 150 | + Some(value) => { |
| 151 | + if self.overwrite { |
| 152 | + self.generate_id(req, depot) |
| 153 | + } else { |
| 154 | + value.clone() |
| 155 | + } |
| 156 | + } |
| 157 | + }; |
| 158 | + |
| 159 | + let _ = req.add_header(self.header_name.clone(), &request_id, false); |
| 160 | + |
| 161 | + let span = tracing::info_span!("request", ?request_id); |
| 162 | + |
| 163 | + res.headers_mut() |
| 164 | + .insert(self.header_name.clone(), request_id.clone()); |
| 165 | + |
| 166 | + depot.insert(REQUEST_ID_KEY, request_id); |
| 167 | + |
| 168 | + |
| 169 | + async move { |
| 170 | + ctrl.call_next(req, depot, res).await; |
145 | 171 | } |
146 | | - let id = self.generator.generate(req, depot); |
147 | | - let _ = req.add_header(self.header_name.clone(), &id, true); |
148 | | - depot.insert(REQUEST_ID_KEY, id); |
| 172 | + .instrument(span) |
| 173 | + .await; |
149 | 174 | } |
150 | 175 | } |
0 commit comments