1 use std::iter::FromIterator;
2 
3 use util::FlatCsv;
4 use {HeaderName, HeaderValue};
5 
6 /// `Access-Control-Request-Headers` header, part of
7 /// [CORS](http://www.w3.org/TR/cors/#access-control-request-headers-request-header)
8 ///
9 /// The `Access-Control-Request-Headers` header indicates which headers will
10 /// be used in the actual request as part of the preflight request.
11 /// during the actual request.
12 ///
13 /// # ABNF
14 ///
15 /// ```text
16 /// Access-Control-Allow-Headers: "Access-Control-Allow-Headers" ":" #field-name
17 /// ```
18 ///
19 /// # Example values
20 /// * `accept-language, date`
21 ///
22 /// # Examples
23 ///
24 /// ```
25 /// # extern crate headers;
26 /// extern crate http;
27 /// # fn main() {
28 /// use http::header::{ACCEPT_LANGUAGE, DATE};
29 /// use headers::AccessControlRequestHeaders;
30 ///
31 /// let req_headers = vec![ACCEPT_LANGUAGE, DATE]
32 ///     .into_iter()
33 ///     .collect::<AccessControlRequestHeaders>();
34 /// # }
35 /// ```
36 #[derive(Clone, Debug)]
37 pub struct AccessControlRequestHeaders(FlatCsv);
38 
39 derive_header! {
40     AccessControlRequestHeaders(_),
41     name: ACCESS_CONTROL_REQUEST_HEADERS
42 }
43 
44 impl AccessControlRequestHeaders {
45     /// Returns an iterator over `HeaderName`s contained within.
iter<'a>(&'a self) -> impl Iterator<Item = HeaderName> + 'a46     pub fn iter<'a>(&'a self) -> impl Iterator<Item = HeaderName> + 'a {
47         self.0.iter().filter_map(|s| s.parse().ok())
48     }
49 }
50 
51 impl FromIterator<HeaderName> for AccessControlRequestHeaders {
from_iter<I>(iter: I) -> Self where I: IntoIterator<Item = HeaderName>,52     fn from_iter<I>(iter: I) -> Self
53     where
54         I: IntoIterator<Item = HeaderName>,
55     {
56         let flat = iter.into_iter().map(HeaderValue::from).collect();
57         AccessControlRequestHeaders(flat)
58     }
59 }
60 
61 #[cfg(test)]
62 mod tests {
63     use super::super::{test_decode, test_encode};
64     use super::*;
65 
66     #[test]
iter()67     fn iter() {
68         let req_headers = test_decode::<AccessControlRequestHeaders>(&["foo, bar"]).unwrap();
69 
70         let as_vec = req_headers.iter().collect::<Vec<_>>();
71         assert_eq!(as_vec.len(), 2);
72         assert_eq!(as_vec[0], "foo");
73         assert_eq!(as_vec[1], "bar");
74     }
75 
76     #[test]
from_iter()77     fn from_iter() {
78         let req_headers: AccessControlRequestHeaders =
79             vec![::http::header::CACHE_CONTROL, ::http::header::IF_RANGE]
80                 .into_iter()
81                 .collect();
82 
83         let headers = test_encode(req_headers);
84         assert_eq!(
85             headers["access-control-request-headers"],
86             "cache-control, if-range"
87         );
88     }
89 }
90