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ddlZdd Zej	j
ZG dd dejjZG dd dejjZzbd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$trio async I/O library query support    Nc                 C   s    | d k	rt | S tj S d S N)trioZmove_on_afterdns_asyncbackendZNullContexttimeout r   5/tmp/pip-unpacked-wheel-pk5slln3/dns/_trio_backend.py_maybe_timeout   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  |j || _d S r   )super__init__familysocket)selfr   	__class__r   r	   r      s    zDatagramSocket.__init__c              
      sB   t |" | j||I d H W  5 Q R  S Q R X tjj|dd S Nr   )r
   r   sendtor   	exceptionTimeout)r   whatdestinationr   r   r   r	   r   !   s
    
&zDatagramSocket.sendtoc              
      s@   t |  | j|I d H W  5 Q R  S Q R X tjj|dd S r   )r
   r   recvfromr   r   r   r   sizer   r   r   r	   r   (   s    
$zDatagramSocket.recvfromc                    s   | j   d S r   )r   closer   r   r   r	   r   -   s    zDatagramSocket.closec                    s
   | j  S r   )r   getpeernamer   r   r   r	   r   0   s    zDatagramSocket.getpeernamec                    s
   | j  S r   )r   getsocknamer   r   r   r	   r   3   s    zDatagramSocket.getsocknamec                    s   t d S r   NotImplementedErrorr   r   r   r   r	   getpeercert6   s    zDatagramSocket.getpeercert)__name__
__module____qualname__r   r   r   r   r   r   r#   __classcell__r   r   r   r	   r      s   r   c                   @   sF   e Zd ZdddZdd Zdd Zdd	 Zd
d Zdd Zdd Z	dS )StreamSocketFc                 C   s   || _ || _|| _d S r   )r   streamtls)r   r   r)   r*   r   r   r	   r   ;   s    zStreamSocket.__init__c              
      s@   t |  | j|I d H W  5 Q R  S Q R X tjj|dd S r   )r
   r)   Zsend_allr   r   r   )r   r   r   r   r   r	   sendall@   s    
$zStreamSocket.sendallc              
      s@   t |  | j|I d H W  5 Q R  S Q R X tjj|dd S r   )r
   r)   Zreceive_somer   r   r   r   r   r   r	   recvE   s    
$zStreamSocket.recvc                    s   | j  I d H  d S r   )r)   acloser   r   r   r	   r   J   s    zStreamSocket.closec                    s$   | j r| jjj S | jj S d S r   )r*   r)   transport_streamr   r   r   r   r   r	   r   M   s    zStreamSocket.getpeernamec                    s$   | j r| jjj S | jj S d S r   )r*   r)   r.   r   r   r   r   r   r	   r   S   s    zStreamSocket.getsocknamec              	      s<   | j r4t| | j I d H  W 5 Q R X | j S td S r   )r*   r
   r)   do_handshaker#   r!   r"   r   r   r	   r#   Y   s
    

zStreamSocket.getpeercertN)F)
r$   r%   r&   r   r+   r,   r   r   r   r#   r   r   r   r	   r(   :   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                    s&   t    || _|| _|| _|| _d S r   )r   r   _local_port	_resolver_bootstrap_address_family)r   resolver
local_portbootstrap_addressr   r   r   r	   r   m   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 ]}zvtj|}|d k	s| jdkr|| jf}nd }||f}td|}t|}t |tjd|||I d H }t|jW   S  tk
r   Y qY qX qtjd S )N)r   Zlifetimer   g       @)r0   r   inetZ
is_addressappendr6   r2   r7   Zaf_for_addressr5   resolve_name	addressesr4   r1   Backendmake_socketr   SOCK_STREAM_CoreTrioStreamr)   	ExceptionhttpcoreZConnectError)r   hostportr   Zlocal_addresssocket_optionsr>   _Z
expirationr   Zanswersaddressafsourcer   Zattempt_expirationsockr   r   r	   connect_tcpt   sJ    
  
     
z_NetworkBackend.connect_tcpc                    s   t d S r   r    )r   pathr   rG   r   r   r	   connect_unix_socket   s    z#_NetworkBackend.connect_unix_socketc                    s   t |I d H  d S r   r   sleep)r   secondsr   r   r	   rQ      s    z_NetworkBackend.sleep)N)N)r$   r%   r&   r   rM   rO   rQ   r'   r   r   r   r	   r3   l   s    
% 
r3   c                       s*   e Zd Zdddejd fdd
Z  ZS )_HTTPTransportr   N)r9   r:   r8   r   c                   s>   |d krdd l }|j }t j|| t||||| j_d S )Nr   )Zdns.asyncresolverZasyncresolverResolverr   r   r3   _poolZ_network_backend)r   r9   r:   r8   r   argskwargsr   r   r   r	   r      s    	
   z_HTTPTransport.__init__)r$   r%   r&   r   	AF_UNSPECr   r'   r   r   r   r	   rS      s
   rS   c                   @   s6   e Zd Zdd ZdddZdd Zd	d
 Zdd ZdS )r?   c                 C   s   dS )Nr   r   r   r   r   r	   name   s    zBackend.namer   Nc	              	      s4  t j|||}	d }
zl|r0|	t||I d H  |tjkr~d}t|  |	t||I d H  d}W 5 Q R X |s~tjj	|dW n t
k
r   |	   Y nX |tjkrt|	S |tjkrt |	}
d}|rd}zt j|
||d}
W n& t
k
r   |
 I d H   Y nX t||
|S tdd|  d S )NFTr   )server_hostnamezunsupported socket ztype )r   r   bind_lltuplerA   r
   connectr   r   r   rC   r   
SOCK_DGRAMr   ZSocketStreamZ	SSLStreamr-   r(   r!   )r   rJ   socktypeprotorK   r   r   ssl_contextrZ   sr)   	connectedr*   r   r   r	   r@      sJ    




  
zBackend.make_socketc                    s   t |I d H  d S r   rP   )r   intervalr   r   r	   rQ      s    zBackend.sleepc                 C   s   t S r   )rS   r   r   r   r	   get_transport_class   s    zBackend.get_transport_classc              
      s8   t | |I d H W  5 Q R  S Q R X tjj|dd S r   )r
   r   r   r   )r   Z	awaitabler   r   r   r	   wait_for   s
    
zBackend.wait_for)r   NNNNN)r$   r%   r&   rY   r@   rQ   re   rf   r   r   r   r	   r?      s         
/r?   )!__doc__r   r   Ztrio.socketZdns._asyncbackendr   Zdns.exceptionZdns.inetr
   r;   Zlow_level_address_tupler\   r   r   r(   rD   Zhttpcore._backends.trioZhttpxZAsyncNetworkBackendZ_CoreAsyncNetworkBackendZ	_backendsZ
TrioStreamrB   Z	dns.queryr0   r1   r2   r3   ZAsyncHTTPTransportrS   ImportErrorZNullTransportr?   r   r   r   r	   <module>   s,   (
4