
    >OOfǣ                        d dl 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
mZ d dlm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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*m+Z+m,Z,m-Z- ddl.m/Z/m0Z0 ddl1m2Z2m3Z3m4Z4 ddl5m6Z6m7Z7 ddl8m9Z9m:Z: ddl;m<Z<m=Z= ddl>m?Z? 	 d dl@Z@	 d dlBZCer G d ded      ZDneeEeEf   ZDed   ZF G d deEe      ZG G d d      ZHdeEdeIfdZJdeEd eeeef   deEfd!ZKd"eeE   d#eEd$eEfd%ZLd/d&ej                  fd'ZNd/d&e j                  fd(ZO eP       ZQ G d) d*      ZR G d+ d,eR      ZS G d- d.eR      ZTy# eA$ r Y w xY w# eA$ r Y w xY w)0    N)Counter)ThreadPoolExecutor)asynccontextmanagercontextmanager)Enum)partialmethod)BytesIO)dumps)TYPE_CHECKINGAnyCallableDictListLiteralOptionalTuple	TypedDictUnioncast)ParseResult	parse_qslunquote	urlencodeurljoinurlparse   )	AsyncCurlCurl	CurlErrorCurlHttpVersionCurlInfoCurlOpt)CURL_WRITEFUNC_ERRORCurlMime   )CookiesCookieTypes
CurlMorsel)RequestsErrorSessionClosed)HeadersHeaderTypes)RequestResponse)	WebSocketc                   @    e Zd ZU eed<   eed<   eed<   eed<   eed<   y)	ProxySpecallhttphttpswswssN)__name__
__module____qualname__str__annotations__     [/var/www/premiumrankchecker/venv/lib/python3.12/site-packages/curl_cffi/requests/session.pyr1   r1   0   s    	
r=   r1   F)total)eventletgeventc                   x    e Zd ZdZdZdZdZdZdZdZ	dZ
d	Zd
ZdZdZdZdZdZdZdZdZdZed        Zed        Zy)BrowserTypeedge99edge101chrome99	chrome100	chrome101	chrome104	chrome107	chrome110	chrome116	chrome119	chrome120chrome99_android
safari15_3
safari15_5
safari17_0safari17_2_iosc                     || j                   v S N)__members__clsitems     r>   haszBrowserType.hasS   s    s&&r=   c                 l    |dk(  r| j                   S |dk(  r| j                  S |dk(  r| j                  S |S )Nchromesafari
safari_ios)r\   r]   r^   rW   s     r>   	normalizezBrowserType.normalizeW   s=    8::X::\!>>!Kr=   N)r7   r8   r9   rD   rE   rF   rG   rH   rI   rJ   rK   rL   rM   rN   rO   rP   rQ   rR   rS   r\   r]   r^   classmethodrZ   r_   r<   r=   r>   rC   rC   =   s    FGHIIIIIIII)JJJ%NFF!J' '  r=   rC   c                       e Zd ZdZy)BrowserSpecz+A more structured way of selecting browsersN)r7   r8   r9   __doc__r<   r=   r>   rb   rb   c   s    5r=   rb   urlreturnc                 ^    t        |       }t        |j                  xr |j                        S )z,Check if the provided url is an absolute url)r   boolschemehostname)rd   
parsed_urls     r>   _is_absolute_urlrk   i   s'    #J
!!9j&9&9::r=   paramsc                    t        |       } t        |       }|j                  }t        |      }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 GET params to provided URL being aware of existing.

    Parameters:
        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'
    c              3   &   K   | ]	  }|d      ywr   Nr<   .0xs     r>   	<genexpr>z%_update_url_params.<locals>.<genexpr>   s     >!>   c              3   &   K   | ]	  }|d      ywro   r<   rp   s     r>   rs   z%_update_url_params.<locals>.<genexpr>   s     5!5rt   r%   r   T)doseq)r   r   queryr   r   
isinstancedictlistitemsrg   r
   getappendr   r   rh   netlocpathrl   fragmentgeturl)rd   rl   rj   get_argsparsed_get_argsold_args_counternew_args_counterkeyvaluerr   encoded_get_argsnew_urls               r>   _update_url_paramsr   o   s]     #,C #J H  )O >o>?&$flln%5f56 
