U
    @f                     @   s`   d dl mZ d dlT d dlmZ d dlmZ d dlm	Z	 d dl
Z
G dd dejZe ZZ[dS )	    )SSL)*)	get_errno)greenio)
trampolineNc                       sd   e Zd ZdZd fdd	Zdd Zdd ZdddZdd ZeZ	dd Z
e
Zdd Zdd Z  ZS )GreenConnectionz5 Nonblocking wrapper for SSL.Connection objects.
    Nc                    s.   |d k	rt ||}n|}tt| | d S )N)orig_SSL
ConnectionsuperConnectionType__init__)selfctxsockfd	__class__ T/var/www/html/chatgpt/venv/lib/python3.8/site-packages/eventlet/green/OpenSSL/SSL.pyr      s    zGreenConnection.__init__c              	   C   s   | j r| j S z| j W S  tk
rL   t| j d|  tjd Y q t	k
rz   t| j d|  tjd Y qX qdS )z Perform an SSL handshake (usually called after renegotiate or one of
        set_accept_state or set_accept_state). This can raise the same exceptions as
        send and recv. Treadtimeouttimeout_excwriter   r   N)
act_non_blockingr   do_handshakeWantReadErrorr   fileno
gettimeoutsocketr   WantWriteErrorr   r   r   r   r      s     



zGreenConnection.do_handshakec                 C   s   t dd S )Nz Dup not supported on SSL socketsNotImplementedErrorr"   r   r   r   dup*   s    zGreenConnection.duprc                 C   s   t dd S )Nz%Makefile not supported on SSL socketsr#   )r   modebufsizer   r   r   makefile-   s    zGreenConnection.makefilec              
   C   s   | j r| j|S z| j|W S  tk
rP   t| j d|  tjd Y q t	k
r~   t| j d|  tjd Y q t
k
r } z&t|dkst|dkrW Y dS W 5 d}~X Y qX qdS )zWorks like a blocking call to SSL_read(), whose behavior is
        described here:  http://www.openssl.org/docs/ssl/SSL_read.htmlTr   r   r'   r    N)r   r   r   r   r   r   r   r    r   r!   ZSysCallErrorr   )r   sizeer   r   r   r   0   s&    



zGreenConnection.readc              	   C   s   |sdS | j r| j|S z| j|W S  tk
rX   t| j d|  tjd Y q t	k
r   t| j d|  tjd Y qX qdS )zWorks like a blocking call to SSL_write(), whose behavior is
        described here:  http://www.openssl.org/docs/ssl/SSL_write.htmlr   Tr   r   N)
r   r   r   r   r   r   r   r    r   r!   )r   datar   r   r   r   H   s$    


zGreenConnection.writec                 C   s2   |  |}|t|k r.||  ||d 7 }q
dS )zSend "all" data on the connection. This calls send() repeatedly until
        all data is sent. If an error occurs, it's impossible to tell how much data
        has been sent.

        No return value.N)sendlen)r   r.   tailr   r   r   sendall_   s    
zGreenConnection.sendallc              	   C   s   | j r| j S z| j W S  tk
rL   t| j d|  tjd Y q t	k
rz   t| j d|  tjd Y qX qd S )NTr   r   )
r   r   shutdownr   r   r   r   r    r   r!   r"   r   r   r   r3   i   s     



zGreenConnection.shutdown)N)r&   r'   )__name__
__module____qualname____doc__r   r   r%   r*   r   recvr   r/   r2   r3   __classcell__r   r   r   r   r   	   s   	

r   )ZOpenSSLr   r   ZOpenSSL.SSLZeventlet.supportr   Zeventletr   Zeventlet.hubsr   r    ZGreenSocketr   r	   r   r   r   r   r   <module>   s   r