a
     ÑOcä  ã                   @   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yp   dZY n0 dZG dd	„ d	e
ƒZG d
d„ de
ƒZeeeef  Zer®eneZeed< dS )é    N)ÚAnyÚDictÚListÚOptionalÚTypeÚUnioné   )ÚAbstractResolver)Úget_running_loop)ÚThreadedResolverÚAsyncResolverÚDefaultResolverFc                   @   s^   e Zd ZdZdeej ddœdd„Zdej	fe
eeeee
ef  dœdd	„Zdd
œdd„ZdS )r   z�Threaded 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   úG/var/www/html/gsl.tools/lib/python3.9/site-packages/aiohttp/resolver.pyÚ__init__   s    zThreadedResolver.__init__r   )ÚhostnameÚportÚfamilyr   c              
   Ã   sÆ   | j j||tj|tjd�I d H }g }|D ]˜\}}}}}|tjkrŠt|ƒdk rNq(|d rxt |tjtj	B ¡\}	}
t
|
ƒ}q |d d… \}	}n|tjks˜J ‚|\}	}| ||	|||tjtjB dœ¡ q(|S )N)Útyper   Úflagsé   é   ©r   Úhostr   r   Úprotor   )r   ÚgetaddrinfoÚsocketÚSOCK_STREAMÚAI_ADDRCONFIGÚAF_INET6ÚlenÚgetnameinfoÚNI_NUMERICHOSTÚNI_NUMERICSERVÚintÚAF_INETÚappendÚAI_NUMERICHOSTÚAI_NUMERICSERV)r   r   r   r   ÚinfosÚhostsÚ_r   Úaddressr   Z_portr   r   r   Úresolve   s<    û
ÿ

úÿzThreadedResolver.resolve©r   c                 Ã   s   d S r   r   ©r   r   r   r   ÚcloseJ   s    zThreadedResolver.close)N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   ÚasyncioÚAbstractEventLoopr   r!   r*   Ústrr)   r   r   r   r2   r5   r   r   r   r   r      s   ÿþ,r   c                   @   sŠ   e Zd ZdZdeej eeddœdd„Zde	j
feeeeeeef  dœdd	„Zde	j
feeeeeeef  dœd
d„Zddœdd„ZdS )r   z9Use the `aiodns` package to make asynchronous DNS lookupsN)r   ÚargsÚkwargsr   c                 O   sH   t d u rtdƒ‚t|ƒ| _t j|d|i|¤Ž| _t| jdƒsD| j| _d S )Nz Resolver requires aiodns libraryr   Úgethostbyname)	ÚaiodnsÚRuntimeErrorr
   r   ZDNSResolverÚ	_resolverÚhasattrÚ_resolve_with_queryr2   )r   r   r=   r>   r   r   r   r   Q   s    
zAsyncResolver.__init__r   )r   r   r   r   c           	   
   Ã   s¨   z| j  ||¡I d H }W nN tjjyf } z2t|jƒdkrD|jd nd}t|ƒ|‚W Y d }~n
d }~0 0 g }|jD ]$}| 	||||dt
jt
jB dœ¡ qr|s¤tdƒ‚|S )Nr   úDNS lookup failedr   r   )rB   r?   r@   ÚerrorÚDNSErrorr%   r=   ÚOSErrorÚ	addressesr+   r!   r,   r-   )	r   r   r   r   ÚrespÚexcÚmsgr/   r1   r   r   r   r2   a   s&     

úÿzAsyncResolver.resolvec           
   
   Ã   s¶   |t jkrd}nd}z| j ||¡I d H }W nN tjjyz } z2t|jƒdkrX|jd nd}t	|ƒ|‚W Y d }~n
d }~0 0 g }|D ] }	| 
||	j||dt jdœ¡ q„|s²t	dƒ‚|S )NZAAAAÚAr   rE   r   r   )r!   r$   rB   Úqueryr@   rF   rG   r%   r=   rH   r+   r   r,   )
r   r   r   r   ZqtyperJ   rK   rL   r/   Úrrr   r   r   rD   {   s,    
 úÿz!AsyncResolver._resolve_with_queryr3   c                 Ã   s   | j  ¡  d S r   )rB   Úcancelr4   r   r   r   r5   ›   s    zAsyncResolver.close)N)r6   r7   r8   r9   r   r:   r;   r   r   r!   r*   r<   r)   r   r   r2   rD   r5   r   r   r   r   r   N   s&    þûÿþÿþ r   r   )r:   r!   Útypingr   r   r   r   r   r   Úabcr	   Zhelpersr
   Ú__all__r@   ÚImportErrorZaiodns_defaultr   r   Z_DefaultTyper   Ú__annotations__r   r   r   r   Ú<module>   s   
 
:Q