1
U edD\*%LE $).>.B.B3.G1.LM\]QqTS[sEl B]O]""C<0
1 !=  fh  N% ^s   Eheader_linesr   r   c                     t        |       D ]A  \  }}|j                         j                  |j                         dz         s7| d| | |<    y | j                  | d|        y)z*Update header line list by key value pair.:: N)	enumeratelower
startswithr}   )r   r   r   idxlines        r>   _update_header_liner      sl    |, /	T::<""399;#45#&%r% 1L/
 	se2eW-.r=   qc                 D    	 | j                   d   S # t        $ r |cY S w xY wNr   )queue
IndexErrorr   defaults     r>   _peek_queuer      s)    wwqz     c                 D    	 | j                   d   S # t        $ r |cY S w xY wr   )_queuer   r   s     r>   _peek_aio_queuer      s)    xx{ r   c            ;          e Zd ZdZdddddddddddddddddddddddd	ee   d
ee   deeeef      dee	   dee   deeeef      dee   dee
   dedeeeeef   f   dedededeeeef      dedeeeegef   f   dee
   dee   dee   dedee   deeeeeef   f      f,dZdddddddedddddddd dddddddd!dddfd"ed#edeeeeef      d$eeeeef   ee   eeef      d%ee
   d	ee   d
ee   d&ee   deeeef      deeeeeef   ef      dee   dee   dee	   dee   deeeef      deeeef      d'ee   d(ee   d)ee   deeeef      dee   dee   dee   deeeeeef   f      d*ed+ed,ee   d-ed.ef:d/Zd0 Zd1 Zy)2BaseSessionzMProvide common methods for setting curl options and reading info in sessions.NT   utf-8F)headerscookiesauthproxiesproxy
proxy_authbase_urlrl   verifytimeout	trust_envallow_redirectsmax_redirectsimpersonatedefault_headersdefault_encodingcurl_options
curl_infoshttp_versiondebug	interfacecertr   r   r   r   r   r   r   rl   r   r   r   r   r   r   r   r   r   r   r   r   r   r   c                   t        |      | _        t        |      | _        || _        || _        || _        |	| _        |
| _        || _	        || _
        || _        || _        || _        || _        |xs i | _        |xs g | _        || _        || _        || _        || _        |r|rt+        d      |rd|i}|xs i | _        || _        | j
                  r t1        | j
                        st3        d      d| _        y )N)Cannot specify both 'proxy' and 'proxies'r2   z2You need to provide an absolute url for 'base_url'F)r+   r   r&   r   r   r   rl   r   r   r   r   r   r   r   r   r   r   r   r   r   r   	TypeErrorr   r   rk   
ValueError_closed)selfr   r   r   r   r   r   r   rl   r   r   r   r   r   r   r   r   r   r   r   r   r   r   s                          r>   __init__zBaseSession.__init__   s    4 w'w'	 ".*&. 0(.B$*(
"	WGHHenG")-R$==!1$--!@QRRr=   gzip, deflate, brr   methodrd   datajsonfilesrefereraccept_encodingcontent_callbackstreammax_recv_speed	multipartqueue_classevent_classc           
      n  567 |}|dk(  r!|j                  t        j                  d       n3|dk7  r.|j                  t        j                  |j	                                | j
                  rt        || j
                        }|rt        ||      }| j                  rt        | j                  |      }|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 rI|j                  t        j*                  |        |j                  t        j,                  t/        |              t1        | j2                        }!|!j5                  |       |!j7                  d	      }"|"-t9        |      }#|"|#j:                  k(  s|"|#j<                  k(  r	 |!d	= g }$|!jA                         D ]  \  }%}&|$jC                  |% d
