a
    nJhl                     @   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	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 ddlmZ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, ddlm-Z-m.Z.m/Z/ ddlm0Z0 ddl1m2Z2m3Z3 dZ4erHddl5m6Z6 ee7ef Z8nejjZ8G dd dej9Z:G dd de8e&Z;G dd de;Z<e*fddddddej=deee7 ee> e?ee7 ee3 e7e2e<d	ddZ@dS )    N)Executor)
HTTPStatus)SimpleCookie)TYPE_CHECKINGAnyDictIteratorMutableMappingOptionalUnioncast)CIMultiDictistr   )hdrspayload)AbstractStreamWriter)ZLibCompressor)
ETAG_ANYQUOTED_ETAG_REETagHeadersMixinmust_be_empty_bodyparse_http_daterfc822_formatted_timesentinelshould_remove_content_lengthvalidate_etag_value)SERVER_SOFTWAREHttpVersion10HttpVersion11)Payload)JSONEncoderLooseHeaders)ContentCodingStreamResponseResponsejson_response)BaseRequestc                   @   s   e Zd ZdZdZdZdS )r$   deflategzipidentityN)__name__
__module____qualname__r)   r*   r+    r/   r/   F/var/www/shaz/venv/lib/python3.9/site-packages/aiohttp/web_response.pyr$   7   s   r$   c                       s  e Zd ZdZddddeee ee ddddZe	e
dd	d
Ze	ddddZe	edddZe	e
dddZe	e
dddZe	edddZdreee ddddZe	ee
 dddZddddZe	edddZe	eddd Zdsee dd!d"d#Zdteee
ef  dd$d%d&Ze	d'dd(d)Ze	edd*d+Zdddd,ddddd-eeee ee eeeef  eee
 ee
 ee ee dd.d/d0Zdd,d1eee edd2d3d4Ze	ee d fd5d6Zej ee dd7d8d6Ze	ed fd9d:Z!e!j edd7d;d:Z!e	ee d fd<d=Z"e"j ee dd7d>d=Z"e	ee#j# dd?d@Z$e$j eeee%e#j#ef  dd7dAd@Z$e	ee& ddBdCZ'e'j eee&ef  dd7dDdCZ'e(j)fe*ddEdFdGZ+eddHdIdJZ,dKddLdMdNZ-dKee. dLdOdPZ/dKe.dLdQdRZ0dddSdTZ1dddUdVZ2e3ddWdXdYZ4dddZd[Z5due3ddWd]d^Z6edd_d`Z7ee8dadbdcZ9ee8ddddedfZ:eddadgdhZ;eddidjZ<e=e ddkdlZ>eddmdnZ?e@e
dodpdqZA  ZBS )vr%   T   Nstatusreasonheaders)r3   r4   r5   returnc                C   sv   d | _ d | _d| _d| _d | _t | _d | _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_must_be_empty_body_body_length_stater   _headers
set_status)selfr3   r4   r5   r/   r/   r0   __init__J   s     zStreamResponse.__init__r6   c                 C   s
   | j d uS N)r>   rE   r/   r/   r0   preparedf   s    zStreamResponse.preparedzOptional[asyncio.Task[None]]c                 C   s   | j r| j jS d S d S rH   )r=   taskrI   r/   r/   r0   rK   j   s    zStreamResponse.taskc                 C   s   | j S rH   )_statusrI   r/   r/   r0   r3   q   s    zStreamResponse.statusc                 C   s   | j S rH   )r9   rI   r/   r/   r0   chunkedu   s    zStreamResponse.chunkedc                 C   s   | j S rH   )r:   rI   r/   r/   r0   compressiony   s    zStreamResponse.compressionc                 C   s   | j S rH   )_reasonrI   r/   r/   r0   r4   }   s    zStreamResponse.reason)r3   r4   r6   c                 C   sR   | j rJ dt|| _|d u rHzt| jj}W n tyF   d}Y n0 || _d S )NzGCannot change the response status code after the headers have been sent )rJ   intrL   r   phrase
ValueErrorrO   )rE   r3   r4   r/   r/   r0   rD      s    

zStreamResponse.set_statusc                 C   s   | j S rH   r8   rI   r/   r/   r0   
keep_alive   s    zStreamResponse.keep_alivec                 C   s
   d| _ d S )NFrT   rI   r/   r/   r0   force_close   s    zStreamResponse.force_closec                 C   s   | j S rH   )rA   rI   r/   r/   r0   body_length   s    zStreamResponse.body_lengthc                 C   s   t dt | jsJ | jjS )Nzoutput_length is deprecated)warningswarnDeprecationWarningr>   buffer_sizerI   r/   r/   r0   output_length   s    
