headers_ext/common/
access_control_allow_headers.rs1use std::iter::FromIterator;
2
3use {HeaderName, HeaderValue};
4use util::FlatCsv;
5
6#[derive(Clone, Debug, PartialEq, Header)]
35pub struct AccessControlAllowHeaders(FlatCsv);
36
37impl AccessControlAllowHeaders {
38 pub fn iter<'a>(&'a self) -> impl Iterator<Item = HeaderName> + 'a {
40 self
41 .0
42 .iter()
43 .map(|s| {
44 s.parse().ok()
45 })
46 .take_while(|val| val.is_some())
47 .filter_map(|val| val)
48 }
49}
50
51impl FromIterator<HeaderName> for AccessControlAllowHeaders {
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 AccessControlAllowHeaders(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 allow_headers = test_decode::<AccessControlAllowHeaders>(
72 &["foo, bar"]
73 ).unwrap();
74
75 let as_vec = allow_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 allow: AccessControlAllowHeaders = vec![
84 ::http::header::CACHE_CONTROL,
85 ::http::header::IF_RANGE,
86 ].into_iter().collect();
87
88 let headers = test_encode(allow);
89 assert_eq!(headers["access-control-allow-headers"], "cache-control, if-range");
90 }
91
92 #[test]
93 fn test_with_invalid() {
94 let allow_headers = test_decode::<AccessControlAllowHeaders>(
95 &["foo foo, bar"]
96 ).unwrap();
97
98 assert!(allow_headers.iter().collect::<Vec<_>>().is_empty());
99 }
100}
101