@@ -117,8 +117,7 @@ def sendall(self, data):
117
117
return self ._wait_for_io (self ._socket .sendall , data )
118
118
119
119
def close (self ):
120
- self ._socket .shutdown (SHUT_RDWR )
121
- self ._socket .close ()
120
+ self .close_socket (self ._socket )
122
121
123
122
@classmethod
124
123
def _connect (cls , resolved_address , timeout , keep_alive ):
@@ -160,7 +159,7 @@ def _connect(cls, resolved_address, timeout, keep_alive):
160
159
log .debug ("[#0000] C: <ERROR> %s %s" , type (error ).__name__ ,
161
160
" " .join (map (repr , error .args )))
162
161
log .debug ("[#0000] C: <CLOSE> %s" , resolved_address )
163
- s . close ( )
162
+ cls . close_socket ( s )
164
163
raise ServiceUnavailable (
165
164
"Failed to establish connection to {!r} (reason {})" .format (
166
165
resolved_address , error ))
@@ -175,6 +174,7 @@ def _secure(cls, s, host, ssl_context):
175
174
sni_host = host if HAS_SNI and host else None
176
175
s = ssl_context .wrap_socket (s , server_hostname = sni_host )
177
176
except (OSError , SSLError , CertificateError ) as cause :
177
+ cls .close_socket (s )
178
178
raise BoltSecurityError (
179
179
message = "Failed to establish encrypted connection." ,
180
180
address = (host , local_port )
@@ -233,20 +233,20 @@ def _handshake(cls, s, resolved_address):
233
233
# If no data is returned after a successful select
234
234
# response, the server has closed the connection
235
235
log .debug ("[#%04X] S: <CLOSE>" , local_port )
236
- BoltSocket .close_socket (s )
236
+ cls .close_socket (s )
237
237
raise ServiceUnavailable (
238
238
"Connection to {address} closed without handshake response" .format (
239
239
address = resolved_address ))
240
240
if data_size != 4 :
241
241
# Some garbled data has been received
242
242
log .debug ("[#%04X] S: @*#!" , local_port )
243
- s . close ( )
243
+ cls . close_socket ( s )
244
244
raise BoltProtocolError (
245
245
"Expected four byte Bolt handshake response from %r, received %r instead; check for incorrect port number" % (
246
246
resolved_address , data ), address = resolved_address )
247
247
elif data == b"HTTP" :
248
248
log .debug ("[#%04X] S: <CLOSE>" , local_port )
249
- BoltSocket .close_socket (s )
249
+ cls .close_socket (s )
250
250
raise ServiceUnavailable (
251
251
"Cannot to connect to Bolt service on {!r} "
252
252
"(looks like HTTP)" .format (resolved_address ))
@@ -257,12 +257,14 @@ def _handshake(cls, s, resolved_address):
257
257
258
258
@classmethod
259
259
def close_socket (cls , socket_ ):
260
+ if isinstance (socket_ , BoltSocket ):
261
+ socket_ = socket_ ._socket
260
262
try :
261
- if isinstance ( socket_ , BoltSocket ):
262
- socket_ . close ()
263
- else :
264
- socket_ . shutdown ( SHUT_RDWR )
265
- socket_ .close ()
263
+ socket_ . shutdown ( SHUT_RDWR )
264
+ except OSError :
265
+ pass
266
+ try :
267
+ socket_ .close ()
266
268
except OSError :
267
269
pass
268
270
@@ -296,11 +298,11 @@ def connect(cls, address, *, timeout, custom_resolver, ssl_context,
296
298
log .debug ("[#%04X] C: <CONNECTION FAILED> %s" , local_port ,
297
299
err_str )
298
300
if s :
299
- BoltSocket .close_socket (s )
301
+ cls .close_socket (s )
300
302
errors .append (error )
301
303
except Exception :
302
304
if s :
303
- BoltSocket .close_socket (s )
305
+ cls .close_socket (s )
304
306
raise
305
307
if not errors :
306
308
raise ServiceUnavailable (
0 commit comments