feat(client): implement Protocol trait for HTTP/1.1
This commit is contained in:
@@ -5,6 +5,8 @@ use std::net::Shutdown;
|
|||||||
use method::{Method};
|
use method::{Method};
|
||||||
use header::{ContentLength, TransferEncoding};
|
use header::{ContentLength, TransferEncoding};
|
||||||
use header::Encoding::Chunked;
|
use header::Encoding::Chunked;
|
||||||
|
|
||||||
|
use net::{NetworkConnector, NetworkStream, ContextVerifier};
|
||||||
use http::{HttpWriter, LINE_ENDING};
|
use http::{HttpWriter, LINE_ENDING};
|
||||||
use http::HttpReader::{SizedReader, ChunkedReader, EofReader};
|
use http::HttpReader::{SizedReader, ChunkedReader, EofReader};
|
||||||
use http::HttpWriter::{ChunkedWriter, SizedWriter, EmptyWriter};
|
use http::HttpWriter::{ChunkedWriter, SizedWriter, EmptyWriter};
|
||||||
@@ -12,11 +14,11 @@ use buffer::BufReader;
|
|||||||
use http::{self, HttpReader};
|
use http::{self, HttpReader};
|
||||||
|
|
||||||
use message::{
|
use message::{
|
||||||
|
Protocol,
|
||||||
HttpMessage,
|
HttpMessage,
|
||||||
RequestHead,
|
RequestHead,
|
||||||
ResponseHead,
|
ResponseHead,
|
||||||
};
|
};
|
||||||
use net::NetworkStream;
|
|
||||||
use header;
|
use header;
|
||||||
use version;
|
use version;
|
||||||
|
|
||||||
@@ -241,3 +243,63 @@ impl Http11Message {
|
|||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// The `Protocol` implementation provides HTTP/1.1 messages.
|
||||||
|
pub struct Http11Protocol {
|
||||||
|
connector: Connector,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Protocol for Http11Protocol {
|
||||||
|
fn new_message(&self, host: &str, port: u16, scheme: &str) -> ::Result<Box<HttpMessage>> {
|
||||||
|
let stream = try!(self.connector.connect(host, port, scheme)).into();
|
||||||
|
|
||||||
|
Ok(Box::new(Http11Message::with_stream(stream)))
|
||||||
|
}
|
||||||
|
|
||||||
|
#[inline]
|
||||||
|
fn set_ssl_verifier(&mut self, verifier: ContextVerifier) {
|
||||||
|
self.connector.set_ssl_verifier(verifier);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Http11Protocol {
|
||||||
|
/// Creates a new `Http11Protocol` instance that will use the given `NetworkConnector` for
|
||||||
|
/// establishing HTTP connections.
|
||||||
|
pub fn with_connector<C, S>(c: C) -> Http11Protocol
|
||||||
|
where C: NetworkConnector<Stream=S> + Send + 'static,
|
||||||
|
S: NetworkStream + Send {
|
||||||
|
Http11Protocol {
|
||||||
|
connector: Connector(Box::new(ConnAdapter(c))),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user