leyline/core/request/
debug.rs1use std::fmt;
2
3use http::HeaderValue;
4
5use super::RequestBuilder;
6use crate::trace::masked;
7use crate::util::redact;
8
9impl fmt::Debug for RequestBuilder {
10 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
11 f.debug_struct("RequestBuilder")
12 .field("method", &self.method)
13 .field("url", &redact(&self.url))
14 .field("query", &masked_query(&self.query_params))
15 .field(
16 "headers",
17 &masked(self.headers.iter().map(|(k, v)| (k.as_str(), shown(v)))),
18 )
19 .field("body", &self.body)
20 .field("preset", &self.preset)
21 .field("timeouts", &self.timeouts)
22 .field("retry_policy", &self.retry_policy)
23 .field("proxy", &self.proxy)
24 .field("redirect", &self.redirect)
25 .field("digest_auth", &self.digest_auth.as_ref().map(|_| "***"))
26 .field("compress", &self.compress)
27 .field("stream_response", &self.stream_response)
28 .field("header_order", &self.header_order)
29 .field("error", &self.builder_error)
30 .finish_non_exhaustive()
31 }
32}
33
34fn shown(value: &HeaderValue) -> &[u8] {
35 if value.is_sensitive() {
36 b"***"
37 } else {
38 value.as_bytes()
39 }
40}
41
42fn masked_query(params: &[(String, String)]) -> Vec<(&str, &str)> {
43 params
44 .iter()
45 .map(|(name, _)| (name.as_str(), "***"))
46 .collect()
47}