@@ -157,20 +157,6 @@ def _ipaddr_info(host, port, family, type, proto):
157157 return None
158158
159159
160- def _ensure_resolved (address , * , family = 0 , type = socket .SOCK_STREAM , proto = 0 ,
161- flags = 0 , loop ):
162- host , port = address [:2 ]
163- info = _ipaddr_info (host , port , family , type , proto )
164- if info is not None :
165- # "host" is already a resolved IP.
166- fut = loop .create_future ()
167- fut .set_result ([info ])
168- return fut
169- else :
170- return loop .getaddrinfo (host , port , family = family , type = type ,
171- proto = proto , flags = flags )
172-
173-
174160def _run_until_complete_cb (fut ):
175161 exc = fut ._exception
176162 if isinstance (exc , BaseException ) and not isinstance (exc , Exception ):
@@ -614,7 +600,7 @@ def call_soon_threadsafe(self, callback, *args):
614600 self ._write_to_self ()
615601 return handle
616602
617- def run_in_executor (self , executor , func , * args ):
603+ async def run_in_executor (self , executor , func , * args ):
618604 self ._check_closed ()
619605 if self ._debug :
620606 self ._check_callback (func , 'run_in_executor' )
@@ -623,7 +609,8 @@ def run_in_executor(self, executor, func, *args):
623609 if executor is None :
624610 executor = concurrent .futures .ThreadPoolExecutor ()
625611 self ._default_executor = executor
626- return futures .wrap_future (executor .submit (func , * args ), loop = self )
612+ return await futures .wrap_future (
613+ executor .submit (func , * args ), loop = self )
627614
628615 def set_default_executor (self , executor ):
629616 self ._default_executor = executor
@@ -652,17 +639,19 @@ def _getaddrinfo_debug(self, host, port, family, type, proto, flags):
652639 logger .debug (msg )
653640 return addrinfo
654641
655- def getaddrinfo (self , host , port , * ,
656- family = 0 , type = 0 , proto = 0 , flags = 0 ):
642+ async def getaddrinfo (self , host , port , * ,
643+ family = 0 , type = 0 , proto = 0 , flags = 0 ):
657644 if self ._debug :
658- return self .run_in_executor (None , self ._getaddrinfo_debug ,
659- host , port , family , type , proto , flags )
645+ getaddr_func = self ._getaddrinfo_debug
660646 else :
661- return self .run_in_executor (None , socket .getaddrinfo ,
662- host , port , family , type , proto , flags )
647+ getaddr_func = socket .getaddrinfo
663648
664- def getnameinfo (self , sockaddr , flags = 0 ):
665- return self .run_in_executor (None , socket .getnameinfo , sockaddr , flags )
649+ return await self .run_in_executor (
650+ None , getaddr_func , host , port , family , type , proto , flags )
651+
652+ async def getnameinfo (self , sockaddr , flags = 0 ):
653+ return await self .run_in_executor (
654+ None , socket .getnameinfo , sockaddr , flags )
666655
667656 async def create_connection (self , protocol_factory , host = None , port = None ,
668657 * , ssl = None , family = 0 ,
@@ -703,25 +692,17 @@ async def create_connection(self, protocol_factory, host=None, port=None,
703692 raise ValueError (
704693 'host/port and sock can not be specified at the same time' )
705694
706- f1 = _ensure_resolved ((host , port ), family = family ,
707- type = socket .SOCK_STREAM , proto = proto ,
708- flags = flags , loop = self )
709- fs = [f1 ]
710- if local_addr is not None :
711- f2 = _ensure_resolved (local_addr , family = family ,
712- type = socket .SOCK_STREAM , proto = proto ,
713- flags = flags , loop = self )
714- fs .append (f2 )
715- else :
716- f2 = None
717-
718- await tasks .wait (fs , loop = self )
719-
720- infos = f1 .result ()
695+ infos = await self ._ensure_resolved (
696+ (host , port ), family = family ,
697+ type = socket .SOCK_STREAM , proto = proto , flags = flags , loop = self )
721698 if not infos :
722699 raise OSError ('getaddrinfo() returned empty list' )
723- if f2 is not None :
724- laddr_infos = f2 .result ()
700+
701+ if local_addr is not None :
702+ laddr_infos = await self ._ensure_resolved (
703+ local_addr , family = family ,
704+ type = socket .SOCK_STREAM , proto = proto ,
705+ flags = flags , loop = self )
725706 if not laddr_infos :
726707 raise OSError ('getaddrinfo() returned empty list' )
727708
@@ -730,7 +711,7 @@ async def create_connection(self, protocol_factory, host=None, port=None,
730711 try :
731712 sock = socket .socket (family = family , type = type , proto = proto )
732713 sock .setblocking (False )
733- if f2 is not None :
714+ if local_addr is not None :
734715 for _ , _ , _ , _ , laddr in laddr_infos :
735716 try :
736717 sock .bind (laddr )
@@ -863,7 +844,7 @@ async def create_datagram_endpoint(self, protocol_factory,
863844 assert isinstance (addr , tuple ) and len (addr ) == 2 , (
864845 '2-tuple is expected' )
865846
866- infos = await _ensure_resolved (
847+ infos = await self . _ensure_resolved (
867848 addr , family = family , type = socket .SOCK_DGRAM ,
868849 proto = proto , flags = flags , loop = self )
869850 if not infos :
@@ -946,10 +927,22 @@ async def create_datagram_endpoint(self, protocol_factory,
946927
947928 return transport , protocol
948929
930+ async def _ensure_resolved (self , address , * ,
931+ family = 0 , type = socket .SOCK_STREAM ,
932+ proto = 0 , flags = 0 , loop ):
933+ host , port = address [:2 ]
934+ info = _ipaddr_info (host , port , family , type , proto )
935+ if info is not None :
936+ # "host" is already a resolved IP.
937+ return [info ]
938+ else :
939+ return await loop .getaddrinfo (host , port , family = family , type = type ,
940+ proto = proto , flags = flags )
941+
949942 async def _create_server_getaddrinfo (self , host , port , family , flags ):
950- infos = await _ensure_resolved ((host , port ), family = family ,
951- type = socket .SOCK_STREAM ,
952- flags = flags , loop = self )
943+ infos = await self . _ensure_resolved ((host , port ), family = family ,
944+ type = socket .SOCK_STREAM ,
945+ flags = flags , loop = self )
953946 if not infos :
954947 raise OSError (f'getaddrinfo({ host !r} ) returned empty list' )
955948 return infos
0 commit comments