Skip to content

Commit ce21286

Browse files
committed
use NetworkStream in client
1 parent ccc9f1f commit ce21286

File tree

3 files changed

+34
-24
lines changed

3 files changed

+34
-24
lines changed

src/client/request.rs

Lines changed: 9 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
//! Client Requests
2-
use std::io::net::tcp::TcpStream;
32
use std::io::{BufferedWriter, IoResult};
43

54
use url::Url;
65

76
use method;
7+
use net::{NetworkStream, HttpStream};
88
use header::{Headers, Host};
99
use rfc7230::LINE_ENDING;
1010
use version;
@@ -13,7 +13,7 @@ use super::{Response};
1313

1414

1515
/// A client request to a remote server.
16-
pub struct Request {
16+
pub struct Request<S = HttpStream> {
1717
/// The method of this request.
1818
pub method: method::Method,
1919
/// The headers that will be sent with this request.
@@ -23,13 +23,13 @@ pub struct Request {
2323
/// The HTTP version of this request.
2424
pub version: version::HttpVersion,
2525
headers_written: bool,
26-
body: BufferedWriter<TcpStream>,
26+
body: BufferedWriter<S>,
2727
}
2828

29-
impl Request {
29+
impl<S: NetworkStream> Request<S> {
3030

3131
/// Create a new client request.
32-
pub fn new(method: method::Method, url: Url) -> HttpResult<Request> {
32+
pub fn new(method: method::Method, url: Url) -> HttpResult<Request<S>> {
3333
debug!("{} {}", method, url);
3434
let host = match url.serialize_host() {
3535
Some(host) => host,
@@ -42,7 +42,7 @@ impl Request {
4242
};
4343
debug!("port={}", port);
4444

45-
let stream = try_io!(TcpStream::connect(host.as_slice(), port));
45+
let stream = try_io!(NetworkStream::connect(host.as_slice(), port));
4646
let stream = BufferedWriter::new(stream);
4747
let mut headers = Headers::new();
4848
headers.set(Host(host));
@@ -81,16 +81,15 @@ impl Request {
8181
/// Completes writing the request, and returns a response to read from.
8282
///
8383
/// Consumes the Request.
84-
pub fn send(mut self) -> HttpResult<Response> {
84+
pub fn send(mut self) -> HttpResult<Response<S>> {
8585
try_io!(self.flush());
86-
let mut raw = self.body.unwrap();
87-
try_io!(raw.close_write());
86+
let raw = self.body.unwrap();
8887
Response::new(raw)
8988
}
9089
}
9190

9291

93-
impl Writer for Request {
92+
impl<S: NetworkStream> Writer for Request<S> {
9493
fn write(&mut self, msg: &[u8]) -> IoResult<()> {
9594
if !self.headers_written {
9695
try!(self.write_head());

src/client/response.rs

Lines changed: 15 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,31 +1,31 @@
11
//! Client Responses
22
use std::io::{BufferedReader, IoResult};
3-
use std::io::net::tcp::TcpStream;
43

54
use header::{mod, ContentLength, TransferEncoding, Chunked};
5+
use net::{NetworkStream, HttpStream};
66
use rfc7230::{read_status_line, HttpReader, SizedReader, ChunkedReader, EofReader};
77
use status;
88
use version;
99
use {HttpResult};
1010

1111
/// A response for a client request to a remote server.
12-
pub struct Response {
12+
pub struct Response<S = HttpStream> {
1313
/// The status from the server.
1414
pub status: status::StatusCode,
1515
/// The headers from the server.
1616
pub headers: header::Headers,
1717
/// The HTTP version of this response from the server.
1818
pub version: version::HttpVersion,
19-
body: HttpReader<BufferedReader<TcpStream>>,
19+
body: HttpReader<BufferedReader<S>>,
2020
}
2121

22-
impl Response {
22+
impl<S: NetworkStream> Response<S> {
2323

2424
/// 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));
2929

3030
debug!("{} {}", version, status);
3131
debug!("{}", headers);
@@ -38,22 +38,22 @@ impl Response {
3838
};
3939

4040
if codings.contains(&Chunked) {
41-
ChunkedReader(tcp, None)
41+
ChunkedReader(stream, None)
4242
} else {
43-
debug!("not chucked. read till eof");
44-
EofReader(tcp)
43+
debug!("not chuncked. read till eof");
44+
EofReader(stream)
4545
}
4646
}
4747
None => unreachable!()
4848
}
4949
} else if headers.has::<ContentLength>() {
5050
match headers.get_ref::<ContentLength>() {
51-
Some(&ContentLength(len)) => SizedReader(tcp, len),
51+
Some(&ContentLength(len)) => SizedReader(stream, len),
5252
None => unreachable!()
5353
}
5454
} else {
5555
debug!("neither Transfer-Encoding nor Content-Length");
56-
EofReader(tcp)
56+
EofReader(stream)
5757
};
5858

5959
Ok(Response {
@@ -65,7 +65,8 @@ impl Response {
6565
}
6666
}
6767

68-
impl Reader for Response {
68+
impl<S: NetworkStream> Reader for Response<S> {
69+
#[inline]
6970
fn read(&mut self, buf: &mut [u8]) -> IoResult<uint> {
7071
self.body.read(buf)
7172
}

src/net.rs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,9 @@ pub trait NetworkAcceptor<S: NetworkStream>: Acceptor<S> + Clone + Send {
2525
pub trait NetworkStream: Stream + Clone {
2626
/// Get the remote address of the underlying connection.
2727
fn peer_name(&mut self) -> IoResult<SocketAddr>;
28+
29+
/// Connect to a remote address.
30+
fn connect(host: &str, port: Port) -> IoResult<Self>;
2831
}
2932

3033
/// A `NetworkListener` for `HttpStream`s.
@@ -107,4 +110,11 @@ impl NetworkStream for HttpStream {
107110
fn peer_name(&mut self) -> IoResult<SocketAddr> {
108111
self.inner.peer_name()
109112
}
113+
114+
#[inline]
115+
fn connect(host: &str, port: Port) -> IoResult<HttpStream> {
116+
Ok(HttpStream {
117+
inner: try!(TcpStream::connect(host, port))
118+
})
119+
}
110120
}

0 commit comments

Comments
 (0)