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