o
    4˜Žj{*  ã                   @   s  U d dl Z d dlZd dlZd dlZd dlmZmZmZ ddlm	Z	m
Z
 dZzd dlZeejdƒZW n ey>   dZdZY nw ejejB ZejejB ZejZeedƒrXeejM Zejd	kZd
edefdd„ZG dd„ de	ƒZG dd„ de	ƒZ G dd„ dƒZ!e"e eB  Z#er‡e neZ$e#e%d< dS )é    N)ÚAnyÚFinalÚOptionalé   )ÚAbstractResolverÚResolveResult)ÚThreadedResolverÚAsyncResolverÚDefaultResolverÚgetaddrinfoFÚAI_MASKÚwin32ÚhostÚreturnc                 C   s   t o
|  d¡ ¡ dkS )NÚ.Ú	localhost)Ú_IS_WINDOWSÚrstripÚcasefold)r   © r   úM/var/www/kodo/Anonymous/send/lib/python3.10/site-packages/aiohttp/resolver.pyÚ_is_windows_localhost   s   r   c                
   @   s\   e Zd ZdZddejdB ddfdd„Zdejfde	d	e
d
ejdee fdd„Z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Úloopr   c                 C   s   |pt  ¡ | _d S ©N)ÚasyncioÚget_running_loopÚ_loop)Úselfr   r   r   r   Ú__init__(   s   zThreadedResolver.__init__r   r   ÚportÚfamilyc                 Ã   s  �z| j j||tj|td�I d H }W n tjy0   t|ƒs‚ | j j||tj|dd�I d H }Y nw g }|D ]I\}}}}}|tjkrft|ƒdk rHq5|d r]| j  	|t
¡I d H \}	}
t|
ƒ}n|d d… \}	}n|tjksmJ ‚|\}	}| t||	|||td�¡ q5|S )N)Útyper    Úflagsr   é   é   ©Úhostnamer   r   r    Úprotor"   )r   r   ÚsocketÚSOCK_STREAMÚ_AI_ADDRCONFIGÚgaierrorr   ÚAF_INET6ÚlenÚgetnameinfoÚ_NAME_SOCKET_FLAGSÚintÚAF_INETÚappendr   Ú_NUMERIC_SOCKET_FLAGS)r   r   r   r    ÚinfosÚhostsÚ_r'   ÚaddressÚresolved_hostÚ_portr   r   r   Úresolve+   sX   €ûûý
ÿ
úÿzThreadedResolver.resolvec                 Ã   s   �d S r   r   ©r   r   r   r   Úcloseb   s   €zThreadedResolver.closer   ©r   N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   ÚAbstractEventLoopr   r(   r1   Ústrr0   ÚAddressFamilyÚlistr   r:   r<   r   r   r   r   r   !   s    ÿÿÿÿ
þ7r   c                   @   s”   e Zd ZdZ	ddejdB dededdfdd„Zd	ej	fd
e
dedejdee 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   sx   t d u rtdƒ‚|pt ¡ | _d | _|s|r!t j|i |¤Ž| _d S tƒ | _| j 	| | j¡| _t
| jdƒs:| j| _d S d S )Nz Resolver requires aiodns libraryÚgethostbyname)ÚaiodnsÚRuntimeErrorr   r   r   Ú_managerÚDNSResolverÚ	_resolverÚ_DNSResolverManagerÚget_resolverÚhasattrÚ_resolve_with_queryr:   )r   r   rF   rG   r   r   r   r   i   s   þzAsyncResolver.__init__r   r   r   r    c                 Ã   s†  �z3z| j j||tj|td�I d H }W n tjjy2   t|ƒs!‚ | j j||tj|dd�I d H }Y nw W n" tjjyV } zt	|j
ƒdkrJ|j
d nd}td |ƒ|‚d }~ww g }|jD ]]}|j}	|jtjkr˜t	|	ƒdkrŒ|	d rŒ| j  |	d  d¡g|	dd … ¢R t¡I d H }
|
j}n|	d  d¡}|	d }n|jtjks J ‚|	d  d¡}|	d }| t||||jdtd�¡ q\|sÁtd dƒ‚|S )N)r   r!   r    r"   r   r   úDNS lookup failedr#   Úasciir%   )rM   r   r(   r)   r*   rI   ÚerrorÚDNSErrorr   r-   rF   ÚOSErrorÚnodesÚaddrr    r,   r.   Údecoder/   Únoder1   r2   r   r3   )r   r   r   r    ÚrespÚexcÚmsgr5   rZ   r7   Úresultr8   r   r   r   r:   ‚   sn   €ûûý€
€þ