|&         |tE        |$dd       t        |t              r|dk7  rtE        |$dd       |j                  t        jF                  |$D !cg c]  }!|!j	                          c}!       tI        |!|      }'|j                  t        jJ                  d       |j                  t        jL                  d       | jN                  jQ                  |'      D ]0  }(|j                  t        jL                  |(jS                                2 |rOtU        |      })|)jQ                  |'      D ]0  }(|j                  t        jL                  |(jS                                2 |	rtW        d      |rtY        t        |xs i       j[                         D ]8  \  }%}&|j]                  |%t        |&t              r|&j	                         n|&       : |j                  t        j^                  |j`                         | jb                  s|
r~| jb                  r| jb                  \  }*}+|
r|
\  }*}+|j                  t        jd                  *j	                                |j                  t        jf                  +j	                                |th        u r| jj                  }|d}t        |t              r|\  },}-|,|-z   }.|j                  t        jl                  to        |,dz               |s.|j                  t        jp                  to        |.dz               n|j                  t        jr                  d       |j                  t        jt                  tw        jx                  |.             nt        |tn        tz        f      r|s-|j                  t        jp                  to        |dz               n|j                  t        jl                  to        |dz               |j                  t        jr                  d       |j                  t        jt                  tw        jx                  |             |j                  t        j|                  to        || j~                  n|             |j                  t        j                  || j                  n|       |r|rt'        d      |rd|i}|| j                  }|rt9        |      }/tY        t        t           |j7                  |/j                  |j7                  d                  }|/j<                  r`tY        t        t           |j7                  |/j                   d|/j<                   |j7                  d|/j<                                     xs |}| |/j                  dk(  r-|j                  d      rt        j                  dt        d       |j                  t        j                  |       |j                  d      s |j                  t        j                  d       |xs | j                  }|ra|\  }*}+|j                  t        j                  |*j	                                |j                  t        j                  |+j	                                |du s| j                  sB|@|j                  t        j                  d       |j                  t        j                  d       t        |t              r |j                  t        j                  |       |dv rDt        | j                  t              r*|j                  t        j                  | j                         |r.|j                  t        j                  |j	                                |.|j                  t        j                  |j	                                |xs | j                  }|rvt        |t              r!|j                  t        j                  |       nE|\  }}0|j                  t        j                  |       |j                  t        j                  |0       |xs | j                  }|| j                  n|}|r<t        j                  |      }|j                  ||      }1|1dk7  rt        d | d!      |xs | j                  }|r |j                  t        j                  |       | j                  j[                         D ]  \  }%}&|j                  |%|&        d }2d 6d 5d 7|r= |       6 |       5 |       7567fd"}3|j                  t        j                  |3       nM|!|j                  t        j                  |       n*t!               }2|j                  t        j                  |2       t!               }4|j                  t        j                  |4       |d#k(  r |j                  t        j                  d       |xs | j                  }|r.|j                  t        j                  |j	                                |j                  t        j                  |       |'|2|4657fS # t>        $ r Y 
cw xY wc c}!w )$NPOSTr%   GETr=   z(data must be dict, str, BytesIO or bytes),r   )
separators)r   PUTPATCHHostr   zContent-Typezapplication/jsonz!application/x-www-form-urlencodedALLz(files is not supported, use `multipart`.)namer   r   i  r   r2   z://zall://r4   zhttps://zYou may be using http proxy WRONG, the prefix should be 'http://' not 'https://',see: https://github.com/yifeikong/curl_cffi/issues/6r   )
stacklevelsocksF)NT)r   zImpersonating z is not supportedc                     j                         sj                          j                         rt        S j                  |        t	        |       S rU   )is_setsetr#   
put_nowaitlen)chunkheader_recvedr   quit_nows    r>   qputz+BaseSession._set_curl_options.<locals>.qput  sA    $++-!%%'??$//U#5z!r=   HEAD)fsetoptr"   r   CUSTOMREQUESTencoderl   r   r   r   URLrx   ry   rz   tupler   r:   r	   readbytesr   r
   
POSTFIELDSPOSTFIELDSIZEr   r+   r   updater|   r   r~   ri   KeyErrormulti_itemsr}   r   
HTTPHEADERr-   
COOKIEFILE
COOKIELISTr   get_cookies_for_curlto_curl_formatr&   NotImplementedErrorr   r{   addpartMIMEPOST_formr   USERNAMEPASSWORDnot_setr   CONNECTTIMEOUT_MSint
TIMEOUT_MSLOW_SPEED_LIMITLOW_SPEED_TIMEmathceilfloatFOLLOWLOCATIONr   	MAXREDIRSr   r   r   rh   r   warningswarnRuntimeWarningPROXYHTTPPROXYTUNNELr   PROXYUSERNAMEPROXYPASSWORDr   SSL_VERIFYPEERSSL_VERIFYHOSTCAINFOREFERERACCEPT_ENCODINGr   SSLCERTSSLKEYr   r   rC   r_   r)   r   HTTP_VERSIONr   WRITEFUNCTION	WRITEDATA
HEADERDATANOBODYr   	INTERFACEMAX_RECV_SPEED_LARGE)8r   curlr   rd   rl   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   cbodyhhost_headerur   kvreqmorseltemp_cookiesusernamepasswordconnect_timeoutread_timeoutall_timeoutpartsr   retbufferr   header_bufferr   r   r   s8                                                        @@@r>   _set_curl_optionszBaseSession._set_curl_options  s	   B  VHHW\\1%u_HHW**FMMO< ;;$S$++6C$S&1C==$---C	cjjl+ dT4/0T?))+Dc";;=Dg&99;De$D\DFGG*5<<>D
 655HHW''.HHW**CI6 DLL!	
 eeFm"Aahh&+*C&	 MMO 	-DAq1#Rs,	-n>PQdD!f&6n>ab	##,%GQahhj%GHc1f% 	
