U
    hl                     @  s   d dl mZ 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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 )    )annotationsN   )ConnectErrorConnectTimeoutExceptionMapping	ReadErrorReadTimeout
WriteErrorWriteTimeoutmap_exceptions   )SOCKET_OPTIONAsyncNetworkBackendAsyncNetworkStreamc                   @  s   e Zd ZdddddZd!ddd	d
ddZd"d	dddddZddddZd#dddddddZdddddZdddd Z	dS )$
TrioStreamztrio.abc.StreamNone)streamreturnc                 C  s
   || _ d S N)_streamselfr    r   ;/tmp/pip-unpacked-wheel-a8helrha/httpcore/_backends/trio.py__init__   s    zTrioStream.__init__Nintfloat | Nonebytes)	max_bytestimeoutr   c                   s   |d krt dn|}tjttjttjti}t|H t|2 | j	j
|dI d H }|W  5 Q R  W  5 Q R  S Q R X W 5 Q R X d S )Ninf)r   )floattrioTooSlowErrorr   BrokenResourceErrorr   ClosedResourceErrorr   
fail_afterr   Zreceive_some)r   r   r   timeout_or_infexc_mapdatar   r   r   read   s       
zTrioStream.read)bufferr   r   c              
     st   |sd S |d krt dn|}tj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 )Nr    )r)   )r!   r"   r#   r
   r$   r	   r%   r   r&   r   Zsend_all)r   r+   r   r'   r(   r   r   r   write%   s       
zTrioStream.write)r   c                   s   | j  I d H  d S r   )r   aclose)r   r   r   r   r-   3   s    zTrioStream.aclosezssl.SSLContext
str | Noner   )ssl_contextserver_hostnamer   r   c                   s   |d krt dn|}tjttjti}tj| j||ddd}t|d z(t	| |
 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 )Nr    TF)r/   r0   Zhttps_compatibleserver_side)r!   r"   r#   r   r$   r   	SSLStreamr   r   r&   do_handshake	Exceptionr-   r   )r   r/   r0   r   r'   r(   Z
ssl_streamexcr   r   r   	start_tls6   s*      
 zTrioStream.start_tlsstrz
typing.Any)infor   c                 C  s   |dkrt | jtjr| jjS |dkr4|  j S |dkrJ|  j S |dkr| j}t |tjrl|j	}qXt |tj
s|t|jS |dkr| d}| S d S )NZ
ssl_objectclient_addrZserver_addrsocketis_readable)
isinstancer   r"   r2   Z_ssl_object_get_socket_streamr:   getsocknamegetpeernametransport_streamSocketStreamAssertionErrorget_extra_infor;   )r   r8   r   r:   r   r   r   rC   Q   s     
zTrioStream.get_extra_infoztrio.SocketStreamc                 C  s.   | j }t|tjr|j}qt|tjs*t|S r   )r   r<   r"   r2   r@   rA   rB   r   r   r   r   r=   e   s
    zTrioStream._get_socket_stream)N)N)NN)
__name__
__module____qualname__r   r*   r,   r-   r6   rC   r=   r   r   r   r   r      s     r   c                   @  sL   e Zd Zddddddddd	d
ZddddddddZdddddZdS )TrioBackendNr7   r   r   r.   z%typing.Iterable[SOCKET_OPTION] | Noner   )hostportr   local_addresssocket_optionsr   c           
   
     s   |d krg }|d krt dn|}tjttjttti}t|F t|0 tj	|||dI d H }|D ]}	|j
|	  qdW 5 Q R X W 5 Q R X t|S )Nr    )rH   rI   rJ   )r!   r"   r#   r   r$   r   OSErrorr   r&   Zopen_tcp_stream
setsockoptr   )
r   rH   rI   r   rJ   rK   r'   r(   r   optionr   r   r   connect_tcpn   s(    
   
   zTrioBackend.connect_tcp)pathr   rK   r   c              
     s   |d krg }|d krt dn|}tjttjttti}t|@ t|* t	|I d H }|D ]}|j
|  q^W 5 Q R X W 5 Q R X t|S )Nr    )r!   r"   r#   r   r$   r   rL   r   r&   Zopen_unix_socketrM   r   )r   rP   r   rK   r'   r(   r   rN   r   r   r   connect_unix_socket   s        
 zTrioBackend.connect_unix_socketr!   r   )secondsr   c                   s   t |I d H  d S r   )r"   sleep)r   rR   r   r   r   rS      s    zTrioBackend.sleep)NNN)NN)rD   rE   rF   rO   rQ   rS   r   r   r   r   rG   m   s        rG   )
__future__r   ssltypingr"   _exceptionsr   r   r   r   r   r	   r
   r   baser   r   r   r   rG   r   r   r   r   <module>   s   (
X