U
    ~fh#                     @   s"  d Z ddlZddlZddlZddlZddlZddlZddlZej	dkZ
dd ZG dd dZdd	 ZG d
d dejjZG dd dejjZejdrddlZddlZddlZddlZejZejjjZddlmZmZmZ G dd deZ G dd dej!Z"nejj#Z"G dd dejj$Z$dS )zasyncio library query support    Nwin32c                   C   s,   z
t  W S  tk
r&   t   Y S X d S N)asyncioZget_running_loopAttributeErrorZget_event_loop r   r   8/tmp/pip-unpacked-wheel-z_du6bmr/dns/_asyncio_backend.py_get_running_loop   s    
r   c                   @   s<   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd ZdS )_DatagramProtocolc                 C   s   d | _ d | _d S r   )	transportrecvfromselfr   r   r   __init__   s    z_DatagramProtocol.__init__c                 C   s
   || _ d S r   )r
   )r   r
   r   r   r   connection_made   s    z!_DatagramProtocol.connection_madec                 C   s$   | j r | j  s | j ||f d S r   )r   doneZ
set_result)r   dataaddrr   r   r   datagram_received    s    z#_DatagramProtocol.datagram_receivedc                 C   s    | j r| j  s| j | d S r   )r   r   set_exception)r   excr   r   r   error_received$   s    z _DatagramProtocol.error_receivedc              
   C   sb   | j r^| j  s^|d krRztW q^ tk
rN } z| j | W 5 d }~X Y q^X n| j | d S r   )r   r   EOFErrorr   )r   r   er   r   r   connection_lost(   s     z!_DatagramProtocol.connection_lostc                 C   s   | j   d S r   )r
   closer   r   r   r   r   3   s    z_DatagramProtocol.closeN)	__name__
__module____qualname__r   r   r   r   r   r   r   r   r   r   r	      s   r	   c                    sR   |d k	rDzt | |I d H W S  t jk
r@   tjj|dY qNX n
| I d H S d S )N)timeout)r   wait_forTimeoutErrordns	exceptionTimeout)	awaitabler   r   r   r   _maybe_wait_for7   s    r%   c                       sL   e Zd Z fddZdd Zdd Zdd Zd	d
 Zdd Zdd Z	  Z
S )DatagramSocketc                    s   t  | || _|| _d S r   )superr   r
   protocol)r   familyr
   r(   	__class__r   r   r   B   s    zDatagramSocket.__init__c                    s   | j || t|S r   )r
   sendtolen)r   whatdestinationr   r   r   r   r,   G   s    zDatagramSocket.sendtoc                    sN   t   }z4| jjd kst|| j_t||I d H  | W S d | j_X d S r   )r   Zcreate_futurer(   r   AssertionErrorr%   result)r   sizer   r   r   r   r   r   L   s    
