diff --git a/src/http11.rs b/src/http11.rs index ae8e9291..d1a704bc 100644 --- a/src/http11.rs +++ b/src/http11.rs @@ -5,6 +5,8 @@ use std::net::Shutdown; use method::{Method}; use header::{ContentLength, TransferEncoding}; use header::Encoding::Chunked; + +use net::{NetworkConnector, NetworkStream, ContextVerifier}; use http::{HttpWriter, LINE_ENDING}; use http::HttpReader::{SizedReader, ChunkedReader, EofReader}; use http::HttpWriter::{ChunkedWriter, SizedWriter, EmptyWriter}; @@ -12,11 +14,11 @@ use buffer::BufReader; use http::{self, HttpReader}; use message::{ + Protocol, HttpMessage, RequestHead, ResponseHead, }; -use net::NetworkStream; use header; use version; @@ -241,3 +243,63 @@ impl Http11Message { 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> { + 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: C) -> Http11Protocol + where C: NetworkConnector + Send + 'static, + S: NetworkStream + Send { + Http11Protocol { + connector: Connector(Box::new(ConnAdapter(c))), + } + } +} + +struct ConnAdapter(C); + +impl + Send, S: NetworkStream + Send> NetworkConnector for ConnAdapter { + type Stream = Box; + #[inline] + fn connect(&self, host: &str, port: u16, scheme: &str) + -> ::Result> { + 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> + Send>); + +impl NetworkConnector for Connector { + type Stream = Box; + #[inline] + fn connect(&self, host: &str, port: u16, scheme: &str) + -> ::Result> { + Ok(try!(self.0.connect(host, port, scheme)).into()) + } + #[inline] + fn set_ssl_verifier(&mut self, verifier: ContextVerifier) { + self.0.set_ssl_verifier(verifier); + } +}