@@ -4,6 +4,7 @@ use std::error;
4
4
use std:: error:: Error as StdError ;
5
5
use std:: fmt;
6
6
use std:: io;
7
+ use std:: path:: Path ;
7
8
8
9
use error:: ErrorStack ;
9
10
use ssl:: MidHandshakeSslStream ;
@@ -150,29 +151,63 @@ impl<S: fmt::Debug> StdError for HandshakeError<S> {
150
151
}
151
152
}
152
153
153
- impl < S : fmt :: Debug > fmt:: Display for HandshakeError < S > {
154
+ impl < S > fmt:: Display for HandshakeError < S > {
154
155
fn fmt ( & self , f : & mut fmt:: Formatter ) -> fmt:: Result {
155
156
match * self {
156
- HandshakeError :: SetupFailure ( ref e) => write ! ( f, "stream setup failed: {}" , e) ?,
157
- HandshakeError :: Failure ( ref s) => {
158
- write ! ( f, "the handshake failed: {}" , s. error( ) ) ?;
159
- let verify = s. ssl ( ) . verify_result ( ) ;
160
- if verify != X509VerifyResult :: OK {
161
- write ! ( f, ": {}" , verify) ?;
162
- }
157
+ HandshakeError :: SetupFailure ( ref e) => {
158
+ write ! ( f, "TLS stream setup failed:\n \n {}" , e)
163
159
}
160
+ HandshakeError :: Failure ( ref s) => fmt_mid_handshake_error ( s, f, "TLS handshake failed" ) ,
164
161
HandshakeError :: WouldBlock ( ref s) => {
165
- write ! ( f, "the handshake was interrupted: {}" , s. error( ) ) ?;
166
- let verify = s. ssl ( ) . verify_result ( ) ;
167
- if verify != X509VerifyResult :: OK {
168
- write ! ( f, ": {}" , verify) ?;
169
- }
162
+ fmt_mid_handshake_error ( s, f, "TLS handshake interrupted" )
170
163
}
171
164
}
172
- Ok ( ( ) )
173
165
}
174
166
}
175
167
168
+ fn fmt_mid_handshake_error (
169
+ s : & MidHandshakeSslStream < impl Sized > ,
170
+ f : & mut fmt:: Formatter ,
171
+ prefix : & str ,
172
+ ) -> fmt:: Result {
173
+ match s. ssl ( ) . verify_result ( ) {
174
+ X509VerifyResult :: OK => write ! ( f, "{}" , prefix) ?,
175
+ verify => write ! ( f, "{}: cert verification failed - {}" , prefix, verify) ?,
176
+ }
177
+
178
+ if let Some ( error) = s. error ( ) . io_error ( ) {
179
+ return write ! ( f, " ({})" , error) ;
180
+ }
181
+
182
+ if let Some ( error) = s. error ( ) . ssl_error ( ) {
183
+ let errors = error. errors ( ) ;
184
+
185
+ if errors. is_empty ( ) {
186
+ return Ok ( ( ) ) ;
187
+ }
188
+
189
+ f. write_str ( ":\n " ) ?;
190
+
191
+ for error in errors {
192
+ let path = error. file ( ) ;
193
+ let file = Path :: new ( path)
194
+ . file_name ( )
195
+ . and_then ( |name| name. to_str ( ) )
196
+ . unwrap_or ( path) ;
197
+
198
+ write ! (
199
+ f,
200
+ "\n {} [{}] ({}:{})" ,
201
+ error. reason( ) . unwrap_or( "unknown error" ) ,
202
+ error. code( ) ,
203
+ file,
204
+ error. line( )
205
+ ) ?;
206
+ }
207
+ }
208
+ Ok ( ( ) )
209
+ }
210
+
176
211
impl < S > From < ErrorStack > for HandshakeError < S > {
177
212
fn from ( e : ErrorStack ) -> HandshakeError < S > {
178
213
HandshakeError :: SetupFailure ( e)
0 commit comments