o
    n~bk                     @   s  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 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 d dlmZmZ ddlmZ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+ dd
l,m-Z-m.Z.m/Z/m0Z0 ddlm1Z1 ddl2m3Z3m4Z4 dZ5erddl6m7Z7 ee8ef Z9nej jZ9e$sdej:d< G dd dej;Z<G dd de9e'Z=G dd de=Z>e*fddddddej?ddedee8 dee@ deAdee8 dee4 d e8d!e3d"e>fd#d$ZBdS )%    N)Executor)MorselSimpleCookie)
TYPE_CHECKINGAnyDictIteratorMappingMutableMappingOptionalTupleUnioncast)CIMultiDictistr   )hdrspayload)AbstractStreamWriter)	ETAG_ANYPY_38QUOTED_ETAG_REETagHeadersMixinparse_http_daterfc822_formatted_timesentinelvalidate_etag_value)	RESPONSESSERVER_SOFTWAREHttpVersion10HttpVersion11)Payload)JSONEncoderLooseHeaders)ContentCodingStreamResponseResponsejson_response)BaseRequestSameSitesamesitec                   @   s   e Zd ZdZdZdZdS )r%   deflategzipidentityN)__name__
__module____qualname__r,   r-   r.    r2   r2   ?/usr/local/lib/python3.10/dist-packages/aiohttp/web_response.pyr%   =   s    r%   c                       sH  e Zd ZdZdddddedee dee ddfd	d
Ze	de
fddZe	d{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defdedee deeeeef f ddfddZe	dee
 fddZd|ddZe	defdd Ze	defd!d"Zd}d#ee ddfd$d%Z	d}d&eee
ef  ddfd'd(Ze	d~d*d+Ze	dd-d.Zdddd/ddddd0d1ed2ed3ee d4ee d5eeeef  d6ed7ee
 d8ee
 d9ee d:ee ddfd;d<Zdd/d=d1ed4ee d6eddfd>d?Z e	dee f fd@dAZ!e!j"d2ee ddfdBdAZ!e	def fdCdDZ#e#j"d2eddfdEdDZ#e	dee f fdFdGZ$e$j"d2ee ddfdHdGZ$e	dee%j% fdIdJZ&e&j"d2eeee'e%j%ef  ddfdKdJZ&e	dee( fdLdMZ)e)j"d2eee(ef  ddfdNdMZ)e*j+fdOe,ddfdPdQZ-dReddfdSdTZ.ddWdXZ/dUdVdee0 fdYdZZ1dUdVde0fd[d\Z2d|d]d^Z3d|d_d`Z4dae5ddfdbdcZ6d|dddeZ7ddae5ddfdgdhZ8defdidjZ9dkede:fdldmZ;dked2e:ddfdndoZ<dkeddfdpdqZ=defdrdsZ>de?e fdtduZ@defdvdwZAdxeBde
fdydzZC  ZDS )r&   T   Nstatusreasonheadersr6   r7   r8   returnc                C   sp   d | _ d | _d| _d| _d | _t | _d | _d | _d| _	d| _
i | _|d ur,t|| _nt | _| || d S )NFr   )_body_keep_alive_chunked_compression_compression_forcer   _cookies_req_payload_writer	_eof_sent_body_length_stater   _headers
set_status)selfr6   r7   r8   r2   r2   r3   __init__P   s   zStreamResponse.__init__c                 C   s
   | j d uS N)rA   rG   r2   r2   r3   preparedk   s   
zStreamResponse.preparedOptional[asyncio.Task[None]]c                 C   s   | j r| j jS d S rI   )r@   taskrJ   r2   r2   r3   rM   o   s   zStreamResponse.taskc                 C      | j S rI   )_statusrJ   r2   r2   r3   r6   v      zStreamResponse.statusc                 C   rN   rI   )r<   rJ   r2   r2   r3   chunkedz   rP   zStreamResponse.chunkedc                 C   rN   rI   )r=   rJ   r2   r2   r3   compression~   rP   zStreamResponse.compressionc                 C   rN   rI   )_reasonrJ   r2   r2   r3   r7      rP   zStreamResponse.reason
_RESPONSESc                 C   sT   | j rJ dt|| _|d u r%z	|| j d }W n ty$   d}Y nw || _d S )NzGCannot change the response status code after the headers have been sentr    )rK   intrO   	ExceptionrS   )rG   r6   r7   rT   r2   r2   r3   rF      s   

