rama_http_headers/common/
access_control_request_headers.rs

1use std::iter::FromIterator;
2
3use rama_http_types::{HeaderName, HeaderValue};
4
5use crate::util::FlatCsv;
6
7/// `Access-Control-Request-Headers` header, part of
8/// [CORS](http://www.w3.org/TR/cors/#access-control-request-headers-request-header)
9///
10/// The `Access-Control-Request-Headers` header indicates which headers will
11/// be used in the actual request as part of the preflight request.
12/// during the actual request.
13///
14/// # ABNF
15///
16/// ```text
17/// Access-Control-Allow-Headers: "Access-Control-Allow-Headers" ":" #field-name
18/// ```
19///
20/// # Example values
21/// * `accept-language, date`
22///
23/// # Examples
24///
25/// ```
26/// # fn main() {
27/// use rama_http_types::header::{ACCEPT_LANGUAGE, DATE};
28/// use rama_http_headers::AccessControlRequestHeaders;
29///
30/// let req_headers = vec![ACCEPT_LANGUAGE, DATE]
31///     .into_iter()
32///     .collect::<AccessControlRequestHeaders>();
33/// # }
34/// ```
35#[derive(Clone, Debug)]
36pub struct AccessControlRequestHeaders(FlatCsv);
37
38derive_header! {
39    AccessControlRequestHeaders(_),
40    name: ACCESS_CONTROL_REQUEST_HEADERS
41}
42
43impl AccessControlRequestHeaders {
44    /// Returns an iterator over `HeaderName`s contained within.
45    pub fn iter(&self) -> impl Iterator<Item = HeaderName> + '_ {
46        self.0.iter().filter_map(|s| s.parse().ok())
47    }
48}
49
50impl FromIterator<HeaderName> for AccessControlRequestHeaders {
51    fn from_iter<I>(iter: I) -> Self
52    where
53        I: IntoIterator<Item = HeaderName>,
54    {
55        let flat = iter.into_iter().map(HeaderValue::from).collect();
56        AccessControlRequestHeaders(flat)
57    }
58}
59
60#[cfg(test)]
61mod tests {
62    use super::super::{test_decode, test_encode};
63    use super::*;
64
65    #[test]
66    fn iter() {
67        let req_headers = test_decode::<AccessControlRequestHeaders>(&["foo, bar"]).unwrap();
68
69        let as_vec = req_headers.iter().collect::<Vec<_>>();
70        assert_eq!(as_vec.len(), 2);
71        assert_eq!(as_vec[0], "foo");
72        assert_eq!(as_vec[1], "bar");
73    }
74
75    #[test]
76    fn from_iter() {
77        let req_headers: AccessControlRequestHeaders = vec![
78            ::rama_http_types::header::CACHE_CONTROL,
79            ::rama_http_types::header::IF_RANGE,
80        ]
81        .into_iter()
82        .collect();
83
84        let headers = test_encode(req_headers);
85        assert_eq!(
86            headers["access-control-request-headers"],
87            "cache-control, if-range"
88        );
89    }
90}