headers_ext/common/
access_control_request_headers.rs1use std::iter::FromIterator;
2
3use {HeaderName, HeaderValue};
4use util::FlatCsv;
5
6#[derive(Clone, Debug, Header)]
37pub struct AccessControlRequestHeaders(FlatCsv);
38
39impl AccessControlRequestHeaders {
40 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
51impl FromIterator<HeaderName> for AccessControlRequestHeaders {
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)]
65mod tests {
66 use super::*;
67 use super::super::{test_decode, test_encode};
68
69 #[test]
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]
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