aboutsummaryrefslogtreecommitdiff
path: root/openssl/src/ssl/error.rs
diff options
context:
space:
mode:
Diffstat (limited to 'openssl/src/ssl/error.rs')
-rw-r--r--openssl/src/ssl/error.rs55
1 files changed, 55 insertions, 0 deletions
diff --git a/openssl/src/ssl/error.rs b/openssl/src/ssl/error.rs
index 95213361..518ae90f 100644
--- a/openssl/src/ssl/error.rs
+++ b/openssl/src/ssl/error.rs
@@ -1,8 +1,11 @@
+use std::any::Any;
use std::error;
use std::error::Error as StdError;
use std::fmt;
use std::io;
+
use error::ErrorStack;
+use ssl::MidHandshakeSslStream;
/// An SSL error.
#[derive(Debug)]
@@ -62,3 +65,55 @@ impl From<ErrorStack> for Error {
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)
+ }
+}