
    )Jf3              	          d gZ ddlZddlZddlmZ ddlZddlmZmZ ddl	m
Z
 ddlmZ ej                            ej                            e          d          ZdZdZd	Zd
ZdZdZdZdZd	ZdZdZ ej                    dedefd            Z ej                    dedededefd            Z  G d d           Z!dS )	AsyncCurl    N)Any   )ffilib)CurlMOpt)Curlz
cacert.pem         
timeout_msclientpc                    t          j        |          }|dk    r'|j        D ]}|                                 g |_        dS |j                            |dz  |j        t          t                    }|j        	                    |           dS )zD
    see: https://curl.se/libcurl/c/CURLMOPT_TIMERFUNCTION.html
    r   i  N)
r   from_handle_timerscancelloop
call_laterprocess_dataCURL_SOCKET_TIMEOUTCURL_POLL_NONEappend)curlmr   r   
async_curltimers        P/home/alex/cs2snipeproduction/venv/lib/python3.11/site-packages/curl_cffi/aio.pytimer_functionr      s    
 ))JR' 	 	ELLNNNN
**#	
 
 	!!%(((((    sockfdwhatdatac                    t          j        |          }|j        }||j        v r*|                    |           |                    |           |t          z  r<|                    ||j        |t                     |j        
                    |           |t          z  r<|                    ||j        |t                     |j        
                    |           |t          z  r|j                            |           d S d S N)r   r   r   _sockfdsremove_readerremove_writerCURL_POLL_IN
add_readerr   CURL_CSELECT_INaddCURL_POLL_OUT
add_writerCURL_CSELECT_OUTCURL_POLL_REMOVEremove)curlr    r!   r   r"   r   r   s          r   socket_functionr2   4   s   ))J?D $$$6"""6"""l (
 7QQQ'''m (
 7AQRRR''' +""6*****+ +r   c                       e Zd ZdZedfdefdZd Zd Zd Z	de
fd	Zd
ededefdZd
edefdZde
fdZde
fdZde
fdZde
fdZd ZdS )r   zhWrapper around curl_multi handle to provide asyncio support. It uses the libcurl
    socket_action APIs.Ncacertc                 V   t          j                    | _        || _        i | _        i | _        t                      | _        ||nt          j	                    | _
        | j
                            |                                           | _        g | _        |                                  d S r$   )r   curl_multi_init_curlm_cacert_curl2future
_curl2curlsetr%   asyncioget_running_loopr   create_task_force_timeout_checkerr   _setup)selfr4   r   s      r   __init__zAsyncCurl.__init__L   s    )++ ,DD'2J2L2L		--d.A.A.C.CDDr   c                 t   |                      t          j        t          j                   |                      t          j        t          j                   t          j        |           | _	        |                      t          j
        | j	                   |                      t          j        | j	                   d S r$   )setoptr   TIMERFUNCTIONr   r   SOCKETFUNCTIONr2   r   
new_handle_self_handle
SOCKETDATA	TIMERDATArB   s    r   rA   zAsyncCurl._setupW   s    H*C,>???H+S-@AAAN400H'):;;;H&(9:::::r   c                 &   | j                                          | j                                        D ]a\  }}t	          j        | j        |j                   |                                s)|	                                s|
                    d           bt	          j        | j                   d| _        | j        D ]6}| j                            |           | j                            |           7| j        D ]}|                                 dS )z?Close and cleanup running timers, readers, writers and handles.N)r@   r   r9   itemsr   curl_multi_remove_handler7   _curldone	cancelled
set_resultcurl_multi_cleanupr%   r   r&   r'   r   )rB   r1   futurer    r   s        r   closezAsyncCurl.close^   s    	 -3355 	( 	(LD&(djAAA;;== ()9)9);); (!!$'''t{+++m 	, 	,FI##F+++I##F++++\ 	 	ELLNNNN	 	r   c                    K   	 | j         sd S t          j        d           d {V  |                     t          t
                     D)NTr   )r7   r<   sleepsocket_actionr   r   rL   s    r   r?   zAsyncCurl._force_timeoutr   sZ      	D; -"""""""""2NCCC	Dr   r1   c                     |                                  t          j        | j        |j                   | j                                        }|| j        |<   || j        |j        <   |S )znAdd a curl handle to be managed by curl_multi. This is the equivalent of
        `perform` in the async world.)	_ensure_cacertr   curl_multi_add_handler7   rP   r   create_futurer9   r:   rB   r1   rU   s      r   
