1
1
//! Client Responses
2
2
use std:: io:: { self , Read } ;
3
3
4
+ use url:: Url ;
5
+
4
6
use header;
5
7
use net:: NetworkStream ;
6
8
use http:: { self , RawStatus , ResponseHead , HttpMessage } ;
9
+ use http:: h1:: Http11Message ;
7
10
use status;
8
11
use version;
9
- use http:: h1:: Http11Message ;
10
12
11
13
/// A response for a client request to a remote server.
12
14
#[ derive( Debug ) ]
@@ -17,6 +19,8 @@ pub struct Response {
17
19
pub headers : header:: Headers ,
18
20
/// The HTTP version of this response from the server.
19
21
pub version : version:: HttpVersion ,
22
+ /// The final URL of this response.
23
+ pub url : Url ,
20
24
status_raw : RawStatus ,
21
25
message : Box < HttpMessage > ,
22
26
is_drained : bool ,
@@ -25,13 +29,13 @@ pub struct Response {
25
29
impl Response {
26
30
27
31
/// Creates a new response from a server.
28
- pub fn new ( stream : Box < NetworkStream + Send > ) -> :: Result < Response > {
32
+ pub fn new ( url : Url , stream : Box < NetworkStream + Send > ) -> :: Result < Response > {
29
33
trace ! ( "Response::new" ) ;
30
- Response :: with_message ( Box :: new ( Http11Message :: with_stream ( stream) ) )
34
+ Response :: with_message ( url , Box :: new ( Http11Message :: with_stream ( stream) ) )
31
35
}
32
36
33
37
/// Creates a new response received from the server on the given `HttpMessage`.
34
- pub fn with_message ( mut message : Box < HttpMessage > ) -> :: Result < Response > {
38
+ pub fn with_message ( url : Url , mut message : Box < HttpMessage > ) -> :: Result < Response > {
35
39
trace ! ( "Response::with_message" ) ;
36
40
let ResponseHead { headers, raw_status, version } = try!( message. get_incoming ( ) ) ;
37
41
let status = status:: StatusCode :: from_u16 ( raw_status. 0 ) ;
@@ -42,6 +46,7 @@ impl Response {
42
46
status : status,
43
47
version : version,
44
48
headers : headers,
49
+ url : url,
45
50
message : message,
46
51
status_raw : raw_status,
47
52
is_drained : false ,
@@ -89,6 +94,8 @@ impl Drop for Response {
89
94
mod tests {
90
95
use std:: io:: { self , Read } ;
91
96
97
+ use url:: Url ;
98
+
92
99
use header:: TransferEncoding ;
93
100
use header:: Encoding ;
94
101
use http:: HttpMessage ;
@@ -131,7 +138,8 @@ mod tests {
131
138
\r \n "
132
139
) ;
133
140
134
- let res = Response :: new ( Box :: new ( stream) ) . unwrap ( ) ;
141
+ let url = Url :: parse ( "http://hyper.rs" ) . unwrap ( ) ;
142
+ let res = Response :: new ( url, Box :: new ( stream) ) . unwrap ( ) ;
135
143
136
144
// The status line is correct?
137
145
assert_eq ! ( res. status, status:: StatusCode :: Ok ) ;
@@ -162,7 +170,8 @@ mod tests {
162
170
\r \n "
163
171
) ;
164
172
165
- let res = Response :: new ( Box :: new ( stream) ) . unwrap ( ) ;
173
+ let url = Url :: parse ( "http://hyper.rs" ) . unwrap ( ) ;
174
+ let res = Response :: new ( url, Box :: new ( stream) ) . unwrap ( ) ;
166
175
167
176
assert ! ( read_to_string( res) . is_err( ) ) ;
168
177
}
@@ -181,7 +190,8 @@ mod tests {
181
190
\r \n "
182
191
) ;
183
192
184
- let res = Response :: new ( Box :: new ( stream) ) . unwrap ( ) ;
193
+ let url = Url :: parse ( "http://hyper.rs" ) . unwrap ( ) ;
194
+ let res = Response :: new ( url, Box :: new ( stream) ) . unwrap ( ) ;
185
195
186
196
assert ! ( read_to_string( res) . is_err( ) ) ;
187
197
}
@@ -200,7 +210,8 @@ mod tests {
200
210
\r \n "
201
211
) ;
202
212
203
- let res = Response :: new ( Box :: new ( stream) ) . unwrap ( ) ;
213
+ let url = Url :: parse ( "http://hyper.rs" ) . unwrap ( ) ;
214
+ let res = Response :: new ( url, Box :: new ( stream) ) . unwrap ( ) ;
204
215
205
216
assert_eq ! ( read_to_string( res) . unwrap( ) , "1" . to_owned( ) ) ;
206
217
}
0 commit comments