Skip to content

Commit dccdf8d

Browse files
committed
feat(client): implement Protocol trait for HTTP/1.1
1 parent 3417303 commit dccdf8d

1 file changed

Lines changed: 63 additions & 1 deletion

File tree

src/http11.rs

Lines changed: 63 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,18 +5,20 @@ use std::net::Shutdown;
55
use method::{Method};
66
use header::{ContentLength, TransferEncoding};
77
use header::Encoding::Chunked;
8+
9+
use net::{NetworkConnector, NetworkStream, ContextVerifier};
810
use http::{HttpWriter, LINE_ENDING};
911
use http::HttpReader::{SizedReader, ChunkedReader, EofReader};
1012
use http::HttpWriter::{ChunkedWriter, SizedWriter, EmptyWriter};
1113
use buffer::BufReader;
1214
use http::{self, HttpReader};
1315

1416
use message::{
17+
Protocol,
1518
HttpMessage,
1619
RequestHead,
1720
ResponseHead,
1821
};
19-
use net::NetworkStream;
2022
use header;
2123
use version;
2224

@@ -241,3 +243,63 @@ impl Http11Message {
241243
Ok(())
242244
}
243245
}
246+
247+
/// The `Protocol` implementation provides HTTP/1.1 messages.
248+
pub struct Http11Protocol {
249+
connector: Connector,
250+
}
251+
252+
impl Protocol for Http11Protocol {
253+
fn new_message(&self, host: &str, port: u16, scheme: &str) -> ::Result<Box<HttpMessage>> {
254+
let stream = try!(self.connector.connect(host, port, scheme)).into();
255+
256+
Ok(Box::new(Http11Message::with_stream(stream)))
257+
}
258+
259+
#[inline]
260+
fn set_ssl_verifier(&mut self, verifier: ContextVerifier) {
261+
self.connector.set_ssl_verifier(verifier);
262+
}
263+
}
264+
265+
impl Http11Protocol {
266+
/// Creates a new `Http11Protocol` instance that will use the given `NetworkConnector` for
267+
/// establishing HTTP connections.
268+
pub fn with_connector<C, S>(c: C) -> Http11Protocol
269+
where C: NetworkConnector<Stream=S> + Send + 'static,
270+
S: NetworkStream + Send {
271+
Http11Protocol {
272+
connector: Connector(Box::new(ConnAdapter(c))),
273+
}
274+
}
275+
}
276+
277+
struct ConnAdapter<C: NetworkConnector + Send>(C);
278+
279+
impl<C: NetworkConnector<Stream=S> + Send, S: NetworkStream + Send> NetworkConnector for ConnAdapter<C> {
280+
type Stream = Box<NetworkStream + Send>;
281+
#[inline]
282+
fn connect(&self, host: &str, port: u16, scheme: &str)
283+
-> ::Result<Box<NetworkStream + Send>> {
284+
Ok(try!(self.0.connect(host, port, scheme)).into())
285+
}
286+
#[inline]
287+
fn set_ssl_verifier(&mut self, verifier: ContextVerifier) {
288+
self.0.set_ssl_verifier(verifier);
289+
}
290+
}
291+
292+
struct Connector(Box<NetworkConnector<Stream=Box<NetworkStream + Send>> + Send>);
293+
294+
impl NetworkConnector for Connector {
295+
type Stream = Box<NetworkStream + Send>;
296+
#[inline]
297+
fn connect(&self, host: &str, port: u16, scheme: &str)
298+
-> ::Result<Box<NetworkStream + Send>> {
299+
Ok(try!(self.0.connect(host, port, scheme)).into())
300+
}
301+
#[inline]
302+
fn set_ssl_verifier(&mut self, verifier: ContextVerifier) {
303+
self.0.set_ssl_verifier(verifier);
304+
}
305+
}

0 commit comments

Comments
 (0)