zStreamResponse.set_statusc                 C   rN   rI   r;   rJ   r2   r2   r3   
keep_alive   rP   zStreamResponse.keep_alivec                 C   s
   d| _ d S )NFrX   rJ   r2   r2   r3   force_close      
zStreamResponse.force_closec                 C   rN   rI   )rC   rJ   r2   r2   r3   body_length   rP   zStreamResponse.body_lengthc                 C   s   t dt | jsJ | jjS )Nzoutput_length is deprecated)warningswarnDeprecationWarningrA   buffer_sizerJ   r2   r2   r3   output_length   s   
zStreamResponse.output_length
chunk_sizec                 C   s6   d| _ tj| jv rtd|durtdt dS dS )z,Enables automatic chunked transfer encoding.Tz>You can't enable chunked encoding when a content length is setNzChunk size is deprecated #1615)r<   r   CONTENT_LENGTHrE   RuntimeErrorr]   r^   r_   )rG   rb   r2   r2   r3   enable_chunked_encoding   s   z&StreamResponse.enable_chunked_encodingforcec                 C   sT   t |tkr|rtjntj}tdt n|dur"t|ts"J dd| _	|| _
dS )z&Enables response compression encoding.z+Using boolean for force is deprecated #3318Nz1force should one of None, bool or ContentEncodingT)typeboolr%   r,   r.   r]   r^   r_   
isinstancer=   r>   )rG   rf   r2   r2   r3   enable_compression   s   
z!StreamResponse.enable_compressionCIMultiDict[str]c                 C   rN   rI   )rE   rJ   r2   r2   r3   r8      rP   zStreamResponse.headersSimpleCookie[str]c                 C   rN   rI   )r?   rJ   r2   r2   r3   cookies   rP   zStreamResponse.cookies/)expiresdomainmax_agepathsecurehttponlyversionr+   namevaluero   rp   rq   rr   rs   rt   ru   r+   c                C   s   | j |}|dur|jdkr| j |d || j |< | j | }|dur)||d< n
|ddkr3|d= |dur;||d< |durFt||d< nd|v rM|d= ||d< |durY||d< |dura||d	< |	duri|	|d
< |
durs|
|d< dS dS )zSet or update response cookie.

        Sets new cookie or updates existent with new value.
        Also updates only those params which are not None.
        NrU   ro   Thu, 01 Jan 1970 00:00:00 GMTrp   zmax-agerr   rs   rt   ru   r+   )r?   getcoded_valuepopstr)rG   rv   rw   ro   rp   rq   rr   rs   rt   ru   r+   oldcr2   r2   r3   
set_cookie   s2   


zStreamResponse.set_cookie)rp   rr   c                C   s(   | j |d | j|ddd||d dS )zBDelete cookie.

        Creates new empty expired cookie.
        NrU   r   rx   )rq   ro   rp   rr   )r?   r{   r   )rG   rv   rp   rr   r2   r2   r3   
del_cookie   s   
zStreamResponse.del_cookiec                       t  jS rI   )supercontent_lengthrJ   	__class__r2   r3   r        zStreamResponse.content_lengthc                 C   sF   |d urt |}| jrtdt|| jtj< d S | jtjd  d S )Nz<You can't set content length when chunked encoding is enable)rV   r<   rd   r|   rE   r   rc   r{   rG   rw   r2   r2   r3   r     s   c                    r   rI   )r   content_typerJ   r   r2   r3   r   #  r   zStreamResponse.content_typec                 C   s   | j  t|| _|   d S rI   )r   r|   _content_type_generate_content_type_headerr   r2   r2   r3   r   (  s   
c                    r   rI   )r   charsetrJ   r   r2   r3   r   .  r   zStreamResponse.charsetc                 C   sZ   | j }|dkrtd| jd usJ |d u r| jdd  n	t| | jd< |   d S )Napplication/octet-streamzYSetting charset for application/octet-stream doesn't make sense, setup content_type firstr   )r   rd   _content_dictr{   r|   lowerr   )rG   rw   ctyper2   r2   r3   r   3  s   c                 C   s   t | jtjS )zuThe value of Last-Modified HTTP header, or None.

        This header is represented as a `datetime` object.
        )r   rE   ry   r   LAST_MODIFIEDrJ   r2   r2   r3   last_modifiedB  s   zStreamResponse.last_modifiedc                 C   s   |d u r| j tjd  d S t|ttfr'tdt	t
