o
    NDiI                  
   @   s   d dl Z d dlmZ d dlmZ d dlmZ d dlZd dlm	Z	 d dl
Z
d dlmZmZmZmZ z
d dlmZ dZW n eyP Z z
d	ZeZW Y dZ[ndZ[ww eeZd
d ZG dd deZdS )    N)socket)Queue)GreenletExit)Event)
ConnectionConnectionShutdownTimerTimerManager)SSLTFc                   C   s   t stdttd S )NzR{}, pyOpenSSL must be installed to enable SSL support with the Eventlet event loop)
_PYOPENSSLImportErrorformatstrno_pyopenssl_error r   r   U/var/www/Datamplify/venv/lib/python3.10/site-packages/cassandra/io/eventletreactor.py_check_pyopenssl&   s   
r   c                       s   e Zd ZdZdZdZejjZ	ejj
ZdZdZdZedd Zedd Zedd Zd	d
 Zdd Z fddZdd Zdd Zdd Zdd Zdd Zdd Z  ZS )EventletConnectionz
    An implementation of :class:`.Connection` that utilizes ``eventlet``.

    This implementation assumes all eventlet monkey patching is active. It is not tested with partial patching.
    Nc                 C   s4   t   | jst | _t | j| _t | _d S d S N)	eventletmonkey_patch_timersr	   spawnservice_timeouts_timeout_watcherr   
_new_timer)clsr   r   r   initialize_reactor?   s   z%EventletConnection.initialize_reactorc                 C   s$   t ||}| j| | j  |S r   )r   r   	add_timerr   set)r   timeoutcallbacktimerr   r   r   create_timerG   s   

zEventletConnection.create_timerc                 C   sB   | j }	 | }|rt|t  dnd}| j| | j  q)a  
        cls._timeout_watcher runs in this loop forever.
        It is usually waiting for the next timeout on the cls._new_timer Event.
        When new timers are added, that event is set so that the watcher can
        wake up and possibly set an earlier timeout.
        Tr   i'  )r   r   maxtimer   waitclear)r   timer_managernext_end
sleep_timer   r   r   r   N   s   
z#EventletConnection.service_timeoutsc                    sl   t j g|R i |  jo j  _t  _   t	 fdd _
t	 fdd _   d S )Nc                            S r   )handle_readr   selfr   r   <lambda>d       z-EventletConnection.__init__.<locals>.<lambda>c                      r+   r   )handle_writer   r-   r   r   r/   e   r0   )r   __init__ssl_optionsssl_contextuses_legacy_ssl_optionsr   _write_queue_connect_socketr   r   _read_watcher_write_watcher_send_options_message)r.   argskwargsr   r-   r   r2   ]   s   zEventletConnection.__init__c                 C   sH   t   t| j| j}|  | jr"d| jv r"|| jd d |S )Nserver_hostnameascii)	r   r
   r   r4   _socketset_connect_stater3   set_tlsext_host_nameencode)r.   rvr   r   r   _wrap_socket_from_contexth   s   z,EventletConnection._wrap_socket_from_contextc                    sD   | j rtt| | d S | j| | js| jr | j  d S d S r   )	r5   superr   _initiate_connectionr?   connectr4   r3   do_handshake)r.   sockaddr	__class__r   r   rF   q   s   z'EventletConnection._initiate_connectionc                 C   s>   | j s| j  j}|| jjkrtd|| jjd S d S )NzOHostname verification failed! Certificate name '{}' doesn't match endpoint '{}')	r5   r?   get_peer_certificateget_subject
commonNameendpointaddress	Exceptionr   )r.   	cert_namer   r   r   _validate_hostnamey   s   z%EventletConnection._validate_hostnamec                 C   s   | j  | jr	 W d    d S d| _W d    n1 sw   Y  tdt| | jf  t }| jr?| j|kr?| j	  | j
rL| j
|krL| j
	  | jrT| j  td| jf  | jsq| td| j  | j  d S d S )NTzClosing connection (%s) to %szClosed socket to %szConnection to %s was closed)lock	is_closedlogdebugidrO   r   
getcurrentr8   killr9   r?   close
is_defuncterror_all_requestsr   connected_eventr   )r.   cur_gthreadr   r   r   r[      s*   


zEventletConnection.closec                 C   s   t d |   d S )Nzconnection closed by server)rV   rW   r[   r-   r   r   r   handle_close   s   
zEventletConnection.handle_closec              
   C   sr   	 z| j  }| j| W n) tjy. } ztd| | | | W Y d }~d S d }~w t	y7   Y d S w q)NTz'Exception during socket send for %s: %s)
r6   getr?   sendallr   errorrV   rW   defunctr   )r.   next_msgerrr   r   r   r1      s   

zEventletConnection.handle_writec              
   C   s   	 z| j | j}| j| W n) tjy0 } ztd| | | 	| W Y d }~d S d }~w t
y9   Y d S w |rF| j rF|   ntd|  |   d S q)NTz'Exception during socket recv for %s: %szConnection %s closed by server)r?   recvin_buffer_size_iobufwriter   rc   rV   rW   rd   r   tellprocess_io_bufferr[   )r.   bufrf   r   r   r   r,      s(   

zEventletConnection.handle_readc                 C   s8   | j }tdt||D ]}| j||||   qd S )Nr   )out_buffer_sizerangelenr6   put)r.   data
chunk_sizeir   r   r   push   s   zEventletConnection.push)__name__
__module____qualname____doc__r8   r9   r   greenr   _socket_implssl	_ssl_implr   r   r   classmethodr   r#   r   r2   rD   rF   rS   r[   r`   r1   r,   ru   __classcell__r   r   rJ   r   r   .   s0    


	r   )r   eventlet.greenr   eventlet.queuer   greenletr   logging	threadingr   r%   cassandra.connectionr   r   r   r	   eventlet.green.OpenSSLr
   r   r   er   	getLoggerrv   rV   r   r   r   r   r   r   <module>   s&   