þ
úÿ
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 |ƒ|‚d }~ww g }|D ]}	| 
||	j||dt jdœ¡ q=|sUt	d dƒ‚|S )NÚAAAAÚAr   rR   r   r%   )r(   r,   rM   ÚqueryrI   rT   rU   r-   rF   rV   r2   r   ÚAI_NUMERICHOST)
r   r   r   r    Úqtyper[   r\   r]   r5   Úrrr   r   r   rQ   ¿   s.   €€þúÿ
z!AsyncResolver._resolve_with_queryc                 Ã   sF   �| j r| j  | | j¡ d | _ d | _d S | jd ur| j ¡  d | _d S r   )rK   Úrelease_resolverr   rM   Úcancelr;   r   r   r   r<   Ü   s   €


zAsyncResolver.closer   r=   )r>   r?   r@   rA   r   rB   r   r   r(   r1   rC   r0   rD   rE   r   r:   ÚdictrQ   r<   r   r   r   r   r	   f   sB    þþýü
ûÿÿÿÿ
þ>ÿÿÿÿ
þr	   c                       sn   e Zd ZU dZdZed  ed< d‡ fdd„Zddd„Zd	d
de	j
ddfdd„Zd	d
de	j
ddfdd„Z‡  ZS )rN   z£Manager for aiodns.DNSResolver objects.

    This class manages shared aiodns.DNSResolver instances
    with no custom arguments across different event loops.
    NÚ	_instancer   c                    s(   | j d u rtƒ  | ¡| _ | j  ¡  | j S r   )rh   ÚsuperÚ__new__Ú_init)Úcls©Ú	__class__r   r   rj   ò   s   

z_DNSResolverManager.__new__c                 C   s   t  ¡ | _d S r   )ÚweakrefÚWeakKeyDictionaryÚ
_loop_datar;   r   r   r   rk   ø   s   ýz_DNSResolverManager._initÚclientr	   r   zaiodns.DNSResolverc                 C   sJ   || j vrtj|d�}t ¡ }||f| j |< n| j | \}}| |¡ |S )a&  Get or create the shared aiodns.DNSResolver instance for a specific event loop.

        Args:
            client: The AsyncResolver instance requesting the resolver.
                   This is required to track resolver usage.
            loop: The event loop to use for the resolver.
        )r   )rq   rI   rL   ro   ÚWeakSetÚadd)r   rr   r   ÚresolverÚ
client_setr   r   r   rO   ÿ   s   

z _DNSResolverManager.get_resolverc                 C   sN   | j  |¡}|du rdS |\}}| |¡ |s%|dur| ¡  | j |= dS dS )zÎRelease the resolver for an AsyncResolver client when it's closed.

        Args:
            client: The AsyncResolver instance to release.
            loop: The event loop the resolver was using.
        N)rq   ÚgetÚdiscardrf   )r   rr   r   Úcurrent_loop_dataru   rv   r   r   r   re     s   

ýz$_DNSResolverManager.release_resolver)r   rN   r=   )r>   r?   r@   rA   rh   r   Ú__annotations__rj   rk   r   rB   rO   re   Ú__classcell__r   r   rm   r   rN   é   s&   
 
ÿÿ
þÿÿþrN   r
   )&r   r(   Úsysro   Útypingr   r   r   Úabcr   r   Ú__all__rI   rP   rL   Úaiodns_defaultÚImportErrorrb   ÚAI_NUMERICSERVr3   ÚNI_NUMERICHOSTÚNI_NUMERICSERVr/   ÚAI_ADDRCONFIGr*   r   Úplatformr   rC   Úboolr   r   r	   rN   r!   Ú_DefaultTyper
   rz   r   r   r   r   Ú<module>   s6   
 þ


E C