U
    h#                     @   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   :./venv/lib/python3.8/site-packages/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   dataZ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dnsZ	exceptionZ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socknamer1   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   r3   r5   r9   __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   r/   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 r0   r=   r2   r   r   r   r   r3   t   s    zStreamSocket.getpeernamec                    s   | j dS r4   rC   r   r   r   r   r5   w   s    zStreamSocket.getsocknamec                    s   | j dS )NZpeercertrC   r8   r   r   r   r9   z   s    zStreamSocket.getpeercertN)
r   r   r   r   r@   rB   r   r3   r5   r9   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_familyr7   )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)rD   r    inetZ
is_addressappendrI   rF   rJ   Zaf_for_addressrH   resolve_name	addressesrE   anyioZ
fail_afterconnect_tcp_CoreAnyIOStream	ExceptionhttpcoreZConnectError)r   ZhostZportr   Zlocal_addresssocket_optionsrQ   _Z
expirationr&   ZanswersZaddressZattempt_expirationstreamr   r   r   rS      s<    
  
z_NetworkBackend.connect_tcpc                    s   t d S r   r6   )r   pathr   rW   r   r   r   connect_unix_socket   s    z#_NetworkBackend.connect_unix_socketc                    s   t |I d H  d S r   )rR   sleep)r   Zsecondsr   r   r   r\      s    z_NetworkBackend.sleep)N)N)r   r   r   r   rS   r[   r\   r:   r   r   r'   r   rG      s    
" 
rG   c                       s*   e Zd Zdddejd fdd
Z  ZS )_HTTPTransportr   N)rL   rM   rK   r&   c                   s>   |d krdd l }|j }t j|| t||||| j_d S )Nr   )Zdns.asyncresolverZasyncresolverZResolverr$   r   rG   Z_poolZ_network_backend)r   rL   rM   rK   r&   argskwargsr    r'   r   r   r      s    	
   z_HTTPTransport.__init__)r   r   r   socketZ	AF_UNSPECr   r:   r   r   r'   r   r]      s
   r]   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   )Zsslr&   rc   Z
local_addrserver_hostnamezunsupported socket ztype )r   r`   Z
SOCK_DGRAM	_is_win32r    rN   Z
any_for_afZcreate_datagram_endpointr	   r#   ZSOCK_STREAM
ValueErrorr"   r   Zopen_connectionr;   r7   )r   r>   Zsocktyperc   sourcer,   r   Zssl_contextre   Zloopr
   r%   rwr   r   r   make_socket   s>    

	zBackend.make_socketc                    s   t |I d H  d S r   )r   r\   )r   intervalr   r   r   r\   	  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   )r]   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   rb   rk   r\   rm   rn   r   r   r   r   r   ra      s         
/ra   )%__doc__r   r`   sysZdns._asyncbackendr    Zdns._featuresZdns.exceptionZdns.inetplatformrf   r   r	   r"   Z_asyncbackendr#   r;   Z	_featuresZhaverR   rV   Zhttpcore._backends.anyioZhttpxZAsyncNetworkBackendZ_CoreAsyncNetworkBackendZ	_backendsZAnyIOStreamrT   Z	dns.queryrD   rE   rF   rG   ZAsyncHTTPTransportr]   ZNullTransportra   r   r   r   r   <module>   s2   

#
5