##S)	##U+ll77< 	EFKK**F,A,A,CD	E "7+L&;;C@ IG..0E0E0GHI %&PQQ T4:2.446 X1!!qZ3=OqxxzUV!WXHHW%%y7 99yy%)YY"(%)"(HHW%%x'89HHW%%x'89 gllG?Ggu%,3)O\)L8KHHW..Od4J0KL++St1C-DE 00!4//;1GH#u.++S4-@A22C$4GH00!4//71CD 	
""(?$$_U	
 	
"/"7D]	
 WGHHenG?llGSME#ELL'++eBT(UVE~~ $||nC/?@#KK&0@(AB     <<7*u/?/?
/KMMO&#$	 .''0HHW44a8 (:4??
)3&HhHHW22HOO4EFHHW22HOO4EF U?$++&.HHW++Q/HHW++Q/ fc"HHW^^V, \!jc&BHHW^^T[[1 HHW__gnn&67 &HHW,,o.D.D.FG  tyy$$$/ 	c$/- "5T%5%52A2I$..%//<K--_-MCax#n[MAR$STT $8t'8'8HHW))<8 %%++- 	DAqHHQN	 A'MM"}H" HHW**D1)HHW**,<=YFHHW&&/		##]3VHHW^^Q' /	HHW&&	(8(8(:; 	
--~>FM1mXEEo    &Hs   r" 
r2
"	r/.r/c                    |}t        |      }t        t        |j                  t        j
                              j                         |_        |r|j                         |_	        t        t        |j                  t        j                              |_        t        t        |j                  t        j                              |_        d|j                  cxk  xr dk  nc |_        |j                         j!                         }g }|D ]  }	|	j#                         s|	j%                  d      r'|j'                  |	      j                         |_        g }L|	j%                  d      s|	j%                  d      r|dxx   |	z  cc<   ||j+                  |	        t-        |      |_        |j                  t        j0                        D cg c]  }t3        j4                  |       }
}| j6                  j9                  |
       | j6                  |_        ||_        t        t<        j                  t        j>                              |_         t        t        |j                  t        jB                              |_"        t        t        |j                  t        jF                              j                         |_$        | jJ                  D ]   }|j                  |      |jL                  |<   " |S c c}w )N   i  s   HTTP/       	r   )'r.   r   r   getinfor!   EFFECTIVE_URLdecoderd   getvaluecontentr   r  r   RESPONSE_CODEstatus_codeok
splitlinesstripr   get_reason_phrasereasonr}   r+   r   r   r(   from_curl_formatr   update_cookies_from_curlr   r  
TOTAL_TIMEelapsedREDIRECT_COUNTredirect_countREDIRECT_URLredirect_urlr   infos)r   r  r.  r/  r   r  rspr   header_listheader_linemorselsinfos               r>   _parse_responsezBaseSession._parse_response5  s9   qk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B;.{+	, k*;<99XEXEX;YZa:..q1ZZ 	--g6ll  05!))H,?,?"@A!#qyy1H1H'IJqyy1F1F'GHOOQOO 	.DiioCIIdO	. 
! [s   
K0c                 2    | j                   rt        d      y )Nz'Session is closed, cannot send request.)r   r*   r   s    r>   _check_session_closedz!BaseSession._check_session_closedc  s    << IJJ r=   )r7   r8   r9   rc   r   r,   r'   r   r:   r1   ry   rg   r   r  r   rC   r   r   rz   r    r   r   r   r   r	   objectr$   r   r0  rO  rR  r<   r=   r>   r   r      s^   W
 *.)-*.'+#04"&!%57 $9= $?F'+%)26#'6:18 +&8 +&	8
 uS#X'8 )$8 }8 U38_-8 3-8 8 8 ueE5L1128 8 8 8  eC$456!8" #8$  Xugsl%; ;<%8& tn'8( TN)8* /+8, -8. C=/80 uS%S/12318~ 6:RV#)-)- $*.GN*.'+'+#04-1!%)</39=*.26#'6:(,?nF nF 	nF
 tT5012nF uT#s(^T%[#wMNOnF tnnF +&nF +&nF ~nF uS#X'nF %uUE\':F BCDnF "$nF  }nF )$nF  }!nF" U38_-#nF$ tSy)*%nF& #'nF( "#)nF* #8,+nF, eC$456-nF. "$/nF0 /1nF2 C=3nF4 uS%S/1235nF6 7nF8 9nF: H%;nF< =nF> ?nF`	,\Kr=   r   c            ;       &    e Zd ZdZ	 	 	 d<dee   dee   def fdZe	d        Z
