From 3cd7d72b078fa3f043e27032a9b0699703bb5be3 Mon Sep 17 00:00:00 2001 From: Sean McArthur Date: Fri, 31 Oct 2014 15:16:03 -0700 Subject: [PATCH] split NetworkStream::connect to NetworkConnector --- src/client/request.rs | 8 ++++---- src/client/response.rs | 2 +- src/header/mod.rs | 2 +- src/mock.rs | 11 +++++++---- src/net.rs | 38 ++++++++++++++++++-------------------- src/server/request.rs | 2 +- src/server/response.rs | 2 +- 7 files changed, 33 insertions(+), 32 deletions(-) diff --git a/src/client/request.rs b/src/client/request.rs index fc1e6844..96b00158 100644 --- a/src/client/request.rs +++ b/src/client/request.rs @@ -6,7 +6,7 @@ use url::Url; use method::{mod, Get, Post, Delete, Put, Patch, Head, Options}; use header::Headers; use header::common::{mod, Host}; -use net::{NetworkStream, HttpStream, Fresh, Streaming}; +use net::{NetworkStream, NetworkConnector, HttpStream, Fresh, Streaming}; use http::{HttpWriter, ThroughWriter, ChunkedWriter, SizedWriter, LINE_ENDING}; use version; use {HttpResult, HttpUriError}; @@ -43,7 +43,7 @@ impl Request { } /// Create a new client request with a specific underlying NetworkStream. - pub fn with_stream(method: method::Method, url: Url) -> HttpResult> { + pub fn with_stream(method: method::Method, url: Url) -> HttpResult> { debug!("{} {}", method, url); let host = match url.serialize_host() { Some(host) => host, @@ -56,8 +56,8 @@ impl Request { }; debug!("port={}", port); - let stream: S = try_io!(NetworkStream::connect(host.as_slice(), port, url.scheme.as_slice())); - let stream = ThroughWriter(BufferedWriter::new(stream.dynamic())); + let stream: S = try_io!(NetworkConnector::connect(host.as_slice(), port, url.scheme.as_slice())); + let stream = ThroughWriter(BufferedWriter::new(box stream as Box)); let mut headers = Headers::new(); headers.set(Host { diff --git a/src/client/response.rs b/src/client/response.rs index 27a3fea9..940169ad 100644 --- a/src/client/response.rs +++ b/src/client/response.rs @@ -25,7 +25,7 @@ impl Response { /// Creates a new response from a server. pub fn new(stream: Box) -> HttpResult { - let mut stream = BufferedReader::new(stream.dynamic()); + let mut stream = BufferedReader::new(stream); let (version, status) = try!(read_status_line(&mut stream)); let headers = try!(header::Headers::from_raw(&mut stream)); diff --git a/src/header/mod.rs b/src/header/mod.rs index fe744e02..307593e5 100644 --- a/src/header/mod.rs +++ b/src/header/mod.rs @@ -408,7 +408,7 @@ mod tests { use std::hash::sip::hash; use mime::{Mime, Text, Plain}; use super::CaseInsensitive; - use super::{Headers, Header}; + use super::{Headers, Header, HeaderFormat}; use super::common::{ContentLength, ContentType, Accept, Host}; fn mem(s: &str) -> MemReader { diff --git a/src/mock.rs b/src/mock.rs index 12851991..42172868 100644 --- a/src/mock.rs +++ b/src/mock.rs @@ -1,7 +1,7 @@ use std::io::IoResult; use std::io::net::ip::SocketAddr; -use net::NetworkStream; +use net::{NetworkStream, NetworkConnector}; #[deriving(Clone, PartialEq, Show)] pub struct MockStream; @@ -19,11 +19,14 @@ impl Writer for MockStream { } impl NetworkStream for MockStream { - fn connect(_host: &str, _port: u16, _scheme: &str) -> IoResult { - Ok(MockStream) - } fn peer_name(&mut self) -> IoResult { Ok(from_str("127.0.0.1:1337").unwrap()) } } + +impl NetworkConnector for MockStream { + fn connect(_host: &str, _port: u16, _scheme: &str) -> IoResult { + Ok(MockStream) + } +} diff --git a/src/net.rs b/src/net.rs index 6a599f4f..254890ce 100644 --- a/src/net.rs +++ b/src/net.rs @@ -45,19 +45,15 @@ pub trait NetworkStream: Stream + Any + Clone + Send { /// Get the remote address of the underlying connection. fn peer_name(&mut self) -> IoResult; - /// Connect to a remote address. - fn connect(host: &str, Port, scheme: &str) -> IoResult; - - /// Turn this into an appropriately typed trait object. - #[inline] - fn dynamic(self) -> Box { - box self as Box - } - #[doc(hidden)] #[inline] - // Hack to work around lack of Clone impl for Box - fn clone_box(&self) -> Box { self.clone().dynamic() } + fn clone_box(&self) -> Box { box self.clone() } +} + +/// A connector creates a NetworkStream. +pub trait NetworkConnector: NetworkStream { + /// Connect to a remote address. + fn connect(host: &str, Port, scheme: &str) -> IoResult; } impl fmt::Show for Box { @@ -214,6 +210,15 @@ impl Writer for HttpStream { impl NetworkStream for HttpStream { + fn peer_name(&mut self) -> IoResult { + match *self { + Http(ref mut inner) => inner.peer_name(), + Https(_, addr) => Ok(addr) + } + } +} + +impl NetworkConnector for HttpStream { fn connect(host: &str, port: Port, scheme: &str) -> IoResult { match scheme { "http" => { @@ -239,13 +244,6 @@ impl NetworkStream for HttpStream { } } } - - fn peer_name(&mut self) -> IoResult { - match *self { - Http(ref mut inner) => inner.peer_name(), - Https(_, addr) => Ok(addr) - } - } } fn lift_ssl_error(ssl: SslError) -> IoError { @@ -276,7 +274,7 @@ mod tests { #[test] fn test_downcast_box_stream() { - let stream = MockStream.dynamic(); + let stream = box MockStream as Box; let mock = stream.downcast::().unwrap(); assert_eq!(mock, box MockStream); @@ -285,7 +283,7 @@ mod tests { #[test] fn test_downcast_unchecked_box_stream() { - let stream = MockStream.dynamic(); + let stream = box MockStream as Box; let mock = unsafe { stream.downcast_unchecked::() }; assert_eq!(mock, box MockStream); diff --git a/src/server/request.rs b/src/server/request.rs index 36d8d527..4d82d13d 100644 --- a/src/server/request.rs +++ b/src/server/request.rs @@ -38,7 +38,7 @@ impl Request { pub fn new(mut stream: S) -> HttpResult { let remote_addr = try_io!(stream.peer_name()); debug!("remote addr = {}", remote_addr); - let mut stream = BufferedReader::new(stream.dynamic()); + let mut stream = BufferedReader::new(box stream as Box); let (method, uri, version) = try!(read_request_line(&mut stream)); let headers = try!(Headers::from_raw(&mut stream)); diff --git a/src/server/response.rs b/src/server/response.rs index 19cdcf24..dea152ae 100644 --- a/src/server/response.rs +++ b/src/server/response.rs @@ -55,7 +55,7 @@ impl Response { status: status::Ok, version: version::Http11, headers: header::Headers::new(), - body: ThroughWriter(BufferedWriter::new(stream.dynamic())) + body: ThroughWriter(BufferedWriter::new(box stream as Box)) } }