diff --git a/src/neo4j/_async/io/_bolt_socket.py b/src/neo4j/_async/io/_bolt_socket.py index c33062e9..b59d2503 100644 --- a/src/neo4j/_async/io/_bolt_socket.py +++ b/src/neo4j/_async/io/_bolt_socket.py @@ -327,7 +327,11 @@ async def connect( s = None try: s = await cls._connect_secure( - resolved_address, tcp_timeout, keep_alive, ssl_context + resolved_address, + tcp_timeout, + deadline, + keep_alive, + ssl_context, ) agreed_version = await s._handshake(resolved_address, deadline) return s, agreed_version diff --git a/src/neo4j/_async_compat/network/_bolt_socket.py b/src/neo4j/_async_compat/network/_bolt_socket.py index c93781e4..1a52e55f 100644 --- a/src/neo4j/_async_compat/network/_bolt_socket.py +++ b/src/neo4j/_async_compat/network/_bolt_socket.py @@ -205,13 +205,14 @@ def kill(self): @classmethod async def _connect_secure( - cls, resolved_address, timeout, keep_alive, ssl_context + cls, resolved_address, timeout, deadline, keep_alive, ssl_context ) -> t.Self: """ Connect to the address and return the socket. :param resolved_address: :param timeout: seconds + :param deadline: deadline for the whole operation :param keep_alive: True or False :param ssl_context: SSLContext or None @@ -242,7 +243,11 @@ async def _connect_secure( if ssl_context is not None: hostname = resolved_address._host_name or None sni_host = hostname if HAS_SNI and hostname else None - ssl_kwargs.update(ssl=ssl_context, server_hostname=sni_host) + ssl_kwargs.update( + ssl=ssl_context, + server_hostname=sni_host, + ssl_handshake_timeout=deadline.to_timeout(), + ) log.debug("[#%04X] C: %s", local_port, hostname) reader = asyncio.StreamReader( @@ -463,13 +468,14 @@ def kill(self): @classmethod def _connect_secure( - cls, resolved_address, timeout, keep_alive, ssl_context + cls, resolved_address, timeout, deadline, keep_alive, ssl_context ): """ Connect to the address and return the socket. :param resolved_address: :param timeout: seconds + :param deadline: deadline for the whole operation :param keep_alive: True or False :returns: socket object """ @@ -531,7 +537,11 @@ def _connect_secure( sni_host = hostname if HAS_SNI and hostname else None log.debug("[#%04X] C: %s", local_port, hostname) try: + t = s.gettimeout() + if timeout: + s.settimeout(deadline.to_timeout()) s = ssl_context.wrap_socket(s, server_hostname=sni_host) + s.settimeout(t) except (OSError, SSLError, CertificateError) as cause: log.debug( "[#0000] S: %s: %s", diff --git a/src/neo4j/_sync/io/_bolt_socket.py b/src/neo4j/_sync/io/_bolt_socket.py index 44b18edc..64f3d641 100644 --- a/src/neo4j/_sync/io/_bolt_socket.py +++ b/src/neo4j/_sync/io/_bolt_socket.py @@ -327,7 +327,11 @@ def connect( s = None try: s = cls._connect_secure( - resolved_address, tcp_timeout, keep_alive, ssl_context + resolved_address, + tcp_timeout, + deadline, + keep_alive, + ssl_context, ) agreed_version = s._handshake(resolved_address, deadline) return s, agreed_version