o
    h                     @   s   d dl Z d dlZd dlZd dlZd dlm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 )    N)partial   )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ejdejdej	e
 dej	e fdd	Zd
ejdejf dejfddZddedej	e defddZddedej	e ddfddZdddZ		ddejdej	e
 dej	e ddfddZde
dejf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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#   W/var/www/html/flask_server/venv/lib/python3.10/site-packages/httpcore/_backends/sync.py__init__    s   

zTLSinTLSStream.__init__func.returnc              
   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&   retr+   ebufr#   r#   r$   r    4   s$   


zTLSinTLSStream._perform_io	max_bytesc              	   C   sb   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castbytesr    r   r   r-   r"   r6   r   exc_mapr#   r#   r$   r-   M   s   
$zTLSinTLSStream.readbufferc                 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 s9w   Y  d S r(   )r7   r   r
   r8   r	   r   r   r   r    r   r   r1   )r"   r>   r   r=   nsentr#   r#   r$   r1   U   s   
"zTLSinTLSStream.writec                 C      | j   d S r(   r   closer"   r#   r#   r$   rB   ]      zTLSinTLSStream.closer   c                 C   s   t  r(   )NotImplementedError)r"   r   r   r   r#   r#   r$   	start_tls`   s   zTLSinTLSStream.start_tlsinfoc                 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_addrr7   is_readable)r   r   getsocknamegetpeernamer   r"   rG   r#   r#   r$   get_extra_infoh   s   


zTLSinTLSStream.get_extra_infoNNr(   r'   N)__name__
__module____qualname____doc__r0   r7   r   
SSLContextr9   Optionalstrfloatr%   CallableAnyr    intr;   r-   r1   rB   rF   rP   r#   r#   r#   r$   r      sD    



r   c                	   @   s   e Zd ZdejddfddZddedeje de	fdd	Z
dd
e	deje ddfddZdddZ		ddejdeje deje defddZdedejfddZdS )
SyncStreamr   r'   Nc                 C   s
   || _ d S r(   )r   )r"   r   r#   r#   r$   r%   w   s   
zSyncStream.__init__r6   r   c                 C   sR   t jttti}t| | j| | j|W  d    S 1 s"w   Y  d S r(   )	r7   r   r   r8   r   r   r   r   r/   r<   r#   r#   r$   r-   z   s
   

$zSyncStream.readr>   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(   )	r7   r   r
   r8   r	   r   r   r   send)r"   r>   r   r=   nr#   r#   r$   r1      s   
"zSyncStream.writec                 C   r@   r(   rA   rC   r#   r#   r$   rB      rD   zSyncStream.closer   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   )r7   r   r   r8   r   r   
isinstancer   r   	SSLSocketr   r   wrap_socket	ExceptionrB   r^   )r"   r   r   r   r=   r   excr#   r#   r$   rF      s0   




zSyncStream.start_tlsrG   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 rH   )ra   r   r   rb   _sslobjrM   rN   r   rO   r#   r#   r$   rP      s   


zSyncStream.get_extra_infor(   rR   rQ   )rS   rT   rU   r7   r%   r]   r9   rX   rZ   r;   r-   r1   rB   r   rW   rY   r   rF   r\   rP   r#   r#   r#   r$   r^   v   s"    

r^   c                   @   s   e Zd Z			ddededeje deje dejeje	  de
fdd	Z		dd
edeje dejeje	  de
fddZdS )SyncBackendNhostportr   local_addresssocket_optionsr'   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   )r7   r   r   r8   r   r   create_connection
setsockoptIPPROTO_TCPTCP_NODELAYr^   )r"   rh   ri   r   rj   rk   addressrl   r=   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RuntimeErrorr7   r   r   r8   r   r   AF_UNIXSOCK_STREAMrn   r   connectr^   )r"   rt   r   rk   r=   r   rr   r#   r#   r$   connect_unix_socket   s&   



zSyncBackend.connect_unix_socket)NNNrQ   )rS   rT   rU   rY   r]   r9   rX   rZ   Iterabler   r   rs   r|   r#   r#   r#   r$   rg      s8    
!rg   )r7   r   rv   r9   	functoolsr   _exceptionsr   r   r   r   r   r	   r
   r   _utilsr   baser   r   r   r   r^   rg   r#   r#   r#   r$   <module>   s    (
aC