
    Xh_              "          U d dl mZ g dZd dlZ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 d dlmZmZmZmZmZmZmZmZ d dlmZmZmZmZmZmZ d	d
lmZmZm Z  d	dl!m"Z"m#Z# d	dl$m%Z% ddl&m'Z' ddl(m)Z)m*Z* ddl+m,Z, ddl-m.Z.m/Z/m0Z0m1Z1m2Z2m3Z3 ddl4m5Z5 er d	dl!m6Z6 ddl&m7Z7 ddl+m8Z8 ddl-m9Z9m:Z: ddl;m<Z< ed   Z=ed   Z> e?d      Z@ eA       ZBdeCd<   	 	 	 	 d1dZDd2dZEd3d4d ZFd5d!ZG eHd"      ZId6d#ZJd6d$ZK	 d7	 	 	 	 	 	 	 d8d%ZLd9d:d&ZMd9d;d'ZNd<d(ZOd7d=d)ZPd>d*ZQd?d+ZRg dddg g ddeBd,d-g ddg dd.dddddd,dddddd ddddd/!	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 d@d0ZSy)A    )annotations)HttpVersionLiteralset_curl_optionsnot_setN)Counter)BytesIO)dumps)TYPE_CHECKINGAnyCallableFinalLiteralOptionalUnioncast)ParseResult	parse_qslquote	urlencodeurljoinurlparse   )CurlHttpVersionCurlOptCurlSslVersion)CURL_WRITEFUNC_ERRORCurlMime)CurlCffiWarning   )Cookies)ImpersonateError
InvalidURL)Headers)TLS_CIPHER_NAME_MAPTLS_EC_CURVES_MAPTLS_VERSION_MAPExtraFingerprintsnormalize_browser_typetoggle_extension)Request)Curl)CookieTypes)HeaderTypes)BrowserTypeLiteralExtraFpDict)	ProxySpec)	GETPOSTPUTDELETEOPTIONSHEADTRACEPATCHQUERY)v1v2v2tlsv2_prior_knowledgev3v3onlyz!#$%&'()*+,/:;=?@[]~z
Final[Any]r   c                   | dk(  rt         j                  S | dk(  rt         j                  S | dk(  rt         j                  S | dk(  rt         j                  S | dk(  rt         j
                  S | dk(  rt         j                  S | S )Nr:   r>   r?   r;   r<   r=   )r   V1_1V3V3ONLYV2_0V2TLSV2_PRIOR_KNOWLEDGE)versions    P/home/Script/Script_env/lib/python3.12/site-packages/curl_cffi/requests/utils.pynormalize_http_versionrI   3   s     $###	D!!!	H	%%%	D###	G	$$$	(	(111N    c                ^    t        |       }t        |j                  xr |j                        S )z,Check if the provided url is an absolute url)r   boolschemehostname)url
parsed_urls     rH   is_absolute_urlrQ   F   s'    #J
!!9j&9&9::rJ    c                Z   dj                  t        t        |      z
        }t        |       }t	        |j
                  d      }t        |d|      }t        |j                  |j                  t        |j                  |      |j                  ||j                        j                         S )NrR   Tkeep_blank_values)doseqsaferW   )join
SAFE_CHARSsetr   r   queryr   r   rM   netlocr   pathparamsfragmentgeturl)rO   	quote_strrW   rP   parsed_get_argsencoded_get_argss         rH   quote_path_and_paramsre   L   s    77:I./D#J
 0 0DIO 4HjooD) fhrJ   c                   t        |       }t        |j                  d      }t        d |D              }t	        |t
              rt        |j                               }t        d |D              }|D ]}  \  }}t	        |t        t
        f      rt        |      }|j                  |      dk(  r0|j                  |      dk(  r|D cg c]  }|d   |k7  r|n||f }}k|j                  ||f        t        |d      }	t        |j                  |j                  |j                   |j"                  |	|j$                        j'                         }
