o
    )f                     @   sP  d dl Z d dlZd dlZd dl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
mZmZ d dlmZmZmZ d dlmZmZ d dlmZ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!Z!d dl"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. dd
l/m0Z0 ddl1m2Z2m3Z3m4Z4m5Z5m6Z6m7Z7 ddl8m9Z9 ddl:m;Z; ddl+m<Z<m=Z=m>Z>m?Z?m@Z@mAZAmBZBmCZCmDZDmEZE ddl,mFZFmGZGmHZHmIZImJZJ ddlKmLZL ddlMmNZN ddlOmPZPmQZQmRZRmSZSmTZT zd dlUZUd dlUmVZV W n eWy   dZUeXZVY nw dZYerddlZm[Z[ ddl\m]Z] ddl^m_Z_ e`dZae`dZbdecfddZde!jeddddG dd  d Zfe!jeddddG d!d" d"ZgG d#d$ d$ZheUdurXeUjVeiehejdfZkneiejdfZkd%ed&eiehf d'eei d(ed& d)eel ded&eiehf f
d*d+Zme!jedddd,G d-d. d.Znd/ecd0ecdeifd1d2ZoG d3d4 d4ZpG d5d6 d6e>ZqdS )7    N)md5sha1sha256)CookieErrorMorselSimpleCookie)MappingProxyTypeTracebackType)TYPE_CHECKINGAnyCallableDictIterableListMappingOptionalTupleTypeUnioncast)CIMultiDictCIMultiDictProxy	MultiDictMultiDictProxy)URL   )hdrshelpershttp	multipartpayload)AbstractStreamWriter)ClientConnectionErrorClientOSErrorClientResponseErrorContentTypeError
InvalidURLServerFingerprintMismatch
HAS_BROTLI)FormData)
BaseTimerContext	BasicAuthHeadersMixin	TimerNoopbasicauth_from_netrcnetrc_from_envnoopreifyset_exception
set_result)SERVER_SOFTWAREHttpVersionHttpVersion10HttpVersion11StreamWriter)client_logger)StreamReader)DEFAULT_JSON_DECODERJSONDecoderLooseCookiesLooseHeaders
RawHeaders)
SSLContext)ClientRequestClientResponseRequestInfoFingerprint)ClientSession)
Connection)Tracez[^-!#$%&'*+.^_`|~0-9a-zA-Z]z!^application/(?:[\w.+-]+?\+)?jsonreturnc                   C   s   t rdS dS )Nzgzip, deflate, brzgzip, deflater(    rJ   rJ   5lib/python3.10/site-packages/aiohttp/client_reqrep.py_gen_default_accept_encoding^      rL   T)auto_attribsfrozenslotsc                   @   s.   e Zd ZU ee ed< ded< ee ed< dS )ContentDispositiontypezMappingProxyType[str, str]
parametersfilenameN)__name__
__module____qualname__r   str__annotations__rJ   rJ   rJ   rK   rQ   b   s   
 rQ   c                   @   sJ   e Zd ZU eed< eed< ded< e Zeed< ej	defddZ
d	S )
rD   urlmethodCIMultiDictProxy[str]headersreal_urlrI   c                 C      | j S N)rZ   selfrJ   rJ   rK   real_url_defaultp      zRequestInfo.real_url_defaultN)rU   rV   rW   r   rY   rX   attrZibr^   defaultrc   rJ   rJ   rJ   rK   rD   i   s   
 rD   c                   @   sP   e Zd ZeeedZdeddfddZe	defddZ
d	ejddfd
dZdS )rE   )          fingerprintrI   Nc                 C   sH   t |}| j|}|std|tu s|tu rtd|| _|| _d S )Nzfingerprint has invalid lengthz8md5 and sha1 are insecure and not supported. Use sha256.)lenHASHFUNC_BY_DIGESTLENget
ValueErrorr   r   	_hashfunc_fingerprint)rb   rj   Z	digestlenZhashfuncrJ   rJ   rK   __init__|   s   
zFingerprint.__init__c                 C   r_   r`   )rp   ra   rJ   rJ   rK   rj      rd   zFingerprint.fingerprint	transportc                 C   s`   | dsd S | d}|jdd}| | }|| jkr.| d^}}}t| j|||d S )NZ
sslcontextZ
ssl_objectT)Zbinary_formZpeername)Zget_extra_infoZgetpeercertro   Zdigestrp   r'   )rb   rr   ZsslobjZcertZgothostport_rJ   rJ   rK   check   s   


