
    )Jf                     b   d dl Z d dlmZmZ 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 d dlmZ d dlmZmZmZmZmZmZmZmZ d dlmZmZmZmZmZ d d	l m!Z! d
dl"m#Z#m$Z$m%Z%m&Z&m'Z'm(Z( d
dl)m*Z* ddl+m,Z,m-Z-m.Z. ddl/m0Z0 ddl1m2Z2m3Z3 ddl4m5Z5m6Z6 	 d dl7Z7n# e8$ r Y nw xY w	 d dl9Z:n# e8$ r Y nw xY wdZ; G d de<e
          Z=de<dede<fdZ>dee<         de<de<fdZ?d&dej@        fdZAd&de j@        fdZB eC            ZD G d  d!          ZE G d" d#eE          ZF G d$ d%eE          ZGdS )'    N)contextmanagerasynccontextmanager)Enum)partialmethod)BytesIO)dumps)CallableDictListAnyOptionalTupleUnioncast)ParseResult	parse_qslunquote	urlencodeurlparse)ThreadPoolExecutor   )	AsyncCurlCurl	CurlErrorCurlInfoCurlOptCurlHttpVersion)CURL_WRITEFUNC_ERROR   )CookiesCookieTypes
CurlMorsel)RequestsError)HeadersHeaderTypes)RequestResponsez
WindowsProactorEventLoopPolicy is not supported, you can use the selector loop by:
    asyncio.set_event_loop_policy(asyncio.WindowsSelectorEventLoopPolicy())
c                   P    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ed             ZdS )BrowserTypeedge99edge101chrome99	chrome100	chrome101	chrome104	chrome107	chrome110chrome99_android
safari15_3
safari15_5c                     || j         v S N)__members__)clsitems     ]/home/alex/cs2snipeproduction/venv/lib/python3.11/site-packages/curl_cffi/requests/session.pyhaszBrowserType.has6   s    s&&    N)__name__
__module____qualname__r*   r+   r,   r-   r.   r/   r0   r1   r2   r3   r4   classmethodr;    r<   r:   r)   r)   )   se        FGHIIIII)JJ' ' [' ' 'r<   r)   urlparamsreturnc                    t          |           } t          |           }|j        }t          t	          |                    }|                    |           |                    d |                                D                        t          |d          }t          |j	        |j
        |j        |j        ||j                                                  }|S )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                 l    i | ]1\  }}t          |t          t          f          !|t          |          2S rA   )
isinstancebooldictr   ).0kvs      r:   
<dictcomp>z&_update_url_params.<locals>.<dictcomp>X   s8    XXXAJq4QU,<W<WXE!HHXXXr<   T)doseq)r   r   queryrI   r   updateitemsr   r   schemenetlocpathrC   fragmentgeturl)rB   rC   
parsed_urlget_argsparsed_get_argsencoded_get_argsnew_urls          r:   _update_url_paramsr\   ;   s      #,,C#JH9X..//O6""" XX!6!6!8!8XXX  
 !===   fhh  Nr<   header_lineskeyvaluec                     t          |           D ]N\  }}|                                                    |                                dz             r| d| | |<    dS O|                     | d|            dS )z*Update header line list by key value pair.:: N)	enumeratelower
startswithappend)r]   r^   r_   idxlines        r:   _update_header_lineri   k   s    |,, / /	T::<<""399;;#455 	#& 1 1% 1 1LEE	 	s--e--.....r<   qc                 B    	 | j         d         S # t          $ r |cY S w xY wNr   )queue
IndexErrorrj   defaults     r:   _peek_queuerq   u   s7    wqz       c                 B    	 | j         d         S # t          $ r |cY S w xY wrl   )_queuern   ro   s     r:   _peek_aio_queueru   |   s7    x{   rr   c            3       .   e Zd ZdZg dZ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deeeeef         f         dededeee	ef                  dedee
         dee         dee         dede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fde	de	dee
         deeee	e	f         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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f                  dee         dee         dee	         d%ed&ed'ed(ef2d)Zd* ZdS )+BaseSessionzMProvide common methods for setting curl options and reading info in sessions.)headerscookiesauthproxiesrC   verifytimeoutcert	trust_envmax_redirectsimpersonateNT   F)rx   ry   rz   r{   rC   r|   r}   r   r   r   default_headerscurl_options
