use crate::Error;
use percent_encoding::{AsciiSet, CONTROLS, percent_decode, percent_encode};
use std::borrow::Cow;
pub(crate) fn decode_name_value<'a>(
name: &'a str,
val: &'a str,
) -> crate::Result<(Cow<'a, str>, Cow<'a, str>)> {
Ok((decode(name)?, decode(val)?))
}
fn decode(value: &str) -> crate::Result<Cow<'_, str>> {
percent_decode(value.as_bytes())
.decode_utf8()
.map_err(|_| Error::PercentDecodeError)
}
const FORBIDDEN_VALUE: &AsciiSet = &CONTROLS.add(b' ').add(b'"').add(b',').add(b';').add(b'\\');
const FORBIDDEN_NAME: &AsciiSet = &FORBIDDEN_VALUE
.add(b'\t')
.add(b'(')
.add(b')')
.add(b'<')
.add(b'>')
.add(b'@')
.add(b':')
.add(b'/')
.add(b'[')
.add(b']')
.add(b'?')
.add(b'=')
.add(b'{')
.add(b'}');
pub fn encode_name(string: &str) -> impl std::fmt::Display + '_ {
percent_encode(string.as_bytes(), FORBIDDEN_NAME)
}
pub fn encode_value(string: &str) -> impl std::fmt::Display + '_ {
percent_encode(string.as_bytes(), FORBIDDEN_VALUE)
}