1 use std::iter::FromIterator;
2 
3 use {HeaderName, HeaderValue};
4 use util::FlatCsv;
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, Header)]
37 pub struct AccessControlRequestHeaders(FlatCsv);
38 
39 impl AccessControlRequestHeaders {
40     /// Returns an iterator over `HeaderName`s contained within.
iter<'a>(&'a self) -> impl Iterator<Item = HeaderName> + 'a41     pub fn iter<'a>(&'a self) -> impl Iterator<Item = HeaderName> + 'a {
42         self
43             .0
44             .iter()
45             .filter_map(|s| {
46                 s.parse().ok()
47             })
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
57             .into_iter()
58             .map(HeaderValue::from)
59             .collect();
60         AccessControlRequestHeaders(flat)
61     }
62 }
63 
64 #[cfg(test)]
65 mod tests {
66     use super::*;
67     use super::super::{test_decode, test_encode};
68 
69     #[test]
iter()70     fn iter() {
71         let req_headers = test_decode::<AccessControlRequestHeaders>(
72             &["foo, bar"]
73         ).unwrap();
74 
75         let as_vec = req_headers.iter().collect::<Vec<_>>();
76         assert_eq!(as_vec.len(), 2);
77         assert_eq!(as_vec[0], "foo");
78         assert_eq!(as_vec[1], "bar");
79     }
80 
81     #[test]
from_iter()82     fn from_iter() {
83         let req_headers: AccessControlRequestHeaders = vec![
84             ::http::header::CACHE_CONTROL,
85             ::http::header::IF_RANGE,
86         ].into_iter().collect();
87 
88         let headers = test_encode(req_headers);
89         assert_eq!(headers["access-control-request-headers"], "cache-control, if-range");
90     }
91 }
92 
93