a
    Of                     @   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ejejej	e
 ej	e dddZejdejf ej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 ddddZe
ej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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#   P/var/www/ai-form-bot/venv/lib/python3.9/site-packages/httpcore/_backends/sync.py__init__    s    

zTLSinTLSStream.__init__.)funcreturnc              
   C   s   d }d }z
| }W n2 t jt jfyD } z|j}W Y d }~n
d }~0 0 | j| j  |t jkr| j	| j
}|r| j| n
| j  |d u 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&   retr+   ebufr#   r#   r$   r    4   s    


zTLSinTLSStream._perform_io	max_bytesr   r'   c              	   C   sb   t jttti}t|8 | j| t	t
| t| jj|W  d    S 1 sT0    Y  d S r(   )socketr   r   OSErrorr   r   r   r   typingcastbytesr    r   r   r-   r"   r7   r   exc_mapr#   r#   r$   r-   M   s    
zTLSinTLSStream.readbufferr   r'   c                 C   sl   t jttti}t|B | j| |rJ| t	| j
j|}||d  }q$W d    n1 s^0    Y  d S r(   )r8   r   r
   r9   r	   r   r   r   r    r   r   r1   )r"   r@   r   r>   Znsentr#   r#   r$   r1   U   s    
zTLSinTLSStream.writer'   c                 C   s   | j   d S r(   r   closer"   r#   r#   r$   rC   ]   s    zTLSinTLSStream.closer   r   r   r   r'   c                 C   s
   t  d S r(   )NotImplementedError)r"   r   r   r   r#   r#   r$   	start_tls`   s    zTLSinTLSStream.start_tls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_addrr8   Zis_readable)r   r   getsocknamegetpeernamer   r"   rI   r#   r#   r$   get_extra_infoh   s    


zTLSinTLSStream.get_extra_info)NN)N)N)NN)__name__
__module____qualname____doc__r0   r8   r   
SSLContextr:   Optionalstrfloatr%   CallableAnyr    intr<   r-   r1   rC   rG   rO   r#   r#   r#   r$   r      s2       r   c                   @   s   e Zd Ze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 )
SyncStreamN)r   r'   c                 C   s
   || _ d S r(   )r   )r"   r   r#   r#   r$   r%   w   s    zSyncStream.__init__r6   c                 C   sR   t jttti}t|( | j| | j|W  d    S 1 sD0    Y  d S r(   )	r8   r   r   r9   r   r   r   r   r/   r=   r#   r#   r$   r-   z   s    
zSyncStream.readr?   c                 C   sl   |sd S t jttti}t|: |rJ| j| | j|}||d  }q W d    n1 s^0    Y  d S r(   )	r8   r   r
   r9   r	   r   r   r   send)r"   r@   r   r>   nr#   r#   r$   r1      s    
zSyncStream.writerA   c                 C   s   | j   d S r(   rB   rD   r#   r#   r$   rC      s    zSyncStream.closerE   c                 C   s   t jttti}t| zNt| jtj	rHt
| j|||W W  d    S | j| |j| j|d}W n0 ty } z|   |W Y d }~n
d }~0 0 W d    n1 s0    Y  t|S )N)r   )r8   r   r   r9   r   r   
isinstancer   r   	SSLSocketr   r   wrap_socket	ExceptionrC   r[   )r"   r   r   r   r>   r   excr#   r#   r$   rG      s"    


8zSyncStream.start_tlsrH   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 rJ   )r^   r   r   r_   _sslobjrL   rM   r   rN   r#   r#   r$   rO      s    


zSyncStream.get_extra_info)N)N)NN)rP   rQ   rR   r8   r%   rZ   r:   rU   rW   r<   r-   r1   rC   r   rT   rV   r   rG   rY   rO   r#   r#   r#   r$   r[   v   s     r[   c                   @   sf   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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|F t j|||d}	|D ]}
|	j|
  qT|	t jt j	d W d    n1 s0    Y  t
|	S )Nr   )source_addressr   )r8   r   r   r9   r   r   create_connection
setsockoptIPPROTO_TCPTCP_NODELAYr[   )r"   re   rf   r   rg   rh   addressri   r>   r   optionr#   r#   r$   connect_tcp   s"    

0zSyncBackend.connect_tcp)pathr   rh   r'   c                 C   s   t jdkrtd|d u rg }tjttti}t|H ttj	tj
}|D ]}|j|  qJ|| || W d    n1 s0    Y  t|S )Nwin32z:Attempted to connect to a UNIX socket on a Windows system.)sysplatformRuntimeErrorr8   r   r   r9   r   r   AF_UNIXSOCK_STREAMrk   r   connectr[   )r"   rq   r   rh   r>   r   ro   r#   r#   r$   connect_unix_socket   s     


(zSyncBackend.connect_unix_socket)NNN)NN)rP   rQ   rR   rV   rZ   r:   rU   rW   Iterabler   r   rp   ry   r#   r#   r#   r$   rd      s&      !  rd   )r8   r   rs   r:   	functoolsr   _exceptionsr   r   r   r   r   r	   r
   r   Z_utilsr   baser   r   r   r   r[   rd   r#   r#   r#   r$   <module>   s   (
aC