U
    \eX                     @   s   d dl Z d dlZd dlZddlmZmZmZmZmZm	Z	m
Z
 ddlmZ ddlmZmZmZ G dd deZG d	d
 d
eZdS )    N   )ConnectErrorConnectTimeout	ReadErrorReadTimeout
WriteErrorWriteTimeoutmap_exceptions)is_socket_readable   )SOCKET_OPTIONAsyncNetworkBackendAsyncNetworkStreamc                   @   s   e Zd ZejjddddZdeej	e
 edddZdeej	e
 ddd	d
ZddddZdejej	e ej	e
 edddZeejdddZdS )AnyIOStreamN)streamreturnc                 C   s
   || _ d S N)_stream)selfr    r   </tmp/pip-unpacked-wheel-4txt3dqh/httpcore/_backends/anyio.py__init__   s    zAnyIOStream.__init__)	max_bytestimeoutr   c                    s   t ttjttjti}t|x t|b z.| jj	|dI d H W W  5 Q R  W  5 Q R  S  tj
k
r   Y W 5 Q R  W 5 Q R  dS X W 5 Q R X W 5 Q R X d S )N)r       )TimeoutErrorr   anyioBrokenResourceErrorr   ClosedResourceErrorr	   
fail_afterr   ZreceiveZEndOfStream)r   r   r   exc_mapr   r   r   read   s       
.zAnyIOStream.read)bufferr   r   c              
      s^   |sd S t ttjttjti}t|0 t| | jj	|dI d H  W 5 Q R X W 5 Q R X d S )N)item)
r   r   r   r   r   r   r	   r   r   send)r   r"   r   r    r   r   r   write&   s       
zAnyIOStream.write)r   c                    s   | j  I d H  d S r   )r   aclose)r   r   r   r   r&   5   s    zAnyIOStream.aclose)ssl_contextserver_hostnamer   r   c                    s   t ttjti}t|x z<t|( tjjj	j
| j||dddI d H }W 5 Q R X W n4 tk
r } z|  I d H  |W 5 d }~X Y nX W 5 Q R X t|S )NF)r'   hostnameZstandard_compatibleserver_side)r   r   r   r   r   r	   r   streamstlsZ	TLSStreamwrapr   	Exceptionr&   r   )r   r'   r(   r   r    Z
ssl_streamexcr   r   r   	start_tls8   s&      

 zAnyIOStream.start_tls)infor   c                 C   s   |dkr| j tjjjjd S |dkr:| j tjjj	d S |dkrV| j tjjj
d S |dkrr| j tjjjd S |dkr| j tjjjd }t|S d S )N
ssl_objectclient_addrZserver_addrsocketZis_readable)r   extrar   r+   r,   ZTLSAttributer2   abcZSocketAttributelocal_addressZremote_addressZ
raw_socketr
   )r   r1   sockr   r   r   get_extra_infoQ   s    zAnyIOStream.get_extra_info)N)N)NN)__name__
__module____qualname__r   r6   Z
ByteStreamr   inttypingOptionalfloatbytesr!   r%   r&   ssl
SSLContextstrr   r0   Anyr9   r   r   r   r   r      s.         r   c                   @   sv   e Zd Zdeeeje eje ejeje	  e
dddZdeeje ejeje	  e
dddZeddd	d
ZdS )AnyIOBackendN)hostportr   r7   socket_optionsr   c           	   
      s|   |d krg }t ttttjti}t|H t|2 tj|||dI d H }|D ]}|j	j
|  qNW 5 Q R X W 5 Q R X t|S )N)Zremote_hostZremote_portZ
local_host)r   r   OSErrorr   r   r   r	   r   connect_tcp_raw_socket
setsockoptr   )	r   rG   rH   r   r7   rI   r    r   optionr   r   r   rK   a   s&       
"zAnyIOBackend.connect_tcp)pathr   rI   r   c              
      sv   |d krg }t ttttjti}t|B t|, t|I d H }|D ]}|j	j
|  qHW 5 Q R X W 5 Q R X t|S r   )r   r   rJ   r   r   r   r	   r   Zconnect_unixrL   rM   r   )r   rO   r   rI   r    r   rN   r   r   r   connect_unix_socket|   s       
"z AnyIOBackend.connect_unix_socket)secondsr   c                    s   t |I d H  d S r   )r   sleep)r   rQ   r   r   r   rR      s    zAnyIOBackend.sleep)NNN)NN)r:   r;   r<   rD   r=   r>   r?   r@   Iterabler   r   rK   rP   rR   r   r   r   r   rF   `   s(        rF   )rB   r>   r   _exceptionsr   r   r   r   r   r   r	   _utilsr
   baser   r   r   r   rF   r   r   r   r   <module>   s   $	M