|| j tj< d S t|tjr;td| | j tj< d S t|trH|| j tj< d S d S )Nz%a, %d %b %Y %H:%M:%S GMT)rE   r{   r   r   ri   rV   floattimestrftimegmtimemathceildatetimeutctimetupler|   r   r2   r2   r3   r   J  s   
c                 C   sZ   | j tj}|sd S |tkrttdS t|}|sd S |dd\}}tt	||dS )N)rw   r      )is_weakrw   )
rE   ry   r   ETAGr   r   r   	fullmatchgrouprh   )rG   Zquoted_valuematchr   rw   r2   r2   r3   etag[  s   

zStreamResponse.etagc                 C   s   |d u r| j tjd  d S t|tr|tks!t|tr)|jtkr)t| j tj< d S t|tr>t	| d| d| j tj< d S t|trgt|jtrgt	|j |j
rXd|j dnd|j d}|| j tj< d S tdt| d)N"zW/"zUnsupported etag type: z . etag must be str, ETag or None)rE   r{   r   r   ri   r|   r   r   rw   r   r   
ValueErrorrg   )rG   rw   Z	hdr_valuer2   r2   r3   r   k  s$   

"CONTENT_TYPEc                 C   s^   | j d usJ | jd usJ ddd | j  D }|r%| jd | }n| j}|| j|< d S )Nz; c                 s   s"    | ]\}}| d | V  qdS )=Nr2   ).0kvr2   r2   r3   	<genexpr>  s     z?StreamResponse._generate_content_type_header.<locals>.<genexpr>)r   r   joinitemsrE   )rG   r   paramsr   r2   r2   r3   r     s   z,StreamResponse._generate_content_type_headercodingc                    sN   |t jkr%| jd usJ |j| jtj< | j|j | jtj	d  d S d S rI   )
r%   r.   rA   rw   rE   r   CONTENT_ENCODINGrj   Zpopallrc   )rG   r   r2   r2   r3   _do_start_compression  s   
z$StreamResponse._do_start_compressionrequestr)   c                    s`   | j r| | j I d H  d S |jtjd }tD ]}|j|v r-| |I d H   d S qd S )NrU   )	r>   r   r8   ry   r   ACCEPT_ENCODINGr   r%   rw   )rG   r   accept_encodingr   r2   r2   r3   _start_compression  s   
z!StreamResponse._start_compressionc                    s,   | j rd S | jd ur| jS | |I d H S rI   )rB   rA   _startrG   r   r2   r2   r3   prepare  s   
zStreamResponse.preparec                    sD   || _ |j }| _|  I d H  || I d H  |  I d H  |S rI   )r@   rA   _prepare_headersZ_prepare_hook_write_headers)rG   r   writerr2   r2   r3   r     s   zStreamResponse._startc                    s  | j }|d us
J | j}|d usJ | j}|d u r|j}|| _|j}| j}| j D ]}|jdddd  }|	t
j| q+| jrJ| |I d H  | jrl|tkrYtd|j|  d|t
j< t
j|v rk|t
j= n8| jr| j|_|jd u r|tkr| jdkr|  d|t
j< t
j|v r|t
j= nd}n|tkr| jdv r|t
j= | jd	vr|t
jd
 |t
jt  |t
jt t
j|vr|r|t krd|t
j< d S d S |tkrd|t
j< d S d S d S )NrU   )headerr   z@Using chunked encoding is forbidden for HTTP/{0.major}.{0.minor}rQ      F)d   e   f   g   r   r   i0  r   z
keep-aliveclose)!r@   rA   r;   rY   ru   rE   r?   valuesoutputaddr   Z
SET_COOKIEr=   r   r<   r!   rd   formatZenable_chunkingZTRANSFER_ENCODINGrc   _length_checkr   lengthr6   
setdefaultr   DATEr   ZSERVERr   Z
CONNECTIONr    )rG   r   r   rY   ru   r8   cookierw   r2   r2   r3   r     sh   






zStreamResponse._prepare_headersc                    s`   | j }|d us
J | j}|d usJ |j}d|d |d | j| j}||| jI d H  d S )NzHTTP/{}.{} {} {}r   r   )r@   rA   ru   r   rO   rS   Zwrite_headersrE   )rG   r   r   ru   Zstatus_liner2   r2   r3   r     s   zStreamResponse._write_headersdatac                    sX   t |tttfsJ dt| | jrtd| jd u r!td| j|I d H  d S )N#data argument must be byte-ish (%r)z%Cannot call write() after write_eof()z$Cannot call write() before prepare())	ri   bytes	bytearray
memoryviewrg   rB   rd   rA   writerG   r   r2   r2   r3   r     s   


