@ -3,30 +3,26 @@
//! There is no dependency on actual TLS implementations. Everything like
//! There is no dependency on actual TLS implementations. Everything like
//! `native_tls` or `openssl` will work as long as there is a TLS stream supporting standard
//! `native_tls` or `openssl` will work as long as there is a TLS stream supporting standard
//! `AsyncRead + AsyncWrite` traits.
//! `AsyncRead + AsyncWrite` traits.
use pin_project ::{ pin_project , project } ;
use std ::pin ::Pin ;
use std ::pin ::Pin ;
use std ::task ::{ Context , Poll } ;
use std ::task ::{ Context , Poll } ;
use futures ::io ::{ AsyncRead , AsyncWrite } ;
use futures ::io ::{ AsyncRead , AsyncWrite } ;
/// Stream, either plain TCP or TLS.
/// Stream, either plain TCP or TLS.
#[ pin_project ]
pub enum Stream < S , T > {
pub enum Stream < S , T > {
/// Unencrypted socket stream.
/// Unencrypted socket stream.
Plain ( #[ pin ] S ) ,
Plain ( S ) ,
/// Encrypted socket stream.
/// Encrypted socket stream.
Tls ( #[ pin ] T ) ,
Tls ( T ) ,
}
}
impl < S : AsyncRead + Unpin , T : AsyncRead + Unpin > AsyncRead for Stream < S , T > {
impl < S : AsyncRead + Unpin , T : AsyncRead + Unpin > AsyncRead for Stream < S , T > {
#[ project ]
fn poll_read (
fn poll_read (
self : Pin < & mut Self > ,
self : Pin < & mut Self > ,
cx : & mut Context < ' _ > ,
cx : & mut Context < ' _ > ,
buf : & mut [ u8 ] ,
buf : & mut [ u8 ] ,
) -> Poll < std ::io ::Result < usize > > {
) -> Poll < std ::io ::Result < usize > > {
#[ project ]
match self . get_mut ( ) {
match self . project ( ) {
Stream ::Plain ( ref mut s ) = > Pin ::new ( s ) . poll_read ( cx , buf ) ,
Stream ::Plain ( ref mut s ) = > Pin ::new ( s ) . poll_read ( cx , buf ) ,
Stream ::Tls ( ref mut s ) = > Pin ::new ( s ) . poll_read ( cx , buf ) ,
Stream ::Tls ( ref mut s ) = > Pin ::new ( s ) . poll_read ( cx , buf ) ,
}
}
@ -34,32 +30,26 @@ impl<S: AsyncRead + Unpin, T: AsyncRead + Unpin> AsyncRead for Stream<S, T> {
}
}
impl < S : AsyncWrite + Unpin , T : AsyncWrite + Unpin > AsyncWrite for Stream < S , T > {
impl < S : AsyncWrite + Unpin , T : AsyncWrite + Unpin > AsyncWrite for Stream < S , T > {
#[ project ]
fn poll_write (
fn poll_write (
self : Pin < & mut Self > ,
self : Pin < & mut Self > ,
cx : & mut Context < ' _ > ,
cx : & mut Context < ' _ > ,
buf : & [ u8 ] ,
buf : & [ u8 ] ,
) -> Poll < Result < usize , std ::io ::Error > > {
) -> Poll < Result < usize , std ::io ::Error > > {
#[ project ]
match self . get_mut ( ) {
match self . project ( ) {
Stream ::Plain ( ref mut s ) = > Pin ::new ( s ) . poll_write ( cx , buf ) ,
Stream ::Plain ( ref mut s ) = > Pin ::new ( s ) . poll_write ( cx , buf ) ,
Stream ::Tls ( ref mut s ) = > Pin ::new ( s ) . poll_write ( cx , buf ) ,
Stream ::Tls ( ref mut s ) = > Pin ::new ( s ) . poll_write ( cx , buf ) ,
}
}
}
}
#[ project ]
fn poll_flush ( self : Pin < & mut Self > , cx : & mut Context < ' _ > ) -> Poll < Result < ( ) , std ::io ::Error > > {
fn poll_flush ( self : Pin < & mut Self > , cx : & mut Context < ' _ > ) -> Poll < Result < ( ) , std ::io ::Error > > {
#[ project ]
match self . get_mut ( ) {
match self . project ( ) {
Stream ::Plain ( ref mut s ) = > Pin ::new ( s ) . poll_flush ( cx ) ,
Stream ::Plain ( ref mut s ) = > Pin ::new ( s ) . poll_flush ( cx ) ,
Stream ::Tls ( ref mut s ) = > Pin ::new ( s ) . poll_flush ( cx ) ,
Stream ::Tls ( ref mut s ) = > Pin ::new ( s ) . poll_flush ( cx ) ,
}
}
}
}
#[ project ]
fn poll_close ( self : Pin < & mut Self > , cx : & mut Context < ' _ > ) -> Poll < Result < ( ) , std ::io ::Error > > {
fn poll_close ( self : Pin < & mut Self > , cx : & mut Context < ' _ > ) -> Poll < Result < ( ) , std ::io ::Error > > {
#[ project ]
match self . get_mut ( ) {
match self . project ( ) {
Stream ::Plain ( ref mut s ) = > Pin ::new ( s ) . poll_close ( cx ) ,
Stream ::Plain ( ref mut s ) = > Pin ::new ( s ) . poll_close ( cx ) ,
Stream ::Tls ( ref mut s ) = > Pin ::new ( s ) . poll_close ( cx ) ,
Stream ::Tls ( ref mut s ) = > Pin ::new ( s ) . poll_close ( cx ) ,
}
}