Move HandshakeError to submodule

This commit is contained in:
Steven Fackler 2016-10-30 17:18:37 -07:00
parent eea4e31a56
commit bd457dba18
2 changed files with 57 additions and 56 deletions

View File

@ -1,8 +1,11 @@
use std::any::Any;
use std::error; use std::error;
use std::error::Error as StdError; use std::error::Error as StdError;
use std::fmt; use std::fmt;
use std::io; use std::io;
use error::ErrorStack; use error::ErrorStack;
use ssl::MidHandshakeSslStream;
/// An SSL error. /// An SSL error.
#[derive(Debug)] #[derive(Debug)]
@ -62,3 +65,55 @@ impl From<ErrorStack> for Error {
Error::Ssl(e) Error::Ssl(e)
} }
} }
/// An error or intermediate state after a TLS handshake attempt.
#[derive(Debug)]
pub enum HandshakeError<S> {
/// Setup failed.
SetupFailure(ErrorStack),
/// The handshake failed.
Failure(MidHandshakeSslStream<S>),
/// The handshake was interrupted midway through.
Interrupted(MidHandshakeSslStream<S>),
}
impl<S: Any + fmt::Debug> StdError for HandshakeError<S> {
fn description(&self) -> &str {
match *self {
HandshakeError::SetupFailure(_) => "stream setup failed",
HandshakeError::Failure(_) => "the handshake failed",
HandshakeError::Interrupted(_) => "the handshake was interrupted",
}
}
fn cause(&self) -> Option<&StdError> {
match *self {
HandshakeError::SetupFailure(ref e) => Some(e),
HandshakeError::Failure(ref s) |
HandshakeError::Interrupted(ref s) => Some(s.error()),
}
}
}
impl<S: Any + fmt::Debug> fmt::Display for HandshakeError<S> {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
try!(f.write_str(StdError::description(self)));
match *self {
HandshakeError::SetupFailure(ref e) => try!(write!(f, ": {}", e)),
HandshakeError::Failure(ref s) |
HandshakeError::Interrupted(ref s) => {
try!(write!(f, ": {}", s.error()));
if let Some(err) = s.ssl().verify_result() {
try!(write!(f, ": {}", err));
}
}
}
Ok(())
}
}
impl<S> From<ErrorStack> for HandshakeError<S> {
fn from(e: ErrorStack) -> HandshakeError<S> {
HandshakeError::SetupFailure(e)
}
}

View File

@ -73,7 +73,6 @@ use std::any::Any;
use std::any::TypeId; use std::any::TypeId;
use std::cmp; use std::cmp;
use std::collections::HashMap; use std::collections::HashMap;
use std::error as stderror;
use std::ffi::{CStr, CString}; use std::ffi::{CStr, CString};
use std::fmt; use std::fmt;
use std::io; use std::io;
@ -99,7 +98,7 @@ use pkey::PKeyRef;
use error::ErrorStack; use error::ErrorStack;
use opaque::Opaque; use opaque::Opaque;
pub mod error; mod error;
mod connector; mod connector;
mod bio; mod bio;
#[cfg(test)] #[cfg(test)]
@ -109,8 +108,7 @@ use self::bio::BioMethod;
pub use ssl::connector::{ClientConnectorBuilder, ClientConnector, ServerConnectorBuilder, pub use ssl::connector::{ClientConnectorBuilder, ClientConnector, ServerConnectorBuilder,
ServerConnector}; ServerConnector};
#[doc(inline)] pub use ssl::error::{Error, HandshakeError};
pub use ssl::error::Error;
bitflags! { bitflags! {
pub flags SslOptions: c_ulong { pub flags SslOptions: c_ulong {
@ -1223,58 +1221,6 @@ impl Ssl {
} }
} }
/// An error or intermediate state after a TLS handshake attempt.
#[derive(Debug)]
pub enum HandshakeError<S> {
/// Setup failed.
SetupFailure(ErrorStack),
/// The handshake failed.
Failure(MidHandshakeSslStream<S>),
/// The handshake was interrupted midway through.
Interrupted(MidHandshakeSslStream<S>),
}
impl<S: Any + fmt::Debug> stderror::Error for HandshakeError<S> {
fn description(&self) -> &str {
match *self {
HandshakeError::SetupFailure(_) => "stream setup failed",
HandshakeError::Failure(_) => "the handshake failed",
HandshakeError::Interrupted(_) => "the handshake was interrupted",
}
}
fn cause(&self) -> Option<&stderror::Error> {
match *self {
HandshakeError::SetupFailure(ref e) => Some(e),
HandshakeError::Failure(ref s) |
HandshakeError::Interrupted(ref s) => Some(s.error()),
}
}
}
impl<S: Any + fmt::Debug> fmt::Display for HandshakeError<S> {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
try!(f.write_str(stderror::Error::description(self)));
match *self {
HandshakeError::SetupFailure(ref e) => try!(write!(f, ": {}", e)),
HandshakeError::Failure(ref s) |
HandshakeError::Interrupted(ref s) => {
try!(write!(f, ": {}", s.error()));
if let Some(err) = s.ssl().verify_result() {
try!(write!(f, ": {}", err));
}
}
}
Ok(())
}
}
impl<S> From<ErrorStack> for HandshakeError<S> {
fn from(e: ErrorStack) -> HandshakeError<S> {
HandshakeError::SetupFailure(e)
}
}
/// An SSL stream midway through the handshake process. /// An SSL stream midway through the handshake process.
#[derive(Debug)] #[derive(Debug)]
pub struct MidHandshakeSslStream<S> { pub struct MidHandshakeSslStream<S> {