28
28
from .types import HostPort
29
29
from .constants import (
30
30
CRLF , COLON , HTTP_1_1 , IS_WINDOWS , WHITESPACE , DEFAULT_TIMEOUT ,
31
- DEFAULT_THREADLESS , PROXY_AGENT_HEADER_VALUE , DEFAULT_SSL_CONTEXT_OPTIONS ,
31
+ DEFAULT_THREADLESS , DEFAULT_CONNECT_TIMEOUT , PROXY_AGENT_HEADER_VALUE ,
32
+ DEFAULT_SSL_CONTEXT_OPTIONS ,
32
33
)
33
34
34
35
@@ -249,9 +250,10 @@ def wrap_socket(
249
250
250
251
251
252
def new_socket_connection (
252
- addr : HostPort ,
253
- timeout : float = DEFAULT_TIMEOUT ,
254
- source_address : Optional [HostPort ] = None ,
253
+ addr : HostPort ,
254
+ timeout : float = DEFAULT_TIMEOUT ,
255
+ connect_timeout : float = DEFAULT_CONNECT_TIMEOUT ,
256
+ source_address : Optional [HostPort ] = None ,
255
257
) -> socket .socket :
256
258
conn = None
257
259
try :
@@ -260,22 +262,29 @@ def new_socket_connection(
260
262
conn = socket .socket (
261
263
socket .AF_INET , socket .SOCK_STREAM , 0 ,
262
264
)
263
- conn .settimeout (timeout )
265
+ conn .settimeout (connect_timeout )
264
266
conn .connect (addr )
265
267
else :
266
268
conn = socket .socket (
267
269
socket .AF_INET6 , socket .SOCK_STREAM , 0 ,
268
270
)
269
- conn .settimeout (timeout )
271
+ conn .settimeout (connect_timeout )
270
272
conn .connect ((addr [0 ], addr [1 ], 0 , 0 ))
271
273
except ValueError :
272
274
pass # does not appear to be an IPv4 or IPv6 address
273
275
274
276
if conn is not None :
277
+ conn .settimeout (timeout )
275
278
return conn
276
279
277
280
# try to establish dual stack IPv4/IPv6 connection.
278
- return socket .create_connection (addr , timeout = timeout , source_address = source_address )
281
+ conn = socket .create_connection (
282
+ addr ,
283
+ timeout = connect_timeout ,
284
+ source_address = source_address ,
285
+ )
286
+ conn .settimeout (timeout )
287
+ return conn
279
288
280
289
281
290
class socket_connection (contextlib .ContextDecorator ):
0 commit comments