1
- use std:: fmt;
1
+ use std:: fmt:: { self , Display } ;
2
2
use std:: str;
3
3
4
4
use url:: Url ;
5
- use header;
5
+ use header:: { Header , HeaderFormat } ;
6
6
7
7
/// The `Access-Control-Allow-Origin` response header,
8
- /// part of [CORS](www.w3.org/TR/cors/#access-control-allow-origin-response-header)
8
+ /// part of [CORS](http:// www.w3.org/TR/cors/#access-control-allow-origin-response-header)
9
9
///
10
10
/// The `Access-Control-Allow-Origin` header indicates whether a resource
11
11
/// can be shared based by returning the value of the Origin request header,
@@ -15,45 +15,60 @@ use header;
15
15
/// ```plain
16
16
/// Access-Control-Allow-Origin = "Access-Control-Allow-Origin" ":" origin-list-or-null | "*"
17
17
/// ```
18
- // FIXME: The documentation says differently (missing "null" value, "*" not used in practice,
19
- // orgin list no list but single value)
18
+ ///
19
+ /// # Example values
20
+ /// * `null`
21
+ /// * `*`
22
+ /// * `http://google.com/`
20
23
#[ derive( Clone , PartialEq , Debug ) ]
21
24
pub enum AccessControlAllowOrigin {
22
25
/// Allow all origins
23
26
Any ,
27
+ /// A hidden origin
28
+ Null ,
24
29
/// Allow one particular origin
25
30
Value ( Url ) ,
26
31
}
27
32
28
- impl header :: Header for AccessControlAllowOrigin {
33
+ impl Header for AccessControlAllowOrigin {
29
34
fn header_name ( ) -> & ' static str {
30
35
"Access-Control-Allow-Origin"
31
36
}
32
37
33
38
fn parse_header ( raw : & [ Vec < u8 > ] ) -> Option < AccessControlAllowOrigin > {
34
39
if raw. len ( ) == 1 {
35
- match str:: from_utf8 ( unsafe { & raw . get_unchecked ( 0 ) [ ..] } ) {
36
- Ok ( s) => {
37
- if s == "*" {
38
- Some ( AccessControlAllowOrigin :: Any )
39
- } else {
40
- Url :: parse ( s) . ok ( ) . map (
41
- |url| AccessControlAllowOrigin :: Value ( url) )
42
- }
43
- } ,
44
- _ => return None ,
40
+ match unsafe { & raw . get_unchecked ( 0 ) [ ..] } {
41
+ b"*" => Some ( AccessControlAllowOrigin :: Any ) ,
42
+ b"null" => Some ( AccessControlAllowOrigin :: Null ) ,
43
+ r => if let Ok ( s) = str:: from_utf8 ( r) {
44
+ Url :: parse ( s) . ok ( ) . map ( |url| AccessControlAllowOrigin :: Value ( url) )
45
+ } else { None }
45
46
}
46
- } else {
47
- return None ;
48
- }
47
+ } else { None }
49
48
}
50
49
}
51
50
52
- impl header :: HeaderFormat for AccessControlAllowOrigin {
51
+ impl HeaderFormat for AccessControlAllowOrigin {
53
52
fn fmt_header ( & self , f : & mut fmt:: Formatter ) -> fmt:: Result {
54
53
match * self {
55
54
AccessControlAllowOrigin :: Any => f. write_str ( "*" ) ,
56
- AccessControlAllowOrigin :: Value ( ref url) => fmt:: Display :: fmt ( url, f)
55
+ AccessControlAllowOrigin :: Null => f. write_str ( "null" ) ,
56
+ AccessControlAllowOrigin :: Value ( ref url) => Display :: fmt ( url, f) ,
57
57
}
58
58
}
59
59
}
60
+
61
+ impl Display for AccessControlAllowOrigin {
62
+ fn fmt ( & self , f : & mut :: std:: fmt:: Formatter ) -> :: std:: fmt:: Result {
63
+ self . fmt_header ( f)
64
+ }
65
+ }
66
+
67
+ #[ cfg( test) ]
68
+ mod test_access_control_allow_orgin {
69
+ use header:: * ;
70
+ use super :: AccessControlAllowOrigin as HeaderField ;
71
+ test_header ! ( test1, vec![ b"null" ] ) ;
72
+ test_header ! ( test2, vec![ b"*" ] ) ;
73
+ test_header ! ( test3, vec![ b"http://google.com/" ] ) ;
74
+ }
0 commit comments