o
    i/'                     @   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   J/home/kim/smarthome/.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_hostZ_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   r6   r8   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_queryr6   )r   r   rA   rB   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#   )rH   r   r&   r'   r(   rD   errorDNSErrorr*   rA   OSErrornodesaddrr   r)   r+   decoder,   noder.   r/   r   r0   )r   r   r   r   respexcmsgr2   rU   r4   resultr5   r   r   r   r6   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 )NZAAAAAr
   rM   r   r#   )r&   r)   rH   queryrD   rO   rP   r*   rA   rQ   r/   r   AI_NUMERICHOST)
r   r   r   r   ZqtyperV   rW   rX   r2   Zrrr   r   r   rL      s.   
z!AsyncResolver._resolve_with_queryc                    sF   | j r| j | | j d | _ d | _d S | jd ur| j  d | _d S r   )rF   release_resolverr   rH   cancelr7   r   r   r   r8      s   


zAsyncResolver.closer   r9   )r:   r;   r<   r=   r   r   r>   r   r   r&   r.   r?   r-   r@   r   r   r6   r   rL   r8   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 )rI   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   )r_   super__new___init)cls	__class__r   r   ra      s   

z_DNSResolverManager.__new__c                 C   s   t  | _d S r   )weakrefWeakKeyDictionary
_loop_datar7   r   r   r   rb      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   )rh   rD   rG   rf   WeakSetadd)r   ri   r   resolver
client_setr   r   r   rJ      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)rh   getdiscardr^   )r   ri   r   Zcurrent_loop_datarl   rm   r   r   r   r]      s   

z$_DNSResolverManager.release_resolver)r   rI   r9   )r:   r;   r<   r=   r_   r   __annotations__ra   rb   r   r>   rJ   r]   __classcell__r   r   rd   r   rI      s&   
 

rI   r   )$r   r&   rf   typingr   r   r   r   r   r   r   r	   abcr   r   __all__rD   rK   rG   Zaiodns_defaultImportErrorr\   AI_NUMERICSERVr0   NI_NUMERICHOSTNI_NUMERICSERVr,   AI_ADDRCONFIGr(   r   r   r   rI   Z_DefaultTyper   rp   r   r   r   r   <module>   s.   
 (

:yC