zL i. UddlZddlZddlZddlmZddlmZmZddlm Z ddl m Z m Z ddl mZmZddlmZmZmZdd lmZd gZej.d k(r+e Ze ed <d Zdej6dej6fdZndej6dej6fdZdZdZdZdZ dZ!dZ"dZ#dZ$dZ%dZ&dZ'dZ(dZ)dZ* e jVde,dede,fdZ-e jVde,de,dedede,f dZ.Gdd Z/y)N)suppress)AnyOptional)WeakKeyDictionary)ffilib) CurlECodeCurlMOpt)DEFAULT_CACERTCurl CurlError)CurlCffiWarning AsyncCurlwin32 _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_loopreturnc tvr tStttdt dsSt j ttdddl m }|xt<jfd}|_ 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`_tjdjyN)closerpop)r loop_close selector_loopsS/mnt/ssd/data/python-lab/Trading/venv/lib/python3.12/site-packages/curl_cffi/aio.py_close_selector_and_loopz.get_selector.._close_selector_and_loop7s'",L  NN< .    !) r isinstancegetattrasynciotypewarningswarnPROACTOR_WARNINGr_asyncio_selectorrr)rrr"rr s` @@r! get_selectorr,s : %l+ + ''+>T K   &AFA3M 4  <0 "''  "6 r#loopc|Sr)r-s r!r,r,Cs r#r timeout_msclientpctj|}|jr!|jjd|_|jj |dz |j tt|_y)zD see: https://curl.se/libcurl/c/CURLMOPT_TIMERFUNCTION.html Nir) r from_handle_timercancelr- call_later process_dataCURL_SOCKET_TIMEOUTCURL_POLL_NONE)curlmr3r4 async_curls r!timer_functionr?usl )J  " #22T J r#sockfdwhatdatactj|}|j}||jvr"|j ||j ||t zr=|j||j|t|jj||tzr=|j||j|t|jj||tk(r|jj|y)z[This callback is called when libcurl decides it's time to interact with certain socketsr)rr6r-_sockfds remove_reader remove_writer CURL_POLL_IN add_readerr:CURL_CSELECT_INadd CURL_POLL_OUT add_writerCURL_CSELECT_OUTCURL_POLL_REMOVEremove)curlr@rAr4rBr>r-s r!socket_functionrQs )J ??D$$$ 6" 6" l  7 7Q' m  7 7AQR' ""6* r#ceZdZdZddefdZdZdZdZde fd Z d e d e d e fd Z d e d e fdZ de fdZde fdZde fdZde fdZde defdZdZy)rzhWrapper around curl_multi handle to provide asyncio support. It uses the libcurl socket_action APIs.Ncacertcdtj|_|xst|_i|_i|_t|_t||ntj|_ |jj|j|_d|_|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 _curl2curlsetrDr,r&get_running_loopr- create_task_force_timeout_timeout_checkerr7_setup)selfrSr-s r!__init__zAsyncCurl.__init__s ))+ / 8:13"%%  $D'*B*B*D  !% 5 5d6I6I6K L59  r#c|jtjtj|jtj tj tj||_ |jtj|j|jtj|jyr) setoptr TIMERFUNCTIONr r?SOCKETFUNCTIONrQr new_handle _self_handle SOCKETDATA TIMERDATAr`s r!r_zAsyncCurl._setups{ H**C,>,>? H++S-@-@ANN40 H''):):; H&&(9(9:r#cK|jjttj5|jd{ddd|j j D]b\}}tj|j|j|jrA|jrR|jddtj|jd|_ |jD]8}|j j#||j j%|:|j&r|j&jyy7!#1swY!xYww)z?Close and cleanup running timers, readers, writers and handles.N)r^r8rr&CancelledErrorrXitemsr curl_multi_remove_handlerV_curldone cancelled set_resultcurl_multi_cleanuprDr-rErFr7)r`rPfuturer@s r!rzAsyncCurl.closes! $$& g,, - ('' ' ' (!--335 (LD&  ( (djj A;;=)9)9);!!$' ( t{{+ mm ,F II # #F + II # #F + , ;; KK    % ( ( (s<4E7E*E'E* A"E7.E7?B(E7'E**E4/E7cK |jsy|jttt j dd{E7w)zpThis coroutine is used to safeguard from any missing signals from curl, and put everything back on trackg?N)rV socket_actionr;r<r&sleeprjs r!r]zAsyncCurl._force_timeoutsB;;   2N C--$ $ $  %sAA A A rPc |jtj|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_handlerVro _check_errorr- create_futurerXrY)r`rPerrcoderts r! add_handlezAsyncCurl.add_handlesq ++DKKD '"((*"($&* # r#r@ ev_bitmaskrctjd}tj|j|||}|j ||dS)zYwrapper for curl_multi_socket_action, returns the number of running curl handles.int *r)rnewr curl_multi_socket_actionrVr{)r`r@rrunning_handler}s r!rvzAsyncCurl.socket_actionsJ).. KK^  '"a  r#ct|jstjdtdy|j ||t j d} tj|j|}|t jk(ry|jtk(ri|j|j}|jj}|dk(r|j!|n.|j#||j%|dn t'd#t($rtjd tdY(wxYw) z8Call curl_multi_info_read to read data for given socket.z0Curlm already closed! quitting from process_datarrNrrperformzNOT DONEzLUnexpected curl multi state in process_data, please open an issue on GitHub )rVr(r)rrvrrr curl_multi_info_readNULLmsg CURLMSG_DONErY easy_handlerBresultrr set_exception _get_errorprint Exception)r`r@r msg_in_queuecurl_msgrPretcodes r!r:zAsyncCurl.process_datas{{ MMB   6:.www'  33DKKNsxx'<<</??8+?+?@D&mm22G!|-**4)1TU*%  7#  s3DBD%D76D7ctj|j|j}|j ||j j |jd|jj |dSr)r rnrVror{rYrrX)r`rPr}s r! _pop_futurezAsyncCurl._pop_future's[..t{{DJJG '" DJJ-  $$T400r#c|j|}|r3|js"|js|jyyyy)z&Cancel a future for given curl handle.N)rrprqr8r`rPrts r! remove_handlezAsyncCurl.remove_handle-s;!!$' &++-0@0@0B MMO1C-6r#c|j|}|r4|js#|js|jdyyyy)z,Mark a future as done for given curl handle.N)rrprqrrrs r!rrzAsyncCurl.set_result3s@!!$' &++-0@0@0B   d #1C-6r#c|j|}|r4|js#|js|j|yyyy)z2Raise exception of a future for given curl handle.N)rrprqr)r`rP exceptionrts r!rzAsyncCurl.set_exception9s@!!$' &++-0@0@0B   +1C-6r#r}argsc |tjk(rytj|}dj |Dcgc] }t |c}}t d|d|d|dcc}w)N z Failed in z , multi: (z) z. See https://curl.se/libcurl/c/libcurl-errors.html first for more details. Please open an issue on GitHub to help debug this error.)r OKr curl_multi_strerrorjoinstrr)r`r}rerrmsgaactions r!r{zAsyncCurl._check_error?so ill " ((140a3q601 7)2fX>P P  1sA'c2|tjtjtjtjtj tj fvrtjd|}n|}tj|j||S)z!Wrapper around curl_multi_setopt.zlong*) r PIPELINING MAXCONNECTSMAX_HOST_CONNECTIONSMAX_PIPELINE_LENGTHMAX_TOTAL_CONNECTIONSMAX_CONCURRENT_STREAMSrrr curl_multi_setoptrV)r`optionvaluec_values r!rczAsyncCurl.setoptJsu       ) )  ( (  * *  + +   gggu-GG$$T[[&'BBr#)N)__name__ __module__ __qualname____doc__rrar_rr]r r~intrvr:rrrrrrr{rcr/r#r!rrss$;!6% t !C!S!S!"3"C"H11 $ $t$ ,$,  C     Cr#)0r&sysr( contextlibrtypingrrweakrefr_wrapperrr constr r rPr r rutilsr__all__platformr__annotations__r*AbstractEventLoopr,r<rGrKCURL_POLL_INOUTrNr;CURL_SOCKET_BADrIrMCURL_CSELECT_ERRrCURLPIPE_NOTHINGCURLPIPE_HTTP1CURLPIPE_MULTIPLEX def_externrr?rQrr/r#r!rsc  %&11" -<<7$5$7J!7&//&  " "&T7449R9R   4 c C C  . # S 3 c c  :lClCr#