From b4b539091fe477b5344e441a33179be1366096e5 Mon Sep 17 00:00:00 2001 From: Sean McArthur Date: Tue, 2 Sep 2014 14:14:56 -0700 Subject: [PATCH] use Buffered Readers and Writers --- README.md | 6 +++--- src/client/request.rs | 10 ++++++---- src/client/response.rs | 7 ++++--- src/server/request.rs | 7 ++++--- src/server/response.rs | 12 ++++++------ 5 files changed, 23 insertions(+), 19 deletions(-) diff --git a/README.md b/README.md index 3296a89d..4f404f31 100644 --- a/README.md +++ b/README.md @@ -10,9 +10,9 @@ An HTTP library for Rust. ``` running 3 tests -test bench_curl ... bench: 346762 ns/iter (+/- 16469) -test bench_http ... bench: 310861 ns/iter (+/- 123168) -test bench_hyper ... bench: 284916 ns/iter (+/- 65935) +test bench_curl ... bench: 234539 ns/iter (+/- 22228) +test bench_http ... bench: 290370 ns/iter (+/- 69179) +test bench_hyper ... bench: 224482 ns/iter (+/- 95197) test result: ok. 0 passed; 0 failed; 0 ignored; 3 measured ``` diff --git a/src/client/request.rs b/src/client/request.rs index d3d6eb12..562beaa7 100644 --- a/src/client/request.rs +++ b/src/client/request.rs @@ -1,6 +1,6 @@ //! Client Requests use std::io::net::tcp::TcpStream; -use std::io::IoResult; +use std::io::{BufferedWriter, IoResult}; use url::Url; @@ -23,7 +23,7 @@ pub struct Request { /// The HTTP version of this request. pub version: version::HttpVersion, headers_written: bool, - body: TcpStream, + body: BufferedWriter, } impl Request { @@ -43,6 +43,7 @@ impl Request { debug!("port={}", port); let stream = try_io!(TcpStream::connect(host.as_slice(), port)); + let stream = BufferedWriter::new(stream); let mut headers = Headers::new(); headers.set(Host(host)); Ok(Request { @@ -82,8 +83,9 @@ impl Request { /// Consumes the Request. pub fn send(mut self) -> HttpResult { try_io!(self.flush()); - try_io!(self.body.close_write()); - Response::new(self.body) + let mut raw = self.body.unwrap(); + try_io!(raw.close_write()); + Response::new(raw) } } diff --git a/src/client/response.rs b/src/client/response.rs index 5287f895..276057f5 100644 --- a/src/client/response.rs +++ b/src/client/response.rs @@ -1,5 +1,5 @@ //! Client Responses -use std::io::{Reader, IoResult}; +use std::io::{BufferedReader, IoResult}; use std::io::net::tcp::TcpStream; use header::{mod, ContentLength, TransferEncoding, Chunked}; @@ -16,13 +16,14 @@ pub struct Response { pub headers: header::Headers, /// The HTTP version of this response from the server. pub version: version::HttpVersion, - body: HttpReader, + body: HttpReader>, } impl Response { /// Creates a new response from a server. - pub fn new(mut tcp: TcpStream) -> HttpResult { + pub fn new(tcp: TcpStream) -> HttpResult { + let mut tcp = BufferedReader::new(tcp); let (version, status) = try!(read_status_line(&mut tcp)); let mut headers = try!(header::Headers::from_raw(&mut tcp)); diff --git a/src/server/request.rs b/src/server/request.rs index cbbd2e56..1a40c7f4 100644 --- a/src/server/request.rs +++ b/src/server/request.rs @@ -2,7 +2,7 @@ //! //! These are requests that a `hyper::Server` receives, and include its method, //! target URI, headers, and message body. -use std::io::{Reader, IoResult}; +use std::io::{Reader, BufferedReader, IoResult}; use std::io::net::ip::SocketAddr; use std::io::net::tcp::TcpStream; @@ -26,7 +26,7 @@ pub struct Request { pub uri: RequestUri, /// The version of HTTP for this request. pub version: HttpVersion, - body: HttpReader + body: HttpReader> } @@ -35,13 +35,14 @@ impl Request { /// Create a new Request, reading the StartLine and Headers so they are /// immediately useful. pub fn new(mut tcp: TcpStream) -> HttpResult { + let remote_addr = try_io!(tcp.peer_name()); + let mut tcp = BufferedReader::new(tcp); let (method, uri, version) = try!(read_request_line(&mut tcp)); let mut headers = try!(Headers::from_raw(&mut tcp)); debug!("{} {} {}", method, uri, version); debug!("{}", headers); - let remote_addr = try_io!(tcp.peer_name()); // TODO: handle Transfer-Encoding let body = if headers.has::() { diff --git a/src/server/response.rs b/src/server/response.rs index 8aa1a49c..c18611d2 100644 --- a/src/server/response.rs +++ b/src/server/response.rs @@ -2,7 +2,7 @@ //! //! These are responses sent by a `hyper::Server` to clients, after //! receiving a request. -use std::io::IoResult; +use std::io::{BufferedWriter, IoResult}; use std::io::net::tcp::TcpStream; use header; @@ -21,7 +21,7 @@ pub struct Response { pub version: version::HttpVersion, headers_written: bool, // TODO: can this check be moved to compile time? - body: TcpStream + body: BufferedWriter, // TODO: use a HttpWriter from rfc7230 } impl Response { @@ -33,7 +33,7 @@ impl Response { version: version::Http11, headers: header::Headers::new(), headers_written: false, - body: tcp + body: BufferedWriter::new(tcp) } } @@ -56,9 +56,9 @@ impl Response { } /// Flushes all writing of a response to the client. - pub fn end(&mut self) -> IoResult<()> { - try!(self.flush()); - self.body.close_write() + pub fn end(mut self) -> IoResult<()> { + debug!("ending"); + self.flush() } }