Skip to main content

leyline/core/request/
debug.rs

1use 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}