@@ -253,6 +253,8 @@ async def _connect_secure(cls, resolved_address, timeout, keep_alive, ssl):
253
253
raise
254
254
except (SSLError , CertificateError ) as error :
255
255
local_port = s .getsockname ()[1 ]
256
+ if s :
257
+ await cls .close_socket (s )
256
258
raise BoltSecurityError (
257
259
message = "Failed to establish encrypted connection." ,
258
260
address = (resolved_address .host_name , local_port )
@@ -261,7 +263,8 @@ async def _connect_secure(cls, resolved_address, timeout, keep_alive, ssl):
261
263
log .debug ("[#0000] C: <ERROR> %s %s" , type (error ).__name__ ,
262
264
" " .join (map (repr , error .args )))
263
265
log .debug ("[#0000] C: <CLOSE> %s" , resolved_address )
264
- s .close ()
266
+ if s :
267
+ await cls .close_socket (s )
265
268
raise ServiceUnavailable (
266
269
"Failed to establish connection to {!r} (reason {})" .format (
267
270
resolved_address , error ))
@@ -334,14 +337,20 @@ async def _handshake(self, resolved_address):
334
337
335
338
@classmethod
336
339
async def close_socket (cls , socket_ ):
337
- try :
338
- if isinstance ( socket_ , AsyncBoltSocket ) :
340
+ if isinstance ( socket_ , AsyncBoltSocket ) :
341
+ try :
339
342
await socket_ .close ()
340
- else :
343
+ except OSError :
344
+ pass
345
+ else :
346
+ try :
341
347
socket_ .shutdown (SHUT_RDWR )
348
+ except OSError :
349
+ pass
350
+ try :
342
351
socket_ .close ()
343
- except OSError :
344
- pass
352
+ except OSError :
353
+ pass
345
354
346
355
@classmethod
347
356
async def connect (cls , address , * , timeout , custom_resolver , ssl_context ,
@@ -463,8 +472,7 @@ def sendall(self, data):
463
472
return self ._wait_for_io (self ._socket .sendall , data )
464
473
465
474
def close (self ):
466
- self ._socket .shutdown (SHUT_RDWR )
467
- self ._socket .close ()
475
+ self .close_socket (self ._socket )
468
476
469
477
def kill (self ):
470
478
self ._socket .close ()
@@ -509,7 +517,7 @@ def _connect(cls, resolved_address, timeout, keep_alive):
509
517
log .debug ("[#0000] C: <ERROR> %s %s" , type (error ).__name__ ,
510
518
" " .join (map (repr , error .args )))
511
519
log .debug ("[#0000] C: <CLOSE> %s" , resolved_address )
512
- s . close ( )
520
+ cls . close_socket ( s )
513
521
raise ServiceUnavailable (
514
522
"Failed to establish connection to {!r} (reason {})" .format (
515
523
resolved_address , error ))
@@ -524,6 +532,7 @@ def _secure(cls, s, host, ssl_context):
524
532
sni_host = host if HAS_SNI and host else None
525
533
s = ssl_context .wrap_socket (s , server_hostname = sni_host )
526
534
except (OSError , SSLError , CertificateError ) as cause :
535
+ cls .close_socket (s )
527
536
raise BoltSecurityError (
528
537
message = "Failed to establish encrypted connection." ,
529
538
address = (host , local_port )
@@ -582,20 +591,20 @@ def _handshake(cls, s, resolved_address):
582
591
# If no data is returned after a successful select
583
592
# response, the server has closed the connection
584
593
log .debug ("[#%04X] S: <CLOSE>" , local_port )
585
- BoltSocket .close_socket (s )
594
+ cls .close_socket (s )
586
595
raise ServiceUnavailable (
587
596
"Connection to {address} closed without handshake response" .format (
588
597
address = resolved_address ))
589
598
if data_size != 4 :
590
599
# Some garbled data has been received
591
600
log .debug ("[#%04X] S: @*#!" , local_port )
592
- s . close ( )
601
+ cls . close_socket ( s )
593
602
raise BoltProtocolError (
594
603
"Expected four byte Bolt handshake response from %r, received %r instead; check for incorrect port number" % (
595
604
resolved_address , data ), address = resolved_address )
596
605
elif data == b"HTTP" :
597
606
log .debug ("[#%04X] S: <CLOSE>" , local_port )
598
- BoltSocket .close_socket (s )
607
+ cls .close_socket (s )
599
608
raise ServiceUnavailable (
600
609
"Cannot to connect to Bolt service on {!r} "
601
610
"(looks like HTTP)" .format (resolved_address ))
@@ -606,12 +615,14 @@ def _handshake(cls, s, resolved_address):
606
615
607
616
@classmethod
608
617
def close_socket (cls , socket_ ):
618
+ if isinstance (socket_ , BoltSocket ):
619
+ socket_ = socket_ ._socket
609
620
try :
610
- if isinstance ( socket_ , BoltSocket ):
611
- socket_ . close ()
612
- else :
613
- socket_ . shutdown ( SHUT_RDWR )
614
- socket_ .close ()
621
+ socket_ . shutdown ( SHUT_RDWR )
622
+ except OSError :
623
+ pass
624
+ try :
625
+ socket_ .close ()
615
626
except OSError :
616
627
pass
617
628
@@ -647,11 +658,11 @@ def connect(cls, address, *, timeout, custom_resolver, ssl_context,
647
658
log .debug ("[#%04X] C: <CONNECTION FAILED> %s" , local_port ,
648
659
err_str )
649
660
if s :
650
- BoltSocket .close_socket (s )
661
+ cls .close_socket (s )
651
662
errors .append (error )
652
663
except Exception :
653
664
if s :
654
- BoltSocket .close_socket (s )
665
+ cls .close_socket (s )
655
666
raise
656
667
if not errors :
657
668
raise ServiceUnavailable (
0 commit comments