o
    )f                     @   s   U d dl Z d dlZd dlmZmZmZmZmZmZ ddl	m
Z
 ddlmZ dZzd dlZW n ey8   dZY nw dZG dd	 d	e
ZG d
d de
Zeeeef  ZerWeneZeed< dS )    N)AnyDictListOptionalTypeUnion   )AbstractResolver)get_running_loop)ThreadedResolverAsyncResolverDefaultResolverFc                   @   sb   e Zd ZdZddeej ddfddZdej	fde
d	ed
edeee
ef  fddZdddZdS )r   zThreaded resolver.

    Uses an Executor for synchronous getaddrinfo() calls.
    concurrent.futures.ThreadPoolExecutor is used by default.
    Nloopreturnc                 C   s   t || _d S N)r
   _loop)selfr    r   0lib/python3.10/site-packages/aiohttp/resolver.py__init__   s   zThreadedResolver.__init__r   hostnameportfamilyc              
      s   | j j||tj|tjdI d H }g }|D ]L\}}}}}|tjkrFt|dk r(q|d r=t|tjtj	B \}	}
t
|
}n|d d \}	}n|tjksMJ |\}	}|||	|||tjtjB d q|S )N)typer   flags      r   hostr   r   protor   )r   ZgetaddrinfosocketZSOCK_STREAMZAI_ADDRCONFIGAF_INET6lenZgetnameinfoZNI_NUMERICHOSTZNI_NUMERICSERVintAF_INETappendAI_NUMERICHOSTAI_NUMERICSERV)r   r   r   r   Zinfoshosts_r   addressr   Z_portr   r   r   resolve   s>   


zThreadedResolver.resolvec                    s   d S r   r   r   r   r   r   closeJ   s   zThreadedResolver.closer   r   N)__name__
__module____qualname____doc__r   asyncioAbstractEventLoopr   r    r$   strr#   r   r   r   r+   r-   r   r   r   r   r      s    
,r   c                   @   s   e Zd ZdZ	ddeej dededdfddZd	e	j
fd
edededeeeef  fddZd	e	j
fd
edededeeeef  fddZdddZdS )r   z9Use the `aiodns` package to make asynchronous DNS lookupsNr   argskwargsr   c                 O   sL   t d u rtdt|| _t j|d|i|| _t| jds$| j| _d S d S )Nz Resolver requires aiodns libraryr   gethostbyname)	aiodnsRuntimeErrorr
   r   ZDNSResolver	_resolverhasattr_resolve_with_queryr+   )r   r   r6   r7   r   r   r   r   Q   s   
zAsyncResolver.__init__r   r   r   r   c           	   
      s   z| j ||I d H }W n! tjjy. } zt|jdkr#|jd nd}t||d }~ww g }|jD ]}|	||||dt
jt
jB d q4|sMtd|S )Nr   DNS lookup failedr   r   )r;   r8   r9   errorDNSErrorr"   r6   OSErrorZ	addressesr%   r    r&   r'   )	r   r   r   r   respexcmsgr(   r*   r   r   r   r+   a   s,   


zAsyncResolver.resolvec           
   
      s   |t jkr	d}nd}z| j||I d H }W n! tjjy8 } zt|jdkr-|jd nd}t	||d }~ww g }|D ]}	|
||	j||dt jd q=|sTt	d|S )NZAAAAAr   r>   r   r   )r    r!   r;   Zqueryr9   r?   r@   r"   r6   rA   r%   r   r&   )
r   r   r   r   ZqtyperB   rC   rD   r(   Zrrr   r   r   r=   {   s2   

z!AsyncResolver._resolve_with_queryc                    s   | j   d S r   )r;   Zcancelr,   r   r   r   r-      s   zAsyncResolver.closer   r.   )r/   r0   r1   r2   r   r3   r4   r   r   r    r$   r5   r#   r   r   r+   r=   r-   r   r   r   r   r   N   sB    


 r   r   )r3   r    typingr   r   r   r   r   r   abcr	   Zhelpersr
   __all__r9   ImportErrorZaiodns_defaultr   r   Z_DefaultTyper   __annotations__r   r   r   r   <module>   s    
  :Q