curl_infoshttp_versiondebug	interfacerx   ry   rz   r{   rC   r|   r}   r   r   r   r   r   r   r   r   r   c                &   t          |          | _        t          |          | _        || _        |pi | _        || _        || _        || _        || _	        |	| _
        |
| _        || _        |pi | _        |pg | _        || _        || _        || _        d S r6   )r$   rx   r    ry   rz   r{   rC   r|   r}   r   r   r   r   r   r   r   r   r   )selfrx   ry   rz   r{   rC   r|   r}   r   r   r   r   r   r   r   r   r   s                    r:   __init__zBaseSession.__init__   s    ( w''w''	}""*&.(.B$*(
"r<   gzip, deflate, brr   methodrB   datajsonfilesallow_redirectsrefereraccept_encodingcontent_callbackstreammax_recv_speedqueue_classevent_classc                 \  ./0 |}|dk    r!|                     t          j        d           n8|dk    r2|                     t          j        |                                           | j        rt          || j                  }|rt          ||          }|                     t          j        |                                           t          |t                    r"t          |                                          }nt          |t                    r|                                }nVt          |t                    r|                                }n,t          |t                    r|}n|d}nt          d          |#t!          |d                                          }|s|dv rM|                     t          j        |           |                     t          j        t'          |                     t)          | j                  }|                    |           |                    d	          }|:t1          |          }||j        k    s||j        k    r	 |d	= n# t6          $ r Y nw xY wg } |                                D ]\  }!}"|                     |! d
|"             |t=          | dd           t          |t                    r|dk    rt=          | dd           |                     t          j        d | D                        tA          |||          }#|                     t          j!        d           |                     t          j"        d           | j#        $                    |#          D ]4}$|                     t          j"        |$%                                           5|rYtM          |          }%|%$                    |#          D ]4}$|                     t          j"        |$%                                           5|	rtO          d          | j(        s|
r|| j(        r
| j(        \  }&}'|
r|
\  }&}'|                     t          j)        |&                                           |                     t          j*        |'                                           |tV          u r| j,        }|d}t          |tZ                    rm|\  }(})|(|)z   }*|                     t          j.        t_          |(dz                       |s0|                     t          j0        t_          |*dz                       nc|s1|                     t          j0        t_          |dz                       n0|                     t          j.        t_          |dz                       |                     t          j1        t_          |                     |                     t          j2        |p| j3                   | j4        ri | j4        |pi }|r|5                    d          r/|d         &|                     t          j6        |d                    n|5                    d          r|d         |d         5                    d          rto          d          |                     t          j6        |d                    |d         5                    d          s |                     t          j8        d           |du s	| j9        sB|@|                     t          j:        d           |                     t          j;        d           t          |t                    r |                     t          j<        |           |dv r?t          | j9        t                    r%|                     t          j<        | j9                   |r2|                     t          j=        |                                           |2|                     t          j>        |                                           |p| j?        }|| j@        n|}|rDt          B                    |          sto          d| d          |?                    ||           |p| jC        }|r |                     t          jD        |           | jE        F                                D ]\  }!}"|                     |!|"           d }+d /d .d 0|rF |            / |            . |            0./0fd},|                     t          jG        |,           nQ|!|                     t          jG        |           n.t                      }+|                     t          jH        |+           t                      }-|                     t          jI        |-           |dk    r |                     t          jJ        d           |p| jK        }|r2|                     t          jL        |                                           |                     t          jM        |           |#|+|-/.0fS ) NPOSTr   GETr<   z(data must be dict, str, BytesIO or bytes),ra   )
separators)r   PUTPATCHHostrb   Content-Typezapplication/jsonz!application/x-www-form-urlencodedc                 6    g | ]}|                                 S rA   )encode)rJ   hs     r:   
<listcomp>z1BaseSession._set_curl_options.<locals>.<listcomp>  s     %G%G%GQahhjj%G%G%Gr<   ALLzFiles has not been implemented.r   i  zhttp://httpzhttps://httpszYou are using http proxy WRONG, the prefix should be 'http://' not 'https://',see: https://github.com/yifeikong/curl_cffi/issues/6socksF)NTzimpersonate z is not supported)r   c                                                      s                                                                  rt          S                     |            d S r6   )is_setsetr   
put_nowait)chunkheader_recvedrj   quit_nows    r:   qputz+BaseSession._set_curl_options.<locals>.qput  sY    $++-- (!%%'''??$$ 0//U#####r<   HEAD)Nsetoptr   r   CUSTOMREQUESTr   rC   r\   URLrG   rI   r   strr   readbytes	TypeErrorr   
POSTFIELDSPOSTFIELDSIZElenr$   rx   rP   getr   rS   hostnameKeyErrormulti_itemsrf   ri   
HTTPHEADERr&   
COOKIEFILE
COOKIELISTry   get_cookies_for_curlto_curl_formatr    NotImplementedErrorrz   USERNAMEPASSWORDnot_setr}   tupleCONNECTTIMEOUT_MSint
TIMEOUT_MSFOLLOWLOCATION	MAXREDIRSr   r{   re   PROXYr#   HTTPPROXYTUNNELr|   SSL_VERIFYPEERSSL_VERIFYHOSTCAINFOREFERERACCEPT_ENCODINGr   r   r)   r;   r   HTTP_VERSIONr   rQ   WRITEFUNCTION	WRITEDATA
HEADERDATANOBODYr   	INTERFACEMAX_RECV_SPEED_LARGE)1r   curlr   rB   rC   r   r   rx   ry   r   rz   r}   r   r   r{   r|   r   r   r   r   r   r   r   r   r   r   r   cbodyr   host_headerur]   rK   rL   reqmorseltemp_cookiesusernamepasswordconnect_timeoutread_timeoutall_timeoutbufferr   header_bufferr   rj   r   s1                                                 @@@r:   _set_curl_optionszBaseSession._set_curl_options   s	   :  VHHW\1%%%%u__HHW*FMMOO<<< ; 	7$S$+66C 	2$S&11C	cjjll+++ dD!! 	HT??))++DDc"" 		H;;==DDg&& 	H99;;DDe$$ 	HDD\DDFGGG*555<<>>D
  	76555HHW'...HHW*CII666 DL!!	
 eeFmm"Aah&&+*C*C&		   D MMOO 	- 	-DAq1,,,,n>PQQQdD!! 	f&6&6n.Q   	
#%G%G,%G%G%GHHHc1f%% 	
#S)))	#U+++l77<< 	E 	EFKK*F,A,A,C,CDDDD 	I"7++L&;;C@@ I IG.0E0E0G0GHHHH  	I%&GHHH 9 	: 	:y /%)Y"( *%)"(HHW%x'8'8999HHW%x'8'8999 glG?Ggu%% 
	I,3)O\)L8KHHW.Od4J0K0KLLL F+St1C-D-DEEE I+S4-@-@AAAA2C$4G4GHHH 	
'_)=)=>>> 	
"M$GT5GHHH < 	:99'-R9G 	=~~i(( =6?.HHW]GFO<<<
++ 
=7#/w'22:>> +S   HHW]GG,<==="7+66w?? =!8!<<< U??$+?&.HHW+Q///HHW+Q/// fc"" 	-HHW^V,,, \!!jc&B&B!HHW^T[111  	8HHW_gnn&6&6777 &HHW,o.D.D.F.FGGG "5T%5$3$;D   	  	H??;// S#$Q;$Q$Q$QRRRMM+MGGG $8t'8 	9HHW)<888 %++-- 	 	DAqHHQNNNN 	0A'KMMM"{}}H$ $ $ $ $ $ $ HHW*D1111)HHW*,<====YYFHHW&///			#]333VHHW^Q''' /	 	<HHW&	(8(8(:(:;;; 	
-~>>>FM1mXEEs   I 
I+*I+c                    |}t          |          }t          t          |                    t          j                                                            |_        |r|                                |_	        t          t          |                    t          j                            |_        t          t          |                    t          j                            |_        d|j        cxk    odk     nc |_        |                                                                }g }|D ]}|                                s|                    d          r/|                    |                                          |_        g }[|                    d          s|                    d          r|dxx         |z  cc<   |                    |           t-          |          |_        d |                    t          j                  D             }	| j                            |	           | j        |_        |j                            dd	
          }