add_handlezAsyncCurl.add_handlez   s`     	!$+tz:::((**"($&*
#r   r    
ev_bitmaskreturnc                 r    t          j        d          }t          j        | j        |||           |d         S )z#Call libcurl socket_action functionint *r   )r   newr   curl_multi_socket_actionr7   )rB   r    r`   running_handles       r   rY   zAsyncCurl.socket_action   s5    ))$T[&*nUUUa  r   c                    | j         st          j        d           dS |                     ||           t	          j        d          }	 t          j        | j         |          }|t          j        k    rdS |j	        t          k    re| j        |j                 }|j        j        }|dk    r|                     |           n:|                     ||                    |d                     nt%          d           )z8Call curl_multi_info_read to read data for given socket.z/Curlm alread closed! quitting from process_dataNrc   Tr   performzNOT DONE)r7   warningswarnrY   r   rd   r   curl_multi_info_readNULLmsgCURLMSG_DONEr:   easy_handler"   resultrS   set_exception
_get_errorprint)rB   r    r`   msg_in_queuecurl_msgr1   retcodes          r   r   zAsyncCurl.process_data   s    { 	MKLLLF6:...ww''	"/\JJH38##||++x';<"-.a<<OOD)))) &&tT__Wi-P-PQQQQj!!!	"r   c                     t          j        | j        |j                   | j                            |j        d            | j                            |d           S r$   )r   rO   r7   rP   r:   popr9   )rB   r1   s     r   _pop_futurezAsyncCurl._pop_future   sL    $T[$*===DJ--- $$T4000r   c                     |                      |          }|r>|                                s,|                                s|                                 dS dS dS dS )z&Cancel a future for given curl handle.N)ry   rQ   rR   r   r^   s      r   remove_handlezAsyncCurl.remove_handle   sn    !!$'' 	&++-- 	0@0@0B0B 	MMOOOOO	 	 	 	 	 	r   c                     |                      |          }|r?|                                s-|                                s|                    d           dS dS dS dS )z,Mark a future as done for given curl handle.N)ry   rQ   rR   rS   r^   s      r   rS   zAsyncCurl.set_result   sw    !!$'' 	$&++-- 	$0@0@0B0B 	$d#####	$ 	$ 	$ 	$ 	$ 	$r   c                     |                      |          }|r?|                                s-|                                s|                    |           dS dS dS dS )z2Raise exception of a future for given curl handle.N)ry   rQ   rR   rq   )rB   r1   	exceptionrU   s       r   rq   zAsyncCurl.set_exception   sw    !!$'' 	,&++-- 	,0@0@0B0B 	,  +++++	, 	, 	, 	, 	, 	,r   c                 8    t          j        | j        ||          S )z!Wrapper around curl_multi_setopt.)r   curl_multi_setoptr7   )rB   optionvalues      r   rE   zAsyncCurl.setopt   s    $T[&%@@@r   )__name__
__module____qualname____doc__DEFAULT_CACERTstrrC   rA   rV   r?   r	   r_   intrY   r   ry   r{   rS   rq   rE    r   r   r   r   H   s[         &4$ 	 	s 	 	 	 	; ; ;  (D D D	t 	 	 	 	!C !S !S ! ! ! !"3 "C " " " "41 1 1 1 1
$    $t $ $ $ $,$ , , , ,A A A A Ar   )"__all__r<   ostypingr   ri   _wrapperr   r   constr   r1   r	   pathjoindirname__file__r   r   r(   r,   CURL_POLL_INOUTr/   r   CURL_SOCKET_BADr*   r.   CURL_CSELECT_ERRrn   
def_externr   r   r2   r   r   r   r   <module>r      s  -  				                           bgooh77FF     )c )C ) ) ) )( +# +S +3 +c + + + +&vA vA vA vA vA vA vA vA vA vAr   