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) } }