zFingerprint.check)rU   rV   rW   r   r   r   rl   bytesrq   propertyrj   asyncioZ	Transportrv   rJ   rJ   rJ   rK   rE   u   s    rE   sslrA   
verify_sslssl_contextrj   c                 C   s   | d u rd} |d ur|st jdtdd | durtdd} |d ur4t jdtdd | dur2td|} |d urLt jdtdd | durHtdt|} t| tsXtd	| | S )
NTz/verify_ssl is deprecated, use ssl=False instead   
stacklevelzNverify_ssl, ssl_context, fingerprint and ssl parameters are mutually exclusiveFz2ssl_context is deprecated, use ssl=context insteadzCfingerprint is deprecated, use ssl=Fingerprint(fingerprint) insteadzFssl should be SSLContext, bool, Fingerprint or None, got {!r} instead.)	warningswarnDeprecationWarningrn   rE   
isinstanceSSL_ALLOWED_TYPES	TypeErrorformat)rz   r{   r|   rj   rJ   rJ   rK   _merge_ssl_params   sR   
r   )rN   rP   rO   c                   @   s`   e Zd ZU eed< ee ed< eed< ee	ee
f ed< ee ed< ee ed< ee ed< dS )	ConnectionKeyrs   rt   is_sslrz   proxy
proxy_authZproxy_headers_hashN)rU   rV   rW   rX   rY   r   intboolr   rA   rE   r   r,   rJ   rJ   rJ   rK   r      s   
 r   response_content_typeexpected_content_typec                 C   s   |dkrt | d uS || v S )Napplication/json)json_rematch)r   r   rJ   rJ   rK   _is_expected_content_type   s   r   c                0   @   s  e Zd ZejejejejhZej	ej
ejhZeeejhZejdeje iZdZdZdZdZdZdde dddejddddddddddddddddeded	eeeef  d
ee  de!e de"dee# dee$ dej%dee dee& de&dee'j( dee)d  dee dee$ dee* ded de+e,e&e-f dee  dee.d  de&d ee f.d!d"Z/dcd#e0d$dfd%d&Z1e2d$ed' fd(d)Z3e3j4d*ed' d$dfd+d)Z3d$e&fd,d-Z5e2d$e+d.e&e-f fd/d0Z6e2d$e7fd1d2Z8e2d$efd3d4Z9e2d$ee: fd5d6Z;e2d$e<fd7d8Z=ded$dfd9d:Z>de+ej%ef d$dfd;d<Z?d
ee  d$dfd=d>Z@de!e d$dfd?d@ZAdee# d$dfdAdBZBde"d$dfdCdDZCdddEdFZDdedee$ de&d$dfdGdHZEdIe"d$dfdJdKZFdedLe&d$dfdMdNZGdee dee$ dee  d$dfdOdPZHd$e&fdQdRZId*eJdSdTd$dfdUdVZKdfdWdXZLdddYdZZMddd[d\ZNdeded]eOd$dfd^d_ZPdeded
d`d$dfdadbZQdS )grB   z*/*    NFT)paramsr]   skip_auto_headersdatacookiesauthversioncompresschunked	expect100loopresponse_classr   r   timersessionrz   proxy_headerstraces	trust_envserver_hostnamer[   rZ   r   r]   r   r   r   r   r   r   r   r   r   r   rC   r   r   r   r   rF   rz   r   r   rH   r   r   c                C   s  |d u rt  }t|}|rtd|dt|ts J |t|ttd fs-J |td|| _	|rJt
|j}||}||j ||}|| _|d | _| | _|| _|
| _|| _d | _|d u rkt}n|}|| _|d urv|nt | _|d ur|nd| _|| _| rtt !d| _"| #|	 | $| | %| | &| | '| | (| | )|| | *||| | +| |d us| j| j,vr| -  | .| |d u rg }|| _/d S )Nz+Method cannot contain non-token characters z# (found at least {match.group()!r})rF   Tr   )0ry   Zget_event_loop_CONTAINS_CONTROL_CHAR_REsearchrn   r   r   rR   r   _sessionr   ZqueryZ
with_queryextendoriginal_urlwith_fragmentrZ   upperr[   r   r   r   lengthrC   r   r.   _timer_sslr   	get_debug	tracebackextract_stacksys	_getframe_source_tracebackupdate_versionupdate_hostupdate_headersupdate_auto_headersupdate_cookiesupdate_content_encodingupdate_authupdate_proxyupdate_body_from_dataGET_METHODSupdate_transfer_encodingupdate_expect_continue_traces)rb   r[   rZ   r   r]   r   r   r   r   r   r   r   r   r   r   r   r   r   r   rz   r   r   r   r   r   qZurl2Zreal_response_classrJ   rJ   rK   rq     s\   














zClientRequest.__init__ru   rI   c                 C   
   d | _ d S r`   _ClientRequest__writerrb   ru   rJ   rJ   rK   __reset_writerW     
zClientRequest.__reset_writerasyncio.Task[None]c                 C   r_   r`   r   ra   rJ   rJ   rK   _writerZ  rd   zClientRequest._writerwriterc                 C   :   | j d ur| j | j || _ |d ur|| j d S d S r`   )r   remove_done_callback_ClientRequest__reset_writeradd_done_callbackrb   r   rJ   rJ   rK   r   ^     
c                 C   s   | j jdv S )N)ZhttpsZwss)rZ   Zschemera   rJ   rJ   rK   r   f  rM   zClientRequest.is_sslrA   c                 C   r_   r`   )r   ra   rJ   rJ   rK   rz   i  rd   zClientRequest.sslc                 C   sL   | j }|rttdd | D }nd }t| j| j|  | j| j	| j
|S )Nc                 s   s    | ]	\}}||fV  qd S r`   rJ   ).0kvrJ   rJ   rK   	<genexpr>q  s    z/ClientRequest.connection_key.<locals>.<genexpr>)r   hashtupleitemsr   rs   rt   r   rz   r   r   )rb   r   hrJ   rJ   rK   connection_keym  s   zClientRequest.connection_keyc                 C   s   | j j}|d us
J |S r`   )rZ   raw_host)rb   retrJ   rJ   rK   rs   ~  s   zClientRequest.hostc                 C   s   | j jS r`   )rZ   rt   ra   rJ   rJ   rK   rt     s   zClientRequest.portc                 C   s   t | j}t| j| j|| jS r`   )r   r]   rD   rZ   r[   r   )rb   r]   rJ   rJ   rK   request_info  s   
zClientRequest.request_infoc                 C   s:   |j st||j|j}}|rt||pd| _dS dS )z8Update destination host, port and connection type (ssl). N)r   r&   userpasswordr   r,   r   )rb   rZ   Zusernamer   rJ   rJ   rK   r     s   zClientRequest.update_hostc                 C   sj   t |tr0dd |ddD }ztt|d t|d }W n ty/   td| dw || _dS )zdConvert request version to two elements tuple.

        parser HTTP version '1.1' => (1, 1)
        c                 S   s   g | ]}|  qS rJ   )strip)r   partrJ   rJ   rK   
<listcomp>  s    z0ClientRequest.update_version.<locals>.<listcomp>.r   r   z#Can not parse http version number: N)r   rX   splitr   r6   r   rn   r   )rb   r   r   rJ   rJ   rK   r     s   
 
zClientRequest.update_versionc                 C   s   t  | _tt| jj}t|rd| d}|d}| jj	dur0| j
 s0|dt| jj	 7 }|| jtj< |r^t|tttfrD| }|D ]\}}| dkrV|| j|< qF| j|| qFdS dS )zUpdate request headers.[]r   N:rs   )r   r]   r   rX   rZ   r   r   is_ipv6_addressrstriprt   Zis_default_portr   ZHOSTr   dictr   r   r   loweradd)rb   r]   ZnetlockeyvaluerJ   rJ   rK   r     s"   

zClientRequest.update_headersc                 C   sv   t dd t|D | _| j }|| j | j D ]\}}||vr+| j|| qt	j
|vr9t| jt	j
< d S d S )Nc                 s   s    | ]}|d fV  qd S r`   rJ   )r   hdrrJ   rJ   rK   r     s    
z4ClientRequest.update_auto_headers.<locals>.<genexpr>)r   sortedr   r]   copyr   DEFAULT_HEADERSr   r   r   Z
USER_AGENTr5   )rb   r   Zused_headersr   valrJ   rJ   rK   r     s   


z!ClientRequest.update_auto_headersc                 C   s   |sdS t  }tj| jv r|| jtjd | jtj= t|tr'| }n|}|D ]$\}}t|t	rK||j
t	 }||j
|j|j |||< q+|||< q+|jddd | jtj< dS )zUpdate request cookies header.Nr   ;)headersep)r   r   ZCOOKIEr]   loadrm   r   r   r   r   r   setr   Zcoded_valueoutputr   )rb   r   cZiter_cookiesnamer   Zmrsl_valrJ   rJ   rK   r     s    





zClientRequest.update_cookiesc                 C   sj   |du rdS | j tjd }|r| jrtddS | jr3t| jts'd| _| j| j tj< d| _	dS dS )zSet request content encoding.Nr   z9compress can not be set if Content-Encoding header is setZdeflateT)
r]   rm   r   ZCONTENT_ENCODINGr   r   rn   r   rX   r   )rb   r   encrJ   rJ   rK   r     s   
z%ClientRequest.update_content_encodingc                 C   s   | j tjd }d|v r| jrtddS | jr,tj| j v r$tdd| j tj< dS tj| j vr?tt	| j
| j tj< dS dS )z!Analyze transfer-encoding header.r   r   zDchunked can not be set if "Transfer-Encoding: chunked" header is setz6chunked can not be set if Content-Length header is setN)r]   rm   r   ZTRANSFER_ENCODINGr   r   rn   CONTENT_LENGTHrX   rk   body)rb   terJ   rJ   rK   r     s    z&ClientRequest.update_transfer_encodingc                 C   s   |du r| j }|du r2|r2| jjdur2t }tt t|| jj}W d   n1 s-w   Y  |du r8dS t|t	j
sBtd| | jtj< dS )zSet basic auth.Nz%BasicAuth() tuple is required instead)r   rZ   rs   r0   
contextlibsuppressLookupErrorr/   r   r   r,   r   encoder]   r   ZAUTHORIZATION)rb   r   r   Z	netrc_objrJ   rJ   rK   r     s   zClientRequest.update_authr   c                 C   s   |d u rd S t |tr| }z
tjj|d d}W n tjy'   t| }Y nw || _| jsMtj	| j
vrM|j}|d u r?d| _ntj	| j
vrMt|| j
tj	< |j
sRJ |j
 D ]\}}|| j
v raqW|| jv rgqW|| j
|< qWd S )N)ZdispositionT)r   r*   r    ZPAYLOAD_REGISTRYrm   r  r   r   r   r   r]   sizerX   r   r   )rb   r   r  r   r   rJ   rJ   rK   r     s2   



z#ClientRequest.update_body_from_dataexpectc                 C   sF   |r	d| j tj< n| j tjd dkrd}|r!| j | _d S d S )Nz100-continuer   T)r]   r   ZEXPECTrm   r   r   Zcreate_future	_continue)rb   r  rJ   rJ   rK   r   @  s   z$ClientRequest.update_expect_continuec                 C   s.   |rt |tjstd|| _|| _|| _d S )Nz,proxy_auth must be None or BasicAuth() tuple)r   r   r,   rn   r   r   r   )rb   r   r   r   rJ   rJ   rK   r   I  s
   
zClientRequest.update_proxyc                 C   sL   | j tk rdS | j tkr| jtjdkrdS dS | jtjdkr$dS dS )NF
keep-aliveTclose)r   r7   r]   rm   r   
CONNECTIONra   rJ   rJ   rK   
keep_aliveU  s   

zClientRequest.keep_aliveconnrG   c              
      s  | j dur!z| I dH  | j I dH  W n tjy    Y dS w |j}|dus*J z.t| jtjr<| j	|I dH  nt| jt
tfrI| jf| _| jD ]
}|	|I dH  qLW na ty } z'|}|jdupmt|tj }|rzt|jd| j}t||| W Y d}~dS d}~w tjy   | I dH  Y dS  ty } zt|td|| W Y d}~dS d}~ww | I dH  |  dS )z-Support coroutines that yields bytes objects.NzCan not write request body for z4Failed to send bytes into the underlying connection )r  Zdrainry   CancelledErrorprotocolr   r   r    ZPayloadwriterw   	bytearrayOSErrorerrnoTimeoutErrorr#   rZ   r3   Z	write_eof	Exceptionr"   Zstart_timeout)rb   r   r  r  chunkZunderlying_excZreraised_excZexc_is_not_timeoutrJ   rJ   rK   write_bytesc  sX   



	zClientRequest.write_bytesc           	         s  | j tjkr&| jj}|d usJ t|rd| d}| d| jj }n| jr3| 	 s3t
| j}n| jj}| jjrC|d| jj 7 }|j}|d usLJ t|| jt| j| j | jt| j| j | jd}| jrn|| j | jd urw|  | j | jv rtj| jvrtj| jvrd| jtj< | jtj}|s|  r| jt krd}n| jt!krd}|d ur|| jtj< d	j"| j || jd
}|#|| jI d H  | j$| %||| _&| j'}|d usJ || j | j(| j&| j)| j*| j+| j,| j| j-d	| _.| j.S )Nr   r   r   ?)Zon_chunk_sentZon_headers_sentzapplication/octet-streamr	  r
  z {0} {1} HTTP/{v.major}.{v.minor})r   )r   continue100r   r   r   r   r   )/r[   r   ZMETH_CONNECTrZ   r   r   r   rt   r   r   rX   Zraw_pathZraw_query_stringr  r9   r   	functoolspartial_on_chunk_request_sent_on_headers_request_sentr   Zenable_compressionr   Zenable_chunkingPOST_METHODSCONTENT_TYPEr   r]   rm   r  r  r   r7   r8   r   Zwrite_headersZcreate_taskr  r   r   r   r  r   r   r   r   response)	rb   r  Zconnect_hostpathr  r   
connectionZstatus_liner   rJ   rJ   rK   send  sz   




zClientRequest.sendc                    sN   | j d ur%ttj | j I d H  W d    d S 1 sw   Y  d S d S r`   )r   r  r  ry   r  ra   rJ   rJ   rK   r
    s   
"zClientRequest.closec                 C   s:   | j d ur| j s| j   | j | j d | _ d S d S r`   )r   r   	is_closedcancelr   r   ra   rJ   rJ   rK   	terminate  s   



zClientRequest.terminater  c                    &   | j D ]}||||I d H  qd S r`   )r   Zsend_request_chunk_sent)rb   r[   rZ   r  tracerJ   rJ   rK   r    s   
z$ClientRequest._on_chunk_request_sentzCIMultiDict[str]c                    r'  r`   )r   Zsend_request_headers)rb   r[   rZ   r]   r(  rJ   rJ   rK   r    s   
z&ClientRequest._on_headers_request_sentr`   rI   N)F)r  rG   rI   rC   )RrU   rV   rW   r   ZMETH_GETZ	METH_HEADZMETH_OPTIONSZ
METH_TRACEr   Z
METH_PATCHZ	METH_POSTZMETH_PUTr  unionZMETH_DELETEZALL_METHODSZACCEPTZACCEPT_ENCODINGrL   r   r   r   r   r   r  	frozensetr   r8   rX   r   r   r   r?   r   r   r>   r,   r6   r   ry   AbstractEventLoopr   r+   r   rA   rE   r   rq   objectr   rx   r   setterr   rz   r   r   rs   r   rt   rD   r   r   r   r   r   r   r   r   r   r   r   r   r  r!   r  r#  r
  r&  rw   r  r  rJ   rJ   rJ   rK   rB      s   	



S
"	


2
Q
rB   c                   @   s  e Zd ZU dZee ed< dZeed< dZ	ee
 ed< dZeed< dZee
 ed< dZeed< dZdZeej ed< d	Zd
ZdZde
deddded dededed dejddddfddZdodeddfddZ e!ded fddZ"e"j#ded ddfd dZ"e$defd!d"Z%e$defd#d$Z&e$defd%d&Z'e$de
fd'd(Z(e$dpd*d+Z)e$defd,d-Z*e$defd.d/Z+e$dee, fd0d1Z-e.fd2e/ddfd3d4Z0de
fd5d6Z1e!ded7 fd8d9Z2e$de3d: fd;d<Z4e$dqd>d?Z5drdAdBZ6dsdCdDZ7e!de8fdEdFZ9dsdGdHZ:de/fdIdJZ;e!de8fdKdLZ<dsdMdNZ=dsdOdPZ>dsdQdRZ?dsdSdTZ@dsdUdVZAdsdWdXZBdeCfdYdZZDde
fd[d\ZEdtd^ee
 d_e
de
fd`daZFdeGdbdcd^ee
 ddeHdeee
 de/fdfdgZIdudhdiZJdjeeKeL  dkeeL dleeM ddfdmdnZNdS )vrC   Nr   statusreasoncontent_headers_raw_headersr   TFr[   rZ   r   r   r  zasyncio.Future[bool]r   r   r   rH   r   r   rF   rI   c          
      C   s   t |tsJ || _t | _|| _|d | _d | _|| _	|| _
d| _d| _|| _|d ur/|nt | _i | _|| _|| _|	| _|	d u rIdd | _n|	j| _| r\ttd| _d S d S )NTrJ   c                  W   s   dS )Nutf-8rJ   )ru   rJ   rJ   rK   <lambda>9  s    z)ClientResponse.__init__.<locals>.<lambda>r   )r   r   r[   r   r   	_real_urlr   _url_bodyr   r  _closed_history_request_infor.   r   _cacher   _loopr   _resolve_charsetr   r   r   r   r   r   )
rb   r[   rZ   r   r  r   r   r   r   r   rJ   rJ   rK   rq     s.   zClientResponse.__init__ru   c                 C   r   r`   _ClientResponse__writerr   rJ   rJ   rK   r   ?  r   zClientResponse.__reset_writerc                 C   r_   r`   r?  ra   rJ   rJ   rK   r   B  rd   zClientResponse._writerc                 C   r   r`   )r@  r   _ClientResponse__reset_writerr   r   rJ   rJ   rK   r   F  r   c                 C   r_   r`   )r7  ra   rJ   rJ   rK   rZ   N  rd   zClientResponse.urlc                 C   s   t jdtdd | jS )NzDeprecated, use .url #1654   r~   )r   r   r   r7  ra   rJ   rJ   rK   url_objR  s   zClientResponse.url_objc                 C   r_   r`   )r6  ra   rJ   rJ   rK   r^   W  rd   zClientResponse.real_urlc                 C   s   | j jd usJ | j jS r`   )r7  rs   ra   rJ   rJ   rK   rs   [  s   zClientResponse.hostr\   c                 C   r_   r`   )r2  ra   rJ   rJ   rK   r]   `  rd   zClientResponse.headersc                 C   r_   r`   )r3  ra   rJ   rJ   rK   raw_headersd  rd   zClientResponse.raw_headersc                 C   r_   r`   )r;  ra   rJ   rJ   rK   r   h  rd   zClientResponse.request_infoc                 C   sF   | j tj}|d u rd S t|\}}t|}t|}t|||S r`   )	r2  rm   r   ZCONTENT_DISPOSITIONr   Zparse_content_dispositionr   Zcontent_disposition_filenamerQ   )rb   rawZdisposition_typeZ
params_dctr   rT   rJ   rJ   rK   content_dispositionl  s   
z"ClientResponse.content_disposition	_warningsc                 C   s   | j rd S | jd ur>| j  |   | j r@d| i}|jd| tfi | | dd}| jr6| j|d< | j	| d S d S d S )NsourcezUnclosed response zUnclosed response)Zclient_responsemessageZsource_traceback)
r9  _connectionrelease_cleanup_writerr=  r   r   ResourceWarningr   Zcall_exception_handler)rb   rG  kwargscontextrJ   rJ   rK   __del__v  s   




zClientResponse.__del__c                 C   s`   t  }t| j}| jr| jddd}nd}td|| j	||d t| j
|d | S )NasciibackslashreplaceNonez<ClientResponse({}) [{} {}]>)file)ioStringIOrX   rZ   r0  r  decodeprintr   r/  r]   getvalue)rb   outZascii_encodable_urlZascii_encodable_reasonrJ   rJ   rK   __repr__  s"   
zClientResponse.__repr__rG   c                 C   r_   r`   )rJ  ra   rJ   rJ   rK   r"    rd   zClientResponse.connection)rC   .c                 C   r_   )z2A sequence of of responses, if redirects occurred.)r:  ra   rJ   rJ   rK   history  s   zClientResponse.history/MultiDictProxy[MultiDictProxy[Union[str, URL]]]c                 C   s   d | jdg }|stt S t }td|D ][}td|}|d u r'q| \}}|ddd  }t }|D ]}	td|	tj	}|d u rJq;| \}
}}}|
|
| q;|d|}
|
d	| j t| |
t|
t| qt|S )
Nz, linkz	,(?=\s*<)z\s*<(.*)>(.*)r   r   z%^\s*(\S*)\s*=\s*(['\"]?)(.*?)(\2)\s*$ZrelrZ   )joinr]   getallr   r   rer   r   groupsMr   rm   rZ   r   rX   )rb   Z	links_strlinksr   r   rZ   Z
params_strr   r^  Zparamr   ru   r   rJ   rJ   rK   rd    s*   
zClientResponse.linksr"  c                    sf  d| _ |j| _|| _| jS 	 z| j}| I dH \}}W n tjy: } zt| j	| j
|j|j|jd|d}~ww |jdk sJ|jdksJ|jdkrKn| jdurYt| jd d| _qW d   n1 sdw   Y  || j |j| _|j| _|j| _|j| _|j| _|| _| jtjdD ]"}z| j| W q ty } zt d	| W Y d}~qd}~ww | S )
zStart response processing.FTNr/  rI  r]   d      e   rJ   z!Can not load response cookies: %s)!r9  r  Z	_protocolrJ  r   readr   ZHttpProcessingErrorr$   r   r\  coderI  r]   r  r4   Zon_eof_response_eofr   r/  r0  r2  rD  r3  r1  r`  r   Z
SET_COOKIEr   r   r   r:   Zwarning)rb   r"  r  rI  r    excr   rJ   rJ   rK   start  sX   	
zClientResponse.startc                 C   sD   | j rd S | jo| jj}|d ur|jrd S d| _ |   |   d S NT)r9  rJ  r  upgradedrL  _release_connection)rb   r  rJ   rJ   rK   rk    s   zClientResponse._response_eofc                 C   r_   r`   )r9  ra   rJ   rJ   rK   closed  rd   zClientResponse.closedc                 C   sV   | j s|   d| _| jd u s| j rd S |   | jd ur)| j  d | _d S d S rn  )	_released_notify_contentr9  r=  r$  rL  rJ  r
  ra   rJ   rJ   rK   r
  	  s   


zClientResponse.closec                 C   s*   | j s|   d| _|   |   t S rn  )rr  rs  r9  rL  rp  r1   ra   rJ   rJ   rK   rK    s   zClientResponse.releasec                 C   s
   d| j kS )zReturns ``True`` if ``status`` is less than ``400``, ``False`` if not.

        This is **not** a check for ``200 OK`` but a check that the response
        status is under 400.
        i  )r/  ra   rJ   rJ   rK   ok   s   
zClientResponse.okc                 C   s<   | j s| jd us
J |   t| j| j| j| j| jdd S )Nre  )rt  r0  rK  r$   r   r\  r/  r]   ra   rJ   rJ   rK   raise_for_status)  s   zClientResponse.raise_for_statusc                    sD    j d ur  jd u r j   d  _ d S  j fdd d S d S )Nc                    s      S r`   )rp  )fra   rJ   rK   r5  <  s    z4ClientResponse._release_connection.<locals>.<lambda>)rJ  r   rK  r   ra   rJ   ra   rK   rp  6  s   



z"ClientResponse._release_connectionc                    $   | j d ur| j I d H  |   d S r`   )r   rp  ra   rJ   rJ   rK   _wait_released>     
zClientResponse._wait_releasedc                 C   s   | j d ur
| j   d | _d S r`   )r   r%  r   ra   rJ   rJ   rK   rL  C  s   


zClientResponse._cleanup_writerc                 C   s.   | j }|r| d u rt|td d| _d S )NConnection closedT)r1  Z	exceptionr3   r"   rr  )rb   r1  rJ   rJ   rK   rs  H  s   
zClientResponse._notify_contentc                    rw  r`   )r   rK  ra   rJ   rJ   rK   wait_for_closeN  ry  zClientResponse.wait_for_closec                    s   | j du r1z| j I dH | _ | jD ]}|| j| j| j I dH  qW n ty0   |    w | j	r8t
d| jo>| jj}|du sF|jsM|  I dH  | j S )zRead response payload.Nrz  )r8  r1  ri  r   Zsend_response_chunk_receivedr[   rZ   BaseExceptionr
  rr  r"   rJ  r  ro  rx  )rb   r(  r  rJ   rJ   rK   ri  S  s&   

zClientResponse.readc                 C   s   | j tjd }t|}|jd}|r2t	t
 t|jW  d    S 1 s-w   Y  |jdkrC|jdksA|jdkrCdS | jd u rLtd| | | jS )Nr   charsetZapplicationjsonZrdapr4  z7Cannot compute fallback encoding of a not yet read body)r]   rm   r   r  r   r   Zparse_mimetyperS   r  r  r  codecslookupr   rR   Zsubtyper8  RuntimeErrorr>  )rb   ctypeZmimetypeencodingrJ   rJ   rK   get_encodingg  s   

 

zClientResponse.get_encodingstrictr  errorsc                    s:   | j du r|  I dH  |du r|  }| j j||dS )z!Read response payload and decode.N)r  )r8  ri  r  rW  )rb   r  r  rJ   rJ   rK   text~  s   
zClientResponse.textr   )r  loadscontent_typer  r  c                   s   | j du r|  I dH  |r+| jtjd }t||s+t| j	| j
d| | jd| j  }|s4dS |du r<|  }|||S )zRead and decodes JSON response.Nr   z3Attempt to decode JSON with unexpected mimetype: %s)rI  r]   )r8  ri  r]   rm   r   r  r   r   r%   r   r\  r   r  rW  )rb   r  r  r  r  strippedrJ   rJ   rK   r~    s$   


	zClientResponse.jsonc                    s   | S r`   rJ   ra   rJ   rJ   rK   
__aenter__  s   zClientResponse.__aenter__exc_typeexc_valexc_tbc                    s   |    |  I d H  d S r`   )rK  r{  )rb   r  r  r  rJ   rJ   rK   	__aexit__  s   	zClientResponse.__aexit__r`   )rI   r\   )rI   r]  )r"  rG   rI   rC   r)  )Nr  )rI   rC   )OrU   rV   rW   r   r   r6   rY   r/  r   r0  rX   r1  r;   r2  r   r3  r@   rJ  r   r   StackSummaryr9  rr  r@  r   r+   rD   r   ry   r,  rq   r-  rA  rx   r   r.  r2   rZ   rC  r^   rs   r]   rD  r   rQ   rF  r   r   rP  r[  r"  r   r\  rd  rm  rk  r   rq  r
  rK  rt  ru  rp  rx  rL  rs  r{  rw   ri  r  r  r<   r=   r~  r  r   r|  r	   r  rJ   rJ   rJ   rK   rC     s   
 	

,	
#
3









 
rC   )rry   r  r  r  rU  ra  r   r   r   Zhashlibr   r   r   Zhttp.cookiesr   r   r   typesr   r	   typingr
   r   r   r   r   r   r   r   r   r   r   r   re   Z	multidictr   r   r   r   Zyarlr   r   r   r   r   r   r    abcr!   Zclient_exceptionsr"   r#   r$   r%   r&   r'   Zcompression_utilsr)   Zformdatar*   r+   r,   r-   r.   r/   r0   r1   r2   r3   r4   r5   r6   r7   r8   r9   logr:   Zstreamsr;   Ztypedefsr<   r=   r>   r?   r@   rz   rA   ImportErrorr-  __all__ZclientrF   Z	connectorrG   tracingrH   compiler   r   rX   rL   srQ   rD   rE   r   rR   r   rw   r   r   r   rB   rC   rJ   rJ   rJ   rK   <module>   s    8 0


"
7
    