a
    }3eOk                     @   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rDddl6m7Z7 ee8ef Z9nej jZ9e$s\d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eee8 ee@ eAee8 ee4 e8e3e>d	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   G/home/pi/bot/my_env/lib/python3.9/site-packages/aiohttp/web_response.pyr%   =   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defeee eeeeef f 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	d*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/d0d1Zdd-d2eee edd3d4d5Z e	ee d fd6d7Z!e!j"ee dd8d9d7Z!e	ed fd:d;Z#e#j"edd8d<d;Z#e	ee d fd=d>Z$e$j"ee dd8d?d>Z$e	ee%j% dd@dAZ&e&j"eeee'e%j%ef  dd8dBdAZ&e	ee( ddCdDZ)e)j"eee(ef  dd8dEdDZ)e*j+fe,ddFdGdHZ-eddIdJdKZ.dLddMdNdOZ/dLee0 dMdPdQZ1dLe0dMdRdSZ2dddTdUZ3dddVdWZ4e5ddXdYdZZ6ddd[d\Z7due5ddXd^d_Z8edd`daZ9ee:dbdcddZ;ee:ddedfdgZ<eddbdhdiZ=eddjdkZ>e?e ddldmZ@eddndoZAeBe
dpdqdrZC  ZDS )vr&   T   Nstatusreasonheaders)r6   r7   r8   returnc                C   sp   d | _ d | _d| _d| _d | _t | _d | _d | _d| _	d| _
i | _|d urXt|| _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__r9   c                 C   s
   | j d uS N)rA   rG   r2   r2   r3   preparedk   s    zStreamResponse.preparedzOptional[asyncio.Task[None]]c                 C   s   | j r| j jS d S d S rJ   )r@   taskrK   r2   r2   r3   rM   o   s    zStreamResponse.taskc                 C   s   | j S rJ   )_statusrK   r2   r2   r3   r6   v   s    zStreamResponse.statusc                 C   s   | j S rJ   )r<   rK   r2   r2   r3   chunkedz   s    zStreamResponse.chunkedc                 C   s   | j S rJ   )r=   rK   r2   r2   r3   compression~   s    zStreamResponse.compressionc                 C   s   | j S rJ   )_reasonrK   r2   r2   r3   r7      s    zStreamResponse.reason)r6   r7   
_RESPONSESr9   c                 C   sT   | j rJ dt|| _|d u rJz|| j d }W n tyH   d}Y n0 || _d S )NzGCannot change the response status code after the headers have been sentr    )rL   intrN   	ExceptionrQ   )rG   r6   r7   rR   r2   r2   r3   rF      s    

zStreamResponse.set_statusc                 C   s   | j S rJ   r;   rK   r2   r2   r3   
keep_alive   s    zStreamResponse.keep_alivec                 C   s
   d| _ d S )NFrV   rK   r2   r2   r3   force_close   s    zStreamResponse.force_closec                 C   s   | j S rJ   )rC   rK   r2   r2   r3   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DeprecationWarningrA   buffer_sizerK   r2   r2   r3   output_length   s    
zStreamResponse.output_length)
chunk_sizer9   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)r<   r   CONTENT_LENGTHrE   RuntimeErrorrZ   r[   r\   )rG   r_   r2   r2   r3   enable_chunked_encoding   s    z&StreamResponse.enable_chunked_encoding)forcer9   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.   rZ   r[   r\   
isinstancer=   r>   )rG   rc   r2   r2   r3   enable_compression   s    z!StreamResponse.enable_compressionzCIMultiDict[str]c                 C   s   | j S rJ   )rE   rK   r2   r2   r3   r8      s    zStreamResponse.headerszSimpleCookie[str]c                 C   s   | j S rJ   )r?   rK   r2   r2   r3   cookies   s    zStreamResponse.cookies/)expiresdomainmax_agepathsecurehttponlyversionr+   )namevaluerj   rk   rl   rm   rn   ro   rp   r+   r9   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.
        NrS   rj   Thu, 01 Jan 1970 00:00:00 GMTrk   zmax-agerm   rn   ro   rp   r+   )r?   getcoded_valuepopstr)rG   rq   rr   rj   rk   rl   rm   rn   ro   rp   r+   oldcr2   r2   r3   
set_cookie   s0    