e	d        Zd	 Zd
 Zd Zed        Zddddddeeeegdf      deeeegdf      dee   dee   def
dZdddddddeddddddddddddddddddfdededeeeeef      deeeeef   ee   eeef      dee   dee   dee   dee   d eeeef      d!eee ee e f   e!f      d"ee   d#ee"   d$ee#   d%ee   d&eeeef      d'ee   d(ee   d)ee   d*ee   d+eeee$f      d,ee   d-eeeegef   f   d.ee%   d/ee   d0eeeeeef   f      d1ed2e"d3ee&   de'f:d4Z( e)e(d5      Z* e)e(d6      Z+ e)e(d7      Z, e)e(d8      Z- e)e(d9      Z. e)e(d:      Z/ e)e(d;      Z0 xZ1S )=SessionzA request session, cookies and connections will be reused. This object is thread-safe,
    but it's recommended to use a seperate session for each thread.Nr  threaduse_thread_local_curlc                 `   t        |   di | || _        || _        d| _        d| _        |rat        j                         | _        |rd| _	        || j                  _
        yd| _	        t        | j                        | j                  _
        y|r|nt        | j                        | _        y)a  
        Parameters set in the init method will be override 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., possible values: 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, 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 unlimited(-1).
            impersonate: which browser version to impersonate in the session.
            interface: which interface use in request to server.
            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.

        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r   r<   )superr   _thread_use_thread_local_curlr   	_executor	threadinglocal_local_is_customized_curlr  r   r   _curl)r   r  rV  rW  kwargs	__class__s        r>   r   zSession.__init__l  s    X 	"6"&;# #//+DK+/(#' +0(#'djj#9 !%4djj+ADJr=   c                    | j                   rs| j                  rt        j                  d       t	        | j
                  dd       s%t        | j                        | j
                  _        | j
                  j                  S | j                  S )Nz/Creating fresh curl handle in different thread.r  rY  )
r\  ra  r  r  getattrr`  r   r   r  rb  rQ  s    r>   r  zSession.curl  s`    &&''OP4;;5#'djj#9 ;;###::r=   c                 P    | j                   t               | _         | j                   S rU   )r]  r   rQ  s    r>   executorzSession.executor  s     >>!/1DN~~r=   c                     | S rU   r<   rQ  s    r>   	__enter__zSession.__enter__  s    r=   c                 $    | j                          y rU   closer   argss     r>   __exit__zSession.__exit__  s    

r=   c                 F    d| _         | j                  j                          y)Close the session.TN)r   r  rm  rQ  s    r>   rm  zSession.close  s    		r=   c              /      K    | j                   |i |ddi}	 | |j                          y# |j                          w xY ww)z6Equivalent to ``with request(..., stream=True) as r:``r   TN)requestrm  r   ro  rc  rJ  s       r>   r   zSession.stream  s>      dllD8F848	IIIKCIIKs   A/ AAA
on_messageon_erroron_openon_closerw  rx  ry  rz  re   c                $   | j                           | j                  | j                  d|g|i | | j                  j                  t        j
                  d       | j                  j                          t        | | j                  ||||      S )a  Connects to a websocket url.

        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_cloes: close callback, ``def on_close(ws)``

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

        Returns:
            a ws instance to communicate with the server.
        r   r   rv  )rR  r0  r  r   r"   CONNECT_ONLYperformr/   )r   rd   rw  rx  ry  rz  ro  rc  s           r>   
ws_connectzSession.ws_connect  s    0 	""$tyy%FtFvF 			--q1		II!
 	
