o
    *fj{*                     @   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re 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   t/var/www/botplatforma_usr/data/www/botplatforma.ilyaolesya.ru/.venv/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   zThreaded 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rt	|	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sJ |	d d}|	d }|t||||jdtd q\|st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   zManager 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 )zRelease 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