o
    Fh/'                     @   s  U d dl Z d dlZd dlZd dlmZmZmZmZmZ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yD   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r^eejM ZG d	d
 d
eZG dd deZG dd dZ e
eeef  Z!ereneZ"e!e#d< dS )    N)AnyDictFinalListOptionalTupleTypeUnion   )AbstractResolverResolveResult)ThreadedResolverAsyncResolverDefaultResolvergetaddrinfoFAI_MASKc                
   @   s\   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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loopreturnc                 C   s   |pt  | _d S N)asyncioget_running_loop_loop)selfr    r   C/var/www/html/venv/lib/python3.10/site-packages/aiohttp/resolver.py__init__"   s   zThreadedResolver.__init__r   hostportfamilyc                    s   | j j||tj|tdI d H }g }|D ]I\}}}}}|tjkrEt|dk r'q|d r<| j |tI d H \}	}
t	|
}n|d d \}	}n|tj
ksLJ |\}	}|t||	|||td q|S )N)typer   flags      hostnamer   r   r   protor    )r   r   socketSOCK_STREAM_AI_ADDRCONFIG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%   s@   

zThreadedResolver.resolvec                    s   d S r   r   r   r   r   r   closeQ   s   zThreadedResolver.closer   r   N)__name__
__module____qualname____doc__r   r   AbstractEventLoopr   r&   r.   strr-   AddressFamilyr   r   r7   r9   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	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_queryr7   )r   r   rB   rC   r   r   r   r   X   s   zAsyncResolver.__init__r   r   r   r   c                    sB  z| j j||tj|tdI d H }W n" tjjy4 } zt|j	dkr(|j	d nd}t
d ||d }~ww g }|jD ]]}|j}	|j}|tjkrxt|	dkrl|	d rl| j |	d dg|	dd  R tI d H }
|
j}n|	d d}|	d }n|tjksJ |	d d}|	d }|t||||dtd q:|st
d d|S )N)r   r   r   r    r
   DNS lookup failedr!   r   asciir#   )rI   r   r&   r'   r(   rE   errorDNSErrorr*   rB   OSErrornodesaddrr   r)   r+   decoder,   noder.   r/   r   r0   )r   r   r   r   respexcmsgr2   rV   r4   resultr5   r   r   r   r7   q   sV   




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
   rN   r   r#   )r&   r)   rI   queryrE   rP   rQ   r*   rB   rR   r/   r   AI_NUMERICHOST)
r   r   r   r   qtyperW   rX   rY   r2   rrr   r   r   rM      s.   
z!AsyncResolver._resolve_with_queryc                    sF   | j r| j | | j d | _ d | _d S | jd ur| j  d | _d S r   )rG   release_resolverr   rI   cancelr8   r   r   r   r9      s   


zAsyncResolver.closer   r:   )r;   r<   r=   r>   r   r   r?   r   r   r&   r.   r@   r-   rA   r   r   r7   r   rM   r9   r   r   r   r   r   U   sB    

4
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 )rJ   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   )rc   super__new___init)cls	__class__r   r   re      s   

z_DNSResolverManager.__new__c                 C   s   t  | _d S r   )weakrefWeakKeyDictionary
_loop_datar8   r   r   r   rf      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   )rl   rE   rH   rj   WeakSetadd)r   rm   r   resolver
client_setr   r   r   rK      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)rl   getdiscardrb   )r   rm   r   current_loop_datarp   rq   r   r   r   ra      s   

z$_DNSResolverManager.release_resolver)r   rJ   r:   )r;   r<   r=   r>   rc   r   __annotations__re   rf   r   r?   rK   ra   __classcell__r   r   rh   r   rJ      s&   
 

rJ   r   )$r   r&   rj   typingr   r   r   r   r   r   r   r	   abcr   r   __all__rE   rL   rH   aiodns_defaultImportErrorr^   AI_NUMERICSERVr0   NI_NUMERICHOSTNI_NUMERICSERVr,   AI_ADDRCONFIGr(   r   r   r   rJ   _DefaultTyper   ru   r   r   r   r   <module>   s.   
 (

:yC