Skip to content

Commit 3e3242b

Browse files
committed
Refactor closing of sockets into separate function
This allows to categorically ignore failures when closing a socket
1 parent 7c3f87b commit 3e3242b

File tree

1 file changed

+17
-15
lines changed

1 file changed

+17
-15
lines changed

neo4j/io/__init__.py

Lines changed: 17 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -198,12 +198,10 @@ def ping(cls, address, *, timeout=None, **config):
198198
ssl_context=config.get_ssl_context(),
199199
keep_alive=config.keep_alive,
200200
)
201-
except ServiceUnavailable:
202-
return None
203-
except BoltHandshakeError as e:
201+
except (ServiceUnavailable, SessionExpired, BoltHandshakeError):
204202
return None
205203
else:
206-
s.close()
204+
_close_socket(s)
207205
return protocol_version
208206

209207
@classmethod
@@ -250,20 +248,16 @@ def open(cls, address, *, auth=None, timeout=None, routing_context=None, **pool_
250248
connection = Bolt4x3(address, s, pool_config.max_connection_lifetime, auth=auth, user_agent=pool_config.user_agent, routing_context=routing_context)
251249
else:
252250
log.debug("[#%04X] S: <CLOSE>", s.getpeername()[1])
253-
s.shutdown(SHUT_RDWR)
254-
s.close()
251+
_close_socket(s)
255252

256253
supported_versions = Bolt.protocol_handlers().keys()
257254
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)
258255

259256
try:
260257
connection.hello()
261-
except (SessionExpired, ServiceUnavailable):
262-
raise
263258
except Exception as error:
264259
log.debug("[#%04X] C: <CLOSE> %s", s.getsockname()[1], str(error))
265-
s.shutdown(SHUT_RDWR)
266-
s.close()
260+
_close_socket(s)
267261
raise error
268262

269263
return connection
@@ -933,7 +927,7 @@ def _connect(resolved_address, timeout, keep_alive):
933927
except SocketTimeout:
934928
log.debug("[#0000] C: <TIMEOUT> %s", resolved_address)
935929
log.debug("[#0000] C: <CLOSE> %s", resolved_address)
936-
s.close()
930+
_close_socket(s)
937931
raise ServiceUnavailable("Timed out trying to establish connection to {!r}".format(resolved_address))
938932
except OSError as error:
939933
log.debug("[#0000] C: <ERROR> %s %s", type(error).__name__,
@@ -954,7 +948,7 @@ def _secure(s, host, ssl_context):
954948
sni_host = host if HAS_SNI and host else None
955949
s = ssl_context.wrap_socket(s, server_hostname=sni_host)
956950
except (SSLError, OSError) as cause:
957-
s.close()
951+
_close_socket(s)
958952
error = BoltSecurityError(message="Failed to establish encrypted connection.", address=(host, local_port))
959953
error.__cause__ = cause
960954
raise error
@@ -1005,7 +999,7 @@ def _handshake(s, resolved_address):
1005999
# If no data is returned after a successful select
10061000
# response, the server has closed the connection
10071001
log.debug("[#%04X] S: <CLOSE>", local_port)
1008-
s.close()
1002+
_close_socket(s)
10091003
raise ServiceUnavailable("Connection to {address} closed without handshake response".format(address=resolved_address))
10101004
if data_size != 4:
10111005
# Some garbled data has been received
@@ -1014,14 +1008,22 @@ def _handshake(s, resolved_address):
10141008
raise BoltProtocolError("Expected four byte Bolt handshake response from %r, received %r instead; check for incorrect port number" % (resolved_address, data), address=resolved_address)
10151009
elif data == b"HTTP":
10161010
log.debug("[#%04X] S: <CLOSE>", local_port)
1017-
s.close()
1011+
_close_socket(s)
10181012
raise ServiceUnavailable("Cannot to connect to Bolt service on {!r} "
10191013
"(looks like HTTP)".format(resolved_address))
10201014
agreed_version = data[-1], data[-2]
10211015
log.debug("[#%04X] S: <HANDSHAKE> 0x%06X%02X", local_port, agreed_version[1], agreed_version[0])
10221016
return s, agreed_version, handshake, data
10231017

10241018

1019+
def _close_socket(socket_):
1020+
try:
1021+
socket_.shutdown(SHUT_RDWR)
1022+
socket_.close()
1023+
except OSError:
1024+
pass
1025+
1026+
10251027
def connect(address, *, timeout, custom_resolver, ssl_context, keep_alive):
10261028
""" Connect and perform a handshake and return a valid Connection object,
10271029
assuming a protocol version can be agreed.
@@ -1041,7 +1043,7 @@ def connect(address, *, timeout, custom_resolver, ssl_context, keep_alive):
10411043
return _handshake(s, address)
10421044
except Exception as error:
10431045
if s:
1044-
s.close()
1046+
_close_socket(s)
10451047
last_error = error
10461048
if last_error is None:
10471049
raise ServiceUnavailable("Failed to resolve addresses for %s" % address)

0 commit comments

Comments
 (0)