
    i                        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 d dlmZmZmZmZ 	 d dlmZ d	Zn# e$ rZd
ZeZY dZ[ndZ[ww xY w ej        e          Zd Z edd           G d de                      ZdS )    N)socket)Queue)GreenletExit)Event)
deprecated)
ConnectionConnectionShutdownTimerTimerManager)SSLTFc                  |    t           s4t          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     n/Users/user/workspace/sujinbaek/cqa-test-app/venv/lib/python3.11/site-packages/cassandra/io/eventletreactor.py_check_pyopensslr   )   sA     
77=vcBT>U>U7V7V
 
 	

 
r   z3.30.0zXThe eventlet event loop is deprecated and will be removed in 3.31.0.  See CASSPYTHON-12.)versionreasonc                        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             Zed             Zed             Zd Zd Z fdZd	 Zd
 Zd Zd Zd Zd Z x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                     t          j                     | j        sFt                      | _        t          j        | j                  | _        t                      | _        d S d S N)	eventletmonkey_patch_timersr   spawnservice_timeouts_timeout_watcherr   
_new_timer)clss    r   initialize_reactorz%EventletConnection.initialize_reactorC   sT    { 	%&..CK#+>#2F#G#GC "WWCNNN	% 	%r   c                     t          ||          }| j                            |           | j                                         |S r   )r
   r   	add_timerr#   set)r$   timeoutcallbacktimers       r   create_timerzEventletConnection.create_timerK   s@    gx((e$$$r   c                     | j         }	 |                                }|r$t          |t          j                    z
  d          nd}| j                            |           | j                                         p)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_times       r   r!   z#EventletConnection.service_timeoutsR   st     	#$5577H;CNX	3Q777JN
+++N  """		#r   c                 @    t          j         g|R i |  j        o j          _        t                       _                                          t          j	         fd           _
        t          j	         fd           _                                          d S )Nc                  ,                                      S r   )handle_readselfs   r   <lambda>z-EventletConnection.__init__.<locals>.<lambda>h   s    D4D4D4F4F r   c                  ,                                      S r   )handle_writer8   s   r   r:   z-EventletConnection.__init__.<locals>.<lambda>i   s    T5F5F5H5H r   )r   __init__ssl_optionsssl_contextuses_legacy_ssl_optionsr   _write_queue_connect_socketr   r    _read_watcher_write_watcher_send_options_message)r9   argskwargss   `  r   r=   zEventletConnection.__init__a   s    D242226222'+'7'P@P<P$!GG%^,F,F,F,FGG&n-H-H-H-HII""$$$$$r   c                    t                       t          j        | j        | j                  }|                                 | j        r<d| j        v r3|                    | j        d                             d                     |S )Nserver_hostnameascii)	r   r   r   r?   _socketset_connect_stater>   set_tlsext_host_nameencode)r9   rvs     r   _wrap_socket_from_contextz,EventletConnection._wrap_socket_from_contextl   s    ^D,dl;;
 	Y 1T5E E E##D$45F$G$N$Nw$W$WXXX	r   c                     | j         r*t          t          |                               |           d S | j                            |           | j        s| j        r| j                                         d S d S r   )	r@   superr   _initiate_connectionrK   connectr?   r>   do_handshake)r9   sockaddr	__class__s     r   rS   z'EventletConnection._initiate_connectionu   s    ' 	,$d++@@JJJJJL  *** ,4#3 ,))+++++, ,r   c                     | j         sm| j                                                                        j        }|| j        j        k    r/t          d                    || j        j                            d S d S )NzOHostname verification failed! Certificate name '{}' doesn't match endpoint '{}')	r@   rK   get_peer_certificateget_subject
commonNameendpointaddress	Exceptionr   )r9   	cert_names     r   _validate_hostnamez%EventletConnection._validate_hostname}   s    + 	h99;;GGIITIDM111 !>>DfYPTP]Pe>f>fh h h	h 	h11r   c                    | j         5  | j        r	 d d d            d S d| _        d d d            n# 1 swxY w Y   t                              dt	          |           d| j                   t          j                    }| j        r$| j        |k    r| j        	                                 | j
        r$| j
        |k    r| j
        	                                 | j        r| j                                         t                              d| j                   | j        sE|                     t          d| j        z                       | j                                         d S d S )NTzClosing connection (z) to zClosed socket to zConnection to %s was closed)lock	is_closedlogdebugidr\   r   
getcurrentrC   killrD   rK   close
is_defuncterror_all_requestsr	   connected_eventr(   )r9   cur_gthreads     r   ri   zEventletConnection.close   s   Y 	" 	"~ 	" 	" 	" 	" 	" 	" 	" 	" "DN	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	"
 				RXXXXt}}MNNN)++ 	&$"4"C"C##%%% 	'4#6+#E#E$$&&&< 	!L   			4==:;;; 	'##"#@4=#PQQS S S  $$&&&&&		' 	's   	1155c                 b    t                               d           |                                  d S )Nzconnection closed by server)rd   re   ri   r8   s    r   handle_closezEventletConnection.handle_close   s&    		/000

r   c                 $   	 	 | j                                         }| j                            |           nZ# t          j        $ r<}t                              d| |           |                     |           Y d }~d S d }~wt          $ r Y d S w xY w)NTz'Exception during socket send for %s: %s)
rA   getrK   sendallr   errorrd   re   defunctr   )r9   next_msgerrs      r   r<   zEventletConnection.handle_write   s    		,0022$$X....<   		CT3OOOS!!!   		s   37 B1A==BBc                    	 	 | j                             | j                  }| j                            |           nZ# t
          j        $ r<}t                              d| |           | 	                    |           Y d }~d S d }~wt          $ r Y d S w xY w|r.| j                                        r|                                  n1t                              d|            |                                  d S )NTz'Exception during socket recv for %s: %szConnection %s closed by server)rK   recvin_buffer_size_iobufwriter   rs   rd   re   rt   r   tellprocess_io_bufferri   )r9   bufrv   s      r   r7   zEventletConnection.handle_read   s   		l''(;<<!!#&&&&<   		C% % %S!!!     t{'')) &&((((		:DAAA

#	s   9= B1BBBc                     | j         }t          dt          |          |          D ]'}| j                            ||||z                       (d S )Nr   )out_buffer_sizerangelenrA   put)r9   data
chunk_sizeis       r   pushzEventletConnection.push   s]    )
q#d))Z00 	: 	:A!!$qZ'7"89999	: 	:r   )__name__
__module____qualname____doc__rC   rD   r   greenr   _socket_implssl	_ssl_implr   r"   r#   classmethodr%   r,   r!   r=   rP   rS   r`   ri   ro   r<   r7   r   __classcell__)rW   s   @r   r   r   1   s<         MN>(L"IGJ% % [%   [ # # [#	% 	% 	%  , , , , ,h h h' ' '0  
 
 
  (: : : : : : :r   r   )r   eventlet.greenr   eventlet.queuer   greenletr   logging	threadingr   r/   r   cassandra.connectionr   r	   r
   r   eventlet.green.OpenSSLr   r   r   er   	getLoggerr   rd   r   r   r   r   r   <module>r      s  (  ! ! ! ! ! !             ! ! ! ! ! !         ! ! ! ! ! ! T T T T T T T T T T T T******JJ   J
 g!!
 
 
 H%  A  A  AQ: Q: Q: Q: Q: Q: Q: A  AQ: Q: Q:s   A AAA