Add MaybeSslStream

This commit is contained in:
Steven Fackler 2014-11-28 15:43:58 -08:00
parent 08d1f2e629
commit 72ca8433f5
1 changed files with 73 additions and 1 deletions

View File

@ -436,12 +436,29 @@ impl<S: Stream> SslStream<S> {
SslStream::new_server_from(ssl, stream) SslStream::new_server_from(ssl, stream)
} }
/// Returns a mutable reference to the underlying stream /// Returns a mutable reference to the underlying stream.
/// ///
/// ## Warning /// ## Warning
///
/// `read`ing or `write`ing directly to the underlying stream will most /// `read`ing or `write`ing directly to the underlying stream will most
/// likely desynchronize the SSL session. /// likely desynchronize the SSL session.
#[deprecated="use get_mut instead"]
pub fn get_inner(&mut self) -> &mut S { pub fn get_inner(&mut self) -> &mut S {
self.get_mut()
}
/// Returns a reference to the underlying stream.
pub fn get_ref(&self) -> &S {
&self.stream
}
/// Returns a mutable reference to the underlying stream.
///
/// ## Warning
///
/// It is inadvisable to read from or write to the underlying stream as it
/// will most likely desynchronize the SSL session.
pub fn get_mut(&mut self) -> &mut S {
&mut self.stream &mut self.stream
} }
@ -530,3 +547,58 @@ impl<S: Stream> Writer for SslStream<S> {
self.stream.flush() self.stream.flush()
} }
} }
/// A utility type to help in cases where the use of SSL is decided at runtime.
pub enum MaybeSslStream<S> where S: Stream {
/// A connection using SSL
Ssl(SslStream<S>),
/// A connection not using SSL
Normal(S),
}
impl<S> Reader for MaybeSslStream<S> where S: Stream {
fn read(&mut self, buf: &mut [u8]) -> IoResult<uint> {
match *self {
MaybeSslStream::Ssl(ref mut s) => s.read(buf),
MaybeSslStream::Normal(ref mut s) => s.read(buf),
}
}
}
impl<S> Writer for MaybeSslStream<S> where S: Stream{
fn write(&mut self, buf: &[u8]) -> IoResult<()> {
match *self {
MaybeSslStream::Ssl(ref mut s) => s.write(buf),
MaybeSslStream::Normal(ref mut s) => s.write(buf),
}
}
fn flush(&mut self) -> IoResult<()> {
match *self {
MaybeSslStream::Ssl(ref mut s) => s.flush(),
MaybeSslStream::Normal(ref mut s) => s.flush(),
}
}
}
impl<S> MaybeSslStream<S> where S: Stream {
/// Returns a reference to the underlying stream.
pub fn get_ref(&self) -> &S {
match *self {
MaybeSslStream::Ssl(ref s) => s.get_ref(),
MaybeSslStream::Normal(ref s) => s,
}
}
/// Returns a mutable reference to the underlying stream.
///
/// ## Warning
///
/// It is inadvisable to read from or write to the underlying stream.
pub fn get_mut(&mut self) -> &mut S {
match *self {
MaybeSslStream::Ssl(ref mut s) => s.get_mut(),
MaybeSslStream::Normal(ref mut s) => s,
}
}
}