zDatagramSocket.recvfromc                    s   | j   d S r   )r(   r   r   r   r   r   r   W   s    zDatagramSocket.closec                    s   | j dS NZpeernamer
   get_extra_infor   r   r   r   getpeernameZ   s    zDatagramSocket.getpeernamec                    s   | j dS NZsocknamer4   r   r   r   r   getsockname]   s    zDatagramSocket.getsocknamec                    s   t d S r   NotImplementedErrorr   r   r   r   r   getpeercert`   s    zDatagramSocket.getpeercert)r   r   r   r   r,   r   r   r6   r8   r<   __classcell__r   r   r*   r   r&   A   s   r&   c                   @   sD   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd Zdd Z	dS )StreamSocketc                 C   s   || _ || _|| _d S r   )r)   readerwriter)r   afr?   r@   r   r   r   r   e   s    zStreamSocket.__init__c                    s"   | j | t| j  |I d H S r   )r@   writer%   Zdrain)r   r.   r   r   r   r   sendallj   s    zStreamSocket.sendallc                    s   t | j||I d H S r   )r%   r?   read)r   r2   r   r   r   r   recvn   s    zStreamSocket.recvc                    s   | j   d S r   )r@   r   r   r   r   r   r   q   s    zStreamSocket.closec                    s   | j dS r3   r@   r5   r   r   r   r   r6   t   s    zStreamSocket.getpeernamec                    s   | j dS r7   rF   r   r   r   r   r8   w   s    zStreamSocket.getsocknamec                    s   | j dS )NZpeercertrF   r;   r   r   r   r<   z   s    zStreamSocket.getpeercertN)
r   r   r   r   rC   rE   r   r6   r8   r<   r   r   r   r   r>   d   s   r>   Zdoh)_compute_times_expiration_for_this_attempt
_remainingc                       s8   e Zd Z fddZd
ddZdddZdd	 Z  ZS )_NetworkBackendc                    s6   t    || _|| _|| _|| _|dkr2tdd S )Nr   z9the asyncio transport for HTTPX cannot set the local port)r'   r   Z_local_port	_resolver_bootstrap_address_familyr:   )r   resolver
local_portbootstrap_addressr)   r*   r   r   r      s    
z_NetworkBackend.__init__Nc              
      s   g }t |\}}tj|r(|| nV| jd k	r@|| j n>t|}| j}	|r^tj|}	| j	j
||	|dI d H }
|
 }|D ]f}zLtd|}t|}t| tj|||dI d H }W 5 Q R X t|W   S  tk
r   Y qX qtjd S )N)r)   Zlifetimeg       @)Zremote_hostZremote_portZ
local_host)rG   r!   inetZ
is_addressappendrL   rI   rM   Zaf_for_addressrK   resolve_name	addressesrH   anyioZ
fail_afterconnect_tcp_CoreAnyIOStream	ExceptionhttpcoreZConnectError)r   hostportr   Zlocal_addresssocket_optionsrT   _Z
expirationr)   ZanswersaddressZattempt_expirationstreamr   r   r   rV      s<    
  
z_NetworkBackend.connect_tcpc                    s   t d S r   r9   )r   pathr   r\   r   r   r   connect_unix_socket   s    z#_NetworkBackend.connect_unix_socketc                    s   t |I d H  d S r   )rU   sleep)r   secondsr   r   r   rb      s    z_NetworkBackend.sleep)N)N)r   r   r   r   rV   ra   rb   r=   r   r   r*   r   rJ      s    
" 
rJ   c                       s*   e Zd Zdddejd fdd
Z  ZS )_HTTPTransportr   N)rO   rP   rN   r)   c                   s>   |d krdd l }|j }t j|| t||||| j_d S )Nr   )Zdns.asyncresolverZasyncresolverResolverr'   r   rJ   _poolZ_network_backend)r   rO   rP   rN   r)   argskwargsr!   r*   r   r   r      s    	
   z_HTTPTransport.__init__)r   r   r   socket	AF_UNSPECr   r=   r   r   r*   r   rd      s
   rd   c                   @   s>   e Zd Zdd ZdddZdd Zd	d
 Zdd Zdd ZdS )Backendc                 C   s   dS )Nr   r   r   r   r   r   name   s    zBackend.namer   Nc	              
      s   t  }	|tjkrVtr,|d kr,tj|df}|	jt||||dI d H \}
}t	||
|S |tj
kr|d krptdttj|d |d |||||d|I d H \}}t|||S tdd|  d S )Nr   )r)   protoZremote_addrz'destination required for stream sockets   )sslr)   rm   Z
local_addrserver_hostnamezunsupported socket ztype )r   ri   
SOCK_DGRAM	_is_win32r!   rQ   Z
any_for_afZcreate_datagram_endpointr	   r&   SOCK_STREAM
ValueErrorr%   r   Zopen_connectionr>   r:   )r   rA   socktyperm   sourcer/   r   ssl_contextrp   Zloopr
   r(   rwr   r   r   make_socket   s>    

	zBackend.make_socketc                    s   t |I d H  d S r   )r   rb   )r   intervalr   r   r   rb   	  s    zBackend.sleepc                 C   s   dS )NFr   r   r   r   r   datagram_connection_required  s    z$Backend.datagram_connection_requiredc                 C   s   t S r   )rd   r   r   r   r   get_transport_class  s    zBackend.get_transport_classc                    s   t ||I d H S r   )r%   )r   r$   r   r   r   r   r     s    zBackend.wait_for)r   NNNNN)	r   r   r   rl   rz   rb   r|   r}   r   r   r   r   r   rk      s         
/rk   )%__doc__r   ri   sysZdns._asyncbackendr!   Zdns._featuresZdns.exceptionZdns.inetplatformrr   r   r	   r%   Z_asyncbackendr&   r>   Z	_featuresZhaverU   rY   Zhttpcore._backends.anyioZhttpxZAsyncNetworkBackendZ_CoreAsyncNetworkBackendZ	_backendsZAnyIOStreamrW   Z	dns.queryrG   rH   rI   rJ   ZAsyncHTTPTransportrd   ZNullTransportrk   r   r   r   r   <module>   s2   

#
5