zStreamResponse.writec                    sF   | j rJ d| jd usJ dtjdtdd | j I d H  d S )NzEOF has already been sentResponse has not been startedz2drain method is deprecated, use await resp.write()r   )
stacklevel)rB   rA   r]   r^   r_   drainrJ   r2   r2   r3   r     s   zStreamResponse.drain    c                    sp   t |tttfsJ dt| | jrd S | jd usJ d| j|I d H  d| _d | _| jj	| _
d | _d S )Nr   r   T)ri   r   r   r   rg   rB   rA   	write_eofr@   Zoutput_sizerC   r   r2   r2   r3   r     s   



zStreamResponse.write_eofc                 C   s\   | j rd}n| jr| jd usJ | jj d| jj d}nd}d| jj d| j d| dS )Neof znot prepared<>)rB   rK   r@   methodrr   r   r/   r7   )rG   infor2   r2   r3   __repr__  s   zStreamResponse.__repr__keyc                 C   s
   | j | S rI   rD   rG   r   r2   r2   r3   __getitem__(  r[   zStreamResponse.__getitem__c                 C   s   || j |< d S rI   r   )rG   r   rw   r2   r2   r3   __setitem__+  s   zStreamResponse.__setitem__c                 C   s   | j |= d S rI   r   r   r2   r2   r3   __delitem__.     zStreamResponse.__delitem__c                 C   
   t | jS rI   )lenrD   rJ   r2   r2   r3   __len__1  r[   zStreamResponse.__len__c                 C   r   rI   )iterrD   rJ   r2   r2   r3   __iter__4  r[   zStreamResponse.__iter__c                 C   s   t t| S rI   )hashidrJ   r2   r2   r3   __hash__7  r   zStreamResponse.__hash__otherc                 C   s   | |u S rI   r2   )rG   r   r2   r2   r3   __eq__:  s   zStreamResponse.__eq__)r9   rL   )r9   NrI   )r9   rk   )r9   rl   )r   r)   r9   Nr   )Er/   r0   r1   r   rV   r   r|   r$   rH   propertyrh   rK   rM   r6   rQ   rR   r7   r   r	   r   rF   rY   rZ   r\   ra   re   r   r%   rj   r8   rm   r   r   r   setterr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   objectr   __classcell__r2   r2   r   r3   r&   L   s   



	

4
 

	



;


r&   c                       sz  e Zd Zdddddddddd	dededee dee dee d	ee d
ee dee dee ddf fddZ	e
deeeef  fddZejejejfdedededdfddZe
dee fddZejdeddfddZe
dee f fddZejdee ddfddZd*deddf fddZd d!def fd"d#Zd$eddfd%d&Zd'eddf fd(d)Z  ZS )+r'   Nr4   )	bodyr6   r7   textr8   r   r   zlib_executor_sizezlib_executorr   r6   r7   r   r8   r   r   r   r   r9   c       	            sX  |d ur|d urt d|d u rt }
nt|tst|}
n|}
|d ur,d|v r,t d|d urhtj|
v r>|s9|r=t dnOt|tsKtdt| |d u rQd}|d u rWd}|d | |
tj< ||}d }n%tj|
v rz|d usu|d uryt dn|d ur|d ur|d| 7 }||
tj< t	 j
|||
d	 |d ur|| _n|| _d | _|| _|	| _d S )
Nz&body and text are not allowed togetherr   z,charset must not be in content_type argumentzPpassing both Content-Type header and content_type or charset params is forbiddentext argument must be str (%r)
text/plainutf-8z
; charset=r5   )r   r   ri   r   r   r|   	TypeErrorrg   encoder   rH   r   r   _compressed_body_zlib_executor_size_zlib_executor)rG   r   r6   r7   r   r8   r   r   r   r   Zreal_headersr   r2   r3   rH   ?  sT   







