
    iW                       S SK Jr  S SKrS SKrS SKrS SKr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  S SKJr  S SKJrJrJrJrJrJrJrJr  S SKJr  S S	KJ r   S
SK!J"r"  S
SK#J$r$J%r%J&r&  S
SK'J(r(J)r)J*r*  S
SK+J,r,  SSK-J.r.J/r/J0r0  SSK1J2r2J3r3J4r4  SSK5J6r6J7r7  SSK8J9r9J:r:J;r;  SSK<J=r=J>r>  SSK+J?r?J@r@JArA  SSKBJCrCJDrDJErE  \R                  S:  a	  \" S\>\>S9rGO\" S\>S9rG\(       a3  S SKHJIrI   " S S\SS9rJ " S  S!\\G   \SS9rK " S" S#\SS9rL " S$ S%\LSS9rMO " S& S'5      rN\N" 5       rI\O\P\P4   rJ\rK\\srLrM\S(   rQ\S)   rRS3S* jrSS4S5S+ jjrTS4S6S, jjrU " S- S.\\G   5      rV " S/ S0\V\G   5      rW " S1 S2\V\G   5      rXg)7    )annotationsN)ThreadPoolExecutor)asynccontextmanagercontextmanagersuppress)Callable)BytesIO)TYPE_CHECKINGGenericLiteralOptional	TypedDictTypeVarUnioncast)urlparse)	timedelta   )	AsyncCurl)CurlHttpVersionCurlInfoCurlOpt)Curl	CurlErrorCurlMime)CurlCffiWarning   )CookiesCookieTypes
CurlMorsel)RequestExceptionSessionClosed
code2error)HeadersHeaderTypes)BrowserTypeLiteralExtraFingerprintsExtraFpDict)
STREAM_ENDResponse)HttpVersionLiteralnot_setset_curl_options)AsyncWebSocket	WebSocketWebSocketError)      R)bounddefault)r4   )Unpackc                  H    \ rS rSr% S\S'   S\S'   S\S'   S\S'   S\S'   Srg	)
	ProxySpec0   strallhttphttpswswss N__name__
__module____qualname____firstlineno____annotations____static_attributes__r@       G/app/mltbenv/lib/python3.13/site-packages/curl_cffi/requests/session.pyr8   r8   0   s    	
rH   r8   F)totalc                  .   \ rS rSr% S\S'   S\S'   S\S'   S\S	'   S
\S'   S\S'   S
\S'   S\S'   S\S'   S\S'   S\S'   S\S'   S\S'   S\S'   S
\S'   S
\S'   S\S'   S\S'   S\S '   S\S!'   S"\S#'   S$\S%'   S\S&'   S
\S''   S(\S)'   S*\S+'   S\S,'   S\S-'   S.rg/)0BaseSessionParams7   Optional[HeaderTypes]headersOptional[CookieTypes]cookiesOptional[tuple[str, str]]authOptional[ProxySpec]proxiesOptional[str]proxy
proxy_authbase_urlOptional[dict]paramsboolverify!Union[float, tuple[float, float]]timeout	trust_envallow_redirectsintmax_redirectsOptional[BrowserTypeLiteral]impersonateja3akamai/Optional[Union[ExtraFingerprints, ExtraFpDict]]extra_fpdefault_headers"Union[str, Callable[[bytes], str]]default_encodingcurl_optionsOptional[list]
curl_infos4Optional[Union[CurlHttpVersion, HttpVersionLiteral]]http_versiondebug	interface%Optional[Union[str, tuple[str, str]]]certOptional[type[R]]response_classdiscard_cookiesraise_for_statusr@   NrA   r@   rH   rI   rL   rL   7   s    &&&&''$$--2211AA<<$$""JJ  33))rH   rL   c                  B   \ rS rSr% S\S'   S\S'   S\S'   S\S	'   S
\S'   S\S'   S\S'   S\S'   S\S'   S\S'   S\S'   S\S'   S\S'   S\S'   S\S'   S\S'   S\S'   S \S!'   S\S"'   S\S#'   S$\S%'   S\S&'   S'\S('   S)\S*'   S+\S,'   S\S-'   S.\S/'   S0\S1'   S2\S3'   S4\S5'   S6rg7)8StreamRequestParamsU   "Optional[Union[dict, list, tuple]]r[   AOptional[Union[dict[str, str], list[tuple], str, BytesIO, bytes]]dataOptional[dict | list]jsonrN   rO   rP   rQ   rZ   filesrR   rS   3Optional[Union[float, tuple[float, float], object]]r_   Optional[bool]ra   Optional[int]rc   rT   rU   rV   rW   rX   r]   refereraccept_encodingOptional[Callable]content_callbackrd   re   rf   rg   rh   ri   rj   rk   rl   Union[str, Literal[False]]quoterp   rq   rs   rt   ru   rb   max_recv_speedOptional[CurlMime]	multipartr\   rx   r@   NrA   r@   rH   rI   r{   r{   U   s    22OO##&&&&''DD''$$$$--&&,,11AA''<<))JJ  33%%rH   r{   c                       \ rS rSr% S\S'   Srg)RequestParamsu   r   streamr@   NrA   r@   rH   rI   r   r   u   s    rH   r   c                  $    \ rS rSr\S 5       rSrg)_Unpackz   c                     g Nr@   )argskwargss     rI   __getitem___Unpack.__getitem__{   s    rH   r@   N)rB   rC   rD   rE   staticmethodr   rG   r@   rH   rI   r   r   z   s    		 
	rH   r   )eventletgevent)	GETPOSTPUTDELETEOPTIONSHEADTRACEPATCHQUERYc                h    [        U 5      n[        UR                  =(       a    UR                  5      $ )z,Check if the provided url is an absolute url)r   r\   schemehostname)url
