o
    MK&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                   @  sj   e Zd ZdZdZ		d&d'ddZd(ddZd)d*ddZd)d+ddZd,ddZ			d&d-d d!Z
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socksocket.socketssl_contextssl.SSLContextserver_hostname
str | Nonetimeoutfloat | Nonec                 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'   J/var/www/html/venv/lib/python3.10/site-packages/httpcore/_backends/sync.py__init__"   s   

zTLSinTLSStream.__init__func typing.Callable[..., typing.Any]return
typing.Anyc              
   C  s   d }	 d }z| }W n t jt jfy# } z	|j}W Y d }~nd }~ww | j| j  |t jkrG| j	| j
}|rB| j| n| j  |d u rM|S qN)r   SSLWantReadErrorSSLWantWriteErrorerrnor   sendallr    readSSL_ERROR_WANT_READrecvTLS_RECORD_SIZEr   write	write_eof)r&   r*   retr1   ebufr'   r'   r(   r$   6   s$   


zTLSinTLSStream._perform_io	max_bytesintbytesc              
   C  sd   t jttti}t| | j| t	t
| t| jj|W  d    S 1 s+w   Y  d S r.   )socketr   r   OSErrorr   r   r   r#   typingcastr>   r$   	functoolspartialr"   r3   r&   r<   r   exc_mapr'   r'   r(   r3   O   s   
$zTLSinTLSStream.readbufferNonec                 C  s   t jttti}t|, | j| |r/| t	
| jj|}||d  }|sW d    d S W d    d S 1 s:w   Y  d S r.   )r?   r   r
   r@   r	   r   r   r#   r$   rC   rD   r"   r7   )r&   rG   r   rF   nsentr'   r'   r(   r7   W   s   
"zTLSinTLSStream.writec                 C     | j   d S r.   r   closer&   r'   r'   r(   rL   _      zTLSinTLSStream.closer   c                 C  s   t  r.   )NotImplementedError)r&   r   r   r   r'   r'   r(   	start_tlsb   s   zTLSinTLSStream.start_tlsinfostrc                 C  sV   |dkr| j S |dkr| j S |dkr| j S |dkr | jS |dkr)t| jS d S N
ssl_objectclient_addrserver_addrr?   is_readable)r"   r   getsocknamegetpeernamer   r&   rQ   r'   r'   r(   get_extra_infoj   s   


zTLSinTLSStream.get_extra_infoNN)r   r   r   r   r   r   r   r   )r*   r+   r,   r-   r.   r<   r=   r   r   r,   r>   rG   r>   r   r   r,   rH   r,   rH   r   r   r   r   r   r   r,   r   rQ   rR   r,   r-   )__name__
__module____qualname____doc__r6   r)   r$   r3   r7   rL   rP   r[   r'   r'   r'   r(   r      s    

r   c                   @  sR   e Zd Zd ddZd!d"ddZd!d#ddZd$ddZ		d%d&ddZd'ddZdS )(
SyncStreamr   r   r,   rH   c                 C  s
   || _ d S r.   )r   )r&   r   r'   r'   r(   r)   y   s   
zSyncStream.__init__Nr<   r=   r   r   r>   c                 C  sR   t jttti}t| | j| | j|W  d    S 1 s"w   Y  d S r.   )	r?   r   r   r@   r   r   r   r#   r5   rE   r'   r'   r(   r3   |   s
   

$zSyncStream.readrG   c                 C  s   |sd S t jttti}t|' |r.| j| | j|}||d  }|sW d    d S W d    d S 1 s9w   Y  d S r.   )	r?   r   r
   r@   r	   r   r   r#   send)r&   rG   r   rF   nr'   r'   r(   r7      s   
"zSyncStream.writec                 C  rJ   r.   rK   rM   r'   r'   r(   rL      rN   zSyncStream.closer   r   r   r   r   c                 C  s   t jttti}t|E z't| jtj	r$t
| j|||W W  d    S | j| |j| j|d}W n tyE } z|   |d }~ww W d    t|S 1 sSw   Y  t|S )N)r   )r?   r   r   r@   r   r   
isinstancer   r   	SSLSocketr   r#   wrap_socket	ExceptionrL   rf   )r&   r   r   r   rF   r   excr'   r'   r(   rP      s0   




zSyncStream.start_tlsrQ   rR   r-   c                 C  sf   |dkrt | jtjr| jjS |dkr| j S |dkr!| j S |dkr(| jS |dkr1t| jS d S rS   )ri   r   r   rj   _sslobjrX   rY   r   rZ   r'   r'   r(   r[      s   


zSyncStream.get_extra_info)r   r   r,   rH   r.   r]   r^   r_   r\   r`   ra   )	rb   rc   rd   r)   r3   r7   rL   rP   r[   r'   r'   r'   r(   rf   x   s    

rf   c                   @  s.   e Zd Z			ddddZ		ddddZdS )SyncBackendNhostrR   portr=   r   r   local_addressr   socket_options%typing.Iterable[SOCKET_OPTION] | Noner,   r   c                 C  s   |d u rg }||f}|d u rd n|df}t jttti}t|& t j|||d}	|D ]}
|	j|
  q*|	t jt j	d W d    t
|	S 1 sHw   Y  t
|	S )Nr   )source_addressr   )r?   r   r   r@   r   r   create_connection
setsockoptIPPROTO_TCPTCP_NODELAYrf   )r&   rp   rq   r   rr   rs   addressru   rF   r   optionr'   r'   r(   connect_tcp   s(   


		zSyncBackend.connect_tcppathc                 C  s   t jdkr	td|d u rg }tjttti}t|' ttj	tj
}|D ]}|j|  q%|| || W d    t|S 1 sDw   Y  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_STREAMrw   r#   connectrf   )r&   r}   r   rs   rF   r   r{   r'   r'   r(   connect_unix_socket   s&   



zSyncBackend.connect_unix_socket)NNN)rp   rR   rq   r=   r   r   rr   r   rs   rt   r,   r   r\   )r}   rR   r   r   rs   rt   r,   r   )rb   rc   rd   r|   r   r'   r'   r'   r(   ro      s    !ro   )
__future__r   rC   r?   r   r   rA   _exceptionsr   r   r   r   r   r	   r
   r   _utilsr   baser   r   r   r   rf   ro   r'   r'   r'   r(   <module>   s    (
aC