U
    d
#                     @   s  d 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zjd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W n ek
r   ejj ZY nX 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-pk5slln3/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   1   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_for5   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   @   s    zDatagramSocket.__init__c                    s   | j || t|S r   )r
   sendtolen)r   whatdestinationr   r   r   r   r,   E   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   J   s    
zDatagramSocket.recvfromc                    s   | j   d S r   )r(   r   r   r   r   r   r   U   s    zDatagramSocket.closec                    s   | j dS NZpeernamer
   get_extra_infor   r   r   r   getpeernameX   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&   ?   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   c   s    zStreamSocket.__init__c                    s"   | j | t| j  |I d H S r   )r@   writer%   Zdrain)r   r.   r   r   r   r   sendallh   s    zStreamSocket.sendallc                    s   t | j||I d H S r   )r%   r?   read)r   r2   r   r   r   r   recvl   s    zStreamSocket.recvc                    s   | j   d S r   )r@   r   r   r   r   r   r   o   s    zStreamSocket.closec                    s   | j dS r3   r@   r5   r   r   r   r   r6   r   s    zStreamSocket.getpeernamec                    s   | j dS r7   rF   r   r   r   r   r8   u   s    zStreamSocket.getsocknamec                    s   | j dS )NZpeercertrF   r;   r   r   r   r<   x   s    zStreamSocket.getpeercertN)
r   r   r   r   rC   rE   r   r6   r8   r<   r   r   r   r   r>   b   s   r>   )_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!   Z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_optionsrS   _Z
expirationr)   ZanswersaddressZattempt_expirationstreamr   r   r   rU      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   )rT   sleep)r   secondsr   r   r   ra      s    z_NetworkBackend.sleep)N)N)r   r   r   r   rU   r`   ra   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   rc      s
   rc   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   |d kr|t jkrtrtdt }	|t jkrX|	jt||||dI d H \}
}t||
|S |t jkr|d krrt	dt
tj|d |d |||||d|I d H \}}t|||S tdd|  d S )	NzHdestinationless datagram sockets are not supported by asyncio on Windows)r)   protoZremote_addrz'destination required for stream socketsr      )sslr)   rl   Z
local_addrserver_hostnamezunsupported socket ztype )rh   
SOCK_DGRAM	_is_win32r:   r   Zcreate_datagram_endpointr	   r&   SOCK_STREAM
ValueErrorr%   r   Zopen_connectionr>   )r   rA   socktyperl   sourcer/   r   ssl_contextro   Zloopr
   r(   rwr   r   r   make_socket   sB    

	zBackend.make_socketc                    s   t |I d H  d S r   )r   ra   )r   intervalr   r   r   ra   	  s    zBackend.sleepc                 C   s   t S r   )rq   r   r   r   r   datagram_connection_required  s    z$Backend.datagram_connection_requiredc                 C   s   t S r   )rc   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   rk   ry   ra   r{   r|   r   r   r   r   r   rj      s         
1rj   )"__doc__r   rh   sysZdns._asyncbackendr!   Zdns.exceptionplatformrq   r   r	   r%   Z_asyncbackendr&   r>   rT   rX   Zhttpcore._backends.anyioZhttpxZAsyncNetworkBackendZ_CoreAsyncNetworkBackendZ	_backendsZAnyIOStreamrV   Z	dns.queryrG   rH   rI   rJ   ZAsyncHTTPTransportrc   ImportErrorZNullTransportrj   r   r   r   r   <module>   s0   

#
5