use ::url::form_urlencoded;
use crate::{
FieldSanitizer,
NameMatchMode,
};
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct FormUrlEncodedSanitizer {
field_sanitizer: FieldSanitizer,
}
impl FormUrlEncodedSanitizer {
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_bytes(&self, form: &[u8], match_mode: NameMatchMode) -> String {
let mut serializer = form_urlencoded::Serializer::new(String::new());
for (key, value) in form_urlencoded::parse(form) {
let sanitized_value =
self.field_sanitizer
.sanitize_value(key.as_ref(), value.as_ref(), match_mode);
serializer.append_pair(key.as_ref(), sanitized_value.as_ref());
}
serializer.finish()
}
pub fn sanitize_str(&self, form: &str, match_mode: NameMatchMode) -> String {
self.sanitize_bytes(form.as_bytes(), match_mode)
}
}
impl Default for FormUrlEncodedSanitizer {
fn default() -> Self {
Self::new(FieldSanitizer::default())
}
}