t9          j        d|
          }|r|                    d          nd}||_        ||_         t          tB          |                    t          j"                            |_#        t          t          |                    t          j$                            |_%        t          t          |                    t          j&                                                            |_'        | j(        D ]}|                    |          |j)        |<    |S )N   i  s   HTTP/       	r   c                 6    g | ]}t          j        |          S rA   )r"   from_curl_format)rJ   ls     r:   r   z/BaseSession._parse_response.<locals>.<listcomp>  s0     
 
 
/0J'**
 
 
r<   r    )rp   zcharset=([\w-]+)r   zutf-8)*r'   r   r   getinfor   EFFECTIVE_URLdecoderB   getvaluecontentr   r   r   RESPONSE_CODEstatus_codeok
splitlinesstripre   get_reason_phrasereasonrf   r$   rx   r   ry   update_cookies_from_curlr   researchgroupcharsetencodingfloat
TOTAL_TIMEelapsedREDIRECT_COUNTredirect_countREDIRECT_URLredirect_urlr   infos)r   r   r   r   r   rspr]   header_listheader_linemorselscontent_typemr  infos                 r:   _parse_responsezBaseSession._parse_response  s   qkkuaii(>??@@GGII 	, //++CKQYYx/D%E%EFFsAIIh.D$E$EFF----#----$--//::<< ' 	, 	,K$$&& %%h// 00==DDFF
 %%d++ {/E/Ee/L/L B;.{++++k**
 
45IIh>Q4R4R
 
 
 	--g666l {~rBBI)<88 !.!''!***w5!))H,?"@"@AA!#qyy1H'I'IJJqyy1F'G'GHHOOQQO 	. 	.DiiooCIdOO
r<   )r=   r>   r?   __doc__	__attrs__r   r%   r!   r   r   rI   rH   r   r	  r   r)   listr   r   r   r
   r   r   objectr	   r   r   r  rA   r<   r:   rw   rw      s       WW  I" *.)-*."&!%579= $'+%)26#'%## ## ## +&## +&	##
 uS#X'## $## ## ## ueE5L112## ## ## eC$456## ## tn## TN##  /!##" ###$ C=%## ## ## ##T "&EI#)-)- $*.GN $'+"&-1!%)</39=*.26#'7sF sF sF 	sF
 sF uT#s(^S'5@ABsF tnsF +&sF +&sF ~sF uS#X'sF %uUE\':F BCDsF sF  }sF $sF  tSy)*!sF" ##sF$ "#%sF& #8,'sF( eC$456)sF* "$+sF, /-sF. C=/sF0 1sF2 3sF4 5sF6 7sF sF sF sFj4 4 4 4 4r<   rw   c            1           e Zd ZdZ	 	 	 d1d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	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 d2dededee         deeeeef         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         f                  dedee         dee         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d'ed(ef0d)Z e ed*          Z! e ed+          Z" e ed,          Z# e ed-          Z$ e ed.          Z% e ed/          Z& e ed0          Z' xZ(S )3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.NTr   threaduse_thread_local_curlc                 `    t                      j        di | || _        || _        d| _        d| _        |rWt          j                    | _        |rd| _	        || j        _
        dS d| _	        t          | j                  | j        _
        dS |r|nt          | j                  | _        dS )a  
        Parameters set in the init method will be override by the same parameter in request method.

        Parameters:
            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}.
            params: query string for the session.
            verify: whether to verify https certs.
            timeout: how many seconds to wait before giving up. In stream mode, only connect_timeout will be set.
            trust_env: use http_proxy/https_proxy and other environments, default True.
            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.

        Notes:
            This class can be used as a context manager.
            ```
            from curl_cffi.requests import Session

            with Session() as s:
                r = s.get("https://example.com")
            ```
        NTFr   rA   )superr   _thread_use_thread_local_curlrt   	_executor	threadinglocal_local_is_customized_curlr   r   r   _curl)r   r   r  r   kwargs	__class__s        r:   r   zSession.__init__  s    J 	""6"""&;#  		B#/++DK :+/(#'   +0(#'dj#9#9#9   !%A4dj+A+A+ADJJJr<   c                     | j         r\| 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   r"  )
r%  r*  warningswarngetattrr)  r   r   r   r+  r   s    r:   r   zSession.curl$  sj    & 	' QOPPP4;55 :#'dj#9#9#9 ;##:r<   c                 D    | j         t                      | _         | j         S r6   )r&  r   r2  s    r:   executorzSession.executor/  s    >!/11DN~r<   c                     | S r6   rA   r2  s    r:   	__enter__zSession.__enter__5  s    r<   c                 .    |                                   d S r6   closer   argss     r:   __exit__zSession.__exit__8  s    

r<   c                 8    | j                                          dS )Close the session.N)r   r9  r2  s    r:   r9  zSession.close;  s    	r<   c              /      K    | j         |i |ddi}	 |V  |                                 d S # |                                 w xY wNr   T)requestr9  r   r;  r,  r  s       r:   r   zSession.stream?  sX      dlD8F884888	IIIIIKKKKKCIIKKKKs	   / Ar   Fr   r   rB   rC   r   r   rx   ry   r   rz   r}   r   r   r{   r|   r   r   r   r   r   r   r   r   r   rD   c                 ^    !"#$% |r3 j                                           j                                          n j                                |||||||||	|
|||||||||||||t          j        t          j                  \  %!$#}|rt          j                    " !#$% fd} "fd} j        	                    |          }|
                    |           #                                                       !          }"                                 t          $          }t          |t                     r                                  |%|_        ||_        ||_        $|_        |S 	  j        dk    r%t*          j                             j                   nb j        dk    rCt3          j                    j                             j                                                   n                                                        !          }%|_        |                                  S # t<          $ rG}                      !          }%|_        t!          t?          |          |j         |          |d}~ww xY w#                                   w xY w)Send the request, see [curl_cffi.requests.request](/api/curl_cffi.requests/#curl_cffi.requests.request) for details on parameters.)r   rB   rC   r   r   rx   ry   r   rz   r}   r   r   r{   r|   r   r   r   r   r   r   r   r   r   r   r   c                     	                                   nk# t          $ r^}                               }|_                            t          t          |           | j        |                     Y d } ~ nd } ~ ww xY w                                s	                                 
                    d            d S #                                 s	                                 
                    d            w xY wr6   )performr   r  rA  r   r#   r   coder   r   put)	er  r   r   r   r   rj   r   r   s	     r:   rF  z Session.request.<locals>.perform  s   
 IIKKKK  E E E..q&-HHC"%CKLLs1vvqvs!C!CDDDDDDDDE
 )//11 ,%))+++EE$KKKKK )//11 ,%))+++EE$KKKKs,    C 
B AA;6C ;B  C ?Dc                 X                                                                       d S r6   )waitreset)futr   header_parseds    r:   cleanupz Session.request.<locals>.cleanup  s&    ""$$$					r<   eventletgeventN)!r   	duphandlerL  r   rm   Queuer'  Eventr4  submitadd_done_callbackrK  r  r   rq   rG   r#   rA  stream_taskr   r$  rP  tpoolexecuterF  rQ  get_hub
threadpoolspawnr   r   r   rG  )&r   r   rB   rC   r   r   rx   ry   r   rz   r}   r   r   r{   r|   r   r   r   r   r   r   r   r   r   r   rF  rO  rW  r  first_elementrI  r   r   r   rN  r   rj   r   s&   `                              @@@@@@@r:   rA  zSession.requestG  s   :  		##%%AIOO	AAEAWAW+'+-#+%)!5 BX B
 B
>V]A}h:  :	%O--M                           -..w77K))'222    &&q&-@@C (NNM-77 $			##CK)CO#CLCIJ<:--N**195555\X--N$$/55ai@@DDFFFFIIKKK **1fmDD!				  @ @ @**1fmDD!#CFFAFC88a?@ 				s,   <BI J 
JAJJJ J,r   r   r   r   r   DELETEOPTIONS)NNTNNNNNNNNTNNNNr   NNNNNFr   ))r=   r>   r?   r  r   r   r   rH   r   propertyr   r4  r6  r<  r9  r   r   rI   r   r
   r   r   r%   r!   r   r	  r   r	   r)   r   r'   rA  r   headr   postrH  patchdeleteoptions__classcell__r-  s   @r:   r  r    sd       G G
  $ $&*	3B 3Btn3B 3B  $	3B 3B 3B 3B 3B 3Bj   X   X
         ^ "&EI#)-)- $*.?C $'+"&!%!%)</39=*.26#'1z zz z 	z
 uT#s(^S'5@ABz tnz +&z +&z ~z uS#X'z %uUE\': :;<z z  }z $z z  #!z" "##z$ #8,%z& eC$456'z( "$)z* /+z, C=-z. /z0 1z2 
3z z z zx =&))D
-
'
'C=&))D
-
'
'CM'7++E]7H--FmGY//GGGGGr<   r  c            /           e Zd ZdZdddddee         def fdZed             Z	d	 Z
d
 Zd Zd Zd Zd Zd Zed             Z	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 d4dededee         deeeeef         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         f                  ded ee         d!ee         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d+ef.d,Z! e"e!d-          Z# e"e!d.          Z$ e"e!d/          Z% e"e!d0          Z& e"e!d1          Z' e"e!d2          Z( e"e!d3          Z) xZ*S )5AsyncSessionzAAn async request session, cookies and connections will be reused.N
   )loop
async_curlmax_clientsrm  rn  c                    t                      j        di | || _        || _        || _        d| _        |                                  t          j        dk    rwt          j	        
                                                    d          rHt          t          j                    t          j                  rt!          j        t$                     dS dS dS dS )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}.
            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.
            max_redirects: max redirect counts, default unlimited(-1).
            impersonate: which browser version to impersonate in the session.

        Notes:
            This class can be used as a context manager, and it's recommended to use via `async with`.
            ```
            from curl_cffi.requests import AsyncSession

            async with AsyncSession() as s:
                r = await s.get("https://example.com")
            ```
        F)      winNrA   )r#  r   rl  _acurlrn  _closed	init_poolsysversion_infoplatformrd   re   rG   asyncioget_event_loop_policyWindowsProactorEventLoopPolicyr/  r0  WINDOWS_WARN)r   rl  rm  rn  r,  r-  s        r:   r   zAsyncSession.__init__  s    F 	""6"""	 &v%%#,*<*<*>*>*I*I%*P*P%-//1W  , l+++++	 &%%%, ,r<   c                     | j         t          j                    | _         | j        t	          | j                   | _        | j        S )N)rl  )rl  ry  get_running_looprs  r   r2  s    r:   acurlzAsyncSession.acurl  s>    9022DI;#333DK{r<   c                     t          j        | j                  | _        	 	 | j                            d            n# t           j        $ r Y d S w xY w3r6   )ry  	LifoQueuern  poolr   	QueueFullr2  s    r:   ru  zAsyncSession.init_pool  sd    %d&677			$$T****$   	s   < AAc                 v   K   | j                                          d {V }|t          | j                  }|S )Nr"  )r  r   r   r   r   r   s     r:   pop_curlzAsyncSession.pop_curl  sC      Y]]__$$$$$$<dj)))Dr<   c                 h    	 | j                             |           d S # t          j        $ r Y d S w xY wr6   )r  r   ry  r  r  s     r:   	push_curlzAsyncSession.push_curl  sH    	I  &&&&&  	 	 	DD	s    11c                 
   K   | S r6   rA   r2  s    r:   