zResponse.__init__c                 C   rN   rI   )r:   rJ   r2   r2   r3   r     rP   zResponse.bodyr   rc   c                 C   s   |d u rd | _ d| _nbt|ttfr|| _ d| _nTztj| | _ }W n tjy4   t	dt
| w d| _| j}| jsO||vrO|j}|d urOt|||< ||vrX|j||< |jrm|j D ]\}}||vrl|||< q`d | _d S )NFzUnsupported body type %rT)r:   _body_payloadri   r   r   r   ZPAYLOAD_REGISTRYry   LookupErrorr   rg   rE   r<   sizer|   r   r8   r   r   )rG   r   r   rc   r8   r  r   rw   r2   r2   r3   r     s2   

c                 C   s    | j d u rd S | j | jpdS )Nr   )r:   decoder   rJ   r2   r2   r3   r     s   
zResponse.textc                 C   s`   |d u st |tsJ dt| | jdkrd| _| jd u r!d| _|| j| _d| _d | _d S )Nr   r   r   r   F)	ri   r|   rg   r   r   r   r:   r   r   )rG   r   r2   r2   r3   r     s   




c                    sT   | j rd S tj| jv rt jS | jd urt| jS | jrd S | j	d ur(t| j	S dS )Nr   )
r<   r   rc   rE   r   r   r   r   r   r:   rJ   r   r2   r3   r     s   



zResponse.content_lengthrw   c                 C   s   t d)Nz#Content length is set automatically)rd   r   r2   r2   r3   r     s   r   r   c                    s   | j rd S | jd u r| j}n| j}|rJ d|| jd us"J | jd us)J |d url| jjtjks9| jdv rCt	 
 I d H  d S | jr^tt|}|| jI d H  t	 
 I d H  d S t	 
tt|I d H  d S t	 
 I d H  d S )Nzdata arg is not supported, got r   )rB   r   r:   r@   rA   _methodr   Z	METH_HEADrO   r   r   r   r   r"   r   r   )rG   r   r   r   r   r2   r3   r     s$   

zResponse.write_eofr   r)   c                    sZ   | j s$tj| jvr$| js$| jd urtt| j| jtj< nd| jtj< t 	|I d H S )N0)
r<   r   rc   rE   r   r:   r|   r   r   r   r   r   r2   r3   r     s   
zResponse._start	zlib_modec                 C   sB   |dksJ t j|d}| j}|d usJ |||  | _d S )Nr   )wbits)zlibcompressobjr:   compressflushr   )rG   r  r  body_inr2   r2   r3   _compress_body  s
   zResponse._compress_bodyr   c                    s   | j s| jrt |I d H S |tjkrg|tjkrdtj ntj}| j	}|d us+J | j
d urFt|| j
krFt | j| j|I d H  n| | | j}|d usTJ |j| jtj< tt|| jtj< d S d S )N   )r   r<   r   r   r%   r.   r-   r  	MAX_WBITSr:   r   r   asyncioget_event_looprun_in_executorr   r  r   rw   rE   r   r   r|   rc   )rG   r   r  r  Zbody_outr   r2   r3   r     s*   


zResponse._do_start_compressionr   )r/   r0   r1   r   rV   r   r|   r$   r   rH   r   r   r   r"   r   r   r   r   rc   r   r   r   r   r   r   r  r%   r   r   r2   r2   r   r3   r'   >  sr    	
F(
r'   r4   zapplication/json)r   r   r6   r7   r8   r   dumpsr   r   r   r6   r7   r8   r   r  r9   c                C   s4   | t ur|s|rtd|| }t||||||dS )Nz3only one of data, text, or body should be specified)r   r   r6   r7   r8   r   )r   r   r'   )r   r   r   r6   r7   r8   r   r  r2   r2   r3   r(   "  s   r(   )Cr  collections.abccollectionsr   enumjsonr   r   r]   r  concurrent.futuresr   http.cookiesr   r   typingr   r   r   r   r	   r
   r   r   r   r   Z	multidictr   r   rU   r   r   abcr   helpersr   r   r   r   r   r   r   r   r   httpr   r   r    r!   r"   Ztypedefsr#   r$   __all__Zweb_requestr)   r|   Z	BaseClass	_reservedEnumr%   r&   r'   r  r   rV   r(   r2   r2   r2   r3   <module>   sz    0,
   u f	
