Merge pull request #757 from sfackler/ssl-split
feat(net): Split Ssl into SslClient and SslServer
This commit is contained in:
		
							
								
								
									
										46
									
								
								src/net.rs
									
									
									
									
									
								
							
							
						
						
									
										46
									
								
								src/net.rs
									
									
									
									
									
								
							| @@ -410,7 +410,9 @@ impl<F> NetworkConnector for F where F: Fn(&str, u16, &str) -> io::Result<TcpStr | |||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
| /// An abstraction to allow any SSL implementation to be used with HttpsStreams. | /// Deprecated | ||||||
|  | /// | ||||||
|  | /// Use `SslClient` and `SslServer` instead. | ||||||
| pub trait Ssl { | pub trait Ssl { | ||||||
|     /// The protected stream. |     /// The protected stream. | ||||||
|     type Stream: NetworkStream + Send + Clone; |     type Stream: NetworkStream + Send + Clone; | ||||||
| @@ -420,6 +422,38 @@ pub trait Ssl { | |||||||
|     fn wrap_server(&self, stream: HttpStream) -> ::Result<Self::Stream>; |     fn wrap_server(&self, stream: HttpStream) -> ::Result<Self::Stream>; | ||||||
| } | } | ||||||
|  |  | ||||||
|  | /// An abstraction to allow any SSL implementation to be used with client-side HttpsStreams. | ||||||
|  | pub trait SslClient { | ||||||
|  |     /// The protected stream. | ||||||
|  |     type Stream: NetworkStream + Send + Clone; | ||||||
|  |     /// Wrap a client stream with SSL. | ||||||
|  |     fn wrap_client(&self, stream: HttpStream, host: &str) -> ::Result<Self::Stream>; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | /// An abstraction to allow any SSL implementation to be used with server-side HttpsStreams. | ||||||
|  | pub trait SslServer { | ||||||
|  |     /// The protected stream. | ||||||
|  |     type Stream: NetworkStream + Send + Clone; | ||||||
|  |     /// Wrap a server stream with SSL. | ||||||
|  |     fn wrap_server(&self, stream: HttpStream) -> ::Result<Self::Stream>; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | impl<S: Ssl> SslClient for S { | ||||||
|  |     type Stream = <S as Ssl>::Stream; | ||||||
|  |  | ||||||
|  |     fn wrap_client(&self, stream: HttpStream, host: &str) -> ::Result<Self::Stream> { | ||||||
|  |         Ssl::wrap_client(self, stream, host) | ||||||
|  |     } | ||||||
|  | } | ||||||
|  |  | ||||||
|  | impl<S: Ssl> SslServer for S { | ||||||
|  |     type Stream = <S as Ssl>::Stream; | ||||||
|  |  | ||||||
|  |     fn wrap_server(&self, stream: HttpStream) -> ::Result<Self::Stream> { | ||||||
|  |         Ssl::wrap_server(self, stream) | ||||||
|  |     } | ||||||
|  | } | ||||||
|  |  | ||||||
| /// A stream over the HTTP protocol, possibly protected by SSL. | /// A stream over the HTTP protocol, possibly protected by SSL. | ||||||
| #[derive(Debug, Clone)] | #[derive(Debug, Clone)] | ||||||
| pub enum HttpsStream<S: NetworkStream> { | pub enum HttpsStream<S: NetworkStream> { | ||||||
| @@ -493,7 +527,7 @@ impl<S: NetworkStream> NetworkStream for HttpsStream<S> { | |||||||
|  |  | ||||||
| /// A Http Listener over SSL. | /// A Http Listener over SSL. | ||||||
| #[derive(Clone)] | #[derive(Clone)] | ||||||
| pub struct HttpsListener<S: Ssl> { | pub struct HttpsListener<S: SslServer> { | ||||||
|     listener: HttpListener, |     listener: HttpListener, | ||||||
|     ssl: S, |     ssl: S, | ||||||
| } | } | ||||||
| @@ -516,7 +550,7 @@ impl<S: Ssl> HttpsListener<S> { | |||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
| impl<S: Ssl + Clone> NetworkListener for HttpsListener<S> { | impl<S: SslServer + Clone> NetworkListener for HttpsListener<S> { | ||||||
|     type Stream = S::Stream; |     type Stream = S::Stream; | ||||||
|  |  | ||||||
|     #[inline] |     #[inline] | ||||||
| @@ -532,18 +566,18 @@ impl<S: Ssl + Clone> NetworkListener for HttpsListener<S> { | |||||||
|  |  | ||||||
| /// A connector that can protect HTTP streams using SSL. | /// A connector that can protect HTTP streams using SSL. | ||||||
| #[derive(Debug, Default)] | #[derive(Debug, Default)] | ||||||
| pub struct HttpsConnector<S: Ssl> { | pub struct HttpsConnector<S: SslClient> { | ||||||
|     ssl: S |     ssl: S | ||||||
| } | } | ||||||
|  |  | ||||||
| impl<S: Ssl> HttpsConnector<S> { | impl<S: SslClient> HttpsConnector<S> { | ||||||
|     /// Create a new connector using the provided SSL implementation. |     /// Create a new connector using the provided SSL implementation. | ||||||
|     pub fn new(s: S) -> HttpsConnector<S> { |     pub fn new(s: S) -> HttpsConnector<S> { | ||||||
|         HttpsConnector { ssl: s } |         HttpsConnector { ssl: s } | ||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
| impl<S: Ssl> NetworkConnector for HttpsConnector<S> { | impl<S: SslClient> NetworkConnector for HttpsConnector<S> { | ||||||
|     type Stream = HttpsStream<S::Stream>; |     type Stream = HttpsStream<S::Stream>; | ||||||
|  |  | ||||||
|     fn connect(&self, host: &str, port: u16, scheme: &str) -> ::Result<Self::Stream> { |     fn connect(&self, host: &str, port: u16, scheme: &str) -> ::Result<Self::Stream> { | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user