@@ -198,12 +198,10 @@ def ping(cls, address, *, timeout=None, **config):
198
198
ssl_context = config .get_ssl_context (),
199
199
keep_alive = config .keep_alive ,
200
200
)
201
- except ServiceUnavailable :
202
- return None
203
- except BoltHandshakeError as e :
201
+ except (ServiceUnavailable , SessionExpired , BoltHandshakeError ):
204
202
return None
205
203
else :
206
- s . close ( )
204
+ _close_socket ( s )
207
205
return protocol_version
208
206
209
207
@classmethod
@@ -250,20 +248,16 @@ def open(cls, address, *, auth=None, timeout=None, routing_context=None, **pool_
250
248
connection = Bolt4x3 (address , s , pool_config .max_connection_lifetime , auth = auth , user_agent = pool_config .user_agent , routing_context = routing_context )
251
249
else :
252
250
log .debug ("[#%04X] S: <CLOSE>" , s .getpeername ()[1 ])
253
- s .shutdown (SHUT_RDWR )
254
- s .close ()
251
+ _close_socket (s )
255
252
256
253
supported_versions = Bolt .protocol_handlers ().keys ()
257
254
raise BoltHandshakeError ("The Neo4J server does not support communication with this driver. This driver have support for Bolt Protocols {}" .format (supported_versions ), address = address , request_data = handshake , response_data = data )
258
255
259
256
try :
260
257
connection .hello ()
261
- except (SessionExpired , ServiceUnavailable ):
262
- raise
263
258
except Exception as error :
264
259
log .debug ("[#%04X] C: <CLOSE> %s" , s .getsockname ()[1 ], str (error ))
265
- s .shutdown (SHUT_RDWR )
266
- s .close ()
260
+ _close_socket (s )
267
261
raise error
268
262
269
263
return connection
@@ -933,7 +927,7 @@ def _connect(resolved_address, timeout, keep_alive):
933
927
except SocketTimeout :
934
928
log .debug ("[#0000] C: <TIMEOUT> %s" , resolved_address )
935
929
log .debug ("[#0000] C: <CLOSE> %s" , resolved_address )
936
- s . close ( )
930
+ _close_socket ( s )
937
931
raise ServiceUnavailable ("Timed out trying to establish connection to {!r}" .format (resolved_address ))
938
932
except OSError as error :
939
933
log .debug ("[#0000] C: <ERROR> %s %s" , type (error ).__name__ ,
@@ -954,7 +948,7 @@ def _secure(s, host, ssl_context):
954
948
sni_host = host if HAS_SNI and host else None
955
949
s = ssl_context .wrap_socket (s , server_hostname = sni_host )
956
950
except (SSLError , OSError ) as cause :
957
- s . close ( )
951
+ _close_socket ( s )
958
952
error = BoltSecurityError (message = "Failed to establish encrypted connection." , address = (host , local_port ))
959
953
error .__cause__ = cause
960
954
raise error
@@ -1005,7 +999,7 @@ def _handshake(s, resolved_address):
1005
999
# If no data is returned after a successful select
1006
1000
# response, the server has closed the connection
1007
1001
log .debug ("[#%04X] S: <CLOSE>" , local_port )
1008
- s . close ( )
1002
+ _close_socket ( s )
1009
1003
raise ServiceUnavailable ("Connection to {address} closed without handshake response" .format (address = resolved_address ))
1010
1004
if data_size != 4 :
1011
1005
# Some garbled data has been received
@@ -1014,14 +1008,22 @@ def _handshake(s, resolved_address):
1014
1008
raise BoltProtocolError ("Expected four byte Bolt handshake response from %r, received %r instead; check for incorrect port number" % (resolved_address , data ), address = resolved_address )
1015
1009
elif data == b"HTTP" :
1016
1010
log .debug ("[#%04X] S: <CLOSE>" , local_port )
1017
- s . close ( )
1011
+ _close_socket ( s )
1018
1012
raise ServiceUnavailable ("Cannot to connect to Bolt service on {!r} "
1019
1013
"(looks like HTTP)" .format (resolved_address ))
1020
1014
agreed_version = data [- 1 ], data [- 2 ]
1021
1015
log .debug ("[#%04X] S: <HANDSHAKE> 0x%06X%02X" , local_port , agreed_version [1 ], agreed_version [0 ])
1022
1016
return s , agreed_version , handshake , data
1023
1017
1024
1018
1019
+ def _close_socket (socket_ ):
1020
+ try :
1021
+ socket_ .shutdown (SHUT_RDWR )
1022
+ socket_ .close ()
1023
+ except OSError :
1024
+ pass
1025
+
1026
+
1025
1027
def connect (address , * , timeout , custom_resolver , ssl_context , keep_alive ):
1026
1028
""" Connect and perform a handshake and return a valid Connection object,
1027
1029
assuming a protocol version can be agreed.
@@ -1041,7 +1043,7 @@ def connect(address, *, timeout, custom_resolver, ssl_context, keep_alive):
1041
1043
return _handshake (s , address )
1042
1044
except Exception as error :
1043
1045
if s :
1044
- s . close ( )
1046
+ _close_socket ( s )
1045
1047
last_error = error
1046
1048
if last_error is None :
1047
1049
raise ServiceUnavailable ("Failed to resolve addresses for %s" % address )
0 commit comments