B
    ind                 @   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yd dlZW n ek
rr   dZY nX dZG dd	 d	e
ZG d
d de
Zeeeef  Zere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   zThreaded 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   4/tmp/pip-unpacked-wheel-fdo6ttx3/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 }x|D ]\}}}}}|tjkrt|dk rPq*|d rzt|tjtj	B \}	}
t
|
}q|d d \}	}n|tjkst|\}	}|||	|||tjtjB d q*W |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AssertionErrorappendAI_NUMERICHOSTAI_NUMERICSERV)r   r   r   r   infoshosts_r   addressr   Z_portr   r   r   resolve   s4    

zThreadedResolver.resolve)r   c                s   d S )Nr   )r   r   r   r   closeJ   s    zThreadedResolver.close)N)__name__
__module____qualname____doc__r   asyncioAbstractEventLoopr   r   r(   strr'   r   r   r   r1   r2   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 k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_queryr1   )r   r   r:   r;   r   r   r   r   Q   s    
zAsyncResolver.__init__r   )r   r   r   r   c       	   
      s   y| j ||I d H }W nL tjjk
rd } z*t|jdkrF|jd nd}t||W d d }~X Y nX g }x.|jD ]$}|	||||dt
jt
jB d qrW |std|S )Nr   zDNS lookup failedr   )r   r   r   r   r   r   )r?   r<   r=   errorDNSErrorr#   r:   OSError	addressesr*   r   r+   r,   )	r   r   r   r   respexcmsgr.   r0   r   r   r   r1   a   s"    zAsyncResolver.resolvec       
   
      s   |t jkrd}nd}y| j||I d H }W nL tjjk
rx } z*t|jdkrZ|jd nd}t	||W d d }~X Y nX g }x(|D ] }	|
||	j||dt jd qW |st	d|S )NZAAAAAr   zDNS lookup failedr   )r   r   r   r   r   r   )r   r"   r?   queryr=   rB   rC   r#   r:   rD   r*   r   r+   )
r   r   r   r   ZqtyperF   rG   rH   r.   rrr   r   r   rA   {   s(    

z!AsyncResolver._resolve_with_query)r   c                s   | j   d S )N)r?   cancel)r   r   r   r   r2      s    zAsyncResolver.close)N)r3   r4   r5   r6   r   r7   r8   r   r   r   r(   r9   r'   r   r   r1   rA   r2   r   r   r   r   r   N   s   
r   r   )r7   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