From 95de5a52960eb2e561b6b34baeb024d1f7520ebf Mon Sep 17 00:00:00 2001 From: Abhinav Singh Date: Mon, 17 Feb 2025 19:56:57 +0530 Subject: [PATCH 1/2] `DEFAULT_CONNECT_TIMEOUT = 10.0` --- proxy/common/constants.py | 1 + proxy/common/utils.py | 25 +++++++++++++++++-------- 2 files changed, 18 insertions(+), 8 deletions(-) diff --git a/proxy/common/constants.py b/proxy/common/constants.py index 5d042dbbbf..e34ad70d2c 100644 --- a/proxy/common/constants.py +++ b/proxy/common/constants.py @@ -149,6 +149,7 @@ def _env_threadless_compliant() -> bool: DEFAULT_THREADLESS = _env_threadless_compliant() DEFAULT_LOCAL_EXECUTOR = True DEFAULT_TIMEOUT = 10.0 +DEFAULT_CONNECT_TIMEOUT = 10.0 DEFAULT_VERSION = False DEFAULT_HTTP_PORT = 80 DEFAULT_HTTPS_PORT = 443 diff --git a/proxy/common/utils.py b/proxy/common/utils.py index 74bad92018..3c42b81419 100644 --- a/proxy/common/utils.py +++ b/proxy/common/utils.py @@ -28,7 +28,8 @@ from .types import HostPort from .constants import ( CRLF, COLON, HTTP_1_1, IS_WINDOWS, WHITESPACE, DEFAULT_TIMEOUT, - DEFAULT_THREADLESS, PROXY_AGENT_HEADER_VALUE, DEFAULT_SSL_CONTEXT_OPTIONS, + DEFAULT_THREADLESS, DEFAULT_CONNECT_TIMEOUT, PROXY_AGENT_HEADER_VALUE, + DEFAULT_SSL_CONTEXT_OPTIONS, ) @@ -51,7 +52,7 @@ def cert_der_to_dict(der: Optional[bytes]) -> Dict[str, Any]: cert_file.flush() cert_file.seek(0) try: - certificate = _ssl._test_decode_cert(cert_file.name) + certificate = _ssl._test_decode_cert(cert_file.name) # type: ignore[attr-defined] finally: cert_file.close() os.remove(cert_file.name) @@ -249,9 +250,10 @@ def wrap_socket( def new_socket_connection( - addr: HostPort, - timeout: float = DEFAULT_TIMEOUT, - source_address: Optional[HostPort] = None, + addr: HostPort, + timeout: float = DEFAULT_TIMEOUT, + connect_timeout: float = DEFAULT_CONNECT_TIMEOUT, + source_address: Optional[HostPort] = None, ) -> socket.socket: conn = None try: @@ -260,22 +262,29 @@ def new_socket_connection( conn = socket.socket( socket.AF_INET, socket.SOCK_STREAM, 0, ) - conn.settimeout(timeout) + conn.settimeout(connect_timeout) conn.connect(addr) else: conn = socket.socket( socket.AF_INET6, socket.SOCK_STREAM, 0, ) - conn.settimeout(timeout) + conn.settimeout(connect_timeout) conn.connect((addr[0], addr[1], 0, 0)) except ValueError: pass # does not appear to be an IPv4 or IPv6 address if conn is not None: + conn.settimeout(timeout) return conn # try to establish dual stack IPv4/IPv6 connection. - return socket.create_connection(addr, timeout=timeout, source_address=source_address) + conn = socket.create_connection( + addr, + timeout=connect_timeout, + source_address=source_address, + ) + conn.settimeout(timeout) + return conn class socket_connection(contextlib.ContextDecorator): From 32d7d5c7c36643cd749c2ff782e0d3e43412c83c Mon Sep 17 00:00:00 2001 From: Abhinav Singh Date: Mon, 17 Feb 2025 20:01:09 +0530 Subject: [PATCH 2/2] unused --- proxy/common/utils.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/proxy/common/utils.py b/proxy/common/utils.py index 3c42b81419..bf2b00892e 100644 --- a/proxy/common/utils.py +++ b/proxy/common/utils.py @@ -52,7 +52,7 @@ def cert_der_to_dict(der: Optional[bytes]) -> Dict[str, Any]: cert_file.flush() cert_file.seek(0) try: - certificate = _ssl._test_decode_cert(cert_file.name) # type: ignore[attr-defined] + certificate = _ssl._test_decode_cert(cert_file.name) finally: cert_file.close() os.remove(cert_file.name)