r=   r   r   Fr   r   rd   rl   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   c                 4   $%&'()*  j                          |r5 j                  j                         % j                  j                          n j                  %  j                  %fi d|d|d|d|d|d|d|d|d	|	d
|
d|d|d|d|d|d|d|d|d|d|d|d|d|d|d|d|d|dt
        j                  dt        j                  \  *$&)(}|rt        j                         '$%&()* fd}%'fd} j                  j                  |      } | j                  |       t        t        j                  (      j                           j                  %$&      }!'j                          t!        t        t
        j                  )            }"t#        |"t$              r%j                          |"*|!_        | |!_        ||!_        )|!_        |!S 	  j,                  d k(  r*t.        j0                  j3                  %j4                         ne j,                  d!k(  rFt7        j8                         j:                  j=                  %j4                        j?                          n%j5                           j                  %$&      }!*|!_        |!%j                          S # t@        $ rA}# j                  %$&      }!*|!_        t%        tC        |#      |#jD                  |!      |#d"}#~#ww xY w# %j                          w xY w)#zESend the request, see ``requests.request`` for details on parameters.r   rd   rl   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   c                     	 j                          t	        t        j                        j                         s(t	        t        j                        j                          t	        t
        j                        j                  d        y # t        $ rl} 	j                        }|_        t	        t
        j                        j                  t        t        |       | j                  |             Y d } ~ d } ~ ww xY w# t	        t        j                        j                         s(t	        t        j                        j                          t	        t
        j                        j                  d        w xY wrU   )r}  r   rO  rt  r   r   Queuer   r)   r:   coder^  Eventr   r   put)
erJ  r.  r  r   r/  r   r   r$  r   s
     r>   r}  z Session.request.<locals>.performD  s   
3IIK  	?FFHY__m<@@Ba(,,T2 ! X..q&-IYZC"%CKa(33M#a&!&&RU4VWWX
  	?FFHY__m<@@Ba(,,T2s+   B 	DA"C=8D =DD A;F c                 F    j                          j                          y rU   )waitreset)futr  header_parseds    r>   cleanupz Session.request.<locals>.cleanupQ  s    ""$	r=   r@   rA   N)#rR  r  	duphandler  r0  r   r  r^  r  rh  submitadd_done_callbackr   r  rO  r   r   rx   r)   rt  stream_taskr   r[  r@   tpoolexecuter}  rA   get_hub
threadpoolspawnr|   r   r:   r  )+r   r   rd   rl   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  rJ  first_elementr  r.  r  r/  r  r   r   r$  s+   `                     `             @@@@@@@r>   rt  zSession.request  sb   B 	""$ 		##%AIIOO		AAWAWAWB
B
 B
 	B

 B
 B
 B
 B
 B
 B
 B
 ,B
 (B
 B
 B
  "!B
" #B
$ %B
& ,'B
( .)B
* $+B
, ,-B
. &/B
0  1B
2 3B
4 *5B
6  7B
8 9B
: ;B
< "=B
>V]A}hB %OO-M3 3 --..w7K))'2 -0557&&q&-AQRC (U[[!(<=M-7	##CK)CO#CLCIJ<<:-NN**1995\\X-NN$//55aii@DDFIIK **1fmEUV!	  @**1fmEUV!#CFAFFC8a?@ 	s+   -BJ8 L 8	L<K==LL Lr   r   r   r   r   DELETEOPTIONS)NNT)2r7   r8   r9   rc   r   r   
ThreadTyperg   r   propertyr  rh  rj  rp  rm  r   r   r   r/   r   r   r~  r   r:   r   r   r   r   r	   ry   r,   r'   r  rS  r   r1   rC   r    r$   r.   rt  r   headr|   postr  patchdeleteoptions__classcell__rd  s   @r>   rU  rU  h  s   G
  $'+&*	:Btn:B $:B  $	:Bx    

   DHEI&*'+'
 Xy%&8$&>?@	'

 8Y	$:D$@AB'
 (#'
 8$'
 
'
Z 6:RV#)-)- $*.GN*.'+'+#04!%!%)</39=*.?F26#'6:(,;EE E tT5012	E
 uT#s(^T%[#wMNOE tnE +&E +&E ~E uS#X'E %uUE\':F BCDE "$E  }E )$E }E  U38_-!E" #E$ #%E& "#'E( #8,)E* eC$456+E, "$-E.  Xugsl%; ;</E0 /1E2 C=3E4 uS%S/1235E6 7E8 9E: H%;E< 
=EN &)D

'C&)D

'C'7+E7H-FGY/Gr=   rU  c            :           e Zd ZdZdddddee   def fdZed        Z	ed	        Z
d
 Zd Zd Zd Zd Zd Zd Zed        Zd Zdddddddeddddddddddddddddddfdededeeeeef      deeeeef   ee   eeef      dee   dee   dee   dee   deeeef      d eee ee e f   e!f      d!ee"   d"ee   d#ee#   d$ee   d%eeeef      d&ee"   d'ee   d(ee   d)ee$   d*eeee%f      d+ee"   d,eee$egef   f   d-ee&   d.ee   d/eeeeeef   f      d0e"d1ed2ee'   f8d3Z( e)e(d4      Z* e)e(d5      Z+ e)e(d6      Z, e)e(d7      Z- e)e(d8      Z. e)e(d9      Z/ e)e(d:      Z0 xZ1S );AsyncSessionzAAn async request session, cookies and connections will be reused.N
   )loop
