1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68
use std::iter::FromIterator;
use http::Method;
use util::FlatCsv;
/// `Allow` header, defined in [RFC7231](http://tools.ietf.org/html/rfc7231#section-7.4.1)
///
/// The `Allow` header field lists the set of methods advertised as
/// supported by the target resource. The purpose of this field is
/// strictly to inform the recipient of valid request methods associated
/// with the resource.
///
/// # ABNF
///
/// ```text
/// Allow = #method
/// ```
///
/// # Example values
/// * `GET, HEAD, PUT`
/// * `OPTIONS, GET, PUT, POST, DELETE, HEAD, TRACE, CONNECT, PATCH, fOObAr`
/// * ``
///
/// # Examples
///
/// ```
/// # extern crate headers;
/// extern crate http;
/// use headers::Allow;
/// use http::Method;
///
/// let allow = vec![Method::GET, Method::POST]
/// .into_iter()
/// .collect::<Allow>();
/// ```
#[derive(Clone, Debug, PartialEq)]
pub struct Allow(FlatCsv);
derive_header! {
Allow(_),
name: ALLOW
}
impl Allow {
/// Returns an iterator over `Method`s contained within.
pub fn iter<'a>(&'a self) -> impl Iterator<Item = Method> + 'a {
self.0.iter().filter_map(|s| s.parse().ok())
}
}
impl FromIterator<Method> for Allow {
fn from_iter<I>(iter: I) -> Self
where
I: IntoIterator<Item = Method>,
{
let flat = iter
.into_iter()
.map(|method| {
method
.as_str()
.parse::<::HeaderValue>()
.expect("Method is a valid HeaderValue")
})
.collect();
Allow(flat)
}
}