|
S c c}w )a  Add 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'
    TrT   c              3  &   K   | ]	  }|d      ywr   N .0xs     rH   	<genexpr>z$update_url_params.<locals>.<genexpr>q   s     =qt=   c              3  &   K   | ]	  }|d      ywrh   ri   rj   s     rH   rm   z$update_url_params.<locals>.<genexpr>t   s     4qt4rn   r   r   )rV   )r   r   r\   r   
isinstancedictlistitemsrL   r	   getappendr   r   rM   r]   r^   r_   r`   ra   )rO   r_   rP   rc   old_args_counternew_args_counterkeyvaluerl   rd   new_urls              rH   update_url_paramsr{   [   sQ     #J  
 0 0DIO =_==&$flln%4V44 
1
UedD\*%LE$).>.B.B3.G1.L>M9:adckU|3O  ""C<0
1 !=  fh  N)s   EzBABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-._~c                   | j                  d      }t        dt        |            D ]l  }||   dd }t        |      dk(  rI|j                         r9	 t	        t        |d            }|t        v r|||   dd z   ||<   Vd||    ||<   bd||    ||<   n d	j                  |      S # t        $ r}t        d| d      |d}~ww xY w)
zUn-escape any percent-escape sequences in a URI that are unreserved
    characters. This leaves all reserved, illegal and non-ASCII bytes encoded.
    %r   r   r      z"Invalid percent-escape sequence: ''NrR   )
splitrangelenisalnumchrint
ValueErrorr"   UNRESERVED_SETrY   )uripartsihces         rH   unquote_unreservedr      s     IIcNE1c%j! &!HQqMq6Q;199;SAr
O N"uQx|+auQxj>a58*~E!H& 775>  S #EaS!JKQRRSs   B''	C0C  Cc                p    d}d}	 t        t        |       |      S # t        $ r t        | |      cY S w xY w)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   )r   r   r"   )r   safe_with_percentsafe_without_percents      rH   requote_urir      sJ     01	5 ',3DEE 5 S344	5s    55c                    d}t        |       D ]E  \  }}|j                         j                  |j                         dz         s7d}|r
| d| | |<    n |s| j                  | d|        yy)z*Update header line list by key value pair.F:T: N)	enumeratelower
startswithru   )header_linesrx   ry   replacefoundidxlines          rH   update_header_liner      s     E|, 	T::<""399;#45E'*e2eW$5S! se2eW-. rJ   c                D    	 | j                   d   S # t        $ r |cY S w xY wNr   )queue
IndexErrorqdefaults     rH   
peek_queuer      s)    wwqz     c                D    	 | j                   d   S # t        $ r |cY S w xY wr   )_queuer   r   s     rH   peek_aio_queuer      s)    xx{ r   c                t    h d}||z
  }|D ]  }t        | |d        ||z
  }|D ]  }t        | |d        y )N>     r   
         r~      #   +   -   3   T)enableF)r)   )curlextension_idsdefault_enabledto_enable_idsext_idto_disable_idss         rH   toggle_extensions_by_idsr      sS    DO!O3M 4vd34
 %}4N  5ve45rJ   c                h   |j                  d      \  }}}}}t        t        |         }| j                  t        j
                  |t        j                  z         |t        j                  k(  sJ d       g }	|j                  d      D ]M  }
t        |
      }t        j                  |      }|st        dt        |       d      |	j                  |       O | j                  t        j                  dj                  |	             |	dd g d	k(  r | j                  t        j                   d
       |j#                  d      r!|dd }t%        j&                  dt(        d
       t+        d |j                  d      D              }t-        | |       |s | j                  t        j.                  |       g }|j                  d      D ]'  }t        |      }t0        |   }|j                  |       ) | j                  t        j2                  dj                  |             t        |      dk(  sJ d       y)zu
    Detailed explanation: https://engineering.salesforce.com/tls-fingerprinting-with-ja3-and-ja3s-247362855967/
    ,zOnly TLS v1.2 works for now.-zCipher z is not foundr   N   )TLS_AES_128_GCM_SHA256TLS_CHACHA20_POLY1305_SHA256TLS_AES_256_GCM_SHA384r   z-21zPadding(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.
stacklevelc              3  2   K   | ]  }t        |        y wN)r   )rk   r   s     rH   rm   z"set_ja3_options.<locals>.<genexpr>  s     >1A>s   r   z%Only curve_formats == 0 is supported.)r   r&   r   setoptr   
SSLVERSIONr   MAX_DEFAULTTLSv1_2r$   rt   r!   hexru   SSL_CIPHER_LISTrY   TLS_USE_FIREFOX_TLS13_CIPHERSendswithwarningswarnr   r[   r   TLS_EXTENSION_ORDERr%   SSL_EC_CURVES)r   ja3permutetls_versionciphers
extensionscurvescurve_formatscurl_tls_versioncipher_namescipher	cipher_idcipher_namer   curve_namescurvecurve_id
curve_names                     rH   set_ja3_optionsr      s    ?Biin;K*fm&s;'78KK""$4~7Q7Q$QR~555U7UU5L--$ )K	)--i8"WS^,<M#JKKK() 	KK'',)?@BQ  
 	G991=5!_
M 	
 >
(8(8(=>>MT=1G//<Kc" 'u:&x0
:&'
 	KK%%sxx'<=}"K$KK"rJ   c                   |j                  d      \  }}}}|j                  dd      }| j                  t        j                  t
        j                         | j                  t        j                  |       | j                  t        j                  t        |             |dk7  r | j                  t        j                  |       | j                  t        j                  |j                  dd             y)z
    Detailed explanation: https://www.blackhat.com/docs/eu-17/materials/eu-17-Shuster-Passive-Fingerprinting-Of-HTTP2-Clients-wp.pdf
    |r   ;0rR   N)r   r   r   r   HTTP_VERSIONr   rD   HTTP2_SETTINGSHTTP2_WINDOW_UPDATEr   HTTP2_STREAMSHTTP2_PSEUDO_HEADERS_ORDER)r   akamaisettingswindow_updatestreamsheader_orders         rH   set_akamai_optionsr   )  s     6<\\#5F2HmWl S)HKK$$o&:&:;KK&&1KK++S-?@#~G))73 	KK22L4H4Hb4QRrJ   c                   |j                   r9| j                  t        j                  dj	                  |j                                | j                  t        j
                  |j                  t        j                  z         | j                  t        j                  t        |j                               | j                  t        j                  t        |j                               | j                  t        j                  |j                         | j                  t        j                   |j"                         | j                  t        j$                  |j&                         |j(                  r*| j                  t        j*                  |j(                         |j,                  r+| j                  t        j.                  |j,                         y y )Nr   )tls_signature_algorithmsr   r   SSL_SIG_HASH_ALGSrY   r   tls_min_versionr   r   
TLS_GREASEr   
tls_greaseSSL_PERMUTE_EXTENSIONStls_permute_extensionsSSL_CERT_COMPRESSIONtls_cert_compressionSTREAM_WEIGHThttp2_stream_weightSTREAM_EXCLUSIVEhttp2_stream_exclusivetls_delegated_credentialTLS_DELEGATED_CREDENTIALStls_record_size_limitTLS_RECORD_SIZE_LIMIT)r   fps     rH   set_extra_fpr  ?  s(   	""G--sxx8S8S/TUKK""B$6$69S9S$STKK""C$67KK..B4M4M0NOKK,,b.E.EFKK%%r'='=>KK(("*C*CD	""G55r7R7RS	G1123K3KL  rJ   T   zgzip, deflate, br, zstd)!params_listbase_urldatajsonheaders_listcookies_listfilesauthtimeoutallow_redirectsmax_redirectsproxies_listproxy
proxy_authverify_listrefereraccept_encodingcontent_callbackimpersonater   r   extra_fpdefault_headersr   http_version	interfacecertstreammax_recv_speed	multipartqueue_classevent_classcurl_optionsc       !   	       HIJ | }$|j                         }|dk(  r!|$j                  t        j                  d       n3|dk7  r.|$j                  t        j                  |j                                |dk(  r |$j                  t        j                  d       |\  }%}&|%rt        ||%      }|&rt        ||&      }|rt        ||      }|rt        ||      }|durt        |      }|$j                  t        j                  |j                                t        |t        t        t        f      rt!        |      j                         }'net        |t"              r|j                         }'nDt        |t$              r|j'                         }'n#t        |t(              r|}'n|d}'nt+        d      |t-        |d	
      j                         }'|'s|dv rn|$j                  t        j.                  |'       |$j                  t        j0                  t3        |'             |dk(  r |$j                  t        j                  |       |\  }(})t        |)t4              r|)j6                  nd }*t5        |(|*      }+|+j9                  |)       |+j;                  d      },|,;t=        |      }-|,|-j>                  k(  s|,|-j@                  k(  r|+jC                  dd        g }.|+jE                         D ]L  \  }/}0|0|.jG                  |/ d       |0dk(  r|.jG                  |/ d       7|.jG                  |/ d|0        N |tI        |.dd       t        |t              r|dk7  rtI        |.dd       t        |t"        t(        f      rtI        |.dd       tI        |.ddd       |$j                  t        jJ                  |.D +cg c]  }+|+j                          c}+       tM        |+|      }1|$j                  t        jN                  d       |$j                  t        jP                  d       |\  }2}3|2rD|2jS                  |1      D ]0  }4| j                  t        jP                  |4jU                                2 |3rOtW        |3      }5|5jS                  |1      D ]0  }4| j                  t        jP                  |4jU                                2 |	rtY        d      | rt[        t        |xs i       j]                         D ]8  \  }/}0| j_                  |/t        |0t"              r|0j                         n|0       : |$j                  t        j`                  | jb                         |