async_curlmax_clientsr  r  c                n    t        |   di | || _        || _        || _        | j                          y)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, 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 unlimited(-1).
            impersonate: which browser version to impersonate in the session.
            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.

        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<   )rZ  r   _loop_acurlr  	init_pool)r   r  r  r  rc  rd  s        r>   r   zAsyncSession.__init__  s6    ^ 	"6"
 &r=   c                 d    | j                   t        j                         | _         | j                   S rU   )r  asyncioget_running_looprQ  s    r>   r  zAsyncSession.loop  s&    :: 113DJzzr=   c                 h    | j                   t        | j                        | _         | j                   S )N)r  )r  r   r  rQ  s    r>   acurlzAsyncSession.acurl  s&    ;;#3DK{{r=   c                     t        j                  | j                        | _        	 	 | j                  j	                  d        # t         j
                  $ r Y y w xY wrU   )r  	LifoQueuer  poolr   	QueueFullrQ  s    r>   r  zAsyncSession.init_pool  sS    %%d&6&67			$$T*  $$ s   A AAc                    K   | j                   j                          d {   }|t        | j                        }|S 7 w)NrY  )r  r|   r   r   r   r  s     r>   pop_curlzAsyncSession.pop_curl  s5     YY]]_$<djj)D %s   A?Ac                 n    	 | j                   j                  |       y # t        j                  $ r Y y w xY wrU   )r  r   r  r  r  s     r>   	push_curlzAsyncSession.push_curl  s1    	II  &   		s    44c                    K   | S wrU   r<   rQ  s    r>   
__aenter__zAsyncSession.__aenter__  s     s   c                 @   K   | j                          d {    y 7 wrU   rl  rn  s     r>   	__aexit__zAsyncSession.__aexit__  s     jjl 	s   c                    K   | j                   j                          d{    d| _        	 	 | j                  j	                         }|r|j                          .7 :# t
        j                  $ r Y yw xY ww)rr  NT)r  rm  r   r  
get_nowaitr  
QueueEmptyr  s     r>   rm  zAsyncSession.close  sl     jj   yy++-JJL	  	! %% s2   A6AA6,A A6A30A62A33A6c                     |j                          | j                  s=| j                  j                  |       |j	                          | j                  |       y |j                          y rU   )clean_after_performr   r  remove_handler  r  rm  r  s     r>   release_curlzAsyncSession.release_curl  sE      "||JJ$$T*JJLNN4 JJLr=   c                   K    | j                   |i |ddi d{   }	 | |j                          d{    y7 #7 # |j                          d{  7   w xY ww)z<Equivalent to ``async with request(..., stream=True) as r:``r   TN)rt  acloseru  s       r>   r   zAsyncSession.stream  sX      !DLL$>&>>>	I**,	 ? #**,sA   A"A A"A A"AA"A"AAAA"c                 F  K   | j                          | j                          d {   } | j                  |d|g|i | |j                  t        j
                  d       | j                  j                  d |j                         d {    t        | |      S 7 v7 w)Nr   r   )
rR  r  r0  r   r"   r|  r  run_in_executorr}  r/   )r   rd   ro  rc  r  s        r>   r~  zAsyncSession.ws_connect  s     ""$]]_$tUCA$A&AG((!,ii''dll;;;t$$ % 	<s"   $B!BA%B!BB!B!r   r   Fr   r   rd   rl   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   c           	      
   $%&'()*K    j                           j                          d{   %  j                  d"i d%d|d|d|d|d|d|d	|d
