rama_http_headers/common/
cross_origin_resource_policy.rs1use rama_http_types::{HeaderName, HeaderValue};
2use rama_utils::macros::enums::enum_builder;
3
4use crate::util::{self, IterExt};
5use crate::{Error, HeaderDecode, HeaderEncode, TypedHeader};
6
7enum_builder! {
8 @String
40 pub enum CrossOriginResourcePolicy {
41 SameSite => "same-site",
44 SameOrigin => "same-origin",
46 CrossOrigin => "cross-origin",
49 }
50}
51
52impl TypedHeader for CrossOriginResourcePolicy {
53 fn name() -> &'static HeaderName {
54 &::rama_http_types::header::CROSS_ORIGIN_RESOURCE_POLICY
55 }
56}
57
58impl HeaderDecode for CrossOriginResourcePolicy {
59 fn decode<'i, I: Iterator<Item = &'i HeaderValue>>(values: &mut I) -> Result<Self, Error> {
60 values
64 .just_one()
65 .and_then(|v| v.to_str().ok())
66 .and_then(|s| Self::strict_parse(s.trim()))
67 .ok_or_else(Error::invalid)
68 }
69}
70
71impl HeaderEncode for CrossOriginResourcePolicy {
72 fn encode<E: Extend<HeaderValue>>(&self, values: &mut E) {
73 values.extend(::std::iter::once(util::fmt(self)));
74 }
75}
76
77#[cfg(test)]
78mod tests {
79 use super::super::{test_decode, test_encode};
80 use super::*;
81
82 #[test]
83 fn round_trip_same_site() {
84 let map = test_encode(CrossOriginResourcePolicy::SameSite);
85 let raw = map
86 .get(CrossOriginResourcePolicy::name())
87 .expect("set")
88 .to_str()
89 .unwrap()
90 .to_owned();
91 assert_eq!(raw, "same-site");
92 assert_eq!(
93 test_decode::<CrossOriginResourcePolicy>(&[raw.as_str()]),
94 Some(CrossOriginResourcePolicy::SameSite),
95 );
96 }
97
98 #[test]
99 fn round_trip_same_origin() {
100 assert_eq!(
101 test_decode::<CrossOriginResourcePolicy>(&["same-origin"]),
102 Some(CrossOriginResourcePolicy::SameOrigin),
103 );
104 }
105
106 #[test]
107 fn round_trip_cross_origin() {
108 assert_eq!(
109 test_decode::<CrossOriginResourcePolicy>(&["cross-origin"]),
110 Some(CrossOriginResourcePolicy::CrossOrigin),
111 );
112 }
113
114 #[test]
115 fn parser_case_insensitive() {
116 assert_eq!(
117 test_decode::<CrossOriginResourcePolicy>(&["Same-Origin"]),
118 Some(CrossOriginResourcePolicy::SameOrigin),
119 );
120 assert_eq!(
121 test_decode::<CrossOriginResourcePolicy>(&["CROSS-ORIGIN"]),
122 Some(CrossOriginResourcePolicy::CrossOrigin),
123 );
124 }
125
126 #[test]
127 fn parser_tolerates_surrounding_whitespace() {
128 assert_eq!(
129 test_decode::<CrossOriginResourcePolicy>(&[" same-origin "]),
130 Some(CrossOriginResourcePolicy::SameOrigin),
131 );
132 }
133
134 #[test]
135 fn parser_rejects_unknown_token() {
136 assert_eq!(test_decode::<CrossOriginResourcePolicy>(&["nope"]), None);
139 }
140
141 #[test]
142 fn parser_rejects_empty_value() {
143 assert_eq!(test_decode::<CrossOriginResourcePolicy>(&[""]), None);
144 }
145}