@@ -31,41 +31,70 @@ use header::parsing::from_one_raw_str;
31
31
/// );
32
32
/// ```
33
33
34
- #[ derive( Clone , Debug ) ]
35
- pub struct Origin {
36
- /// The scheme, such as http or https
37
- scheme : Cow < ' static , str > ,
38
- /// The host, such as Host{hostname: "hyper.rs".to_owned(), port: None}
39
- host : Host ,
34
+ #[ derive( PartialEq , Clone , Debug ) ]
35
+ pub struct Origin ( OriginOrNull ) ;
36
+
37
+ #[ derive( PartialEq , Clone , Debug ) ]
38
+ enum OriginOrNull {
39
+ Origin {
40
+ /// The scheme, such as http or https
41
+ scheme : Cow < ' static , str > ,
42
+ /// The host, such as Host{hostname: "hyper.rs".to_owned(), port: None}
43
+ host : Host ,
44
+ } ,
45
+ Null ,
40
46
}
41
47
42
48
impl Origin {
43
49
/// Creates a new `Origin` header.
44
50
pub fn new < S : Into < Cow < ' static , str > > , H : Into < Cow < ' static , str > > > ( scheme : S , hostname : H , port : Option < u16 > ) -> Origin {
45
- Origin {
51
+ Origin ( OriginOrNull :: Origin {
46
52
scheme : scheme. into ( ) ,
47
53
host : Host :: new ( hostname, port) ,
54
+ } )
55
+ }
56
+
57
+ /// Creates a `Null` `Origin` header.
58
+ pub fn null ( ) -> Origin {
59
+ Origin ( OriginOrNull :: Null )
60
+ }
61
+
62
+ /// Checks if `Origin` is `Null`.
63
+ pub fn is_null ( & self ) -> bool {
64
+ match self {
65
+ & Origin ( OriginOrNull :: Null ) => true ,
66
+ _ => false ,
48
67
}
49
68
}
50
69
51
70
/// The scheme, such as http or https
52
71
/// ```
53
72
/// use hyper::header::Origin;
54
73
/// let origin = Origin::new("https", "foo.com", Some(443));
55
- /// assert_eq!(origin.scheme(), "https");
74
+ /// assert_eq!(origin.scheme(), Some( "https") );
56
75
/// ```
57
- pub fn scheme ( & self ) -> & str {
58
- & ( self . scheme )
76
+ #[ allow( unused_variables) ]
77
+ // Variable `host` is considered unused, although there does not seem to be a way to omit it here.
78
+ pub fn scheme ( & self ) -> Option < & str > {
79
+ match self {
80
+ & Origin ( OriginOrNull :: Origin { ref scheme, ref host } ) => Some ( & scheme) ,
81
+ _ => None ,
82
+ }
59
83
}
60
84
61
85
/// The host, such as Host{hostname: "hyper.rs".to_owned(), port: None}
62
86
/// ```
63
87
/// use hyper::header::{Origin,Host};
64
88
/// let origin = Origin::new("https", "foo.com", Some(443));
65
- /// assert_eq!(origin.host(), &Host::new("foo.com", Some(443)));
89
+ /// assert_eq!(origin.host(), Some( &Host::new("foo.com", Some(443) )));
66
90
/// ```
67
- pub fn host ( & self ) -> & Host {
68
- & ( self . host )
91
+ #[ allow( unused_variables) ]
92
+ // Variable `scheme` is considered unused, although there does not seem to be a way to omit it here.
93
+ pub fn host ( & self ) -> Option < & Host > {
94
+ match self {
95
+ & Origin ( OriginOrNull :: Origin { ref scheme, ref host } ) => Some ( & host) ,
96
+ _ => None ,
97
+ }
69
98
}
70
99
}
71
100
@@ -104,26 +133,24 @@ impl FromStr for Origin {
104
133
s => Cow :: Owned ( s. to_owned ( ) )
105
134
} ;
106
135
107
- Ok ( Origin {
136
+ Ok ( Origin ( OriginOrNull :: Origin {
108
137
scheme : scheme,
109
138
host : host
110
- } )
139
+ } ) )
111
140
}
112
141
}
113
142
114
143
impl fmt:: Display for Origin {
115
144
fn fmt ( & self , f : & mut fmt:: Formatter ) -> fmt:: Result {
116
- write ! ( f, "{}://{}" , self . scheme, self . host)
117
- }
118
- }
119
-
120
- impl PartialEq for Origin {
121
- fn eq ( & self , other : & Origin ) -> bool {
122
- self . scheme == other. scheme && self . host == other. host
145
+ match self {
146
+ & Origin ( OriginOrNull :: Origin { ref scheme, ref host } ) => write ! ( f, "{}://{}" , scheme, host) ,
147
+ /// Serialized as "null" per ASCII serialization of an origin
148
+ /// https://html.spec.whatwg.org/multipage/browsers.html#ascii-serialisation-of-an-origin
149
+ _ => write ! ( f, "null" )
150
+ }
123
151
}
124
152
}
125
153
126
-
127
154
#[ cfg( test) ]
128
155
mod tests {
129
156
use super :: Origin ;
@@ -143,11 +170,11 @@ mod tests {
143
170
fn test_origin ( ) {
144
171
let origin : Origin = Header :: parse_header ( & vec ! [ b"http://foo.com" . to_vec( ) ] . into ( ) ) . unwrap ( ) ;
145
172
assert_eq ! ( & origin, & Origin :: new( "http" , "foo.com" , None ) ) ;
146
- assert_borrowed ! ( origin. scheme) ;
173
+ assert_borrowed ! ( origin. scheme( ) . unwrap ( ) . into ( ) ) ;
147
174
148
175
let origin : Origin = Header :: parse_header ( & vec ! [ b"https://foo.com:443" . to_vec( ) ] . into ( ) ) . unwrap ( ) ;
149
176
assert_eq ! ( & origin, & Origin :: new( "https" , "foo.com" , Some ( 443 ) ) ) ;
150
- assert_borrowed ! ( origin. scheme) ;
177
+ assert_borrowed ! ( origin. scheme( ) . unwrap ( ) . into ( ) ) ;
151
178
}
152
179
}
153
180
0 commit comments