|d|	d|
d|d|d|d|d|d|d|d|d|d|d|d|d|d|d|d|d|dt        j                  dt        j
                  \  )$&('}|r j                  j                  %      *$%&'() *f	d }% fd!}t        j                   |             } | j                  |       t        t        j
                  '      j                          d{     j                  %$&      }!t        t        t        j                  (            }"t        |"t              r j!                  %       |")|!_        | |!_        ||!_        (|!_        |!S 	  j                  j                  %      ** d{     j                  %$&      }!)|!_        |! j!                  %       S 7 7 7 7# t*        $ rA}# j                  %$&      }!)|!_        t        t-        |#      |#j.                  |!      |#d}#~#ww xY w#  j!                  %       w xY ww)#zOSend the request, see ``curl_cffi.requests.request`` for details on parameters.Nr  r   rd   rl   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   c                  ,  	K   	 
 d {    t        t        j                        j                         s(t        t        j                        j                          t        t        j
                        j                  d        d {    y 7 # t         $ rl} 	j                        }|_        t        t        j
                        j                  t        t        |       | j                  |             Y d } ~ d } ~ ww xY w7 # t        t        j                        j                         s(t        t        j                        j                          t        t        j
                        j                  d        d {  7   w xY wwrU   )r   rO  rt  r   r  r  r   r)   r:   r  r  r   r   r  )r  rJ  r.  r  r   r/  r   r   r$  r   tasks     r>   r}  z%AsyncSession.request.<locals>.performS  s    
;JJ  }=DDFW]]M:>>@w}}a044T:::   Z..tV]L\]C"%CK*55mCFAFFTW6XYYZ ;  }=DDFW]]M:>>@w}}a044T:::sj   FB BB A<FDFB 	DA"D>D DD FA=F
FFFc                 (    j                         y rU   )r  )r  r  r   s    r>   r  z%AsyncSession.request.<locals>.cleanup`  s    !!$'r=   r<   )rR  r  r0  r  r  r  r  
add_handlecreate_taskr  r   r  rO  r   rx   r)   r  rt  astream_taskr   r   r   r:   r  )+r   r   rd   rl   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  rJ  r  r  r.  r  r/  r   r   r$  r  s+   `                     `             @@@@@@@r>   rt  zAsyncSession.request  s&    @ 	""$]]_$AWAWAW B
B
B
 B
 	B

 B
 B
 B
 B
 B
 B
 B
 ,B
 (B
 B
 B
  "!B
" #B
$ %B
& ,'B
( .)B
* $+B
, ,-B
. &/B
0  1B
2 3B
4 *5B
6  7B
8 9B
:  ;B
<  =B
>V]A}h@ ::((.D; ;( "--gi8K))'2w}}m499;;;
 &&tV]DTUC+D,BCM-7!!$'##CK*C#CLCIJ(zz,,T2

 **4HXY!!!$'o %n <*  @**4HXY!#CFAFFC8a?@ !!$'sk   $JHDJH	A<J H  &H'H  +I- JJH   	I*)<I%%I**I- -J  Jr   r   r   r   r   r  r  )2r7   r8   r9   rc   r   r   r   r   r  r  r  r  r  r  r  r  rm  r  r   r   r~  r   r:   r   r   r   r   r	   r   ry   r,   r'   r  rS  rg   r1   r   rC   r    r$   rt  r   r  r|   r  r  r  r  r  r  r  s   @r>   r  r    sZ   K
 *.3 Y'	3
 3j  
  

  % 6:RV#)-)- $*.GN*.'+'+#04!%!%)</39=*.?F26#'6:(,;y(y( y( tT5012	y(
 uT#s(^T%[#wMNOy( tny( +&y( +&y( ~y( uS#X'y( %uUE\':F BCDy( "$y(  }y( )$y( }y(  U38_-!y(" #y($ #%y(& "#'y(( #8,)y(* eC$456+y(, "$-y(.  Xugsl%; ;</y(0 /1y(2 C=3y(4 uS%S/1235y(6 7y(8 9y(: H%;y(v &)D

'C&)D

'C'7+E7H-FGY/Gr=   r  rU   )Ur  r  r   r^  r  collectionsr   concurrent.futuresr   
contextlibr   r   enumr   	functoolsr   ior	   r   r
   typingr   r   r   r   r   r   r   r   r   r   r   urllib.parser   r   r   r   r   r    r   r   r   r    r!   r"   r  r#   r$   r   r&   r'   r(   errorsr)   r*   r   r+   r,   modelsr-   r.   
websocketsr/   rA   ImportErroreventlet.tpoolr@   r1   r:   r  rC   rb   rg   rk   r   r   r  r   r   rS  r   r   rU  r  r<   r=   r>   <module>r     s         1 :  #      W V M M 1 5 5 0 ) % !		 IU  S#XI)*
##t #L6 6;# ;$ ;;C ;tT5/@)A ;c ;|/d3i /c /# /5;; w}}  (]K ]K@[0k [0|H0; H0A  		
  		s$   ,E 1E! EE!E)(E)