Skip to content

Commit c6a8a63

Browse files
mattwilkinsonnseanmonstar
authored andcommitted
add try_from for AccessControlAllowOrigin
1 parent c207372 commit c6a8a63

File tree

1 file changed

+32
-0
lines changed

1 file changed

+32
-0
lines changed

src/common/access_control_allow_origin.rs

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
use std::convert::TryFrom;
2+
13
use super::origin::Origin;
24
use util::{IterExt, TryFromValues};
35
use HeaderValue;
@@ -25,9 +27,11 @@ use HeaderValue;
2527
/// ```
2628
/// # extern crate headers;
2729
/// use headers::AccessControlAllowOrigin;
30+
/// use std::convert::TryFrom;
2831
///
2932
/// let any_origin = AccessControlAllowOrigin::ANY;
3033
/// let null_origin = AccessControlAllowOrigin::NULL;
34+
/// let origin = AccessControlAllowOrigin::try_from("http://web-platform.test:8000".to_string());
3135
/// ```
3236
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
3337
pub struct AccessControlAllowOrigin(OriginOrAny);
@@ -60,6 +64,16 @@ impl AccessControlAllowOrigin {
6064
}
6165
}
6266

67+
impl TryFrom<String> for AccessControlAllowOrigin {
68+
type Error = ::Error;
69+
70+
fn try_from(s: String) -> Result<Self, ::Error> {
71+
let header_value = HeaderValue::from_str(&s).map_err(|_| headers_core::Error::invalid())?;
72+
let origin = OriginOrAny::try_from_values(&mut vec![header_value].iter())?;
73+
Ok(Self(origin))
74+
}
75+
}
76+
6377
impl TryFromValues for OriginOrAny {
6478
fn try_from_values<'i, I>(values: &mut I) -> Result<Self, ::Error>
6579
where
@@ -89,12 +103,14 @@ impl<'a> From<&'a OriginOrAny> for HeaderValue {
89103

90104
#[cfg(test)]
91105
mod tests {
106+
92107
use super::super::{test_decode, test_encode};
93108
use super::*;
94109

95110
#[test]
96111
fn origin() {
97112
let s = "http://web-platform.test:8000";
113+
98114
let allow_origin = test_decode::<AccessControlAllowOrigin>(&[s]).unwrap();
99115
{
100116
let origin = allow_origin.origin().unwrap();
@@ -107,6 +123,22 @@ mod tests {
107123
assert_eq!(headers["access-control-allow-origin"], s);
108124
}
109125

126+
#[test]
127+
fn try_from_origin() {
128+
let s = "http://web-platform.test:8000";
129+
130+
let allow_origin = AccessControlAllowOrigin::try_from(s.to_string()).unwrap();
131+
{
132+
let origin = allow_origin.origin().unwrap();
133+
assert_eq!(origin.scheme(), "http");
134+
assert_eq!(origin.hostname(), "web-platform.test");
135+
assert_eq!(origin.port(), Some(8000));
136+
}
137+
138+
let headers = test_encode(allow_origin);
139+
assert_eq!(headers["access-control-allow-origin"], s);
140+
}
141+
110142
#[test]
111143
fn any() {
112144
let allow_origin = test_decode::<AccessControlAllowOrigin>(&["*"]).unwrap();

0 commit comments

Comments
 (0)