U
    h)                     @  s   d dl mZ d dlZd dl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 ddlmZmZmZ G dd	 d	e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)is_socket_readable   )SOCKET_OPTIONNetworkBackendNetworkStreamc                   @  s   e Zd ZdZdZd$dddddd	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S )(TLSinTLSStreamz
    Because the standard `SSLContext.wrap_socket` method does
    not work for `SSLSocket` objects, we need this class
    to implement TLS stream using an underlying `SSLObject`
    instance in order to support TLS on top of TLS.
    i @  Nsocket.socketssl.SSLContext
str | Nonefloat | None)sockssl_contextserver_hostnametimeoutc                 C  sN   || _ t | _t | _|j| j| j|d| _| j | | | jj	 d S )N)incomingoutgoingr   )
_sockssl	MemoryBIO	_incoming	_outgoingwrap_biossl_obj
settimeout_perform_iodo_handshake)selfr   r   r   r    r'   ;/tmp/pip-unpacked-wheel-a8helrha/httpcore/_backends/sync.py__init__"   s    

zTLSinTLSStream.__init__z typing.Callable[..., typing.Any]
typing.Any)funcreturnc              
   C  s   d }d }z
| }W n0 t jt jfk
rB } z
|j}W 5 d }~X Y nX | j| j  |t jkr| j	| j
}|r| j| n
| j  |d kr|S qd S N)r   SSLWantReadErrorSSLWantWriteErrorerrnor   sendallr    readSSL_ERROR_WANT_READrecvTLS_RECORD_SIZEr   write	write_eof)r&   r+   retr0   ebufr'   r'   r(   r$   6   s    


zTLSinTLSStream._perform_iointbytes	max_bytesr   r,   c              
   C  sX   t jttti}t|8 | j| t	t
| t| jj|W  5 Q R  S Q R X d S r-   )socketr   r   OSErrorr   r   r   r#   typingcastr<   r$   	functoolspartialr"   r2   r&   r>   r   exc_mapr'   r'   r(   r2   O   s    
 zTLSinTLSStream.readNonebufferr   r,   c              	   C  sZ   t jttti}t|: | j| |rL| t	
| jj|}||d  }q$W 5 Q R X d S r-   )r?   r   r
   r@   r	   r   r   r#   r$   rC   rD   r"   r6   )r&   rI   r   rF   Znsentr'   r'   r(   r6   W   s    
zTLSinTLSStream.writer,   c                 C  s   | j   d S r-   r   closer&   r'   r'   r(   rL   _   s    zTLSinTLSStream.closer   r   r   r   r,   c                 C  s
   t  d S r-   )NotImplementedError)r&   r   r   r   r'   r'   r(   	start_tlsb   s    zTLSinTLSStream.start_tlsstrinfor,   c                 C  sV   |dkr| j S |dkr | j S |dkr2| j S |dkr@| jS |dkrRt| jS d S NZ
ssl_objectclient_addrZserver_addrr?   Zis_readable)r"   r   getsocknamegetpeernamer   r&   rS   r'   r'   r(   get_extra_infoj   s    


zTLSinTLSStream.get_extra_info)NN)N)N)NN)__name__
__module____qualname____doc__r5   r)   r$   r2   r6   rL   rP   rY   r'   r'   r'   r(   r      s       r   c                   @  sx   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S )!
SyncStreamr   rG   )r   r,   c                 C  s
   || _ d S r-   )r   )r&   r   r'   r'   r(   r)   y   s    zSyncStream.__init__Nr;   r   r<   r=   c              
   C  sF   t jttti}t|& | j| | j|W  5 Q R  S Q R X d S r-   )	r?   r   r   r@   r   r   r   r#   r4   rE   r'   r'   r(   r2   |   s    
zSyncStream.readrH   c              	   C  sX   |sd S t jttti}t|0 |rJ| j| | j|}||d  }q W 5 Q R X d S r-   )	r?   r   r
   r@   r	   r   r   r#   send)r&   rI   r   rF   nr'   r'   r(   r6      s    
zSyncStream.writerJ   c                 C  s   | j   d S r-   rK   rM   r'   r'   r(   rL      s    zSyncStream.closer   r   r   rN   c                 C  s   t jttti}t| zLt| jtj	rFt
| j|||W W  5 Q R  S | j| |j| j|d}W n. tk
r } z|   |W 5 d }~X Y nX W 5 Q R X t|S )N)r   )r?   r   r   r@   r   r   
isinstancer   r   	SSLSocketr   r#   wrap_socket	ExceptionrL   r^   )r&   r   r   r   rF   r   excr'   r'   r(   rP      s.      
    
 zSyncStream.start_tlsrQ   r*   rR   c                 C  sf   |dkrt | jtjr| jjS |dkr0| j S |dkrB| j S |dkrP| jS |dkrbt| jS d S rT   )ra   r   r   rb   _sslobjrV   rW   r   rX   r'   r'   r(   rY      s    


zSyncStream.get_extra_info)N)N)NN)	rZ   r[   r\   r)   r2   r6   rL   rP   rY   r'   r'   r'   r(   r^   x   s     r^   c                   @  s<   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S )SyncBackendNrQ   r;   r   r   z%typing.Iterable[SOCKET_OPTION] | Noner   )hostportr   local_addresssocket_optionsr,   c              	   C  s   |d krg }||f}|d kr d n|df}t jttti}t|< t j|||d}	|D ]}
|	j|
  qT|	t jt j	d W 5 Q R X t
|	S )Nr   )source_addressr   )r?   r   r   r@   r   r   create_connection
setsockoptIPPROTO_TCPTCP_NODELAYr^   )r&   rh   ri   r   rj   rk   addressrl   rF   r   optionr'   r'   r(   connect_tcp   s&    
  
zSyncBackend.connect_tcp)pathr   rk   r,   c              	   C  s   t jdkrtd|d krg }tjttti}t|> ttj	tj
}|D ]}|j|  qJ|| || W 5 Q R X t|S )Nwin32z:Attempted to connect to a UNIX socket on a Windows system.)sysplatformRuntimeErrorr?   r   r   r@   r   r   AF_UNIXSOCK_STREAMrn   r#   connectr^   )r&   rt   r   rk   rF   r   rr   r'   r'   r(   connect_unix_socket   s$    
  

zSyncBackend.connect_unix_socket)NNN)NN)rZ   r[   r\   rs   r|   r'   r'   r'   r(   rg      s      !  rg   )
__future__r   rC   r?   r   rv   rA   _exceptionsr   r   r   r   r   r	   r
   r   _utilsr   baser   r   r   r   r^   rg   r'   r'   r'   r(   <module>   s   (
aC