{L i`" UddlmZgdZddlZddlZddlZddlZddlmZddl m Z ddl m Z ddl mZmZmZmZmZmZmZmZddlmZmZmZmZmZmZd d lmZmZm Z d d l!m"Z"m#Z#d d l$m%Z%d dl&m'Z'd dl(m)Z)m*Z*d dl+m,Z,d dl-m.Z.m/Z/m0Z0m1Z1m2Z2m3Z3d dl4m5Z5er d dl!m6Z6d dl&m7Z7d dl+m8Z8d dl-m9Z9m:Z:d dl;me?dZ@eAZBdeCd< d1dZDd2dZEd3d4d ZFd5d!ZGeHd"ZId6d#ZJd6d$ZK d7 d8d%ZLd9d:d&ZMd9d;d'ZNdd*ZQd?d+ZRgdddggddeBd,d-gddgdd.dddddd,ddddddddddd/! d@d0ZSy)A) annotations)HttpVersionLiteralset_curl_optionsnot_setN)Counter)BytesIO)dumps) TYPE_CHECKINGAnyCallableFinalLiteralOptionalUnioncast) ParseResult parse_qslquote urlencodeurljoinurlparse)CurlHttpVersionCurlOptCurlSslVersion)CURL_WRITEFUNC_ERRORCurlMime)CurlCffiWarning)Cookies)ImpersonateError InvalidURL)Headers)TLS_CIPHER_NAME_MAPTLS_EC_CURVES_MAPTLS_VERSION_MAPExtraFingerprintsnormalize_browser_typetoggle_extension)Request)Curl) CookieTypes) HeaderTypes)BrowserTypeLiteral ExtraFpDict) ProxySpec) GETPOSTPUTDELETEOPTIONSHEADTRACEPATCHQUERY)v1v2v2tlsv2_prior_knowledgev3v3onlyz!#$%&'()*+,/:;=?@[]~z Final[Any]rc|dk(rtjS|dk(rtjS|dk(rtjS|dk(rtjS|dk(rtj S|dk(rtj S|S)Nr:r>r?r;r<r=)rV1_1V3V3ONLYV2_0V2TLSV2_PRIOR_KNOWLEDGE)versions ^/mnt/ssd/data/python-lab/Trading/venv/lib/python3.12/site-packages/curl_cffi/requests/utils.pynormalize_http_versionrI4s$### D!!! H %%% D### G $$$ ( (111 Nc^t|}t|jxr |jS)z,Check if the provided url is an absolute url)rboolschemehostname)url parsed_urls rHis_absolute_urlrQGs'#J  !!9j&9&9 ::rJcZdjtt|z }t|}t |j d}t |d|}t|j|jt|j||j||jjS)NrRTkeep_blank_values)doseqsaferW)join SAFE_CHARSsetrrqueryrrrMnetlocrpathparamsfragmentgeturl)rO quote_strrWrPparsed_get_argsencoded_get_argss rHquote_path_and_paramsreMs 77:I. /D#J 0 0DIO 4H  jooD)   fhrJct|}t|jd}td|D}t |t rt |j}td|D}|D]}\}}t |tt fr t|}|j|dk(r0|j|dk(r|Dcgc]}|d|k7r|n||f}}k|j||ft|d} t|j|j|j |j"| |j$j'} | Scc}w)aAdd URL query params to provided URL being aware of existing. Args: url: string of target URL params: dict containing requested params to be added Returns: string with updated URL >> url = 'http://stackoverflow.com/test?answers=true' >> new_params = {'answers': False, 'data': ['some','values']} >> update_url_params(url, new_params) 'http://stackoverflow.com/test?data=some&data=values&answers=false' TrTc3&K|] }|d ywrN.0xs rH z$update_url_params..rs=qt=c3&K|] }|d ywrhrirjs rHrmz$update_url_params..us4qt4rnrr)rV)rrr\r isinstancedictlistitemsrLr getappendrrrMr]r^r_r`ra) rOr_rPrcold_args_counternew_args_counterkeyvaluerlrdnew_urls rHupdate_url_paramsr{\sQ #J 0 0DIO=_==&$flln%4V44 1 U edD\ *%LE    $ ).>.B.B3.G1.L>M9:adckU|3O  " "C< 0 1!=  fh  N)sEzBABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-._~c|jd}tdt|D]l}||dd}t|dk(rI|jr9 t t |d}|tvr|||ddz||<Vd||||<bd||||<nd j|S#t $r}td|d|d}~wwxYw) zUn-escape any percent-escape sequences in a URI that are unreserved characters. This leaves all reserved, illegal and non-ASCII bytes encoded. %rrrz"Invalid percent-escape sequence: ''NrR) splitrangelenisalnumchrint ValueErrorr"UNRESERVED_SETrY)uripartsihces rHunquote_unreservedrs IIcNE 1c%j ! & !HQqM q6Q;199; SAr ON"uQx|+auQxj>a58*~E!H & 775> S #EaS!JKQRR SsB'' C0CCcpd}d} tt||S#t$rt||cYSwxYw)zRe-quote the given URI. This function passes the given URI through an unquote/quote cycle to ensure that it is fully and consistently quoted. z!#$%&'()*+,/:;=?@[]~|z!#$&'()*+,/:;=?@[]~|rX)rrr")rsafe_with_percentsafe_without_percents rH requote_urirsJ 01 5',3DEE 5S344 5s 55cd}t|D]E\}}|jj|jdzs7d}|r |d|||<n|s|j|d|yy)z*Update header line list by key value pair.F:T: N) enumeratelower startswithru) header_linesrxryreplacefoundidxlines rHupdate_header_liners E|, T ::< " "399;#4 5E'*e2eW$5 S!   se2eW-. rJcD |jdS#t$r|cYSwxYwNr)queue IndexErrorqdefaults rH peek_queuers)wwqz   cD |jdS#t$r|cYSwxYwr)_queuerrs rHpeek_aio_queuers)xx{ rcthd}||z }|D]}t||d||z }|D]}t||dy)N> r r~#+-3T)enableF)r))curl extension_idsdefault_enabled to_enable_idsext_idto_disable_idss rHtoggle_extensions_by_idsrsSDO!O3M4vd34 %}4N 5ve45rJc|jd\}}}}}tt|}|jtj |t jz|t jk(sJdg} |jdD]M} t| } tj| } | stdt| d| j| O|jtjdj| |j!dr!|dd }t#j$d t&d t)d |jdD} t+|| |s |jtj,|g}|jdD]'}t|}t.|}|j|)|jtj0dj|t|dk(sJdy)zu Detailed explanation: https://engineering.salesforce.com/tls-fingerprinting-with-ja3-and-ja3s-247362855967/ ,zOnly TLS v1.2 works for now.-zCipher z is not foundrz-21NzPadding(21) extension found in ja3 string, whether to add it should be managed by the SSL engine. The TLS client hello packet may contain or not contain this extension, any of which should be correct.r stacklevelc32K|]}t|ywN)r)rkrs rHrmz"set_ja3_options..s>1A>srz%Only curve_formats == 0 is supported.)rr&rsetoptr SSLVERSIONr MAX_DEFAULTTLSv1_2r$rtr!hexruSSL_CIPHER_LISTrYendswithwarningswarnrr[rTLS_EXTENSION_ORDERr% SSL_EC_CURVES)rja3permute tls_versionciphers extensionscurves curve_formatscurl_tls_version cipher_namescipher cipher_id cipher_namer curve_namescurvecurve_id curve_names rHset_ja3_optionsrs?Biin;K*fm&s;'78KK""$4~7Q7Q$QR ~55 5U7UU 5L--$)K )--i8 "WS^, (8(8(=>>MT=1  G//<Kc"'u:&x0 :&'  KK%%sxx '<= }  "K$KK "rJc|jd\}}}}|jdd}|jtjt j |jtj||jtjt||dk7r |jtj||jtj|jddy)z Detailed explanation: https://www.blackhat.com/docs/eu-17/materials/eu-17-Shuster-Passive-Fingerprinting-Of-HTTP2-Clients-wp.pdf |r;0rRN) rrrr HTTP_VERSIONrrDHTTP2_SETTINGSHTTP2_WINDOW_UPDATEr HTTP2_STREAMSHTTP2_PSEUDO_HEADERS_ORDER)rakamaisettings window_updatestreams header_orders rHset_akamai_optionsr#s6<\\#5F2HmWlS)HKK$$o&:&:;KK&&1KK++S-?@#~ G))73 KK22L4H4Hb4QRrJc|jr9|jtjdj |j|jtj |j tjz|jtjt|j|jtjt|j|jtj|j|jtj |j"|jtj$|j&|j(r*|jtj*|j(|j,r*|jtj.|j,|j0r+|jtj2|j0yy)Nr)tls_signature_algorithmsrrSSL_SIG_HASH_ALGSrYrtls_min_versionrr TLS_GREASEr tls_greaseSSL_PERMUTE_EXTENSIONStls_permute_extensionsSSL_CERT_COMPRESSIONtls_cert_compression STREAM_WEIGHThttp2_stream_weightSTREAM_EXCLUSIVEhttp2_stream_exclusivetls_delegated_credentialTLS_DELEGATED_CREDENTIALStls_record_size_limitTLS_RECORD_SIZE_LIMIThttp2_no_priorityHTTP2_NO_PRIORITY)rfps rH set_extra_fpr9sK "" G--sxx8S8S/TUKK""B$6$69S9S$STKK""C $67KK..B4M4M0NOKK,,b.E.EFKK%%r'='=>KK(("*C*CD "" G55r7R7RS  G1123K3KL  G--r/C/CDrJTzgzip, deflate, br, zstd)! params_listbase_urldatajson headers_list cookies_listfilesauthtimeoutallow_redirects max_redirects proxies_listproxy proxy_auth verify_listrefereraccept_encodingcontent_callback impersonaterrextra_fpdefault_headersr http_version interfacecertstreammax_recv_speed multipart queue_class event_class curl_optionsc! HIJ|}$|j}|dk(r!|$jtjdn3|dk7r.|$jtj|j |dk(r |$jtj d|\}%}&|%r t||%}|&r t||&}|r t||}|r t||}|dur t|}|$jtj|j t|tttfrt!|j }'net|t"r|j }'nDt|t$r|j'}'n#t|t(r|}'n|d}'n t+d|t-|d j }'|'s|d vrn|$jtj.|'|$jtj0t3|'|dk(r |$jtj||\}(})t|)t4r |)j6nd}*t5|(|* }+|+j9|)|+j;d },|,;t=|}-|,|-j>k(s|,|-j@k(r|+jCd dg}.|+jED]L\}/}0|0|.jG|/d|0dk(r|.jG|/d7|.jG|/d|0N| tI|.ddt|tr|dk7r tI|.ddt|t"t(fr tI|.ddtI|.ddd|$jtjJ|.D+cgc]}+|+j c}+tM|+|}1|$jtjNd|$jtjPd|\}2}3|2rD|2jS|1D]0}4|jtjP|4jU2|3rOtW|3}5|5jS|1D]0}4|jtjP|4jU2| r tYd| rt[t|xsij]D]8\}/}0| j_|/t|0t"r|0j n|0:|$jtj`| jb| ra| \}6}7|$jtjd|6j |$jtjf|7j | d} t| tr| \}8}9|8|9z}:|$jtjhtk|8dz|s.|$jtjltk|:dzn|$jtjnd|$jtjptsjt|:nt| tjtvfr|s-|$jtjltk| dzn|$jtjhtk| dz|$jtjnd|$jtjptsjt| |$jtjxtk| |$jtjz| |\};}<|r |}?|?dus|>sB|?@|$jtjd|$jtjdt|?t"r |$jtj|?|?d(vr0t|>t"r |$jtj|>|r.|$jtj|j |.|$jtj|j |rvt|t"r!|$jtj|nE|\}}@|$jtj||$jtj|@|r2t|}|$j||)}A|Adk7rtd*|d+|rEt|tr td2i|}|rtjd,td&t|$||ro|rtjd-td&d}Bt|tr|jrd}Bt|tr|j;d.rd}Bt|$|B/|r*|rtjd0td&t|$||r+t|}|$jtj|d}CdIdHdJ|r=|!I|"H|"JHIJfd1}D|$jtj|DnM|!|$jtj|n*t%}C|$jtj|Ct%}E|$jtj|E|r.|$jtj|j |$jtj||#r*|#j]D]\}F}G|$j|F|G|1CEIHJfScc}+w)3Nr2rr1r6)rbFrJz3data must be dict/list/tuple, str, BytesIO or bytes)rr) separators)r2r3r8)encodingHostrrRrrz Content-Typezapplication/jsonz!application/x-www-form-urlencodedzapplication/octet-streamExpectT)rALLzfiles is not supported, use `multipart`. See examples here: https://github.com/lexiforest/curl_cffi/blob/main/examples/upload.py)namer riz)Cannot specify both 'proxy' and 'proxies'allz://zall://httpszhttps://zMake sure you are using https over https proxy, otherwise, the proxy prefix should be 'http://' not 'https://', see: https://github.com/lexiforest/curl_cffi/issues/6rrsocks)NT)rzImpersonating z is not supportedzBExtra fingerprints was altered after impersonated version was set.z?JA3 fingerprint was altered after impersonated version was set.r)rzBAkamai fingerprint was altered after impersonated version was set.cjsjjrtSj|t |Sr)is_setr[r put_nowaitr)chunk header_recvedrquit_nows rHqputzset_curl_options..qputsA '')!!# ++ LL u: rJri)_upperrrr2 CUSTOMREQUESTencodeNOBODYr{rrerURLrprqrrtuplerstrrreadbytes TypeErrorr POSTFIELDS POSTFIELDSIZErr#r'updatertrr]rNpop multi_itemsrur HTTPHEADERr* COOKIEFILE COOKIELISTget_cookies_for_curlto_curl_formatr NotImplementedErrorrrsaddpartMIMEPOST_formUSERNAMEPASSWORDCONNECTTIMEOUT_MSr TIMEOUT_MSLOW_SPEED_LIMITLOW_SPEED_TIMEmathceilfloatFOLLOWLOCATION MAXREDIRSPROXY_CREDENTIAL_NO_REUSErrMPROXYrrrrHTTPPROXYTUNNEL PROXYUSERNAME PROXYPASSWORDSSL_VERIFYPEERSSL_VERIFYHOSTCAINFOREFERERACCEPT_ENCODINGSSLCERTSSLKEYr(rr!r'rrrrrIr WRITEFUNCTION WRITEDATA HEADERDATA INTERFACEMAX_RECV_SPEED_LARGE)KrmethodrOrrr r r r r rrrrrrrrrrrrrrrrrrrrrr r!r"r#r$r base_paramsr_body base_headersheadersr'r host_headerurkvreq base_cookiescookiesmorsel temp_cookiesusernamepasswordconnect_timeout read_timeout all_timeout base_proxiesproxiesr base_verifyverifyrxretrbufferr5 header_bufferoptionsettingr3rr4sK @@@rHrrKs N A \\^F q! 5 && 8  #&K[1 V,h$ #C59 E#HHW[[#**,'$tU+,%%' D# {{} D' "yy{ D%  MNN Tj188:  v11 ##T* &&D 2 U? HHW**F 3)L'#-gw#?wTH x0AHHW %%-K SM !(( "kQZZ&? EE&$ L -1 9   1#Q ( "W   1#Q (   1#Rs , - <9KL$&F"2 .*M $e %<9ST|Xr4@HHW  l!C!((*!CD #q& !CHHW  %HHW  '(L'"77< EF KK**F,A,A,C D Ew' "77< EF KK**F,A,A,C D E ! S  tzr*002 TDAq   1As9K188:QR  S T !!9??3 !( !!8??#45 !!8??#45'5!(/%% 4  **C$0F,GH HHW''[4-?)@ A HHW,,a 0 HHW++TYY{-C D Gc5\ * HHW''Wt^)< = HHW..GdN0C D HHW,,a 0 HHW++TYYw-? @HHW # #S%9:HHW   .)L' CDD %. 22A6 Xc]GKK gkk%>P$QR >> ||nC'78KK&(8 9:    HHW]]E *||w&##J/MMP(#$ ''0HHW44a8%/"(..0AB..0AB&K kfn ''+ ''+&# (*[#"> - '.."23" ((/*@*@*BC dC HHW__d +ID# HHW__d + HHW^^S ),[9 mmKmI !8"^K=@Q#RS S h %(484H  MMT  Q!  MMQ   h 1 2x7V7VG h %(,,7O*PG30  MMT  1f%-l;  %%|4 F AMH M# =  &&-  % &&(89 ""F+IMHHW  / ""I$4$4$67HHW ) )>:+113 &OFG HHVW % &  q- AAW"Ds+u+ )rGz*Union[CurlHttpVersion, HttpVersionLiteral]returnr)rOr<rrL)rR)rOr<rbr<)rOr<r_zUnion[dict, list, tuple]rr<)rr<rr<)F)rz list[str]rxr<ryr<rrLr)rz queue.Queue)rz asyncio.Queue)rr+)rr+rr<rrL)rr+rr<)rr+rr')Hrr+rj HttpMethodrOr<rz$list[Union[dict, list, tuple, None]]r Optional[str]r zAOptional[Union[dict[str, str], list[tuple], str, BytesIO, bytes]]r zOptional[dict | list]r zlist[Optional[HeaderTypes]]r zlist[Optional[CookieTypes]]r zOptional[dict]rOptional[tuple[str, str]]rz3Optional[Union[float, tuple[float, float], object]]rOptional[bool]rz Optional[int]rzlist[Optional[ProxySpec]]rrrrrzlist[Union[bool, str, None]]rrrrrzOptional[Callable]rz(Optional[Union[BrowserTypeLiteral, str]]rrrrrz/Optional[Union[ExtraFingerprints, ExtraFpDict]]rrLrzUnion[str, Literal[False]]rz4Optional[Union[CurlHttpVersion, HttpVersionLiteral]]rrrz%Optional[Union[str, tuple[str, str]]]rrr rr!zOptional[CurlMime]r"r r#r r$zOptional[dict[CurlOpt, str]])T __future__r__all__asynciorTrr collectionsriorr r typingr r r r rrrr urllib.parserrrrrrconstrrrrrrutilsrrur exceptionsr!r"rnr#rr$r%r&r'r(r)modelsr*r+r,r-r.r/sessionr0rrr[rZobjectr__annotations__rIrQrer{ frozensetrrrrrrrrrrrrirJrHrsQ" ? VVVTT<<1#4$$<"P VW ' ( h 7&; 4vM ,5,DI / /"% /.1 /<@ / 5"+L\S,E.9;"NR"&0202 &*CJ&*#%.0,002!%>+/<@ @D (*IM#26!$(15KoB oB oB oB 6 oB  oB LoB oB.oB.oB oB $oBAoB$oB!oB ,!oB" #oB$*%oB&.'oB()oB*#+oB,)-oB.:/oB0 1oB2 3oB4>5oB67oB8 &9oB:G;oB<=oB> 0?oB@ AoBBCoBD"EoBFGoBHIoBJ/KoBrJ