@@ -5,10 +5,12 @@ use std::io::Error as IoError;
55use std:: str:: Utf8Error ;
66
77use httparse;
8- use openssl:: ssl:: error:: SslError ;
98use url;
109use solicit:: http:: HttpError as Http2Error ;
1110
11+ #[ cfg( feature = "openssl" ) ]
12+ use openssl:: ssl:: error:: SslError ;
13+
1214use self :: Error :: {
1315 Method ,
1416 Uri ,
@@ -43,8 +45,8 @@ pub enum Error {
4345 Status ,
4446 /// An `io::Error` that occurred while trying to read or write to a network stream.
4547 Io ( IoError ) ,
46- /// An error from the `openssl` library.
47- Ssl ( SslError ) ,
48+ /// An error from a SSL library.
49+ Ssl ( Box < StdError + Send + Sync > ) ,
4850 /// An HTTP/2-specific error, coming from the `solicit` library.
4951 Http2 ( Http2Error ) ,
5052 /// Parsing a field as string failed
@@ -89,7 +91,7 @@ impl StdError for Error {
8991 fn cause ( & self ) -> Option < & StdError > {
9092 match * self {
9193 Io ( ref error) => Some ( error) ,
92- Ssl ( ref error) => Some ( error) ,
94+ Ssl ( ref error) => Some ( & * * error) ,
9395 Uri ( ref error) => Some ( error) ,
9496 Http2 ( ref error) => Some ( error) ,
9597 _ => None ,
@@ -109,11 +111,12 @@ impl From<url::ParseError> for Error {
109111 }
110112}
111113
114+ #[ cfg( feature = "openssl" ) ]
112115impl From < SslError > for Error {
113116 fn from ( err : SslError ) -> Error {
114117 match err {
115118 SslError :: StreamError ( err) => Io ( err) ,
116- err => Ssl ( err) ,
119+ err => Ssl ( Box :: new ( err) ) ,
117120 }
118121 }
119122}
@@ -149,7 +152,6 @@ mod tests {
149152 use std:: error:: Error as StdError ;
150153 use std:: io;
151154 use httparse;
152- use openssl:: ssl:: error:: SslError ;
153155 use solicit:: http:: HttpError as Http2Error ;
154156 use url;
155157 use super :: Error ;
@@ -192,12 +194,8 @@ mod tests {
192194
193195 from_and_cause ! ( io:: Error :: new( io:: ErrorKind :: Other , "other" ) => Io ( ..) ) ;
194196 from_and_cause ! ( url:: ParseError :: EmptyHost => Uri ( ..) ) ;
195- from_and_cause ! ( SslError :: SslSessionClosed => Ssl ( ..) ) ;
196197 from_and_cause ! ( Http2Error :: UnknownStreamId => Http2 ( ..) ) ;
197198
198- from ! ( SslError :: StreamError ( io:: Error :: new( io:: ErrorKind :: Other , "ssl negotiation" ) ) => Io ( ..) ) ;
199-
200-
201199 from ! ( httparse:: Error :: HeaderName => Header ) ;
202200 from ! ( httparse:: Error :: HeaderName => Header ) ;
203201 from ! ( httparse:: Error :: HeaderValue => Header ) ;
@@ -207,4 +205,13 @@ mod tests {
207205 from ! ( httparse:: Error :: TooManyHeaders => TooLarge ) ;
208206 from ! ( httparse:: Error :: Version => Version ) ;
209207 }
208+
209+ #[ cfg( feature = "openssl" ) ]
210+ #[ test]
211+ fn test_from_ssl ( ) {
212+ use openssl:: ssl:: error:: SslError ;
213+
214+ from ! ( SslError :: StreamError ( io:: Error :: new( io:: ErrorKind :: Other , "ssl negotiation" ) ) => Io ( ..) ) ;
215+ from_and_cause ! ( SslError :: SslSessionClosed => Ssl ( ..) ) ;
216+ }
210217}
0 commit comments