Skip to main content

rama_http_headers/common/
access_control_request_headers.rs

1use rama_http_types::HeaderName;
2
3derive_non_empty_flat_csv_header! {
4    #[header(name = ACCESS_CONTROL_REQUEST_HEADERS, sep = Comma)]
5    #[derive(Clone, Debug)]
6    /// `Access-Control-Request-Headers` header, as defined on
7    /// [mdn](https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Headers/Access-Control-Request-Headers).
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    /// # fn main() {
26    /// use rama_utils::collections::non_empty_vec;
27    /// use rama_http_types::header::{CONTENT_LENGTH, ETAG};
28    /// use rama_http_headers::AccessControlRequestHeaders;
29    ///
30    /// let expose = AccessControlRequestHeaders(
31    ///     non_empty_vec![CONTENT_LENGTH, ETAG],
32    /// );
33    /// # }
34    /// ```
35    pub struct AccessControlRequestHeaders(pub NonEmptyVec<HeaderName>);
36}
37
38#[cfg(test)]
39mod tests {
40    use super::super::{test_decode, test_encode};
41    use super::*;
42    use rama_utils::collections::non_empty_vec;
43
44    #[test]
45    fn decode_header_single() {
46        let AccessControlRequestHeaders(allow_headers) = test_decode(&["foo, bar"]).unwrap();
47
48        assert_eq!(allow_headers.len(), 2);
49        assert_eq!(allow_headers[0], "foo");
50        assert_eq!(allow_headers[1], "bar");
51    }
52
53    #[test]
54    fn decode_header_multi() {
55        let AccessControlRequestHeaders(allow_headers) = test_decode(&["foo, bar", "baz"]).unwrap();
56
57        assert_eq!(allow_headers.len(), 3);
58        assert_eq!(allow_headers[0], "foo");
59        assert_eq!(allow_headers[1], "bar");
60        assert_eq!(allow_headers[2], "baz");
61    }
62
63    #[test]
64    fn encode() {
65        let allow = AccessControlRequestHeaders(non_empty_vec![
66            ::rama_http_types::header::CACHE_CONTROL,
67            ::rama_http_types::header::IF_RANGE,
68        ]);
69
70        let headers = test_encode(allow);
71        assert_eq!(
72            headers["access-control-request-headers"],
73            "cache-control, if-range"
74        );
75    }
76
77    #[test]
78    fn decode_with_empty_header_value() {
79        assert!(test_decode::<AccessControlRequestHeaders>(&[""]).is_none());
80    }
81
82    #[test]
83    fn decode_with_no_headers() {
84        assert!(test_decode::<AccessControlRequestHeaders>(&[]).is_none());
85    }
86
87    #[test]
88    fn decode_with_invalid_value_str() {
89        assert!(test_decode::<AccessControlRequestHeaders>(&["foo foo, bar"]).is_none());
90    }
91}