headers_ext/common/
access_control_expose_headers.rs1use std::iter::FromIterator;
2
3use {HeaderName, HeaderValue};
4use util::FlatCsv;
5
6#[derive(Clone, Debug, Header)]
36pub struct AccessControlExposeHeaders(FlatCsv);
37
38impl AccessControlExposeHeaders {
39 pub fn iter<'a>(&'a self) -> impl Iterator<Item = HeaderName> + 'a {
41 self
42 .0
43 .iter()
44 .filter_map(|s| {
45 s.parse().ok()
46 })
47 }
48}
49
50impl FromIterator<HeaderName> for AccessControlExposeHeaders {
51 fn from_iter<I>(iter: I) -> Self
52 where
53 I: IntoIterator<Item = HeaderName>,
54 {
55 let flat = iter
56 .into_iter()
57 .map(HeaderValue::from)
58 .collect();
59 AccessControlExposeHeaders(flat)
60 }
61}
62
63#[cfg(test)]
64mod tests {
65 use super::*;
66 use super::super::{test_decode, test_encode};
67
68 #[test]
69 fn iter() {
70 let expose_headers = test_decode::<AccessControlExposeHeaders>(
71 &["foo, bar"]
72 ).unwrap();
73
74 let as_vec = expose_headers.iter().collect::<Vec<_>>();
75 assert_eq!(as_vec.len(), 2);
76 assert_eq!(as_vec[0], "foo");
77 assert_eq!(as_vec[1], "bar");
78 }
79
80 #[test]
81 fn from_iter() {
82 let expose: AccessControlExposeHeaders = vec![
83 ::http::header::CACHE_CONTROL,
84 ::http::header::IF_RANGE,
85 ].into_iter().collect();
86
87 let headers = test_encode(expose);
88 assert_eq!(headers["access-control-expose-headers"], "cache-control, if-range");
89 }
90}
91