1
1
//! Client Responses
2
2
use std:: io:: { BufferedReader , IoResult } ;
3
- use std:: io:: net:: tcp:: TcpStream ;
4
3
5
4
use header:: { mod, ContentLength , TransferEncoding , Chunked } ;
5
+ use net:: { NetworkStream , HttpStream } ;
6
6
use rfc7230:: { read_status_line, HttpReader , SizedReader , ChunkedReader , EofReader } ;
7
7
use status;
8
8
use version;
9
9
use { HttpResult } ;
10
10
11
11
/// A response for a client request to a remote server.
12
- pub struct Response {
12
+ pub struct Response < S = HttpStream > {
13
13
/// The status from the server.
14
14
pub status : status:: StatusCode ,
15
15
/// The headers from the server.
16
16
pub headers : header:: Headers ,
17
17
/// The HTTP version of this response from the server.
18
18
pub version : version:: HttpVersion ,
19
- body : HttpReader < BufferedReader < TcpStream > > ,
19
+ body : HttpReader < BufferedReader < S > > ,
20
20
}
21
21
22
- impl Response {
22
+ impl < S : NetworkStream > Response < S > {
23
23
24
24
/// Creates a new response from a server.
25
- pub fn new ( tcp : TcpStream ) -> HttpResult < Response > {
26
- let mut tcp = BufferedReader :: new ( tcp ) ;
27
- let ( version, status) = try!( read_status_line ( & mut tcp ) ) ;
28
- let mut headers = try!( header:: Headers :: from_raw ( & mut tcp ) ) ;
25
+ pub fn new ( stream : S ) -> HttpResult < Response < S > > {
26
+ let mut stream = BufferedReader :: new ( stream ) ;
27
+ let ( version, status) = try!( read_status_line ( & mut stream ) ) ;
28
+ let mut headers = try!( header:: Headers :: from_raw ( & mut stream ) ) ;
29
29
30
30
debug ! ( "{} {}" , version, status) ;
31
31
debug ! ( "{}" , headers) ;
@@ -38,22 +38,22 @@ impl Response {
38
38
} ;
39
39
40
40
if codings. contains ( & Chunked ) {
41
- ChunkedReader ( tcp , None )
41
+ ChunkedReader ( stream , None )
42
42
} else {
43
- debug ! ( "not chucked . read till eof" ) ;
44
- EofReader ( tcp )
43
+ debug ! ( "not chuncked . read till eof" ) ;
44
+ EofReader ( stream )
45
45
}
46
46
}
47
47
None => unreachable ! ( )
48
48
}
49
49
} else if headers. has :: < ContentLength > ( ) {
50
50
match headers. get_ref :: < ContentLength > ( ) {
51
- Some ( & ContentLength ( len) ) => SizedReader ( tcp , len) ,
51
+ Some ( & ContentLength ( len) ) => SizedReader ( stream , len) ,
52
52
None => unreachable ! ( )
53
53
}
54
54
} else {
55
55
debug ! ( "neither Transfer-Encoding nor Content-Length" ) ;
56
- EofReader ( tcp )
56
+ EofReader ( stream )
57
57
} ;
58
58
59
59
Ok ( Response {
@@ -65,7 +65,8 @@ impl Response {
65
65
}
66
66
}
67
67
68
- impl Reader for Response {
68
+ impl < S : NetworkStream > Reader for Response < S > {
69
+ #[ inline]
69
70
fn read ( & mut self , buf : & mut [ u8 ] ) -> IoResult < uint > {
70
71
self . body . read ( buf)
71
72
}
0 commit comments