
    vKg#              	          % S SK r S SKrS SKrS SKJr  S SKJrJrJr  S SK	J
r
Jr  SSKJrJr  SSKJr  SSKJrJr  S	/r\R*                  S
:X  a   \
" 5       r\
\S'   SrS\ R2                  4S jrOS\ R2                  4S jrS rSrSrSrSrSr Sr!Sr"Sr#Sr$Sr%\RL                  " 5       S\'SS	4S j5       r(\RL                  " 5       S\'S\'SS	S\4S j5       r) " S S	5      r*g)    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 [         ;   a	  [         T    $ [        T [        [        S[	        S5      5      5      (       d  T $ [
        R                  " [        [        SS9  SSK	J
n  U" T 5      =m[         T '   T R                  mU UU4S jnUT l        T$ )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.
ProactorEventLoopN   
stacklevelr	   )AddThreadSelectorEventLoopc                  `   > TT l         [        R                  T S 5        TR                  5         g N)closer   pop)asyncio_loop
loop_closeselector_loops   M/var/www/highfloat_scraper/venv/lib/python3.13/site-packages/curl_cffi/aio.py_close_selector_and_loop/_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Z&1EA3Ml3[[
<0 "''
	" 6r#   c                     U $ r    )loops    r    r-   r-   <   s    r#   r         
timeout_msclientpc                 >   [         R                  " U5      nUS:X  a3  UR                   H  nUR                  5         M     [	        5       Ul        gUR
                  R                  US-  UR                  [        [        5      nUR                  R                  U5        g)z<
see: https://curl.se/libcurl/c/CURLMOPT_TIMERFUNCTION.html
r3   i  N)r
   from_handle_timerscancelr   r0   
call_laterprocess_dataCURL_SOCKET_TIMEOUTCURL_POLL_NONEadd)curlmr4   r5   
async_curltimers        r    timer_functionrB   P   s    
 )J R''ELLN ($Y
**##	
 	u%r#   sockfdwhatdatac                 &   [         R                  " U5      nUR                  nXR                  ;   a"  UR	                  U5        UR                  U5        U[        -  (       a<  UR                  XR                  U[        5        UR                  R                  U5        U[        -  (       a<  UR                  XR                  U[        5        UR                  R                  U5        U[        -  (       a  UR                  R                  U5        g g r   )r
   r7   r0   _sockfdsremove_readerremove_writerCURL_POLL_IN
add_readerr;   CURL_CSELECT_INr>   CURL_POLL_OUT
add_writerCURL_CSELECT_OUTCURL_POLL_REMOVEremove)curlrC   rD   r5   rE   r@   r0   s          r    socket_functionrS   f   s    )J??D $$$6"6"l 7 7Q'm 7 7AQR'""6* r#   c                       \ rS rSrSrSS\4S jjrS rS rS r	S	\
4S
 jrS\S\S\4S jrS\S\4S jrS	\
4S jrS	\
4S jrS	\
4S jrS	\
4S jrS rSrg)r   z   zdWrapper around curl_multi handle to provide asyncio support. It uses the libcurl
socket_action APIs.Ncacertc                    [         R                  " 5       U l        U=(       d    [        U l        0 U l        0 U l        [        5       U l        [        Ub  UO[        R                  " 5       5      U l        U R                  R                  U R                  5       5      U l        [!        5       U l        U R%                  5         g)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setrG   r-   r&   get_running_loopr0   create_task_force_timeout_checkerr   r8   _setup)selfrV   r0   s      r    __init__AsyncCurl.__init__~   s     ))+/8:13"%%!$*:$@X@X@Z[			--d.A.A.CD5<Yr#   c                    U R                  [        R                  [        R                  5        U R                  [        R
                  [        R                  5        [        R                  " U 5      U l	        U R                  [        R                  U R                  5        U R                  [        R                  U R                  5        g r   )setoptr   TIMERFUNCTIONr   rB   SOCKETFUNCTIONrS   r
   
new_handle_self_handle
SOCKETDATA	TIMERDATArc   s    r    rb   AsyncCurl._setup   s{    H**C,>,>?H++S-@-@ANN40H''):):;H&&(9(9:r#   c                   #    U R                   R                  5         [        [        R                  5         U R                   I Sh  vN   SSS5        U R
                  R                  5        Ho  u  p[        R                  " U R                  UR                  5        UR                  5       (       a  MG  UR                  5       (       a  M^  UR                  S5        Mq     [        R                  " U R                  5        SU l	        U R                   H9  nU R                   R#                  U5        U R                   R%                  U5        M;     U R&                   H  nUR                  5         M     g GN.! , (       d  f       GN3= f7f)z?Close and cleanup running timers, readers, writers and handles.N)ra   r9   r   r&   CancelledErrorr[   itemsr   curl_multi_remove_handlerY   _curldone	cancelled
set_resultcurl_multi_cleanuprG   r0   rH   rI   r8   )rc   rR   futurerC   rA   s        r    r   AsyncCurl.close   s     	g,,--- . !--335LD((djjA;;==)9)9););!!$' 6 	t{{+ mmFII##F+II##F+ $
 \\ELLN "%   .-s<   4F	E7E4E7A%F	4F	B)F	4E77
FF	c                    #     U R                   (       d  g [        R                  " S5      I S h  vN   U R                  [        [
        5        ML   N 7f)Nr	   )rY   r&   sleepsocket_actionr<   r=   rn   s    r    r`   AsyncCurl._force_timeout   s?     ;;--"""2NC  #s   -AA!ArR   c                     UR                  5         [        R                  " U R                  UR                  5        U R
                  R                  5       nX R                  U'   XR                  UR                  '   U$ )zfAdd a curl handle to be managed by curl_multi. This is the equivalent of
`perform` in the async world.)	_ensure_cacertr   curl_multi_add_handlerY   rt   r0   create_futurer[   r\   rc   rR   ry   s      r    
add_handleAsyncCurl.add_handle   s]    
 	!!$++tzz:((*"($&*

#r#   rC   
ev_bitmaskr   c                 |    [         R                  " S5      n[        R                  " U R                  XU5        US   $ )z#Call libcurl socket_action functionint *r   )r
   newr   curl_multi_socket_actionrY   )rc   rC   r   running_handles       r    r}   AsyncCurl.socket_action   s1    )$$T[[&nUa  r#   c                     U R                   (       d  [        R                  " SSS9  gU R                  X5        [        R
                  " S5      n [        R                  " U R                   U5      nU[        R                  :X  a  gUR                  [        :X  ai  U R                  UR                     nUR                  R                  nUS:X  a  U R                  U5        O-U R!                  XUR#                  US5      5        O[%        S5        M  )	z8Call curl_multi_info_read to read data for given socket.z/Curlm alread closed! quitting from process_datar   r   Nr   r   performzNOT DONE)rY   r(   r)   r}   r
   r   r   curl_multi_info_readNULLmsgCURLMSG_DONEr\   easy_handlerE   resultrw   set_exception
_get_errorprint)rc   rC   r   msg_in_queuecurl_msgrR   retcodes          r    r;   AsyncCurl.process_data   s    {{MMKXYZ6.www'//\JH388#|||+x';';<"--..a<OOD) &&t__Wi-PQj! r#   c                     [         R                  " U R                  UR                  5        U R                  R                  UR                  S 5        U R                  R                  US 5      $ r   )r   rs   rY   rt   r\   r   r[   )rc   rR   s     r    _pop_futureAsyncCurl._pop_future   sK    $$T[[$**=DJJ-  $$T400r#   c                     U R                  U5      nU(       a=  UR                  5       (       d'  UR                  5       (       d  UR                  5         gggg)z&Cancel a future for given curl handle.N)r   ru   rv   r9   r   s      r    remove_handleAsyncCurl.remove_handle   s@    !!$'&++--0@0@0B0BMMO 1C-6r#   c                     U R                  U5      nU(       a>  UR                  5       (       d(  UR                  5       (       d  UR                  S5        gggg)z,Mark a future as done for given curl handle.N)r   ru   rv   rw   r   s      r    rw   AsyncCurl.set_result   sE    !!$'&++--0@0@0B0Bd# 1C-6r#   c                     U R                  U5      nU(       a>  UR                  5       (       d(  UR                  5       (       d  UR                  U5        gggg)z2Raise exception of a future for given curl handle.N)r   ru   rv   r   )rc   rR   	exceptionry   s       r    r   AsyncCurl.set_exception   sE    !!$'&++--0@0@0B0B  + 1C-6r#   c                 D    [         R                  " U R                  X5      $ )z!Wrapper around curl_multi_setopt.)r   curl_multi_setoptrY   )rc   optionvalues      r    rg   AsyncCurl.setopt   s    $$T[[&@@r#   )	rZ   ra   r\   r[   rY   rk   rG   r8   r0   ) N)__name__
__module____qualname____firstlineno____doc__strrd   rb   r   r`   r   r   intr}   r;   r   r   rw   r   rg   __static_attributes__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   rR   r   r   __all__platformr   __annotations__r*   AbstractEventLoopr-   r=   rJ   rM   CURL_POLL_INOUTrP   r<   CURL_SOCKET_BADrL   rO   CURL_CSELECT_ERRr   
def_externr   rB   rS   r   r/   r#   r    <module>r      s    
   ! ! .   &-<<7$5$7J!7 w'@'@  Hw88       &c &K & &* +# +S +; +c + +&DA DAr#   