@@ -5,18 +5,20 @@ use std::net::Shutdown;
55use method:: { Method } ;
66use header:: { ContentLength , TransferEncoding } ;
77use header:: Encoding :: Chunked ;
8+
9+ use net:: { NetworkConnector , NetworkStream , ContextVerifier } ;
810use http:: { HttpWriter , LINE_ENDING } ;
911use http:: HttpReader :: { SizedReader , ChunkedReader , EofReader } ;
1012use http:: HttpWriter :: { ChunkedWriter , SizedWriter , EmptyWriter } ;
1113use buffer:: BufReader ;
1214use http:: { self , HttpReader } ;
1315
1416use message:: {
17+ Protocol ,
1518 HttpMessage ,
1619 RequestHead ,
1720 ResponseHead ,
1821} ;
19- use net:: NetworkStream ;
2022use header;
2123use 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