zStreamResponse.output_length)
chunk_sizer6   c                 C   s2   d| _ tj| jv rtd|dur.tdt 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)r9   r   CONTENT_LENGTHrC   RuntimeErrorrX   rY   rZ   )rE   r]   r/   r/   r0   enable_chunked_encoding   s    z&StreamResponse.enable_chunked_encoding)forcer6   c                 C   sT   t |tkr*|rtjntj}tdt n|durDt|tsDJ 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+   rX   rY   rZ   
isinstancer:   r;   )rE   ra   r/   r/   r0   enable_compression   s    z!StreamResponse.enable_compressionzCIMultiDict[str]c                 C   s   | j S rH   )rC   rI   r/   r/   r0   r5      s    zStreamResponse.headersc                 C   s   | j S rH   )r<   rI   r/   r/   r0   cookies   s    zStreamResponse.cookies/)expiresdomainmax_agepathsecurehttponlyversionsamesite)namevaluerh   ri   rj   rk   rl   rm   rn   ro   r6   c                C   s   | j |}|dur,|jdkr,| j |d || j |< | j | }|durR||d< n|ddkrf|d= |durv||d< |durt||d< nd|v r|d= ||d< |dur||d< |dur||d	< |	dur|	|d
< |
dur|
|d< 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.
        NrP   rh   Thu, 01 Jan 1970 00:00:00 GMTri   zmax-agerk   rl   rm   rn   ro   )r<   getcoded_valuepopstr)rE   rp   rq   rh   ri   rj   rk   rl   rm   rn   ro   oldcr/   r/   r0   
set_cookie   s0    


zStreamResponse.set_cookie)ri   rk   )rp   ri   rk   r6   c                C   s(   | j |d | j|ddd||d dS )zBDelete cookie.

        Creates new empty expired cookie.
        NrP   r   rr   )rj   rh   ri   rk   )r<   ru   ry   )rE   rp   ri   rk   r/   r/   r0   
del_cookie   s    zStreamResponse.del_cookiec                    s   t  jS rH   )supercontent_lengthrI   	__class__r/   r0   r|     s    zStreamResponse.content_lengthrq   r6   c                 C   sD   |d ur0t |}| jrtdt|| jtj< n| jtjd  d S )Nz<You can't set content length when chunked encoding is enable)rQ   r9   r_   rv   rC   r   r^   ru   rE   rq   r/   r/   r0   r|     s    c                    s   t  jS rH   )r{   content_typerI   r}   r/   r0   r     s    zStreamResponse.content_typec                 C   s   | j  t|| _|   d S rH   )r   rv   _content_type_generate_content_type_headerr   r/   r/   r0   r   "  s    
c                    s   t  jS rH   )r{   charsetrI   r}   r/   r0   r   (  s    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   r_   _content_dictru   rv   lowerr   )rE   rq   ctyper/   r/   r0   r   -  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   rC   rs   r   LAST_MODIFIEDrI   r/   r/   r0   last_modified<  s    zStreamResponse.last_modifiedc                 C   s   |d u r| j tjd  nlt|ttfrJtdt	t
|| j tj< n<t|tjrptd| | j tj< nt|tr|| j tj< d S )Nz%a, %d %b %Y %H:%M:%S GMT)rC   ru   r   r   rd   rQ   floattimestrftimegmtimemathceildatetimeutctimetuplerv   r   r/   r/   r0   r   D  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)rq   r      )is_weakrq   )
rC   rs   r   ETAGr   r   r   	fullmatchgrouprc   )rE   Zquoted_valuematchr   rq   r/   r/   r0   etagU  s    

zStreamResponse.etagc                 C   s   |d u r| j tjd  nt|tr,|tks@t|trN|jtkrNt| j tj< nt|trvt	| d| d| j tj< ndt|trt|jtrt	|j |j
rd|j dnd|j d}|| j tj< ntdt| dd S )N"zW/"zUnsupported etag type: z . etag must be str, ETag or None)rC   ru   r   r   rd   rv   r   r   rq   r   r   rS   rb   )rE   rq   Z	hdr_valuer/   r/   r0   r   e  s$    

")CONTENT_TYPEr6   c                 C   s^   | j d usJ | jd usJ ddd | j  D }|rJ| jd | }n| j}|| j|< d S )Nz; c                 s   s    | ]\}}| d | V  qdS )=Nr/   ).0kvr/   r/   r0   	<genexpr>      z?StreamResponse._generate_content_type_header.<locals>.<genexpr>)r   r   joinitemsrC   )rE   r   paramsr   r/   r/   r0   r   z  s    z,StreamResponse._generate_content_type_headercodingr6   c                    sH   |t jkrD| jd usJ |j| jtj< | j|j | jtj	d  d S rH   )
r$   r+   r>   rq   rC   r   CONTENT_ENCODINGre   Zpopallr^   )rE   r   r/   r/   r0   _do_start_compression  s
    
