1+ use std:: convert:: TryFrom ;
2+
13use super :: origin:: Origin ;
24use util:: { IterExt , TryFromValues } ;
35use 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 ) ]
3337pub 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+
6377impl 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) ]
91105mod 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