use std::collections::BTreeMap;
use http::{
HeaderMap,
HeaderName,
HeaderValue,
};
use crate::{
FieldSanitizer,
NameMatchMode,
};
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct HttpHeaderSanitizer {
field_sanitizer: FieldSanitizer,
}
impl HttpHeaderSanitizer {
pub const fn new(field_sanitizer: FieldSanitizer) -> Self {
Self { field_sanitizer }
}
pub const fn field_sanitizer(&self) -> &FieldSanitizer {
&self.field_sanitizer
}
pub fn field_sanitizer_mut(&mut self) -> &mut FieldSanitizer {
&mut self.field_sanitizer
}
pub fn sanitize_value(
&self,
name: &HeaderName,
value: &HeaderValue,
match_mode: NameMatchMode,
) -> String {
let value = value.to_str().unwrap_or("<non-utf8>");
self.field_sanitizer
.sanitize_value(name.as_str(), value, match_mode)
.into_owned()
}
pub fn sanitize_pair(
&self,
name: &HeaderName,
value: &HeaderValue,
match_mode: NameMatchMode,
) -> (String, String) {
(
name.to_string(),
self.sanitize_value(name, value, match_mode),
)
}
pub fn sanitize_headers(
&self,
headers: &HeaderMap,
match_mode: NameMatchMode,
) -> BTreeMap<String, Vec<String>> {
let mut result = BTreeMap::<String, Vec<String>>::new();
for (name, value) in headers {
result
.entry(name.as_str().to_string())
.or_default()
.push(self.sanitize_value(name, value, match_mode));
}
result
}
}
impl Default for HttpHeaderSanitizer {
fn default() -> Self {
Self::new(FieldSanitizer::default())
}
}