z$StreamResponse._do_start_compressionr(   requestr6   c                    s\   | j r| | j I d H  n>|jtjd }tD ]$}|j|v r2| |I d H   d S q2d S )NrP   )	r;   r   r5   rs   r   ACCEPT_ENCODINGr   r$   rq   )rE   r   accept_encodingr   r/   r/   r0   _start_compression  s    
z!StreamResponse._start_compressionc                    s:   | j r
d S | jd ur| jS t|j| j| _| |I d H S rH   )r?   r>   r   methodr3   r@   _start)rE   r   r/   r/   r0   prepare  s    
zStreamResponse.preparec                    sB   || _ |j }| _|  I d H  || I d H  |  I d H  |S rH   )r=   r>   _prepare_headersZ_prepare_hook_write_headers)rE   r   writerr/   r/   r0   r     s    zStreamResponse._startc                    s  | j }|d usJ | j}|d us$J | j}|d u r8|j}|| _|j}| j}| j D ]&}|jdddd  }|	t
j| qT| jr| |I d H  | jr|tkrtd|j| js|  d|t
j< t
j|v r|t
j= nN| jr*| j|_|jd u r*|tkr| js*|  d|t
j< n| js*d}| jrlt
j|v rVt|j| jrV|t
j= t
j|v rz|t
j= n|t
jd |t
jt  |t
j t! t
j"|vr|r|t#krd|t
j"< n|tkrd	|t
j"< d S )
NrP   )headerr   z@Using chunked encoding is forbidden for HTTP/{0.major}.{0.minor}rM   Fr   z
keep-aliveclose)$r=   r>   r8   rU   rn   rC   r<   valuesoutputaddr   Z
SET_COOKIEr:   r   r9   r    r_   formatr@   Zenable_chunkingZTRANSFER_ENCODINGr^   _length_checkr|   lengthr   r   r3   
setdefaultr   ZDATEr   ZSERVERr   Z
CONNECTIONr   )rE   r   r   rU   rn   r5   cookierq   r/   r/   r0   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=   r>   rn   r   rL   rO   Zwrite_headersrC   )rE   r   r   rn   Zstatus_liner/   r/   r0   r     s    zStreamResponse._write_headersdatar6   c                    sV   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())	rd   bytes	bytearray
memoryviewrb   r?   r_   r>   writerE   r   r/   r/   r0   r     s    


zStreamResponse.writec                    sD   | 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)r?   r>   rX   rY   rZ   drainrI   r/   r/   r0   r     s    zStreamResponse.drainr   c                    sn   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)rd   r   r   r   rb   r?   r>   	write_eofr=   Zoutput_sizerA   r   r/   r/   r0   r     s    


zStreamResponse.write_eofc                 C   s\   | j rd}n2| 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<>)r?   rJ   r=   r   rk   r~   r,   r4   )rE   infor/   r/   r0   __repr__!  s    zStreamResponse.__repr__)keyr6   c                 C   s
   | j | S rH   rB   rE   r   r/   r/   r0   __getitem__+  s    zStreamResponse.__getitem__)r   rq   r6   c                 C   s   || j |< d S rH   r   )rE   r   rq   r/   r/   r0   __setitem__.  s    zStreamResponse.__setitem__c                 C   s   | j |= d S rH   r   r   r/   r/   r0   __delitem__1  s    zStreamResponse.__delitem__c                 C   s
   t | jS rH   )lenrB   rI   r/   r/   r0   __len__4  s    zStreamResponse.__len__c                 C   s
   t | jS rH   )iterrB   rI   r/   r/   r0   __iter__7  s    zStreamResponse.__iter__c                 C   s   t t| S rH   )hashidrI   r/   r/   r0   __hash__:  s    zStreamResponse.__hash__)otherr6   c                 C   s   | |u S rH   r/   )rE   r   r/   r/   r0   __eq__=  s    zStreamResponse.__eq__)N)N)N)r   )Cr,   r-   r.   r   rQ   r
   rv   r#   rF   propertyrc   rJ   rK   r3   rM   rN   r4   rD   rU   rV   rW   r\   r`   r   r$   re   r5   r   rf   ry   rz   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__r/   r/   r}   r0   r%   F   s     4
	
B

r%   c                       s8  e Zd Zdddddddddd	eeee ee ee ee ee ee ee dd
 fddZ	e
eeeef  ddd	Zejedd
dd	Ze
ee dddZejeddddZe
ee d fddZejee ddddZdedd fddZded fddZedd fddZ  ZS ) r&   Nr1   )	bodyr3   r4   textr5   r   r   zlib_executor_sizezlib_executor)
r   r3   r4   r   r5   r   r   r   r   r6   c       	            s^  |d ur|d urt d|d u r(t }
nt|ts<t|}
n|}
|d urXd|v rXt d|d urtj|
v r||sr|rt dnRt|tstdt| |d u rd}|d u rd}|d | |
tj< ||}d }nNtj|
v r|d us|d urt dn*|d ur|d ur|d| 7 }||
tj< t	 j
|||
d	 |d urB|| _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=r2   )rS   r   rd   r   r   rv   	TypeErrorrb   encoder{   rF   r   r   _compressed_body_zlib_executor_size_zlib_executor)rE   r   r3   r4   r   r5   r   r   r   r   Zreal_headersr}   r/   r0   rF   B  sP    