zStreamResponse.set_cookie)rk   rm   )rq   rk   rm   r9   c                C   s(   | j |d | j|ddd||d dS )zBDelete cookie.

        Creates new empty expired cookie.
        NrS   r   rs   )rl   rj   rk   rm   )r?   rv   rz   )rG   rq   rk   rm   r2   r2   r3   
del_cookie   s    zStreamResponse.del_cookiec                    s   t  jS rJ   )supercontent_lengthrK   	__class__r2   r3   r}     s    zStreamResponse.content_lengthrr   r9   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)rT   r<   ra   rw   rE   r   r`   rv   rG   rr   r2   r2   r3   r}     s    c                    s   t  jS rJ   )r|   content_typerK   r~   r2   r3   r   #  s    zStreamResponse.content_typec                 C   s   | j  t|| _|   d S rJ   )r   rw   _content_type_generate_content_type_headerr   r2   r2   r3   r   (  s    
c                    s   t  jS rJ   )r|   charsetrK   r~   r2   r3   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   ra   _content_dictrv   rw   lowerr   )rG   rr   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   rt   r   LAST_MODIFIEDrK   r2   r2   r3   last_modifiedB  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)rE   rv   r   r   rf   rT   floattimestrftimegmtimemathceildatetimeutctimetuplerw   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)rr   r      )is_weakrr   )
rE   rt   r   ETAGr   r   r   	fullmatchgroupre   )rG   Zquoted_valuematchr   rr   r2   r2   r3   etag[  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)rE   rv   r   r   rf   rw   r   r   rr   r   r   
ValueErrorrd   )rG   rr   Z	hdr_valuer2   r2   r3   r   k  s$    

")CONTENT_TYPEr9   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 )=Nr2   ).0kvr2   r2   r3   	<genexpr>      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codingr9   c                    sH   |t jkrD| jd usJ |j| jtj< | j|j | jtj	d  d S rJ   )
r%   r.   rA   rr   rE   r   CONTENT_ENCODINGrg   Zpopallr`   )rG   r   r2   r2   r3   _do_start_compression  s
    
z$StreamResponse._do_start_compressionr)   requestr9   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 )NrS   )	r>   r   r8   rt   r   ACCEPT_ENCODINGr   r%   rr   )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 rJ   )rB   rA   _startrG   r   r2   r2   r3   prepare  s
    
