o
    ir                     @   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d eD Z4dZ5dZ6erddl7m8Z8 ee9ef Z:nejjZ:G dd dej;Z<dd e<D Z=G dd de:e&Z>G dd de>Z?e*fddddddej@ddedee9 d eeA d!eBd"ee9 d#ee3 d$e9d%e2d&e?fd'd(ZCd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LooseHeadersc                 C   s   i | ]}|j |jqS  )valuephrase).0Zhttp_statusr$   r$   N/home/kim/smarthome/.venv/lib/python3.10/site-packages/aiohttp/web_response.py
<dictcomp>,   s    r)   i   )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/   r0   r1   r$   r$   r$   r(   r*   ;   s    r*   c                 C   s   i | ]}|j |qS r$   r%   )r'   codingr$   r$   r(   r)   E   s    c                       s^  e Zd ZU edeeef ed< dZdZ	dZ
ee ed< dZeed< dZeed< dZee ed< dZee ed	< dZed
 ed< dZee ed< dZeed< dZee ed< dZdZee ed< dZddddddedee dee deee  ddf
ddZe defddZ!e dd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&	ddedee ddfd'd(Z'dedee ddfd)d*Z(e dee fd+d,Z)dd-d.Z*e defd/d0Z+e defd1d2Z,dd3ee ddfd4d5Z-		dd6eeeef  d7ee ddfd8d9Z.e dd;d<Z/e defd=d>Z0dddd?dddddd@	dAedBedCee dDee dEeeeef  dFedGee dHee dIee dJee dKee ddfdLdMZ1dd?ddddNdAedDee dFedGee dHee dJee ddfdOdPZ2e dee f fdQdRZ3e3j4dBee ddfdSdRZ3e def fdTdUZ5e5j4dBeddfdVdUZ5e dee f fdWdXZ6e6j4dBee ddfdYdXZ6e dee7j7 fdZd[Z8e8j4dBeeee9e7j7ef  ddfd\d[Z8e dee: fd]d^Z;e;j4dBeee:ef  ddfd_d^Z;e<j=fd`e>ddfdadbZ?dceddfdddeZ@ddgdhZAdfd
dee fdidjZBdfd
defdkdlZCddmdnZDddodpZEdqeeeeFf ddfdrdsZGddtduZHddqeddfdwdxZIdefdydzZJd{edeKfd|d}ZLd{edBeKddfd~dZMd{eddfddZNdefddZOdePe fddZQdefddZRdeSdefddZTdefddZU  ZVS )r+   N_bodyT_keep_aliveF_chunked_compression_compression_strategy_compression_forcer.   _req_payload_writer	_eof_sent_must_be_empty_bodyr   _cookies   )statusreasonheaders_real_headersrC   rD   rE   rF   returnc                C   sB   i | _ |dur|| _n|durt|| _nt | _| || dS )a;  Initialize a new stream response object.

        _real_headers is an internal parameter used to pass a pre-populated
        headers object. It is used by the `Response` class to avoid copying
        the headers when creating a new response object. It is not intended
        to be used by external code.
        N)_state_headersr   _set_status)selfrC   rD   rE   rF   r$   r$   r(   __init__^   s   zStreamResponse.__init__c                 C   s   | j p| jd uS N)r?   r>   rK   r$   r$   r(   preparedx   s   zStreamResponse.preparedOptional[asyncio.Task[None]]c                 C   s   | j r| j jS d S rM   )r=   taskrN   r$   r$   r(   rQ   |   s   zStreamResponse.taskc                 C      | j S rM   )_statusrN   r$   r$   r(   rC         zStreamResponse.statusc                 C   rR   rM   )r9   rN   r$   r$   r(   chunked   rT   zStreamResponse.chunkedc                 C   rR   rM   )r:   rN   r$   r$   r(   compression   rT   zStreamResponse.compressionc                 C   rR   rM   )_reasonrN   r$   r$   r(   rD      rT   zStreamResponse.reasonc                 C   s   | j rJ d| || d S )NzGCannot change the response status code after the headers have been sent)rO   rJ   rK   rC   rD   r$   r$   r(   
set_status   s
   zStreamResponse.set_statusc                 C   s<   t || _|d u rt| jd}nd|v rtd|| _d S )N 
zReason cannot contain \n)intrS   REASON_PHRASESget
ValueErrorrW   rX   r$   r$   r(   rJ      s   

zStreamResponse._set_statusc                 C   rR   rM   r8   rN   r$   r$   r(   
keep_alive   rT   zStreamResponse.keep_alivec                 C   s
   d| _ d S )NFr`   rN   r$   r$   r(   force_close      
zStreamResponse.force_closec                 C   rR   rM   )_body_lengthrN   r$   r$   r(   body_length   rT   zStreamResponse.body_lengthc                 C   s   t dt | jsJ | jjS )Nzoutput_length is deprecated)warningswarnDeprecationWarningr>   buffer_sizerN   r$   r$   r(   output_length   s   
zStreamResponse.output_length
chunk_sizec                 C   s2   t j| jv r
td|durtdt d| _dS )z,Enables automatic chunked transfer encoding.z>You can't enable chunked encoding when a content length is setNzChunk size is deprecated #1615T)r   CONTENT_LENGTHrI   RuntimeErrorrf   rg   rh   r9   )rK   rk   r$   r$   r(   enable_chunked_encoding   s   
z&StreamResponse.enable_chunked_encodingforcestrategyc                 C   sX   t |t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)
isinstanceboolr*   r/   r1   rf   rg   rh   r:   r<   r;   )rK   ro   rp   r$   r$   r(   enable_compression   s   

z!StreamResponse.enable_compressionCIMultiDict[str]c                 C   rR   rM   )rI   rN   r$   r$   r(   rE      rT   zStreamResponse.headersc                 C   s   | j d u r	t | _ | j S rM   )rA   r   rN   r$   r$   r(   cookies   s   
zStreamResponse.cookies/)	expiresdomainmax_agepathsecurehttponlyversionsamesitepartitionednamer%   rw   rx   ry   rz   r{   r|   r}   r~   r   c       	         C   s   | j du r	t | _ || j |< | j | }|dur||d< n
|ddkr&|d= |dur.||d< |dur9t||d< nd|v r@|d= ||d< |durL||d< |durT||d< |	dur\|	|d	< |
durd|
|d
< |durn||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.
        Nrw   Thu, 01 Jan 1970 00:00:00 GMTrx   zmax-agerz   r{   r|   r}   r~   r   )rA   r   r^   str)rK   r   r%   rw   rx   ry   rz   r{   r|   r}   r~   r   cr$   r$   r(   
set_cookie   s4   



zStreamResponse.set_cookie)rx   rz   r{   r|   r~   c                C   s8   | j dur| j |d | j|ddd|||||d	 dS )zBDelete cookie.

        Creates new empty expired cookie.
        NrZ   r   r   )ry   rw   rx   rz   r{   r|   r~   )rA   popr   )rK   r   rx   rz   r{   r|   r~   r$   r$   r(   
del_cookie  s   

zStreamResponse.del_cookiec                       t  jS rM   )supercontent_lengthrN   	__class__r$   r(   r   1     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)r\   r9   rm   r   rI   r   rl   r   rK   r%   r$   r$   r(   r   6  s   c                    r   rM   )r   content_typerN   r   r$   r(   r   B  r   zStreamResponse.content_typec                 C   s   | j  t|| _|   d S rM   )r   r   _content_type_generate_content_type_headerr   r$   r$   r(   r   G  s   
c                    r   rM   )r   charsetrN   r   r$   r(   r   M  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   rm   _content_dictr   r   lowerr   )rK   r%   ctyper$   r$   r(   r   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   rI   r^   r   LAST_MODIFIEDrN   r$   r$   r(   last_modifieda  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t|j }t|)Nz%a, %d %b %Y %H:%M:%S GMTz$Unsupported type for last_modified: )rI   r   r   r   rq   r\   floattimestrftimegmtimemathceildatetimeutctimetupler   typer2   	TypeError)rK   r%   msgr$   r$   r(   r   i  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 )Nr5   r      )is_weakr%   )
rI   r^   r   ETAGr   r   r   	fullmatchgrouprr   )rK   Zquoted_valuematchr   r%   r$   r$   r(   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)rI   r   r   r   rq   r   r   r   r%   r   r   r_   r   )rK   r%   Z	hdr_valuer$   r$   r(   r     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 )=Nr$   )r'   kvr$   r$   r(   	<genexpr>  s     z?StreamResponse._generate_content_type_header.<locals>.<genexpr>)r   r   joinitemsrI   )rK   r   paramsr   r$   r$   r(   r     s   z,StreamResponse._generate_content_type_headerr6   c                    sR   |t ju rd S | jd usJ |j| jtj< | j|j| j | j	tj
d  d S rM   )r*   r1   r>   r%   rI   r   CONTENT_ENCODINGrs   r;   Zpopallrl   )rK   r6   r$   r$   r(   _do_start_compression  s   
z$StreamResponse._do_start_compressionrequestc                    sf   | j r| | j I d H  d S |jtjd }t D ]\}}||v r0| |I d H   d S qd S )NrZ   )	r<   r   rE   r^   r   ACCEPT_ENCODINGr   CONTENT_CODINGSr   )rK   r   accept_encodingr%   r6   r$   r$   r(   _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 rM   )r?   r>   r   methodrC   r@   _start)rK   r   r$   r$   r(   prepare  s   
zStreamResponse.preparec                    sD   || _ |j }| _|  I d H  || I d H  |  I d H  |S rM   )r=   r>   _prepare_headersZ_prepare_hook_write_headers)rK   r   writerr$   r$   r(   r     s   zStreamResponse._startc                    s  | j }|d us
J | j}|d usJ | j}|d u r|j}|| _|j}| j}| jrB| j D ]}|jdddd  }|	t
j| q.| jrM| |I d H  | jri|tkr\td|j| jsh|  d|t
j< n"| jr| j|_|jd u r|tkr| js|  d|t
j< n| jsd}| jrt
j|v rt|j| jr|t
j= t
j|v r|t
j= n| jr|jn| jdk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 )NrZ   )headerr   z@Using chunked encoding is forbidden for HTTP/{0.major}.{0.minor}rU   Fr   r   z
keep-aliveclose)$r=   r>   r8   ra   r}   rI   rA   valuesoutputaddr   Z
SET_COOKIEr:   r   r9   r    rm   formatr@   Zenable_chunkingZTRANSFER_ENCODING_length_checkr   lengthrl   r   r   rC   
setdefaultr   ZDATEr   ZSERVERr   Z
CONNECTIONr   )rK   r   r   ra   r}   rE   cookier%   r$   r$   r(   r     st   




zStreamResponse._prepare_headersc                    s~   | j }|d us
J | j}|d usJ |j}d|d  d|d  d| j d| j }||| jI d H  | jr=|  d S d S )NzHTTP/r   .r    )	r=   r>   r}   rS   rW   Zwrite_headersrI   _send_headers_immediatelysend_headers)rK   r   r   r}   Zstatus_liner$   r$   r(   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())	rq   bytes	bytearray
memoryviewr   r?   rm   r>   writerK   r   r$   r$   r(   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)r?   r>   rf   rg   rh   drainrN   r$   r$   r(   r   2  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)rq   r   r   r   r   r?   r>   	write_eofr=   Zoutput_sizerd   r   r$   r$   r(   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eofr   znot prepared<>)r?   rO   r=   r   rz   r   r2   rD   )rK   infor$   r$   r(   __repr__L  s   zStreamResponse.__repr__keyc                 C   s
   | j | S rM   rH   rK   r   r$   r$   r(   __getitem__V  rc   zStreamResponse.__getitem__c                 C   s   || j |< d S rM   r   )rK   r   r%   r$   r$   r(   __setitem__Y  s   zStreamResponse.__setitem__c                 C   s   | j |= d S rM   r   r   r$   r$   r(   __delitem__\     zStreamResponse.__delitem__c                 C   
   t | jS rM   )lenrH   rN   r$   r$   r(   __len___  rc   zStreamResponse.__len__c                 C   r   rM   )iterrH   rN   r$   r$   r(   __iter__b  rc   zStreamResponse.__iter__c                 C   s   t t| S rM   )hashidrN   r$   r$   r(   __hash__e  r   zStreamResponse.__hash__otherc                 C   s   | |u S rM   r$   )rK   r   r$   r$   r(   __eq__h  s   zStreamResponse.__eq__c                 C   s   dS )NTr$   rN   r$   r$   r(   __bool__k  s   zStreamResponse.__bool__)rG   rP   rM   )rG   N)NN)rG   rt   )r   r.   rG   Nr   )Wr2   r3   r4   r   r   r   r!   __annotations__r   r7   r8   r
   rr   r9   r:   r;   r\   r<   r*   r=   r>   r   r?   r@   rd   rA   r   r   r   r#   r   rL   propertyrO   rQ   rC   rU   rV   rD   rY   rJ   ra   rb   re   rj   rn   rs   rE   ru   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   objectr   r   __classcell__r$   r$   r   r(   r+   L   s^  
 






	