zResponse.__init__rG   c                 C   s   | j S rH   )r7   rI   r/   r/   r0   r     s    zResponse.body)r   r6   c                 C   s   |d u rd | _ d| _nt|ttfr2|| _ d| _nztj| | _ }W n$ tjyl   t	dt
| Y n0 d| _| j}tj|vr|j|tj< |jr|j D ]\}}||vr|||< qd | _d S )NFzUnsupported body type %rT)r7   _body_payloadrd   r   r   r   ZPAYLOAD_REGISTRYrs   LookupErrorrS   rb   rC   r   r   r   r5   r   r   )rE   r   r5   r   rq   r/   r/   r0   r     s&    

c                 C   s    | j d u rd S | j | jpdS )Nr   )r7   decoder   rI   r/   r/   r0   r     s    
zResponse.text)r   r6   c                 C   s`   |d u s"t |ts"J dt| | jdkr2d| _| jd u rBd| _|| j| _d| _d | _d S )Nr   r   r   r   F)	rd   rv   rb   r   r   r   r7   r   r   )rE   r   r/   r/   r0   r     s    



c                    sX   | j r
d S tj| jv rt jS | jd ur2t| jS | jr<d S | j	d urPt| j	S dS d S )Nr   )
r9   r   r^   rC   r{   r|   r   r   r   r7   rI   r}   r/   r0   r|     s    



zResponse.content_lengthr   c                 C   s   t dd S )Nz#Content length is set automatically)r_   r   r/   r/   r0   r|     s    r   r   c                    s   | j r
d S | jd u r| j}n| j}|r4J d|| jd usBJ | jd usPJ |d ur| jrpt  I d H  q| jrt	t
|}|| jI d H  t  I d H  qt t	t|I d H  nt  I d H  d S )Nzdata arg is not supported, got )r?   r   r7   r=   r>   r@   r{   r   r   r   r!   r   r   )rE   r   r   r   r}   r/   r0   r     s"    

zResponse.write_eofr(   r   c                    s   t |j| jr&tj| jv r| jtj= n| jstj| jvr| jrftt	| j
j}|d urt|| jtj< nF| j
rvt| j
nd}|dks| jdkr|j tjkrt|| jtj< t |I d H S )N0i0  )r   r   r3   r   r^   rC   r9   r   r   r!   r7   sizerv   r   upperZ	METH_HEADr{   r   )rE   r   r   Zbody_lenr}   r/   r0   r     s     zResponse._startr   c                    s   | j s| jrt |I d H S |tjkrtt|j| j	| j
d}| jd usNJ | j	d u r~t| jdkr~tdt| j d || jI d H |  | _| jd usJ |j| jtj< tt| j| jtj< d S )N)encodingZmax_sync_chunk_sizeexecutori   z2Synchronous compression of large response bodies (z bytes) might block the async event loop. Consider providing a custom value to zlib_executor_size/zlib_executor response properties or disabling compression on it.)r   r9   r{   r   r$   r+   r   rv   rq   r   r   r7   r   rX   rY   compressflushr   rC   r   r   r^   )rE   r   Z
compressorr}   r/   r0   r     s(    
zResponse._do_start_compression)r   )r,   r-   r.   r   rQ   r
   rv   r#   r   rF   r   r   r   r!   r   r   r   r|   r   r   r   r$   r   r   r/   r/   r}   r0   r&   A  sH   Fr&   r1   zapplication/json)r   r   r3   r4   r5   r   dumps)	r   r   r   r3   r4   r5   r   r   r6   c                C   s6   | t ur"|s|rtdn|| }t||||||dS )Nz3only one of data, text, or body should be specified)r   r   r3   r4   r5   r   )r   rS   r&   )r   r   r   r3   r4   r5   r   r   r/   r/   r0   r'     s    
r'   )Aasynciocollections.abccollectionsr   enumjsonr   r   rX   concurrent.futuresr   httpr   http.cookiesr   typingr   r   r   r   r	   r
   r   r   Z	multidictr   r   rP   r   r   abcr   Zcompression_utilsr   Zhelpersr   r   r   r   r   r   r   r   r   r   r   r   r    r!   Ztypedefsr"   r#   __all__Zweb_requestr(   rv   Z	BaseClassEnumr$   r%   r&   r   r   rQ   r'   r/   r/   r/   r0   <module>   sf   (0   ~ ]