use headers::{Header, HeaderName, HeaderValue};
mod challenge;
mod token68;
pub use challenge::*;
pub use token68::*;
#[derive(Debug, Clone)]
pub struct WWWAuthenticate {
pub challenges: Vec<Challenge>,
}
pub static WWW_AUTHENTICATE: HeaderName = HeaderName::from_static("www-authenticate");
impl Header for WWWAuthenticate {
#[inline]
fn name() -> &'static HeaderName {
&WWW_AUTHENTICATE
}
fn decode<'i, I>(values: &mut I) -> Result<Self, headers::Error>
where
Self: Sized,
I: Iterator<Item = &'i HeaderValue>,
{
let challenges = values
.map(|v| {
v.to_str()
.map_err(|_| headers::Error::invalid())
.and_then(|v| v.parse().map_err(|_| headers::Error::invalid()))
})
.collect::<Result<_, _>>()?;
Ok(Self { challenges })
}
fn encode<E: Extend<HeaderValue>>(&self, values: &mut E) {
values.extend(
self.challenges.iter().map(|c| unsafe {
HeaderValue::from_maybe_shared_unchecked(c.encode().into_bytes())
}),
)
}
}