2929import warnings
3030import weakref
3131
32+ from . import constants
3233from . import coroutines
3334from . import events
3435from . import futures
@@ -275,9 +276,11 @@ def _make_socket_transport(self, sock, protocol, waiter=None, *,
275276 """Create socket transport."""
276277 raise NotImplementedError
277278
278- def _make_ssl_transport (self , rawsock , protocol , sslcontext , waiter = None ,
279- * , server_side = False , server_hostname = None ,
280- extra = None , server = None ):
279+ def _make_ssl_transport (
280+ self , rawsock , protocol , sslcontext , waiter = None ,
281+ * , server_side = False , server_hostname = None ,
282+ extra = None , server = None ,
283+ ssl_handshake_timeout = constants .SSL_HANDSHAKE_TIMEOUT ):
281284 """Create SSL transport."""
282285 raise NotImplementedError
283286
@@ -635,10 +638,12 @@ async def getnameinfo(self, sockaddr, flags=0):
635638 return await self .run_in_executor (
636639 None , socket .getnameinfo , sockaddr , flags )
637640
638- async def create_connection (self , protocol_factory , host = None , port = None ,
639- * , ssl = None , family = 0 ,
640- proto = 0 , flags = 0 , sock = None ,
641- local_addr = None , server_hostname = None ):
641+ async def create_connection (
642+ self , protocol_factory , host = None , port = None ,
643+ * , ssl = None , family = 0 ,
644+ proto = 0 , flags = 0 , sock = None ,
645+ local_addr = None , server_hostname = None ,
646+ ssl_handshake_timeout = constants .SSL_HANDSHAKE_TIMEOUT ):
642647 """Connect to a TCP server.
643648
644649 Create a streaming transport connection to a given Internet host and
@@ -751,7 +756,8 @@ async def create_connection(self, protocol_factory, host=None, port=None,
751756 f'A Stream Socket was expected, got { sock !r} ' )
752757
753758 transport , protocol = await self ._create_connection_transport (
754- sock , protocol_factory , ssl , server_hostname )
759+ sock , protocol_factory , ssl , server_hostname ,
760+ ssl_handshake_timeout = ssl_handshake_timeout )
755761 if self ._debug :
756762 # Get the socket from the transport because SSL transport closes
757763 # the old socket and creates a new SSL socket
@@ -760,8 +766,10 @@ async def create_connection(self, protocol_factory, host=None, port=None,
760766 sock , host , port , transport , protocol )
761767 return transport , protocol
762768
763- async def _create_connection_transport (self , sock , protocol_factory , ssl ,
764- server_hostname , server_side = False ):
769+ async def _create_connection_transport (
770+ self , sock , protocol_factory , ssl ,
771+ server_hostname , server_side = False ,
772+ ssl_handshake_timeout = constants .SSL_HANDSHAKE_TIMEOUT ):
765773
766774 sock .setblocking (False )
767775
@@ -771,7 +779,8 @@ async def _create_connection_transport(self, sock, protocol_factory, ssl,
771779 sslcontext = None if isinstance (ssl , bool ) else ssl
772780 transport = self ._make_ssl_transport (
773781 sock , protocol , sslcontext , waiter ,
774- server_side = server_side , server_hostname = server_hostname )
782+ server_side = server_side , server_hostname = server_hostname ,
783+ ssl_handshake_timeout = ssl_handshake_timeout )
775784 else :
776785 transport = self ._make_socket_transport (sock , protocol , waiter )
777786
@@ -929,15 +938,17 @@ async def _create_server_getaddrinfo(self, host, port, family, flags):
929938 raise OSError (f'getaddrinfo({ host !r} ) returned empty list' )
930939 return infos
931940
932- async def create_server (self , protocol_factory , host = None , port = None ,
933- * ,
934- family = socket .AF_UNSPEC ,
935- flags = socket .AI_PASSIVE ,
936- sock = None ,
937- backlog = 100 ,
938- ssl = None ,
939- reuse_address = None ,
940- reuse_port = None ):
941+ async def create_server (
942+ self , protocol_factory , host = None , port = None ,
943+ * ,
944+ family = socket .AF_UNSPEC ,
945+ flags = socket .AI_PASSIVE ,
946+ sock = None ,
947+ backlog = 100 ,
948+ ssl = None ,
949+ reuse_address = None ,
950+ reuse_port = None ,
951+ ssl_handshake_timeout = constants .SSL_HANDSHAKE_TIMEOUT ):
941952 """Create a TCP server.
942953
943954 The host parameter can be a string, in that case the TCP server is
@@ -1026,13 +1037,16 @@ async def create_server(self, protocol_factory, host=None, port=None,
10261037 for sock in sockets :
10271038 sock .listen (backlog )
10281039 sock .setblocking (False )
1029- self ._start_serving (protocol_factory , sock , ssl , server , backlog )
1040+ self ._start_serving (protocol_factory , sock , ssl , server , backlog ,
1041+ ssl_handshake_timeout )
10301042 if self ._debug :
10311043 logger .info ("%r is serving" , server )
10321044 return server
10331045
1034- async def connect_accepted_socket (self , protocol_factory , sock ,
1035- * , ssl = None ):
1046+ async def connect_accepted_socket (
1047+ self , protocol_factory , sock ,
1048+ * , ssl = None ,
1049+ ssl_handshake_timeout = constants .SSL_HANDSHAKE_TIMEOUT ):
10361050 """Handle an accepted connection.
10371051
10381052 This is used by servers that accept connections outside of
@@ -1045,7 +1059,8 @@ async def connect_accepted_socket(self, protocol_factory, sock,
10451059 raise ValueError (f'A Stream Socket was expected, got { sock !r} ' )
10461060
10471061 transport , protocol = await self ._create_connection_transport (
1048- sock , protocol_factory , ssl , '' , server_side = True )
1062+ sock , protocol_factory , ssl , '' , server_side = True ,
1063+ ssl_handshake_timeout = ssl_handshake_timeout )
10491064 if self ._debug :
10501065 # Get the socket from the transport because SSL transport closes
10511066 # the old socket and creates a new SSL socket
0 commit comments