
    >OOf"              	          U 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 d dl	m
Z
mZ ddlmZmZ ddlmZ ddlmZmZ d	gZej*                  d
k(  r e
       Ze
ed<   dZde j2                  fdZnde j2                  f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jL                         de'dd	fd       Z( ejL                         de'de'dd	defd       Z) G d d	      Z*y)    N)suppress)AnyDictSet)WeakKeyDictionaryWeakSet   )ffilib)CurlMOpt)DEFAULT_CACERTCurl	AsyncCurlwin32
_selectorsa  
    Proactor event loop does not implement add_reader family of methods required.
    Registering an additional selector thread for add_reader support.
    To avoid this warning use:
        asyncio.set_event_loop_policy(WindowsSelectorEventLoopPolicy())
    returnc           
           t         v r	t             S t         t        t        dt	        d                  s S t        j                  t        t               ddl	m
}  |       xt          <    j                   fd}| _        S )zGet selector-compatible loop

        Returns an object with ``add_reader`` family of methods,
        either the loop itself or a SelectorThread instance.

        Workaround Windows proactor removal of *reader methods.
        ProactorEventLoopNr	   )AddThreadSelectorEventLoopc                  `     _         t        j                   d        j                          y N)closer   pop)asyncio_loop
loop_closeselector_loops   N/var/www/premiumrankchecker/venv/lib/python3.12/site-packages/curl_cffi/aio.py_close_selector_and_loopz/_get_selector.<locals>._close_selector_and_loop0   s'     ",LNN<.!    )r   
isinstancegetattrasynciotypewarningswarnPROACTOR_WARNINGRuntimeWarning_asyncio_selectorr   r   )r   r   r   r   r   s   `  @@r   _get_selectorr)      s     :%l++,9LdSWj(YZ&7A3Ml3[[
<0 "''
	" 6r   c                     | S r    )loops    r   r)   r)   <   s    r            
timeout_msclientpc                 6   t        j                  |      }|dk(  r1|j                  D ]  }|j                           t	               |_        y|j
                  j                  |dz  |j                  t        t              }|j                  j                  |       y)zD
    see: https://curl.se/libcurl/c/CURLMOPT_TIMERFUNCTION.html
    r0   i  N)r
   from_handle_timerscancelr   r,   
call_laterprocess_dataCURL_SOCKET_TIMEOUTCURL_POLL_NONEadd)curlmr1   r2   
async_curltimers        r   timer_functionr?   P   s    
 )J R'' 	ELLN	$Y
**##	
 	u%r   sockfdwhatdatac                    t        j                  |      }|j                  }||j                  v r"|j	                  |       |j                  |       |t        z  r=|j                  ||j                  |t               |j                  j                  |       |t        z  r=|j                  ||j                  |t               |j                  j                  |       |t        z  r|j                  j                  |       y y r   )r
   r4   r,   _sockfdsremove_readerremove_writerCURL_POLL_IN
add_readerr8   CURL_CSELECT_INr;   CURL_POLL_OUT
add_writerCURL_CSELECT_OUTCURL_POLL_REMOVEremove)curlr@   rA   r2   rB   r=   r,   s          r   socket_functionrP   f   s    )J??D $$$6"6"l
 7 7Q'm
 7 7AQR'""6* r   c                       e Zd ZdZd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y)r   zhWrapper around curl_multi handle to provide asyncio support. It uses the libcurl
    socket_action APIs.Ncacertc                 t   t        j                         | _        |xs t        | _        i | _        i | _        t               | _        t        ||nt        j                               | _        | j                  j                  | j                               | _        t!               | _        | j%                          y)z
        Parameters:
            cacert: CA cert path to use, by default, curl_cffi uses certs from ``certifi``.
            loop: EventLoop to use.
        N)r   curl_multi_init_curlmr   _cacert_curl2future
_curl2curlsetrD   r)   r"   get_running_loopr,   create_task_force_timeout_checkerr   r5   _setup)selfrR   r,   s      r   __init__zAsyncCurl.__init__~   s     ))+/8:13"%%!$*:$@X@X@Z[			--d.A.A.CD5<Yr   c                    | j                  t        j                  t        j                         | j                  t        j
                  t        j                         t        j                  |       | _	        | j                  t        j                  | j                         | j                  t        j                  | j                         y r   )setoptr   TIMERFUNCTIONr   r?   SOCKETFUNCTIONrP   r
   
new_handle_self_handle
SOCKETDATA	TIMERDATAr_   s    r   r^   zAsyncCurl._setup   s{    H**C,>,>?H++S-@-@ANN40H''):):;H&&(9(9:r   c                   K   | j                   j                          t        t        j                        5  | j                    d{    ddd       | j
                  j                         D ]b  \  }}t        j                  | j                  |j                         |j                         rA|j                         rR|j                  d       d t        j                  | j                         d| _	        | j                  D ]8  }| j                   j#                  |       | j                   j%                  |       : | j&                  D ]  }|j                           y7 # 1 sw Y   xY ww)z?Close and cleanup running timers, readers, writers and handles.N)r]   r6   r   r"   CancelledErrorrW   itemsr   curl_multi_remove_handlerU   _curldone	cancelled
