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