refactor(client): use a Protocol to create a message for a Request
This commit is contained in:
@@ -54,11 +54,14 @@ pub mod pool;
|
|||||||
pub mod request;
|
pub mod request;
|
||||||
pub mod response;
|
pub mod response;
|
||||||
|
|
||||||
|
use message::Protocol;
|
||||||
|
use http11::Http11Protocol;
|
||||||
|
|
||||||
/// A Client to use additional features with Requests.
|
/// A Client to use additional features with Requests.
|
||||||
///
|
///
|
||||||
/// Clients can handle things such as: redirect policy, connection pooling.
|
/// Clients can handle things such as: redirect policy, connection pooling.
|
||||||
pub struct Client {
|
pub struct Client {
|
||||||
connector: Connector,
|
protocol: Box<Protocol + Send>,
|
||||||
redirect_policy: RedirectPolicy,
|
redirect_policy: RedirectPolicy,
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -77,15 +80,20 @@ impl Client {
|
|||||||
/// Create a new client with a specific connector.
|
/// Create a new client with a specific connector.
|
||||||
pub fn with_connector<C, S>(connector: C) -> Client
|
pub fn with_connector<C, S>(connector: C) -> Client
|
||||||
where C: NetworkConnector<Stream=S> + Send + 'static, S: NetworkStream + Send {
|
where C: NetworkConnector<Stream=S> + Send + 'static, S: NetworkStream + Send {
|
||||||
|
Client::with_protocol(Http11Protocol::with_connector(connector))
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Create a new client with a specific `Protocol`.
|
||||||
|
pub fn with_protocol<P: Protocol + Send + 'static>(protocol: P) -> Client {
|
||||||
Client {
|
Client {
|
||||||
connector: with_connector(connector),
|
protocol: Box::new(protocol),
|
||||||
redirect_policy: Default::default()
|
redirect_policy: Default::default()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Set the SSL verifier callback for use with OpenSSL.
|
/// Set the SSL verifier callback for use with OpenSSL.
|
||||||
pub fn set_ssl_verifier(&mut self, verifier: ContextVerifier) {
|
pub fn set_ssl_verifier(&mut self, verifier: ContextVerifier) {
|
||||||
self.connector.set_ssl_verifier(verifier);
|
self.protocol.set_ssl_verifier(verifier);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Set the RedirectPolicy.
|
/// Set the RedirectPolicy.
|
||||||
@@ -131,44 +139,10 @@ impl Client {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn with_connector<C: NetworkConnector<Stream=S> + Send + 'static, S: NetworkStream + Send>(c: C) -> Connector {
|
|
||||||
Connector(Box::new(ConnAdapter(c)))
|
|
||||||
}
|
|
||||||
|
|
||||||
impl Default for Client {
|
impl Default for Client {
|
||||||
fn default() -> Client { Client::new() }
|
fn default() -> Client { Client::new() }
|
||||||
}
|
}
|
||||||
|
|
||||||
struct ConnAdapter<C: NetworkConnector + Send>(C);
|
|
||||||
|
|
||||||
impl<C: NetworkConnector<Stream=S> + Send, S: NetworkStream + Send> NetworkConnector for ConnAdapter<C> {
|
|
||||||
type Stream = Box<NetworkStream + Send>;
|
|
||||||
#[inline]
|
|
||||||
fn connect(&self, host: &str, port: u16, scheme: &str)
|
|
||||||
-> ::Result<Box<NetworkStream + Send>> {
|
|
||||||
Ok(try!(self.0.connect(host, port, scheme)).into())
|
|
||||||
}
|
|
||||||
#[inline]
|
|
||||||
fn set_ssl_verifier(&mut self, verifier: ContextVerifier) {
|
|
||||||
self.0.set_ssl_verifier(verifier);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
struct Connector(Box<NetworkConnector<Stream=Box<NetworkStream + Send>> + Send>);
|
|
||||||
|
|
||||||
impl NetworkConnector for Connector {
|
|
||||||
type Stream = Box<NetworkStream + Send>;
|
|
||||||
#[inline]
|
|
||||||
fn connect(&self, host: &str, port: u16, scheme: &str)
|
|
||||||
-> ::Result<Box<NetworkStream + Send>> {
|
|
||||||
Ok(try!(self.0.connect(host, port, scheme)).into())
|
|
||||||
}
|
|
||||||
#[inline]
|
|
||||||
fn set_ssl_verifier(&mut self, verifier: ContextVerifier) {
|
|
||||||
self.0.set_ssl_verifier(verifier);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Options for an individual Request.
|
/// Options for an individual Request.
|
||||||
///
|
///
|
||||||
/// One of these will be built for you if you use one of the convenience
|
/// One of these will be built for you if you use one of the convenience
|
||||||
@@ -229,7 +203,11 @@ impl<'a, U: IntoUrl> RequestBuilder<'a, U> {
|
|||||||
};
|
};
|
||||||
|
|
||||||
loop {
|
loop {
|
||||||
let mut req = try!(Request::with_connector(method.clone(), url.clone(), &client.connector));
|
let message = {
|
||||||
|
let (host, port) = try!(get_host_and_port(&url));
|
||||||
|
try!(client.protocol.new_message(&host, port, &*url.scheme))
|
||||||
|
};
|
||||||
|
let mut req = try!(Request::with_message(method.clone(), url.clone(), message));
|
||||||
headers.as_ref().map(|headers| req.headers_mut().extend(headers.iter()));
|
headers.as_ref().map(|headers| req.headers_mut().extend(headers.iter()));
|
||||||
|
|
||||||
match (can_have_body, body.as_ref()) {
|
match (can_have_body, body.as_ref()) {
|
||||||
|
|||||||
Reference in New Issue
Block a user