set_resultcurl_multi_cleanuprD   r,   rE   rF   r5   )r_   rO   futurer@   r>   s        r   r   zAsyncCurl.close   s     	g,,- 	 --	  !--335 	(LD&((djjA;;=)9)9);!!$'	( 	t{{+ mm 	,FII##F+II##F+	,
 \\ 	ELLN	%  	  	 s<   4E1E$E!E$A"E1.E1?B"E1!E$$E.)E1c                    K   	 | j                   sy t        j                  d       d {    | j                  t        t
               E7 w)Nr	   )rU   r"   sleepsocket_actionr9   r:   ri   s    r   r\   zAsyncCurl._force_timeout   s@     ;;--"""2NC  #s   'AA	 ArO   c                     |j                          t        j                  | 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_handlerU   rn   r,   create_futurerW   rX   r_   rO   rs   s      r   
add_handlezAsyncCurl.add_handle   sa     	!!$++tzz:((*"($&*

#r   r@   
ev_bitmaskr   c                 z    t        j                  d      }t        j                  | j                  |||       |d   S )z#Call libcurl socket_action functionint *r   )r
   newr   curl_multi_socket_actionrU   )r_   r@   r}   running_handles       r   rv   zAsyncCurl.socket_action   s3    )$$T[[&*nUa  r   c                    | j                   st        j                  d       y| j                  ||       t	        j
                  d      }	 t        j                  | j                   |      }|t        j                  k(  ry|j                  t        k(  ri| j                  |j                     }|j                  j                  }|dk(  r| j                  |       n.| j!                  ||j#                  |d             nt%        d       )z8Call curl_multi_info_read to read data for given socket.z/Curlm alread closed! quitting from process_dataNr   r   performzNOT DONE)rU   r$   r%   rv   r
   r   r   curl_multi_info_readNULLmsgCURLMSG_DONErX   easy_handlerB   resultrq   set_exception
_get_errorprint)r_   r@   r}   msg_in_queuecurl_msgrO   retcodes          r   r8   zAsyncCurl.process_data   s    {{MMKL6:.www'//\JH388#|||+x';';<"--..a<OOD) &&tT__Wi-PQj! r   c                     t        j                  | j                  |j                         | j                  j                  |j                  d        | j                  j                  |d       S r   )r   rm   rU   rn   rX   r   rW   )r_   rO   s     r   _pop_futurezAsyncCurl._pop_future   sK    $$T[[$**=DJJ-  $$T400r   c                     | j                  |      }|r3|j                         s"|j                         s|j                          yyyy)z&Cancel a future for given curl handle.N)r   ro   rp   r6   r{   s      r   remove_handlezAsyncCurl.remove_handle   s;    !!$'&++-0@0@0BMMO 1C-6r   c                     | j                  |      }|r4|j                         s#|j                         s|j                  d       yyyy)z,Mark a future as done for given curl handle.N)r   ro   rp   rq   r{   s      r   rq   zAsyncCurl.set_result   s@    !!$'&++-0@0@0Bd# 1C-6r   c                     | j                  |      }|r4|j                         s#|j                         s|j                  |       yyyy)z2Raise exception of a future for given curl handle.N)r   ro   rp   r   )r_   rO   	exceptionrs   s       r   r   zAsyncCurl.set_exception   s@    !!$'&++-0@0@0B  + 1C-6r   c                 D    t        j                  | j                  ||      S )z!Wrapper around curl_multi_setopt.)r   curl_multi_setoptrU   )r_   optionvalues      r   rb   zAsyncCurl.setopt   s    $$T[[&%@@r   ) N)__name__
__module____qualname____doc__strr`   r^   r   r\   r   r|   intrv   r8   r   r   rq   r   rb   r+   r   r   r   r   z   s    s  ;6D	t 	!C !S !S !"3 "C "41 1
$ $t $,$ ,Ar   )+r"   sysr$   
contextlibr   typingr   r   r   weakrefr   r   _wrapperr
   r   constr   rO   r   r   __all__platformr   __annotations__r&   AbstractEventLoopr)   r:   rG   rJ   CURL_POLL_INOUTrM   r9   CURL_SOCKET_BADrI   rL   CURL_CSELECT_ERRr   
def_externr   r?   rP   r   r+   r   r   <module>r      s     
   ! ! .   &-<<7$5$7J!7 w'@'@  Hw88       &c &K & &* +# +S +; +c + +&BA BAr   