parsed_urls     rI   _is_absolute_urlr      s'    #J
!!9j&9&9::rH   c                F     U R                   S   $ ! [         a    Us $ f = fNr   )queue
IndexErrorqr5   s     rI   _peek_queuer      s)    wwqz       c                F     U R                   S   $ ! [         a    Us $ f = fr   )_queuer   r   s     rI   _peek_aio_queuer      s)    xx{ r   c                     \ rS rSrSrSSSSSSSSSSSSSSSSSSSSSSSSSSSSS.                                                       SS	 jjr  SS
 jrS r\SS j5       r	\	R                  SS j5       r	Srg)BaseSession   zMProvide common methods for setting curl options and reading info in sessions.NT   utf-8F)rO   rQ   rS   rU   rW   rX   rY   r[   r]   r_   r`   ra   rc   re   rf   rg   ri   rj   rl   rm   ro   rq   rr   rs   ru   rw   rx   ry   c                  [        U5      U l        [        U5      U l        X0l        Xpl        Xl        Xl        Xl        Xl	        Xl
        Xl        Xl        Xl        UU l        UU l        UU l        UU l        U=(       d    0 U l        U=(       d    / U l        UU l        UU l        UU l        UU l        Ub"  [1        U[2        5      SL a  [5        SU S35      eU=(       d    [2        U l        UU l        UU l        U(       a  U(       a  [5        S5      eU(       a  SU0nU=(       d    0 U l        X`l        U R
                  (       a%  [A        U R
                  5      (       d  [C        S5      eSU l"        U R                  SL d  U R                  c^  [F        RH                  RK                  S5      =(       d2    [F        RH                  RK                  S	5      =(       d    U R                  U l        g g )
NFzZ`response_class` must be a subclass of `curl_cffi.requests.models.Response`, not of type ``z)Cannot specify both 'proxy' and 'proxies'r;   z2You need to provide an absolute url for 'base_url'TREQUESTS_CA_BUNDLECURL_CA_BUNDLE)&r$   rO   r   _cookiesrS   rY   r[   r]   r_   r`   ra   rc   re   rf   rg   ri   rj   rl   rm   ro   rq   rr   rs   ru   
issubclassr*   	TypeErrorrw   rx   ry   rU   rX   r   
ValueError_closedosenvironget)selfrO   rQ   rS   rU   rW   rX   rY   r[   r]   r_   r`   ra   rc   re   rf   rg   ri   rj   rl   rm   ro   rq   rr   rs   ru   rw   rx   ry   s                                rI   __init__BaseSession.__init__   s   @ w'(	 ".*& . 0(.B$*(
"	%*^X*NRW*W  ./q2 
 -8. 0WGHHenG")-R$==!1$--!@!@QRR ;;$$++"5

34 ::>>"23;; K #6rH   c                H   Un[        [        U R                  U5      5      n[        [        UR	                  [
        R                  5      5      R                  5       Ul        U(       a  UR                  5       Ul
        [        [        UR	                  [
        R                  5      5      Ul        [        [        UR	                  [
        R                  5      5      Ul        SUR                  s=:*  =(       a    S:  Os  Ul        UR                  5       R#                  5       n/ n	U H  n
U
R%                  5       (       d  M  U
R'                  S5      (       a(  UR)                  U
5      R                  5       Ul        / n	MX  U
R'                  S5      (       d  U
R'                  S5      (       a  U	S==   U
-  ss'   M  U	R-                  U
5        M     [/        U	5      Ul        [3        5       Ul        UR0                  R7                  S5      nU H  n [8        R4                  R;                  5       nUR=                  U5        UR?                  5        Hd  u  pUR4                  RA                  UURB                  URE                  SS	5      URE                  S
S5      [G        URE                  S5      5      S9  Mf     M     U=(       d    U RJ                  nU(       d^  UR	                  [
        RL                  5       Vs/ s H  n[N        RP                  " U5      PM     nnU RR                  RU                  U5        [        [        WR	                  [
        RV                  5      5      R                  5       Ul,        [        [        UR	                  [
        RZ                  5      5      Ul.        [        [        UR	                  [
        R^                  5      5      R                  5       Ul0        [        [        UR	                  [
        Rb                  5      5      Ul2        XGl3        [i        [        [j        UR	                  [
        Rl                  5      5      S9Ul7        [        [        UR	                  [
        Rp                  5      5      Ul9        [        [        UR	                  [
        Rt                  5      5      n UR                  5       Ul;        [        [        UR	                  [
        Rz                  5      5      Ul>        [        [        UR	                  [
        R~                  5      5      Ul@        [        [        UR	                  [
        R                  5      5      UlB        [        [        UR	                  [
        R                  5      5      UlD        UR|                  UR                  -   UlE        U R                   H!  nUR	                  U5      UR                  U'   M#     U$ ! [H         a     GM  f = fs  snf ! [x         a    UR                  S5      Ul;         GNSf = f)N   i  s   HTTP/       	z
set-cookiedomain path/secure)r   r   r   )secondszlatin-1)Hr   r3   rw   bytesgetinfor   EFFECTIVE_URLdecoder   getvaluecontentrb   HTTP_VERSIONrq   RESPONSE_CODEstatus_codeok
splitlinesstrip
startswithget_reason_phrasereasonappendr$   rO   r   rQ   get_listr<   SimpleCookieloaditemssetvaluer   r\   	Exceptionrx   
COOKIELISTr    from_curl_formatr   update_cookies_from_curl
PRIMARY_IP
primary_ipPRIMARY_PORTprimary_portLOCAL_IPlocal_ip
LOCAL_PORT
local_portrl   r   float
TOTAL_TIMEelapsedREDIRECT_COUNTredirect_countREDIRECT_URLredirect_urlUnicodeDecodeErrorSIZE_DOWNLOAD_Tdownload_sizeSIZE_UPLOAD_Tupload_sizeHEADER_SIZEheader_sizeREQUEST_SIZErequest_sizeresponse_sizero   infos)r   curlbufferheader_bufferrl   rx   crspheader_linesheader_listheader_lineset_cookie_headers
set_cookiecookienamemorselmorselsredirect_url_bytesinfos                      rI   _parse_responseBaseSession._parse_response   sk    1d))!,-uaii(>(>?@GGI //+CKQYYx/D/D%EFsAIIh.D.D$EF--#-$--/::< $&'K$$&&%%h//00=DDF
 %%d++{/E/Ee/L/LB;.{+ ( k* i [[11,?,J224J'$*LLNLDKKOO%zz(B7#ZZ4#FJJx$89 $  %3	 -  *AT-A-A89		(BUBU8V8V1
++A.8V   MM227;eQYYx/B/B%CDKKMQYYx/D/D%EFE199X->->#?@GGIc199X-@-@#AB/UAIIh>Q>Q4R(ST!#qyy1H1H'IJ!%83H3H)IJ	D188:C !aii0H0H&IJsAIIh.D.D$EFsAIIh.B.B$CDQYYx/D/D%EF--? OODiioCIIdO $ 
E   " 	D188CC	Ds+   B'W&8 W88W= &
W54W5= X! X!c                <    U R                   (       a  [        S5      eg )Nz'Session is closed, cannot send request.)r   r"   r   s    rI   _check_session_closed!BaseSession._check_session_closedH  s    << IJJ rH   c                    U R                   $ r   )r   r  s    rI   rQ   BaseSession.cookiesL  s    }}rH   c                $    [        U5      U l        g r   )r   r   )r   rQ   s     rI   rQ   r#  P  s      (rH   )r   r   rg   ra   rS   rY   ru   ro   rm   rr   rl   rj   rx   ri   rO   rq   re   rs   rf   rc   r[   rU   rX   ry   rw   r_   r`   r]   )8rO   rN   rQ   rP   rS   rR   rU   rT   rW   rV   rX   rR   rY   rV   r[   rZ   r]   r\   r_   r^   r`   r\   ra   r\   rc   rb   re   rd   rf   rV   rg   rV   ri   rh   rj   r\   rl   rk   rm   rZ   ro   rn   rq   rp   rr   r\   rs   rV   ru   rt   rw   rv   rx   r\   ry   r\   )returnr3   )r%  r   )rQ   r   r%  None)rB   rC   rD   rE   __doc__r   r  r   propertyrQ   setterrG   r@   rH   rI   r   r      s   W
 *.)-*.'+#04"&!%57 $48! $DH $?F'+%)MQ#'6:,0 %!&=S 'S '	S
 (S %S S .S  S S S 3S S S S  2!S" #S$ %S& B'S( )S* =+S, %-S. #/S0 K1S2 3S4 !5S6 47S8 *9S: ;S< =SjO	
ObK   ^^) )rH   r   c                    ^  \ rS rSrSr   S       SU 4S jjjr\S 5       r\S 5       rS r	S r
SS	 jr\      S S
 j5       r S! S"S jjrS#S jrSSSSSSS\SSSSSSSSSSSSSSSSSSSSSSS4                                                                 S$S jjrS%S jrS%S jrS%S jrS%S jrS%S jrS%S jrS%S jrS%S jrS%S jrSrU =r$ )&SessioniV  zA request session, cookies and connections will be reused. This object is
thread-safe, but it's recommended to use a separate session for each thread.Nc                p  > [         TU ]  " S0 UD6  X l        X0l        SU l        SU l        U(       ac  [        R                  " 5       U l        U(       a  SU l	        XR                  l
        gSU l	        [        U R                  S9U R                  l
        gU(       a  UO[        U R                  S9U l        g)a  
Parameters set in the ``__init__`` method will be overriden by the same
parameter in request method.

Args:
    curl: curl object to use in the session. If not provided, a new one will be
        created. Also, a fresh curl object will always be created when accessed
        from another thread.
    thread: thread engine to use for working with other thread implementations.
        choices: eventlet, gevent.
    headers: headers to use in the session.
    cookies: cookies to add in the session.
    auth: HTTP basic auth, a tuple of (username, password), only basic auth is
        supported.
    proxies: dict of proxies to use, prefer to use proxy if they are the same.
        format: ``{"http": proxy_url, "https": proxy_url}``.
    proxy: proxy to use, format: "http://proxy_url".
        Cannot be used with the above parameter.
    proxy_auth: HTTP basic auth for proxy, a tuple of (username, password).
    base_url: absolute url to use as base for relative urls.
    params: query string for the session.
    verify: whether to verify https certs.
    timeout: how many seconds to wait before giving up.
    trust_env: use http_proxy/https_proxy and other environments, default True.
    allow_redirects: whether to allow redirection.
    max_redirects: max redirect counts, default 30, use -1 for unlimited.
    impersonate: which browser version to impersonate in the session.
    ja3: ja3 string to impersonate in the session.
    akamai: akamai string to impersonate in the session.
    extra_fp: extra fingerprints options, in complement to ja3 and akamai str.
    interface: which interface use.
    default_encoding: encoding for decoding response content if charset is not
        found in headers. Defaults to "utf-8". Can be set to a callable for
        automatic detection.
    cert: a tuple of (cert, key) filenames for client cert.
    response_class: A customized subtype of ``Response`` to use.
    raise_for_status: automatically raise an HTTPError for 4xx and 5xx
        status codes.

Notes:
    This class can be used as a context manager.

.. code-block:: python

    from curl_cffi.requests import Session

    with Session() as s:
        r = s.get("https://example.com")
NTFrr   r@   )superr   _thread_use_thread_local_curlr   	_executor	threadinglocal_local_is_customized_curlr  r   rr   _curl)r   r  threaduse_thread_local_curlr   	__class__s        rI   r   Session.__init__Z  s    p 	"6"&;# #//+DK+/(#' +0(#'djj#9 !%4djj+ADJrH   c                :   U R                   (       a  U R                  (       a  [        R                  " S[        SS9  [        U R                  SS 5      (       d"  [        U R                  S9U R                  l	        U R                  R                  $ U R                  $ )Nz/Creating fresh curl handle in different thread.r   )
stacklevelr  r-  )r0  r5  warningswarnr   getattrr4  r   rr   r  r6  r  s    rI   r  Session.curl  sm    &&''E# 
 4;;55#'djj#9 ;;###::rH   c                R    U R                   c  [        5       U l         U R                   $ r   )r1  r   r  s    rI   executorSession.executor  s     >>!/1DN~~rH   c                    U $ r   r@   r  s    rI   	__enter__Session.__enter__  s    rH   c                $    U R                  5         g r   closer   r   s     rI   __exit__Session.__exit__  s    

rH   c                F    SU l         U R                  R                  5         g)Close the session.TN)r   r  rI  r  s    rI   rI  Session.close  s    		rH   c              +     #    U R                   " SXS.UDSS0D6n Uv   UR                  5         g! UR                  5         f = f7f)z6Equivalent to ``with request(..., stream=True) as r:``methodr   r   TNr@   )requestrI  r   rR  r   r   r  s        rI   r   Session.stream  s>      llI&IVIDI	IIIKCIIKs   A1 AAAc                    U R                  5         U R                  R                  5       nU R                  R                  5         [	        UUUUUS9nUR
                  " U40 UD6  U$ )a  Connects to a websocket url.

Note: This method is deprecated, use WebSocket instead.

Args:
    url: the ws url to connect.
    on_message: message callback, ``def on_message(ws, str)``
    on_error: error callback, ``def on_error(ws, error)``
    on_open: open callback, ``def on_open(ws)``
    on_close: close callback, ``def on_close(ws)``

Other parameters are the same as ``.request``

Returns:
    a WebSocket instance to communicate with the server.
)r  
on_messageon_erroron_openon_close)r   r  	duphandleresetr/   connect)	r   r   rW  rX  rY  rZ  r   r  r>   s	            rI   
ws_connectSession.ws_connect  sa    & 	""$yy""$		!
 	

3!&!	rH   c                6    U R                   R                  5       $ r   )r  upkeepr  s    rI   ra  Session.upkeep  s    yy!!rH   gzip, deflate, brr   r   r   Fc"           	     R	  ^ ^^!^,^-^.^/^0^1^2 T R                  5         U(       a5  T R                  R                  5       m-T R                  R                  5         OT R                  m-[	        T-40 SU_SU_ST R
                  U/_ST R                  _SU_SU_ST R                  U/_ST R                  U/_S	U_S
U	=(       d    T R                  _SU
[        L a  T R                  OU
_SUc  T R                  OU_SUc  T R                  OU_ST R                  U/_SU_SU=(       d    T R                  _ST R                   U/_SU_SU_SU_SU=(       d    T R"                  _SU=(       d    T R$                  _SU=(       d    T R&                  _SU=(       d    T R(                  _SUc  T R*                  OU_SU_SU=(       d    T R,                  _SU=(       d    T R.                  _SU_SU_S U _S!U=(       d    T R0                  _S"T R2                  _S#[4        R6                  _S$[8        R:                  _6u  m2m,m.m1m0n"U(       a  [8        R:                  " 5       m/U,U-UU!U.U0U1U2U 4	S% jn#U-U/4S& jn$T R<                  R?                  U#5      n%U%RA                  U$5        T0RC                  5         T RE                  T-T,T.TT!5      n&T/RG                  5         [I        T15      n'[K        U'[L        5      (       a  T-R                  5         U'eT2U&l'        U%U&l(        U"U&l)        T1U&l        T RT                  (       a  U&RU                  5         U&$  T RV                  S':X  a*  S(SK,n(U(RZ                  R]                  T-R^                  5        OfT RV                  S):X  aF  S(SK0n)U)Rc                  5       Rd                  Rg                  T-R^                  5      Ri                  5         OT-R_                  5         T RE                  T-T,T.TT!5      n&T2U&l'        T RT                  (       a  U&RU                  5         U&T-R                  5         $ ! [j         a^  n*T RE                  T-T,T.TT!5      n&T2U&l'        [m        U*Rn                  [q        U*5      5      n+U+" [q        U*5      U*Rn                  U&5      U*eSn*A*ff = f! T-R                  5         f = f)*zESend the request, see ``requests.request`` for details on parameters.rR  r   params_listrY   r   r   headers_listcookies_listr   rS   r_   ra   Nrc   proxies_listrW   rX   verify_listr   r   r   re   rf   rg   ri   rj   r   rq   rs   r   r   r   ru   rm   queue_classevent_classc                   >	  TR                  5         [        [        R                  T5      R                  5       (       d(  [        [        R                  T5      R                  5         TR                  [        5        g ! [         aU  n T
R                  TTTTT5      nT	Ul        TR	                  [        [        U 5      U R                  U5      5         S n A NS n A ff = f! [        [        R                  T5      R                  5       (       d(  [        [        R                  T5      R                  5         TR                  [        5        f = fr   )performr   r  rS  
put_nowaitr!   r:   coder   r2  Eventis_setr   putr)   )er  r  r  rl   rx   r  header_recvedr   reqr   s     rI   rm   Session.request.<locals>.performU  s    &IIK  	?FFHHY__m<@@BEE*% ! H..6=2BOC #&CKLL!1#a&!&&#!FGGH  	?FFHHY__m<@@BEE*%s+   A> >
CACC  CC   A,Ec                F   > TR                  5         TR                  5         g r   )waitr\  )futr  header_parseds    rI   cleanup Session.request.<locals>.cleanupc  s    ""$	rH   r   r   r   )9r   r  r[  r\  r-   r[   rY   rO   r   rS   r,   r_   ra   rc   rU   rX   r]   re   rf   rg   ri   rj   rq   rs   ru   rm   r   Queuer2  rp  rB  submitadd_done_callbackrx  r  r   r   
isinstancer!   rS  stream_taskquit_nowry   r/  eventlet.tpooltpoolexecuterm  r   get_hub
threadpoolspawnr   r   r#   ro  r:   )3r   rR  r   r[   r   r   rO   rQ   r   rS   r_   ra   rc   rU   rW   rX   r]   r   r   r   re   rf   rg   ri   rj   rl   r   rq   rs   ru   r   r   r   rx   r  rm  r{  r  r  first_elementr   r   rs  errorr  r  r  rz  rt  r   ru  s3   `                        `       `          @@@@@@@rI   rS  Session.request  s   L 	""$ 		##%AIIOO		AAQ+B
+B
 +B
 f-	+B

 ]]+B
 +B
 +B
 ,,0+B
 --1+B
 +B
 "+B
 %,w$6DLLG+B
 )8(?$$_+B
" '4&;""#+B
& ,,0'+B
( )+B
* "4T__++B
, f--+B
. /+B
0 ,1+B
2 .3+B
4 $7t'7'75+B
6 txx7+B
8 (T[[9+B
: .;+B
> )8(?$$_?+B
B C+B
D &:):):E+B
F  14>>G+B
H I+B
J *K+B
L  M+B
N "O+B
P **Q+B
R S+B
T "U+B
>V]A}hZ %OO-M& & --..w7K))'2  &&6=*:OC  (NM-)9::	##CK)CO#CLCI$$$$&J<<:-)NN**1995\\X-!NN$//55aii@DDFIIK **v}.> "((((*	!  8**v}.> ""1663q62CFAFFC0a78  	s,   :B P) >R )
R3ARRR R&c                ,    U R                   " SSUS.UD6$ Nr   rQ  r@   rS  r   r   r   s      rI   headSession.head      ||=6s=f==rH   c                ,    U R                   " SSUS.UD6$ Nr   rQ  r@   r  r  s      rI   r   Session.get      ||<5c<V<<rH   c                ,    U R                   " SSUS.UD6$ Nr   rQ  r@   r  r  s      rI   postSession.post  r  rH   c                ,    U R                   " SSUS.UD6$ Nr   rQ  r@   r  r  s      rI   rr  Session.put  r  rH   c                ,    U R                   " SSUS.UD6$ Nr   rQ  r@   r  r  s      rI   patchSession.patch      ||>7>v>>rH   c                ,    U R                   " SSUS.UD6$ Nr   rQ  r@   r  r  s      rI   deleteSession.delete  s    ||?8???rH   c                ,    U R                   " SSUS.UD6$ Nr   rQ  r@   r  r  s      rI   optionsSession.options  s    ||@9#@@@rH   c                ,    U R                   " SSUS.UD6$ Nr   rQ  r@   r  r  s      rI   traceSession.trace  r  rH   c                ,    U R                   " SSUS.UD6$ Nr   rQ  r@   r  r  s      rI   querySession.query  r  rH   )r   r6  r1  r5  r4  r   r/  r0  )NNT)r  zOptional[Curl]r7  zOptional[ThreadType]r8  r\   r   Unpack[BaseSessionParams[R]]r%  r&  rR  
HttpMethodr   r:   r   zUnpack[StreamRequestParams])NNNN)r%  r/   )r%  rb   )BrR  r  r   r:   r[   r}   r   r~   r   r   rO   rN   rQ   rP   r   rZ   rS   rR   r_   r   ra   r   rc   r   rU   rT   rW   rV   rX   rR   r]   r   r   rV   r   rV   r   r   re   rd   rf   rV   rg   rV   ri   rh   rj   r   rl   rk   r   r   rq   rp   rs   rV   ru   rt   r   r   r   rb   r   r   rx   r\   )r   r:   r   Unpack[RequestParams])rB   rC   rD   rE   r'  r   r(  r  rB  rE  rK  rI  r   r   r^  ra  r,   rS  r  r   r  rr  r  r  r  r  r  rG   __classcell__r9  s   @rI   r+  r+  V  s   T
  $'+&*	FBFB %FB  $	FB
 /FB FBP    

   .	  KO!	!F" 6:RV&*)-)- $*.GN*.'+'+#04!%!%)</348! $DH*.?F,.MQ#'6:!%(, %Egg g 3	g
 Pg $g 'g 'g g (g Eg (g %g %g g  .!g" #g$ %g& ''g( -)g* 2+g, -g. /g0 B1g2 (3g4 =5g6 *7g8 K9g: !;g< 4=g> ?g@ AgB &CgD EgR>=>=?@A?? ?rH   r+  c                     ^  \ rS rSrSrSSSS.     S'U 4S jjjr\S 5       r\S 5       rS	 r	S
 r
S rS rS rS(S jrS r\      S)S j5       rSSSSS\SSSSSSSSSSSSSSSSSSSSSSSSSS4                                                                    S*S jjrSSSSSSS\SSSSSSSSSSSSSSSSSSSSSSS4                                                                   S+S jjrS,S jrS,S jrS,S jrS,S  jrS,S! jrS,S" jrS,S# jrS,S$ jrS,S% jrS&rU =r$ )-AsyncSessioni  zAAn async request session, cookies and connections will be reused.N
   )loop
async_curlmax_clientsc               j   > [         TU ]  " S0 UD6  Xl        X l        X0l        U R                  5         g)a	  
Parameters set in the ``__init__`` method will be override by the same parameter
in request method.

Parameters:
    loop: loop to use, if not provided, the running loop will be used.
    async_curl: [AsyncCurl](/api/curl_cffi#curl_cffi.AsyncCurl) object to use.
    max_clients: maxmium curl handle to use in the session,
        this will affect the concurrency ratio.
    headers: headers to use in the session.
    cookies: cookies to add in the session.
    auth: HTTP basic auth, a tuple of (username, password), only basic auth is
        supported.
    proxies: dict of proxies to use, prefer to use ``proxy`` if they are the
        same. format: ``{"http": proxy_url, "https": proxy_url}``.
    proxy: proxy to use, format: "http://proxy_url".
        Cannot be used with the above parameter.
    proxy_auth: HTTP basic auth for proxy, a tuple of (username, password).
    base_url: absolute url to use for relative urls.
    params: query string for the session.
    verify: whether to verify https certs.
    timeout: how many seconds to wait before giving up.
    trust_env: use http_proxy/https_proxy and other environments, default True.
    allow_redirects: whether to allow redirection.
    max_redirects: max redirect counts, default 30, use -1 for unlimited.
    impersonate: which browser version to impersonate in the session.
    ja3: ja3 string to impersonate in the session.
    akamai: akamai string to impersonate in the session.
    extra_fp: extra fingerprints options, in complement to ja3 and akamai str.
    default_encoding: encoding for decoding response content if charset is not
        found in headers. Defaults to "utf-8". Can be set to a callable for
        automatic detection.
    cert: a tuple of (cert, key) filenames for client cert.
    response_class: A customized subtype of ``Response`` to use.
    raise_for_status: automatically raise an HTTPError for 4xx and 5xx
        status codes.

Notes:
    This class can be used as a context manager, and it's recommended to use via
    ``async with``.
    However, unlike aiohttp, it is not required to use ``with``.

.. code-block:: python

    from curl_cffi.requests import AsyncSession

    # recommended.
    async with AsyncSession() as s:
        r = await s.get("https://example.com")

    s = AsyncSession()  # it also works.
Nr@   )r.  r   _loop_acurlr  	init_pool)r   r  r  r  r   r9  s        rI   r   AsyncSession.__init__  s0    x 	"6"
 &rH   c                h    U R                   c  [        R                  " 5       U l         U R                   $ r   )r  asyncioget_running_loopr  s    rI   r  AsyncSession.loop   s&    :: 113DJzzrH   c                d    U R                   c  [        U R                  S9U l         U R                   $ )N)r  )r  r   r  r  s    rI   acurlAsyncSession.acurl  s&    ;;#3DK{{rH   c                    [         R                  " U R                  5      U l          U R                  R	                  S 5        M  ! [         R
                   a     g f = fr   )r  	LifoQueuer  poolrn  	QueueFullr  s    rI   r  AsyncSession.init_pool  sS    %%d&6&67			$$T*  $$ s   A AAc                   #    U R                   R                  5       I S h  vN nUc  [        U R                  S9nU$  N7f)Nr-  )r  r   r   rr   r   r  s     rI   pop_curlAsyncSession.pop_curl  s4     YY]]_$<djj)D %s   ?=?c                    [        [        R                  5         U R                  R	                  U5        S S S 5        g ! , (       d  f       g = fr   )r   r  r  r  rn  r  s     rI   	push_curlAsyncSession.push_curl  s.    g''(II  & )((s	   ?
Ac                   #    U $ 7fr   r@   r  s    rI   
__aenter__AsyncSession.__aenter__  s
     s   c                @   #    U R                  5       I S h  vN   g  N7fr   rH  rJ  s     rI   	__aexit__AsyncSession.__aexit__!  s     jjl 	s   c                   #    U R                   R                  5       I Sh  vN   SU l          U R                  R	                  5       nU(       a  UR                  5         M4   N@! [
        R                   a     gf = f7f)rN  NT)r  rI  r   r  
get_nowaitr  
QueueEmptyr  s     rI   rI  AsyncSession.close%  sk     jj   yy++-JJL	  	! %% s2   A=A!A=1A# A=#A:7A=9A::A=c                    UR                  5         U R                  (       d=  U R                  R                  U5        UR	                  5         U R                  U5        g UR                  5         g r   )clean_handles_and_buffersr   r  remove_handler\  r  rI  r  s     rI   release_curlAsyncSession.release_curl1  sE    &&(||JJ$$T*JJLNN4 JJLrH   c                  #    U R                   " SXS.UDSS0D6I Sh  vN n U7v   UR                  5       I Sh  vN   g N# N! UR                  5       I Sh  vN    f = f7f)z<Equivalent to ``async with request(..., stream=True) as r:``rQ  r   TNr@   )rS  acloserT  s        rI   r   AsyncSession.stream:  sX      LLOO6O$OO	I**,	 P #**,sA   A$AA$A A$AA$A$A!AA!!A$Trc  r   r   i      FgMbP??   c"                R  #    U R                  5         U R                  5       I Sh  vN n"[        S#0 SU"_SS_SU_SU R                  _SU R                  U/_SU R
                  U/_S	U R                  U/_S
U=(       d    U R                  _SU[        L a  U R                  OU_SUc  U R                  OU_SU	c  U R                  OU	_SU R                  U
/_SU_SU=(       d    U R                  _SU R                  U/_SU_SU_SU=(       d    U R                  _SU=(       d    U R                   _SU=(       d    U R"                  _SU=(       d    U R$                  _SUc  U R&                  OU_SU_SU=(       d    U R(                  _SU=(       d    U R*                  _SU_SU=(       d    U R,                  _S[.        R0                  _S[.        R2                  _6  U"R5                  [6        R8                  S 5        U"R5                  [6        R:                  S!5        U R<                  R?                  SU"R@                  5      I Sh  vN   [C        [E        [F        [H           U 5      U"UUUUUUUU U!S"9n# U#RK                  5         U#$  GN] NB! [L         a    U#RO                  5         e f = f7f)$a  Connects to a WebSocket.

Args:
    url: url for the requests.
    autoclose: whether to close the WebSocket after receiving a close frame.
    params: query string for the requests.
    headers: headers to send.
    cookies: cookies to use.
    auth: HTTP basic auth, a tuple of (username, password), only basic auth is
        supported.
    timeout: how many seconds to wait before giving up.
    allow_redirects: whether to allow redirection.
    max_redirects: max redirect counts, default 30, use -1 for unlimited.
    proxies: dict of proxies to use, prefer to use ``proxy`` if they are the
        same. format: ``{"http": proxy_url, "https": proxy_url}``.
    proxy: proxy to use, format: "http://user@pass:proxy_url".
        Can't be used with `proxies` parameter.
    proxy_auth: HTTP basic auth for proxy, a tuple of (username, password).
    verify: whether to verify https certs.
    referer: shortcut for setting referer header.
    accept_encoding: shortcut for setting accept-encoding header.
    impersonate: which browser version to impersonate.
    ja3: ja3 string to impersonate.
    akamai: akamai string to impersonate.
    extra_fp: extra fingerprints options, in complement to ja3 and akamai str.
    default_headers: whether to set default browser headers.
    quote: Set characters to be quoted, i.e. percent-encoded. Default safe
        string is ``!#$%&'()*+,/:;=?@[]~``. If set to a sting, the character
        will be removed from the safe string, thus quoted. If set to False, the
        url will be kept as is, without any automatic percent-encoding, you must
        encode the URL yourself.
    curl_options: extra curl options to use.
    http_version: limiting http version, defaults to http2.
    interface: which interface to use.
    cert: a tuple of (cert, key) filenames for client cert.
    max_recv_speed: maximum receive speed, bytes per second.
    recv_queue_size: The maximum number of incoming WebSocket
        messages to buffer internally. This queue stores messages received
        by the Curl socket that are waiting to be consumed by calling `recv()`.
    send_queue_size: The maximum number of outgoing WebSocket
        messages to buffer before applying network backpressure. When you call
        `send(...)` the message is placed in this queue and transmitted when
        the Curl socket is next available for sending.
    max_send_batch_size: The max batch size for sent frames.
    coalesce_frames: If `True`, multiple pending messages in the send queue
        may be merged into a single WebSocket frame for improved throughput.
        **Warning:** This breaks the one-to-one mapping of `send()` calls to
        frames and should only be used when the application protocol is
        designed to handle concatenated data streams. Defaults to `False`.
    retry_on_recv_error: Retries `ws_recv()` if a recv error is raised.
        Retries up to a limited number of times with a delay in between.
    yield_interval: How often to yield control back to the event loop.
        This is a trade-off between throughput and responsiveness. Lower values
        means the loop yields more frequently and enables other tasks to run,
        while higher values are better for throughput. The balanced default
        is `1ms` but you can customize this to fit your application/use case.
    fair_scheduling: Changes the I/O priority from favoring receives (`5:1`)
        to a balanced ratio (`1:1`). Enable this to improve send responsiveness
        under heavy, concurrent load, at the cost of significantly lower overall
        throughput.
    yield_mask: Controls the frequency of cooperative multitasking
        yields in the read loop. The loop yields every `yield_mask + 1`
        operations. For efficiency, this value must be a power of two minus one
        (e.g., `63`, `127`, `255`). Lower values yield more often, improving
        fairness at the cost of throughput. Higher values yield less often,
        prioritizing throughput.
Nr  rR  r   r   rY   re  rf  rg  rS   r_   ra   rc   rh  rW   rX   ri  r   r   re   rf   rg   ri   rj   r   rq   rs   r   ru   rj  rk  r   r   )		autocloserecv_queue_sizesend_queue_sizemax_send_batch_sizecoalesce_framesretry_on_recv_erroryield_intervalfair_scheduling
yield_maskr@   )(r   r  r-   rY   r[   rO   rQ   rS   r,   r_   ra   rc   rU   rX   r]   re   rf   rg   ri   rj   rq   rs   ru   r  r}  rp  setoptr   TCP_NODELAYCONNECT_ONLYr  run_in_executorrm  r.   r   r  r*   _start_io_tasksr0   	terminate)$r   r   r  r[   rO   rQ   rS   r_   ra   rc   rU   rW   rX   r]   r   r   re   rf   rg   ri   rj   r   rq   rs   ru   r   r  r  r  r  r  r  r  r  r  r>   s$                                       rI   r^  AsyncSession.ws_connectH  s    P 	""$]]_$ $	
$	
$	
 $	
 ]]	$	

 f-$	
 ,,0$	
 ,,0$	
 "$	
 %,w$6DLLG$	
 )8(?$$_$	
 '4&;""$	
  ,,0!$	
" #$	
$ "4T__%$	
& f-'$	
( )$	
* ,+$	
, $7t'7'7-$	
. txx/$	
0 (T[[1$	
2 .3$	
6 )8(?$$_7$	
: ;$	
< &:):):=$	
>  14>>?$	
@ *A$	
B "C$	
D  E$	
F  G$	
J 	G''+G((!,ii''dll;;;+h'.++ 3+ 3)+!
	 
 	} %R 	<"  	LLN	s:   $J'JHJ'J,J'1J J'J'J$$J'r   c"           
     N  ^ ^^!^*^+^,^-^.^/^0#    T R                  5         T R                  5       I Sh  vN m+[        S(0 ST+_SU_SU_ST R                  U/_ST R                  _SU_SU_S	T R
                  U/_S
T R                  U/_SU_SU	=(       d    T R                  _SU
[        L a  T R                  OU
_SUc  T R                  OU_SUc  T R                  OU_ST R                  U/_SU_SU=(       d    T R                  _ST R                  U/_SU_SU_SU_SU=(       d    T R                  _SU=(       d    T R                   _SU=(       d    T R"                  _SU=(       d    T R$                  _SUc  T R&                  OU_SU_SU=(       d    T R(                  _SU=(       d    T R*                  _SU_S U_S!U _S"U=(       d    T R,                  _S#T R.                  _S$[0        R2                  _S%[0        R4                  _6u  m/m*m,m.m-n"U(       Ga  T R6                  R9                  T+5      m0U*U+UU!U,U-U.U/U U04
S& jn#U+U 4S' jn$[0        R:                  " U#" 5       5      n%U%R=                  U$5        [?        [0        R4                  T-5      RA                  5       I Sh  vN   T RC                  T+T*T,TT!5      n&[E        T.5      n'[G        U'[H        5      (       a  T RK                  T+5        U'eT/U&l&        U%U&l'        U"U&l(        T.U&l)        T RT                  (       a  U&RU                  5         U&$  T R6                  R9                  T+5      m0T0I Sh  vN   T RC                  T+T*T,TT!5      n&T/U&l&        T RT                  (       a  U&RU                  5         U&T RK                  T+5        $  GNl GN NZ! [V         a^  n(T RC                  T+T*T,TT!5      n&T/U&l&        [Y        U(RZ                  []        U(5      5      n)U)" []        U(5      U(RZ                  U&5      U(eSn(A(ff = f! T RK                  T+5        f = f7f))zISend the request, see ``curl_cffi.requests.request`` for details on args.Nr  rR  r   re  rY   r   r   rf  rg  r   rS   r_   ra   rc   rh  rW   rX   ri  r   r   r   re   rf   rg   ri   rj   r   rq   rs   r   r   r   ru   rm   rj  rk  c                   >
#     TI S h  vN   [        [        R                  T5      R                  5       (       d(  [        [        R                  T5      R                  5         TR                  [        5      I S h  vN   g  Nw! [          aU  n T
R                  TTTTT5      nT	Ul        TR                  [	        [        U 5      U R                  U5      5         S n A NS n A ff = f Ni! [        [        R                  T5      R                  5       (       d(  [        [        R                  T5      R                  5         TR                  [        5      I S h  vN    f = f7fr   )r   r  rS  rn  r!   r:   ro  r   r  rp  rq  r   rr  r)   )rs  r  r  r  rl   rx   r  rt  r   ru  r   tasks     rI   rm  %AsyncSession.request.<locals>.performJ  s     ,JJ  }=DDFFW]]M:>>@%%
+++   H..fm5EC #&CKLL!1#a&!&&#!FGGH ,  }=DDFFW]]M:>>@%%
+++sj   E B BB A-E <C&=E B 
C#ACC( C##C( &E (A.EEEE c                (   > TR                  T5        g r   )r  )ry  r  r   s    rI   r{  %AsyncSession.request.<locals>.cleanupX  s    !!$'rH   r@   )/r   r  r-   r[   rY   rO   rQ   rS   r,   r_   ra   rc   rU   rX   r]   re   rf   rg   ri   rj   rq   rs   ru   rm   r  r}  rp  r  
add_handlecreate_taskr  r   rx  r  r   r  r!   r  rS  astream_taskr  r   ry   r   r#   ro  r:   )1r   rR  r   r[   r   r   rO   rQ   r   rS   r_   ra   rc   rU   rW   rX   r]   r   r   r   re   rf   rg   ri   rj   rl   r   rq   rs   ru   r   r   r   rx   r  rm  r{  r  r  r  rs  r  r  r  r  rt  r   ru  r  s1   `                        `       `        @@@@@@@rI   rS  AsyncSession.request  s    L 	""$]]_$AQ +B
+B
+B
 +B
 f-	+B

 ]]+B
 +B
 +B
 ,,0+B
 ,,0+B
 +B
 "+B
 %,w$6DLLG+B
 )8(?$$_+B
" '4&;""#+B
& ,,0'+B
( )+B
* "4T__++B
, f--+B
. /+B
0 ,1+B
2 .3+B
4 $7t'7'75+B
6 txx7+B
8 (T[[9+B
: .;+B
> )8(?$$_?+B
B C+B
D &:):):E+B
F  14>>G+B
H I+B
J *K+B
L  M+B
N "O+B
P **Q+B
R  S+B
T  U+B
>V]A}hX ::((.D, ,( "--gi8K))'2w}}m499;;; &&fm-=C ,A.M-)9::!!$'##CK*C#CLCI$$$$&J(zz,,T2

 **&-1A? "((((*!!$'] %H <2  8**&-1A? ""1663q62CFAFFC0a78  !!$'sl   $P%NI)P%NBP%' N$ N"N$ >P 
P%P%"N$ $
P.APPP P""P%c                H   #    U R                   " SSUS.UD6I S h  vN $  N7fr  r  r  s      rI   r  AsyncSession.head  $     \\CSCFCCCC   " "c                H   #    U R                   " SSUS.UD6I S h  vN $  N7fr  r  r  s      rI   r   AsyncSession.get  $     \\BCB6BBBBr
  c                H   #    U R                   " SSUS.UD6I S h  vN $  N7fr  r  r  s      rI   r  AsyncSession.post  r	  r
  c                H   #    U R                   " SSUS.UD6I S h  vN $  N7fr  r  r  s      rI   rr  AsyncSession.put  r  r
  c                H   #    U R                   " SSUS.UD6I S h  vN $  N7fr  r  r  s      rI   r  AsyncSession.patch  $     \\DcDVDDDDr
  c                H   #    U R                   " SSUS.UD6I S h  vN $  N7fr  r  r  s      rI   r  AsyncSession.delete  s$     \\EsEfEEEEr
  c                H   #    U R                   " SSUS.UD6I S h  vN $  N7fr  r  r  s      rI   r  AsyncSession.options  s$     \\FFvFFFFr
  c                H   #    U R                   " SSUS.UD6I S h  vN $  N7fr  r  r  s      rI   r  AsyncSession.trace  r  r
  c                H   #    U R                   " SSUS.UD6I S h  vN $  N7fr  r  r  s      rI   r  AsyncSession.query  r  r
  )r  r   r  r  r  )r  zOptional[AsyncCurl]r  rb   r   r  r  r  )Dr   r:   r  r\   r[   r}   rO   rN   rQ   rP   rS   rR   r_   r   ra   r   rc   r   rU   rT   rW   rV   rX   rR   r]   r   r   rV   r   rV   re   rd   rf   rV   rg   rV   ri   rh   rj   r   r   r   rq   rp   rs   rV   ru   rt   r   rb   r  rb   r  rb   r  rb   r  r\   r  r\   r  r   r  r\   r  rb   r%  r.   )DrR  r  r   r:   r[   r}   r   r~   r   r   rO   rN   rQ   rP   r   rZ   rS   rR   r_   r   ra   r   rc   r   rU   rT   rW   rV   rX   rR   r]   r   r   rV   r   rV   r   r   re   rd   rf   rV   rg   rV   ri   rh   rj   r   rl   rk   r   r   rq   rp   rs   rV   ru   rt   r   r   r   rb   r   r   rx   r\   r%  r3   )r   r:   r   r  r%  r3   ) rB   rC   rD   rE   r'  r   r(  r  r  r  r  r  r  r  rI  r  r   r   r,   r^  rS  r  r   r  rr  r  r  r  r  r  rG   r  r  s   @rI   r  r    s   K
 *.@ (	@
 @ /@ @D  
  
'
   .	   59)-)-*.GN*.'+'+#04!%!%)<48! $DH*.,.MQ#'6:""#& %$) % %Ehh h 3	h
 'h 'h (h Eh (h %h %h h .h h h  '!h" 2#h$ %h& 'h( B)h* (+h, *-h. K/h0 !1h2 43h4 5h6 7h8 9h: !;h< =h> "?h@ AhB ChD EhF 
Gh\ 6:RV&*)-)- $*.GN*.'+'+#04!%!%)</348! $DH*.?F,.MQ#'6:!%(, %EV(V( V( 3	V(
 PV( $V( 'V( 'V( V( (V( EV( (V( %V( %V( V(  .!V(" #V($ %V(& ''V(( -)V(* 2+V(, -V(. /V(0 B1V(2 (3V(4 =5V(6 *7V(8 K9V(: !;V(< 4=V(> ?V(@ AV(B &CV(D EV(F 
GV(pDCDCEFGEE ErH   r  )r   r:   r%  r\   r   )r   zqueue.Queue)r   zasyncio.Queue)Y
__future__r   r  http.cookiesr<   r   r   sysr2  r=  concurrent.futuresr   
contextlibr   r   r   collections.abcr   ior	   typingr
   r   r   r   r   r   r   r   urllib.parser   datetimer   aior   constr   r   r   r  r   r   r   utilsr   rQ   r   r   r    
exceptionsr!   r"   r#   rO   r$   r%   re   r&   r'   r(   modelsr)   r*   r+   r,   r-   
websocketsr.   r/   r0   version_infor3   typing_extensionsr6   r8   rL   r{   r   r   dictr:   
ThreadTyper  r   r   r   r   r+  r  r@   rH   rI   <module>r1     s}   "   	  
   1 D D $ 	 	 	 "   6 6 , , # 5 5 C C ) K K ( @ @ A A w8X6A8$A(IU GAJ	 <iu @+5 
 
 YFS#XI!)2I&)*
P

;t)'!* t)nb?k!n b?JhE;q> hErH   