9	
 




A


r+   c                       sh  e Zd ZU dZee ed< 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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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 fd%d&Z  ZS )(r,   N_compressed_bodyFrB   )	bodyrC   rD   textrE   r   r   zlib_executor_sizezlib_executorr   rC   rD   r   rE   r   r   r   r   rG   c       	            sB  |d ur|d urt d|d u rt }
nt|}
|d ur$d|v r$t d|d ur`tj|
v r6|s1|r5t dnOt|tsCtdt| |d u rId}|d u rOd}|d | |
tj< ||}d }n%tj|
v rr|d usm|d urqt dn|d ur|d ur|d| 7 }||
tj< t	 j
|||
d	 |d ur|| _n|| _|| _|	| _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=)rC   rD   rF   )r_   r   r   r   rq   r   r   r   encoder   rL   r   r   _zlib_executor_size_zlib_executor)rK   r   rC   rD   r   rE   r   r   r   r   Zreal_headersr   r$   r(   rL   t  sN   





zResponse.__init__c                 C   rR   rM   )r7   rN   r$   r$   r(   r     rT   zResponse.bodyc                 C   s   |d u rd | _ nJt|ttfr|| _ n?ztj| | _ }W n tjy.   tdt	| w | j
}tj|vr=|j|tj< |jrR|j D ]\}}||vrQ|||< qEd | _d S )NzUnsupported body type %r)r7   rq   r   r   r   ZPAYLOAD_REGISTRYr^   LookupErrorr_   r   rI   r   r   r   rE   r   r   )rK   r   rE   r   r%   r$   r$   r(   r     s$   

c                 C   s    | j d u rd S | j | jpdS )Nr   )r7   decoder   rN   r$   r$   r(   r     s   
zResponse.textc                 C   sZ   |d u st |tsJ dt| | jdkrd| _| jd u r!d| _|| j| _d | _d S )Nr   r   r   r   )rq   r   r   r   r   r   r7   r   )rK   r   r$   r$   r(   r     s   




c                 C   sb   | j rd S tj| jv rt| jtj S | jd urt| jS t| jt	r%d S | jd ur/t| jS dS )Nr   )
r9   r   rl   rI   r\   r   r   rq   r7   r!   rN   r$   r$   r(   r     s   



zResponse.content_lengthr%   c                 C   s   t d)Nz#Content length is set automatically)rm   r   r$   r$   r(   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 s0| jr:t  I d H  d S t| jt	r\| j
| jI d H  | j I d H  t  I d H  d S t tt|I d H  d S )Nzdata arg is not supported, got )r?   r   r7   r=   r>   r@   r   r   rq   r!   r   r   r   r   )rK   r   r   r   r$   r(   r     s    
zResponse.write_eofr   r.   c                    s   t j| jv rt|j| jr| jt j= n;| jsOt| jt	r.| jj
 }d ur-t|| jt j< n!| jr6t| jnd}|dksG| jdkrO|jt jvrOt|| jt j< t |I d H S )N0i0  )r   rl   rI   r   r   rC   r9   rq   r7   r!   sizer   r   ZMETH_HEAD_ALLr   r   )rK   r   r  Zbody_lenr   r$   r(   r     s   
zResponse._startr6   c                    s   | j s
t| jtrt |I d H S |tju rd S t|j	| j
| jd}| jd us+J | j
d u rCt| jtkrCtdt| j d || jI d H |  | _|j	| jtj< tt| j| jtj< d S )N)encodingZmax_sync_chunk_sizeexecutorz2Synchronous 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.)r9   rq   r7   r!   r   r   r*   r1   r   r%   r   r  r   LARGE_BODY_SIZErf   rg   compressflushr   rI   r   r   r   rl   )rK   r6   Z
compressorr   r$   r(   r   &  s*   
zResponse._do_start_compressionr   )r2   r3   r4   r   r
   r   r   r   r   r\   r   r#   r   rL   r   r   r!   r   r   r   r   r   r   r   r*   r   r   r$   r$   r   r(   r,   o  s`   
 	
Ar,   rB   zapplication/json)r   r   rC   rD   rE   r   dumpsr   r   r   rC   rD   rE   r   r  rG   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   rC   rD   rE   r   )r   r_   r,   )r   r   r   rC   rD   rE   r   r  r$   r$   r(   r-   A  s   r-   )DZasynciocollections.abccollectionsr   enumjsonr   r   rf   concurrent.futuresr   httpr   http.cookiesr   typingr   r   r   r   r	   r
   r   r   Z	multidictr   r   rZ   r   r   abcr   Zcompression_utilsr   Zhelpersr   r   r   r   r   r   r   r   r   r   r   r   r    r!   Ztypedefsr"   r#   r]   r  __all__Zweb_requestr.   r   Z	BaseClassEnumr*   r   r+   r,   r  r   r\   r-   r$   r$   r$   r(   <module>   s    (0
    ' T	