ra|
\  }6}7|$j                  t        jd                  |6j                                |$j                  t        jf                  |7j                                |d}t        |t              r|\  }8}9|8|9z   }:|$j                  t        jh                  tk        |8dz               |s.|$j                  t        jl                  tk        |:dz               n|$j                  t        jn                  d       |$j                  t        jp                  ts        jt                  |:             nt        |tj        tv        f      r|s-|$j                  t        jl                  tk        |dz               n|$j                  t        jh                  tk        |dz               |$j                  t        jn                  d       |$j                  t        jp                  ts        jt                  |             |$j                  t        jx                  tk        |             |$j                  t        jz                  |       |\  };}<|r|<rt+        d      |rd|i}<|<|;}<|<rt=        |      }=t[        t|        t"           |<j;                  |=j~                  |<j;                  d                  }|=j@                  rK|<j;                  |=j~                   d |=j@                   |<j;                  d!|=j@                               xs |}||$j                  t        j                  |       |=j~                  d"k(  r^|j                  d#      rt        j                  d$t        d%&       |j                  d'      s |$j                  t        j                  d       |ra|\  }6}7|$j                  t        j                  |6j                                |$j                  t        j                  |7j                                |\  }>}?|?du s|>sB|?@|$j                  t        j                  d       |$j                  t        j                  d       t        |?t"              r |$j                  t        j                  |?       |?d(v r0t        |>t"              r |$j                  t        j                  |>       |r.|$j                  t        j                  |j                                |.|$j                  t        j                  |j                                |rvt        |t"              r!|$j                  t        j                  |       nE|\  }}@|$j                  t        j                  |       |$j                  t        j                  |@       |r2t        |      }|$j                  ||)      }A|Adk7  rt        d*| d+      |rEt        |t              rt        d2i |}|rt        j                  d,t        d&       t        |$|       |ro|rt        j                  d-t        d&       d}Bt        |t              r|j                  rd}Bt        |t              r|j;                  d.      rd}Bt        |$|B/       |r*|rt        j                  d0t        d&       t        |$|       |r+t        |      }|$j                  t        j                  |       d }Cd Id Hd J|r= |!       I |"       H |"       JHIJfd1}D|$j                  t        j                  |D       nM|!|$j                  t        j                  |       n*t%               }C|$j                  t        j                  |C       t%               }E|$j                  t        j                  |E       |r.|$j                  t        j                  |j                                |$j                  t        j                  |       |#r*|#j]                         D ]  \  }F}G|$j                  |F|G        |1CEIHJfS c c}+w )3Nr2   r   r1   r6   )rb   FrJ   z3data must be dict/list/tuple, str, BytesIO or bytes)r   r   )
separators)r2   r3   r8   )encodingHostr   rR   r   r   zContent-Typezapplication/jsonz!application/x-www-form-urlencodedzapplication/octet-streamExpectT)r   ALLzfiles is not supported, use `multipart`. See examples here: https://github.com/lexiforest/curl_cffi/blob/main/examples/upload.py)namer  r   i  z)Cannot specify both 'proxy' and 'proxies'allz://zall://httpszhttps://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/6r   r   socks)NT)r  zImpersonating z is not supportedzJExtra fingerprints was altered after impersonated browser version was set.zGJA3 fingerprint was altered after impersonated browser version was set.r   )r   zJAkamai fingerprint was altered after impersonated browser version was set.c                    j                         sj                          j                         rt        S j                  |        t	        |       S r   )is_setr[   r   
put_nowaitr   )chunkheader_recvedr   quit_nows    rH   qputzset_curl_options.<locals>.qput  sA     '')!!# ++LLu:rJ   ri   )^upperr   r   r2   CUSTOMREQUESTencodeNOBODYr{   r   re   r   URLrp   rq   rr   tupler   strr   readbytes	TypeErrorr	   
POSTFIELDSPOSTFIELDSIZEr   r#   r*  updatert   r   r]   rN   popmulti_itemsru   r   
HTTPHEADERr*   
COOKIEFILE
COOKIELISTget_cookies_for_curlto_curl_formatr    NotImplementedErrorr   rs   addpartMIMEPOST_formUSERNAMEPASSWORDCONNECTTIMEOUT_MSr   
TIMEOUT_MSLOW_SPEED_LIMITLOW_SPEED_TIMEmathceilfloatFOLLOWLOCATION	MAXREDIRSr   rM   PROXYr   r   r   r   HTTPPROXYTUNNELPROXYUSERNAMEPROXYPASSWORDSSL_VERIFYPEERSSL_VERIFYHOSTCAINFOREFERERACCEPT_ENCODINGSSLCERTSSLKEYr(   r  r!   r'   r  r   r   r   rI   r   WRITEFUNCTION	WRITEDATA
HEADERDATA	INTERFACEMAX_RECV_SPEED_LARGE)Kr   methodrO   r
  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r   r   r  r  r   r  r   r!  r"  r#  r$  r%  r&  r'  r   base_paramsr_   bodybase_headersheadersr*  r   host_headerur   kvreqbase_cookiescookiesmorseltemp_cookiesusernamepasswordconnect_timeoutread_timeoutall_timeoutbase_proxiesproxiesr   base_verifyverifyrx   retr   bufferr8  header_bufferoptionsettingr6  r   r7  sK                                                                           @@@rH   r   r   O  s
   N 	A\\^F 	q!	5	&&8	# &K[1V,h$#C59E#HHW[[#**,' $tU+,%%'	D#	{{}	D'	"yy{	D%	 	MNNTj188: v11	##T*	&&D	2U?HHW**F3 )L'#-gw#?wTHx0AHHW
 %%-KSM!(("kQZZ&?EE&$ L -191#Q("W1#Q(1#Rs,- <9KL$&F"2.*M	
 $e%<9ST |Xr4@HHWl!C!((*!CD
#q&
!C HHW%HHW'(L'"77< 	EFKK**F,A,A,CD	Ew'"77< 	EFKK**F,A,A,CD	E !S
 	
 tzr*002 	TDAq1As9K188:QRS	T	!!9??3 !(	!!8??#45	!!8??#45 '5!(/%%4	**C$0F,GH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'CDD%.Xc]GKKgkk%>P$QR>>||nC'78KK&(8 9:    HHW]]E*||w&##J/MMP (#$ ''0HHW44a8 %/"(..0AB..0AB &Kkfn	''+	''+ &#	( *[#">	- 	'.."23 "	((/*@*@*BC dC HHW__d+ID#HHW__d+HHW^^S) ,[9mmKmI!8"^K=@Q#RSS h%(484HMM\
 	Q! MMY
 h 12x7V7VGh%(,,7O*PG30 MM\
 	1f% -l;	%%|4FAMHM#=	 	
&&-		%	&&(89	""F+IMHHW/ 	""I$4$4$67 HHW))>: +113 	&OFGHHVW%	& q-AAK "Ds   +u
)rG   z*Union[CurlHttpVersion, HttpVersionLiteral]returnr   )rO   r?  r  rL   )rR   )rO   r?  rb   r?  )rO   r?  r_   zUnion[dict, list, tuple]r  r?  )r   r?  r  r?  )F)r   z	list[str]rx   r?  ry   r?  r   rL   r   )r   zqueue.Queue)r   zasyncio.Queue)r   r+   )r   r+   r   r?  r   rL   )r   r+   r   r?  )r   r+   r  r'   )Hr   r+   rl  
HttpMethodrO   r?  r
  z$list[Union[dict, list, tuple, None]]r  Optional[str]r  zAOptional[Union[dict[str, str], list[tuple], str, BytesIO, bytes]]r  zOptional[dict | list]r  zlist[Optional[HeaderTypes]]r  zlist[Optional[CookieTypes]]r  zOptional[dict]r  Optional[tuple[str, str]]r  z3Optional[Union[float, tuple[float, float], object]]r  Optional[bool]r  zOptional[int]r  zlist[Optional[ProxySpec]]r  r  r  r  r  zlist[Union[bool, str, None]]r  r  r  r  r  zOptional[Callable]r  z(Optional[Union[BrowserTypeLiteral, str]]r   r  r   r  r  z/Optional[Union[ExtraFingerprints, ExtraFpDict]]r  rL   r   zUnion[str, Literal[False]]r  z4Optional[Union[CurlHttpVersion, HttpVersionLiteral]]r   r  r!  z%Optional[Union[str, tuple[str, str]]]r"  r  r#  r   r$  zOptional[CurlMime]r%  r   r&  r   r'  zOptional[dict[CurlOpt, str]])T
__future__r   __all__asynciorW  r   r   collectionsr   ior   r  r	   typingr
   r   r   r   r   r   r   r   urllib.parser   r   r   r   r   r   constr   r   r   r   r   r   utilsr   rw  r    
exceptionsr!   r"   rp  r#   r  r$   r%   r&   r'   r(   r)   modelsr*   r+   r,   r-   r.   r/   sessionr0   r  r   r[   rZ   objectr   __annotations__rI   rQ   re   r{   	frozensetr   r   r   r   r   r   r   r   r   r  r   ri   rJ   rH   <module>r     sQ   "
?        V V V T T < < 1 #  4   $$<" P
 VW '(
h 7&;4v M
,5, DI//"%/.1/<@/5"2LjS,M* 9;"NR"&0202 &*CJ&*#%.0,002!%>+/<@ @D (*IM#26!$(15KiB
iBiB 
iB
 6iB iB LiB  iB .iB .iB iB $iB AiB $iB !iB  ,!iB" #iB$ *%iB& .'iB( )iB* #+iB, )-iB. :/iB0 
1iB2 3iB4 >5iB6 7iB8 &9iB: G;iB< =iB> 0?iB@ AiBB CiBD "EiBF GiBH IiBJ /KiBrJ   