zStreamResponse.preparec                    sB   || _ |j }| _|  I d H  || I d H  |  I d H  |S rJ   )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 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|  d|t
j< t
j|v r|t
j= n~| jrT| j|_|jd u r6|tkr0| jdkr0|  d|t
j< t
j|v r4|t
j= nd}n|tkrT| jdv rT|t
j= | jd	vrn|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 )NrS   )headerr   z@Using chunked encoding is forbidden for HTTP/{0.major}.{0.minor}rO      F)d   e   f   g   r   r   i0  r   z
keep-aliveclose)!r@   rA   r;   rW   rp   rE   r?   valuesoutputaddr   Z
SET_COOKIEr=   r   r<   r!   ra   formatZenable_chunkingZTRANSFER_ENCODINGr`   _length_checkr}   lengthr6   
setdefaultr   ZDATEr   ZSERVERr   Z
CONNECTIONr    )rG   r   r   rW   rp   r8   cookierr   r2   r2   r3   r     s^    






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   rp   r   rN   rQ   Zwrite_headersrE   )rG   r   r   rp   Zstatus_liner2   r2   r3   r     s    zStreamResponse._write_headersdatar9   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())	rf   bytes	bytearray
memoryviewrd   rB   ra   rA   writerG   r   r2   r2   r3   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)rB   rA   rZ   r[   r\   drainrK   r2   r2   r3   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)rf   r   r   r   rd   rB   rA   	write_eofr@   Zoutput_sizerC   r   r2   r2   r3   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<>)rB   rL   r@   methodrm   r   r/   r7   )rG   infor2   r2   r3   __repr__  s    zStreamResponse.__repr__)keyr9   c                 C   s
   | j | S rJ   rD   rG   r   r2   r2   r3   __getitem__(  s    zStreamResponse.__getitem__)r   rr   r9   c                 C   s   || j |< d S rJ   r   )rG   r   rr   r2   r2   r3   __setitem__+  s    zStreamResponse.__setitem__c                 C   s   | j |= d S rJ   r   r   r2   r2   r3   __delitem__.  s    zStreamResponse.__delitem__c                 C   s
   t | jS rJ   )lenrD   rK   r2   r2   r3   __len__1  s    zStreamResponse.__len__c                 C   s
   t | jS rJ   )iterrD   rK   r2   r2   r3   __iter__4  s    zStreamResponse.__iter__c                 C   s   t t| S rJ   )hashidrK   r2   r2   r3   __hash__7  s    zStreamResponse.__hash__)otherr9   c                 C   s   | |u S rJ   r2   )rG   r   r2   r2   r3   __eq__:  s    zStreamResponse.__eq__)N)N)r   )Er/   r0   r1   r   rT   r   rw   r$   rH   propertyre   rL   rM   r6   rO   rP   r7   r   r	   r   rF   rW   rX   rY   r^   rb   r   r%   rg   r8   rh   rz   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                       sV  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jejfee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ddZedd fd d!Z  ZS )#r'   Nr4   )	bodyr6   r7   textr8   r   r   zlib_executor_sizezlib_executor)
r   r6   r7   r   r8   r   r   r   r   r9   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=r5   )r   r   rf   r   r   rw   	TypeErrorrd   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   ?  sP    









zResponse.__init__rI   c                 C   s   | j S rJ   )r:   rK   r2   r2   r3   r     s    zResponse.body)r   r   r`   r9   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}| js||vr|j}|d urt|||< ||vr|j||< |jr|j D ]\}}||vr|||< qd | _d S )NFzUnsupported body type %rT)r:   _body_payloadrf   r   r   r   ZPAYLOAD_REGISTRYrt   LookupErrorr   rd   rE   r<   sizerw   r   r8   r   r   )rG   r   r   r`   r8   r   r   rr   r2   r2   r3   r     s.    

c                 C   s    | j d u rd S | j | jpdS )Nr   )r:   decoder   rK   r2   r2   r3   r     s    
zResponse.text)r   r9   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)	rf   rw   rd   r   r   r   r:   r   r   )rG   r   r2   r2   r3   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   )
r<   r   r`   rE   r|   r}   r   r   r   r:   rK   r~   r2   r3   r}     s    



zResponse.content_lengthr   c                 C   s   t dd S )Nz#Content length is set automatically)ra   r   r2   r2   r3   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jtjksp| jdv rt	 
 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   )rB   r   r:   r@   rA   _methodr   Z	METH_HEADrN   r|   r   r   r   r"   r   r   )rG   r   r   r   r~   r2   r3   r     s"    

zResponse.write_eofr)   r   c                    sX   | j sFtj| jvrF| jsF| jd ur:tt| j| jtj< nd| jtj< t 	|I d H S )N0)
r<   r   r`   rE   r   r:   rw   r   r|   r   r   r~   r2   r3   r     s    
zResponse._start)	zlib_moder9   c                 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r|tjkr<dtj ntj}| j	}|d usTJ | j
d urt|| j
krt | j| j|I d H  n
| | | j}|d usJ |j| jtj< tt|| jtj< d S )N   )r   r<   r|   r   r%   r.   r-   r   	MAX_WBITSr:   r   r   asyncioZget_event_loopZrun_in_executorr   r  r   rr   rE   r   r   rw   r`   )rG   r   r   r  Zbody_outr~   r2   r3   r     s&    


zResponse._do_start_compression)r   )r/   r0   r1   r   rT   r   rw   r$   r   rH   r   r   r   r"   r   r   r   r   r`   r   r   r}   r   r   r   r  r%   r   r   r2   r2   r~   r3   r'   >  sX   F(
r'   r4   zapplication/json)r   r   r6   r7   r8   r   dumps)	r   r   r   r6   r7   r8   r   r	  r9   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   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   rZ   r   concurrent.futuresr   http.cookiesr   r   typingr   r   r   r   r	   r
   r   r   r   r   Z	multidictr   r   rS   r   r   abcr   Zhelpersr   r   r   r   r   r   r   r   r   httpr   r   r    r!   r"   Ztypedefsr#   r$   __all__Zweb_requestr)   rw   Z	BaseClass	_reservedEnumr%   r&   r'   r	  r   rT   r(   r2   r2   r2   r3   <module>   sh   0,
   u f