
    Xh#              	          U d dl Z d dlZd dlZd dlmZ d dl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d	lmZ d
gZej*                  dk(  r+ e       Zeed<   dZde j2                  de j2                  fdZnde j2                  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)WeakKeyDictionaryWeakSet   )ffilib)CurlMOpt)DEFAULT_CACERTCurl)CurlCffiWarning	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())
    asyncio_loopreturnc           
           t         v r	t             S t         t        t        dt	        d                  s S t        j                  t        t        d       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.
        ProactorEventLoopN   
stacklevelr   )AddThreadSelectorEventLoopc                  `     _         t        j                   d        j                          y N)closer   pop)r   
loop_closeselector_loops   E/home/Script/Script_env/lib/python3.12/site-packages/curl_cffi/aio.py_close_selector_and_loopz.get_selector.<locals>._close_selector_and_loop7   s'     ",LNN<.!    )r   
isinstancegetattrasynciotypewarningswarnPROACTOR_WARNINGr   _asyncio_selectorr   r   )r   r   r    r   r   s   `  @@r   get_selectorr*      s     :%l++''+>T
K
  &AFA3M4
 	

<0
 "''
	" 6r!   loopc                     | S r    )r+   s    r   r*   r*   C   s    r!   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?   W   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   m   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, certs from ``certifi`` are used.
            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"%% $D'*B*B*D
	 		--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t        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.z0Curlm already closed! quitting from process_datar   r   Nr   r   performzNOT DONE)rU   r&   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B
 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      s    s $;6D
t 
!C !S !S !"3 "C "<1 1
$ $t $,$ ,Ar!   )+r$   sysr&   
contextlibr   typingr   weakrefr   r   _wrapperr   r	   constr
   rO   r   r   utilsr   __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&//&		"	"&T744 9R9R       &c &K & &* +# +S +; +c + +&JA JAr!   