__aenter__zAsyncSession.__aenter__  s      r<   c                 2   K   |                                   d S r6   r8  r:  s     r:   	__aexit__zAsyncSession.__aexit__  s      

tr<   c                     | j                                          d| _        	 	 | j                                        }|r|                                 n# t
          j        $ r Y dS w xY wH)r>  TN)r  r9  rt  r  
get_nowaitry  
QueueEmptyr  s     r:   r9  zAsyncSession.close!  sz    
	y++-- !JJLLL%   	s   /A A&%A&c                     |                                  | j        sE| j                            |           |                                 |                     |           d S |                                 d S r6   )clean_after_performrt  r  remove_handlerL  r  r9  r  s     r:   release_curlzAsyncSession.release_curl-  sj      """| 	J$$T***JJLLLNN4     JJLLLLLr<   c                   K    | j         |i |ddi d {V }	 |W V  |                                 d {V  d S # |                                 d {V  w xY wr@  )rA  acloserB  s       r:   r   zAsyncSession.stream6  s       DL$>&>>>>>>>>>>>	IIII**,,#**,,s	   < ATr   Fr   r   rB   rC   r   r   rx   ry   r   rz   r}   r   r   r{   r|   r   r   r   r   r   r   r   r   r   c                 <    !"#$%K                                      d{V                        |||||||||	|
|||||||||||||t          j        t          j                  \  $!#"}|r j                                       % !"#$ %fd}  fd}t          j         |                      }|                    |           "	                                 d{V   
                     !          }t          #          }t          |t                    r                                 |$|_        ||_        ||_        #|_        |S 	  j                                       %% d{V   
                     !          }$|_        |                                 S # t&          $ rG} 
                     !          }$|_        t          t)          |          |j        |          |d}~ww xY w#                                  w xY w)rD  N)r   r   rB   rC   r   r   rx   ry   r   rz   r}   r   r   r{   r|   r   r   r   r   r   r   r   r   r   r   r   c                    K   	 	 d {V  nk# t           $ r^}                               }|_                            t	          t          |           | j        |                     Y d } ~ nd } ~ ww xY w                                s                                 	                    d            d {V  d S #                                 s                                 	                    d            d {V  w xY wr6   )
r   r  rA  r   r#   r   rG  r   r   rH  )
rI  r  r   r   r   r   rj   r   r   tasks
     r:   rF  z%AsyncSession.request.<locals>.performy  s6     
&JJJJJJJJ  E E E..tV]KKC"%CKLLs1vvqvs!C!CDDDDDDDDE
 )//11 ,%))+++%%++%%%%%%%%% )//11 ,%))+++%%++%%%%%%%%s-    B> 
A6AA1,B> 1A66B> >ADc                 2                                    d S r6   )r  )rM  r   r   s    r:   rO  z%AsyncSession.request.<locals>.cleanup  s    !!$'''''r<   )r  r   ry  rS  rT  r  
add_handlecreate_taskrV  rK  r  ru   rG   r#   r  rA  rW  r   rm   r   r   rG  )&r   r   rB   rC   r   r   rx   ry   r   rz   r}   r   r   r{   r|   r   r   r   r   r   r   r   r   r   r   rF  rO  rW  r  r]  rI  r   r   r   r   rj   r   r  s&   `                              @@@@@@@r:   rA  zAsyncSession.request>  s     6 ]]__$$$$$$AEAWAW+'+-#+%)5 BX B
 B
>V]A}h8  6	(:((..D& & & & & & & & & & & &( ( ( ( ( ( "-ggii88K))'222$$&&&&&&&&&
 &&tV]CCC+A..M-77 $!!$'''##CK)CO#CLCIJ(z,,T22






 **4GG!!!$''''  @ @ @**4GG!#CFFAFC88a?@ !!$''''s+   "F0 ;H 0
H:AG<<HH Hr   r   r   r   r   r^  r_  r`  )+r=   r>   r?   r  r   r   r   r   ra  r  ru  r  r  r  r  r9  r  r   r   r   rI   r   r
   r   r   r%   r!   r   r	  rH   r	   r)   r   rA  r   rb  r   rc  rH  rd  re  rf  rg  rh  s   @r:   rj  rj    se       KK
 *.-, -, -, Y'	-,
 -, -, -, -, -, -,^   X          
 
 
      "&EI#)-)- $*.?C $'+"&!%!%)</39=*.26#'1n( n(n( n( 	n(
 uT#s(^S'5@ABn( tnn( +&n( +&n( ~n( uS#X'n( %uUE\': :;<n( n(  }n( $n( n(  #!n(" "##n($ #8,%n(& eC$456'n(( "$)n(* /+n(, C=-n(. /n(0 1n( n( n( n(` =&))D
-
'
'C=&))D
-
'
'CM'7++E]7H--FmGY//GGGGGr<   rj  r6   )Hry  
contextlibr   r   rv  r  r'  r/  rm   enumr   	functoolsr   ior   r   r   typingr	   r
   r   r   r   r   r   r   urllib.parser   r   r   r   r   concurrent.futuresr   r   r   r   r   r   r   r   r   r   ry   r    r!   r"   errorsr#   rx   r$   r%   modelsr&   r'   rQ  ImportErroreventlet.tpoolrP  r|  r   r)   r\   ri   rS  rq   ru   r  r   rw   r  rj  rA   r<   r:   <module>r     s    : : : : : : : : 



 				             # # # # # #             J J J J J J J J J J J J J J J J J J J J M M M M M M M M M M M M M M 1 1 1 1 1 1 N M M M M M M M M M M M M M M M ' ' ' ' ' ' 5 5 5 5 5 5 5 5 5 5 ! ! ! ! ! ! ) ) ) ) ) ) ) ) % % % % % % % %	MMMM 	 	 	D		 	 	 	D	' ' ' ' '#t ' ' '$-C - -# - - - -`/d3i /c /# / / / / 5;     w}     &((_ _ _ _ _ _ _ _J^0 ^0 ^0 ^0 ^0k ^0 ^0 ^0Bh0 h0 h0 h0 h0; h0 h0 h0 h0 h0s$   B B%$B%)B. .B65B6