o
    m=8j?x                     @   sl  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
 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 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" 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. ddlm/Z/m0Z0m1Z1 ddlm2Z2 ddl3m4Z4m5Z5m6Z6 dd eD Z7dZ8erddl9m:Z: e
e;ef Z<nejj
Z<edZ=G dd dej>Z?dd e?D Z@G dd de
e;e(e B ef e'ZAG dd deAZBe,fddddddejCdded e;dB d!eDdB d"eEd#e;dB d$e6dB d%e;d&e5d'eBfd(d)ZFe,fdddddd*ded&e4d!eDdB d"eEd#e;dB d$e6dB d%e;d'eBfd+d,ZGdS )-    N)IteratorMutableMapping)Executor)
HTTPStatus)SimpleCookie)TYPE_CHECKINGAnyOptionalTypeVarcastoverload)CIMultiDictistr   )hdrspayload)AbstractStreamWriter)MAX_SYNC_CHUNK_SIZEZLibCompressor)ETAG_ANYQUOTED_ETAG_REETagHeadersMixinResponseKeymust_be_empty_bodyparse_http_daterfc822_formatted_timesentinelshould_remove_content_lengthvalidate_etag_value)SERVER_SOFTWAREHttpVersion10HttpVersion11)Payload)JSONBytesEncoderJSONEncoderLooseHeadersc                 C   s   i | ]}|j |jqS  )valuephrase).0http_statusr'   r'   [/home/nk/hobo-godmode/plappi-mvp/.venv/lib/python3.10/site-packages/aiohttp/web_response.py
<dictcomp>%   s    r-   )ContentCodingStreamResponseResponsejson_responsejson_bytes_response)BaseRequest_Tc                   @   s   e Zd ZdZdZdZdS )r.   deflategzipidentityN)__name__
__module____qualname__r5   r6   r7   r'   r'   r'   r,   r.   <   s    r.   c                 C   s   i | ]}|j |qS r'   r(   )r*   codingr'   r'   r,   r-   F   s    c                       s  e Zd ZU deB eB eB ed< dZdZdZ	e
dB ed< dZe
ed< dZe
ed< dZedB ed< dZedB ed	< dZed
 ed< dZedB ed< dZe
ed< dZe
dB ed< dZdZedB ed< dZe Zee ed< ddddddededB dedB dee dB 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dB ddfd(d)Z(dededB ddfd*d+Z)e!de
dB fd,d-Z*dd.d/Z+e!defd0d1Z,e!defd2d3Z-dd4edB ddfd5d6Z.		dd7e
eB dB d8edB ddfd9d:Z/e!dd<d=Z0e!defd>d?Z1dddd@ddddddA	dBedCedDedB dEedB dFeeB dB dGedHe
dB dIe
dB dJedB dKedB dLe
dB ddfdMdNZ2dd@ddddOdBedEedB dGedHe
dB dIe
dB dKedB ddfdPdQZ3e!dedB f fdRdSZ4e4j5dCedB ddfdTdSZ4e!def fdUdVZ6e6j5dCeddfdWdVZ6e!dedB f fdXdYZ7e7j5dCedB ddfdZdYZ7e!de8j8dB fd[d\Z9e9j5dCee:B e8j8B eB dB ddfd]d\Z9e!de;dB fd^d_Z<e<j5dCe;eB dB ddfd`d_Z<e=j>fdae?ddfdbdcZ@ddeddfdedfZAddhdiZBdgd
dedB fdjdkZCdgd
defdldmZDddndoZEddpdqZFdreeB eGB ddfdsdtZHddudvZIddreddfdxdyZJdefdzd{ZKeLd|eMeN deNfd}d~ZOeLd|edePfdd~ZOd|eeMeN B dePfdd~ZOeLd|eMeN dCeNddfddZQeLd|edCePddfddZQd|eeMeN B dCePddfddZQd|eeMeN B ddfddZRdefddZSdeTeeMeP B  fddZUdefddZVdeWde
fddZXde
fddZY  ZZS )r/   N_bodyT_keep_aliveF_chunked_compression_compression_strategy_compression_forcer3   _req_payload_writer	_eof_sent_must_be_empty_bodyr   _cookies_seen_str_keys   )statusreasonheaders_real_headersrJ   rK   rL   rM   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)selfrJ   rK   rL   rM   r'   r'   r,   __init__`   s   zStreamResponse.__init__c                 C   s   | j p| jd uS N)rE   rD   rR   r'   r'   r,   preparedz   s   zStreamResponse.preparedasyncio.Task[None] | Nonec                 C   s   | j r| j jS d S rT   )rC   taskrU   r'   r'   r,   rX   ~   s   zStreamResponse.taskc                 C      | j S rT   )_statusrU   r'   r'   r,   rJ         zStreamResponse.statusc                 C   rY   rT   )r?   rU   r'   r'   r,   chunked   r[   zStreamResponse.chunkedc                 C   rY   rT   )r@   rU   r'   r'   r,   compression   r[   zStreamResponse.compressionc                 C   rY   rT   )_reasonrU   r'   r'   r,   rK      r[   zStreamResponse.reasonc                 C   s   | j rJ d| || d S )NzGCannot change the response status code after the headers have been sent)rV   rQ   rR   rJ   rK   r'   r'   r,   
set_status   s
   zStreamResponse.set_statusc                 C   sD   t || _|d u rt| jd}nd|v sd|v rtd|| _d S )N 
zReason cannot contain \r or \n)intrZ   REASON_PHRASESget
ValueErrorr^   r_   r'   r'   r,   rQ      s   

zStreamResponse._set_statusc                 C   rY   rT   r>   rU   r'   r'   r,   
keep_alive   r[   zStreamResponse.keep_alivec                 C   s
   d| _ d S )NFrh   rU   r'   r'   r,   force_close      
zStreamResponse.force_closec                 C   rY   rT   )_body_lengthrU   r'   r'   r,   body_length   r[   zStreamResponse.body_lengthc                 C   s   t dt | jsJ | jjS )Nzoutput_length is deprecated)warningswarnDeprecationWarningrD   buffer_sizerU   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_LENGTHrP   RuntimeErrorrn   ro   rp   r?   )rR   rs   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.   r5   r7   rn   ro   rp   r@   rB   rA   )rR   rw   rx   r'   r'   r,   enable_compression   s   

z!StreamResponse.enable_compressionCIMultiDict[str]c                 C   rY   rT   )rP   rU   r'   r'   r,   rL      r[   zStreamResponse.headersc                 C   s   | j d u r	t | _ | j S rT   )rG   r   rU   r'   r'   r,   cookies   s   
zStreamResponse.cookies/)	expiresdomainmax_agepathsecurehttponlyversionsamesitepartitionednamer(   r   r   r   r   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.
        Nr   Thu, 01 Jan 1970 00:00:00 GMTr   zmax-ager   r   r   r   r   r   )rG   r   rf   str)rR   r   r(   r   r   r   r   r   r   r   r   r   cr'   r'   r,   
set_cookie   s4   



zStreamResponse.set_cookie)r   r   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.
        Nra   r   r   )r   r   r   r   r   r   r   )rG   popr   )rR   r   r   r   r   r   r   r'   r'   r,   
del_cookie  s   

zStreamResponse.del_cookiec                       t  jS rT   )supercontent_lengthrU   	__class__r'   r,   r   3     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)rd   r?   ru   r   rP   r   rt   r   rR   r(   r'   r'   r,   r   8  s   c                    r   rT   )r   content_typerU   r   r'   r,   r   D  r   zStreamResponse.content_typec                 C   s   | j  t|| _|   d S rT   )r   r   _content_type_generate_content_type_headerr   r'   r'   r,   r   I  s   
c                    r   rT   )r   charsetrU   r   r'   r,   r   O  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   ru   _content_dictr   r   lowerr   )rR   r(   ctyper'   r'   r,   r   T  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   rP   rf   r   LAST_MODIFIEDrU   r'   r'   r,   last_modifiedc  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: )rP   r   r   r   ry   rd   floattimestrftimegmtimemathceildatetimeutctimetupler   typer8   	TypeError)rR   r(   msgr'   r'   r,   r   k  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 )Nr;   r      )is_weakr(   )
rP   rf   r   ETAGr   r   r   	fullmatchgrouprz   )rR   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)rP   r   r   r   ry   r   r   r   r(   r   r   rg   r   )rR   r(   	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itemsrP   )rR   r   paramsr   r'   r'   r,   r     s   z,StreamResponse._generate_content_type_headerr<   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 rT   )r.   r7   rD   r(   rP   r   CONTENT_ENCODINGr{   rA   popallrt   )rR   r<   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 )Nra   )	rB   r   rL   rf   r   ACCEPT_ENCODINGr   CONTENT_CODINGSr   )rR   r   accept_encodingr(   r<   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 rT   )rE   rD   r   methodrJ   rF   _start)rR   r   r'   r'   r,   prepare  s   
zStreamResponse.preparec                    sD   || _ |j }| _|  I d H  || I d H  |  I d H  |S rT   )rC   rD   _prepare_headers_prepare_hook_write_headers)rR   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ro|tkrbtd|jj d|jj | jsn|  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 )Nra   )headerr   z-Using chunked encoding is forbidden for HTTP/.r\   Fr   r   z
keep-aliveclose)%rC   rD   r>   ri   r   rP   rG   valuesoutputaddr   
SET_COOKIEr@   r   r?   r"   ru   majorminorrF   enable_chunkingTRANSFER_ENCODING_length_checkr   lengthrt   r   r   rJ   
setdefaultr   DATEr   SERVERr    
CONNECTIONr!   )rR   r   r   ri   r   rL   cookier(   r'   r'   r,   r     sz   




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    )	rC   rD   r   rZ   r^   write_headersrP   _send_headers_immediatelysend_headers)rR   r   r   r   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())	ry   bytes	bytearray
memoryviewr   rE   ru   rD   writerR   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)rE   rD   rn   ro   rp   drainrU   r'   r'   r,   r   4  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)ry   r   r   r   r   rE   rD   	write_eofrC   output_sizerl   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<>)rE   rV   rC   r   r   r   r8   rK   )rR   infor'   r'   r,   __repr__N  s   zStreamResponse.__repr__keyc                 C      d S rT   r'   rR   r   r'   r'   r,   __getitem__X     zStreamResponse.__getitem__c                 C   r   rT   r'   r   r'   r'   r,   r   [  r   c                 C   s
   | j | S rT   rO   r   r'   r'   r,   r   ^  rk   c                 C   r   rT   r'   rR   r   r(   r'   r'   r,   __setitem__a  r   zStreamResponse.__setitem__c                 C   r   rT   r'   r   r'   r'   r,   r   d  r   c                 C   sJ   t |ts|tjvrddlm} tj| tjd|dd || j	|< d S )Nr   )NotAppKeyWarningzIt is recommended to use web.ResponseKey instances for keys.
https://docs.aiohttp.org/en/stable/web_advanced.html#response-s-storager   )categoryr   )
ry   r   r/   rH   web_exceptionsr   r   rn   ro   rO   )rR   r   r(   r   r'   r'   r,   r   g  s   
c                 C   s   | j |= d S rT   r   r   r'   r'   r,   __delitem__y     zStreamResponse.__delitem__c                 C   
   t | jS rT   )lenrO   rU   r'   r'   r,   __len__|  rk   zStreamResponse.__len__c                 C   r  rT   )iterrO   rU   r'   r'   r,   __iter__  rk   zStreamResponse.__iter__c                 C   s   t t| S rT   )hashidrU   r'   r'   r,   __hash__  r  zStreamResponse.__hash__otherc                 C   s   | |u S rT   r'   )rR   r
  r'   r'   r,   __eq__  s   zStreamResponse.__eq__c                 C   s   dS )NTr'   rU   r'   r'   r,   __bool__  r   zStreamResponse.__bool__)rN   rW   rT   )rN   N)NN)rN   r|   )r   r3   rN   Nr   )[r8   r9   r:   r   r   r#   __annotations__r   r=   r>   rz   r?   r@   rA   rd   rB   r.   rC   r	   rD   r   rE   rF   rl   rG   r   r   setrH   r   r&   r   rS   propertyrV   rX   rJ   r\   r]   rK   r`   rQ   ri   rj   rm   rr   rv   r{   rL   r}   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   r4   r   r   r   r   r  r   r  r	  objectr  r  __classcell__r'   r'   r   r,   r/   M   sp  
 








	

9	





A


r/   c                       sd  e Zd ZU dZedB ed< dZdddddddedd	dede	de
dB d	e
dB d
edB de
dB de
dB de	dedB ddf fddZedeeB eB dB fddZejdeddfddZede
dB fddZejd	e
ddfddZede	dB fddZejde	dB 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 )(r0   N_compressed_bodyFrI   )	bodyrJ   rK   textrL   r   r   zlib_executor_sizezlib_executorr  rJ   rK   r  rL   r   r   r  r  rN   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=)rJ   rK   rM   )rg   r   r   r   ry   r   r   r   encoder   rS   r  r  _zlib_executor_size_zlib_executor)rR   r  rJ   rK   r  rL   r   r   r  r  real_headersr   r'   r,   rS     sN   





zResponse.__init__c                 C   rY   rT   )r=   rU   r'   r'   r,   r    r[   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)r=   ry   r   r   r   PAYLOAD_REGISTRYrf   LookupErrorrg   r   rP   r   r   r   rL   r   r  )rR   r  rL   r   r(   r'   r'   r,   r    s$   

c                 C   s    | j d u rd S | j | jpdS )Nr  )r=   decoder   rU   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  )ry   r   r   r   r   r  r=   r  )rR   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   )
r?   r   rt   rP   rd   r  r  ry   r=   r#   rU   r'   r'   r,   r     s   



zResponse.content_lengthr(   c                 C   s   t d)Nz#Content length is set automatically)ru   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	rhz| j
| jI d H  W | j I d H  n	| j I d H  w t  I d H  d S t tt|I d H  d S )Nzdata arg is not supported, got )rE   r  r=   rC   rD   rF   r   r   ry   r#   r   r   r   r   )rR   r   r  r   r'   r,   r     s"   
$zResponse.write_eofr   r3   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   rt   rP   r   r   rJ   r?   ry   r=   r#   sizer   r  METH_HEAD_ALLr   r   )rR   r   r$  body_lenr   r'   r,   r   3  s   
zResponse._startr<   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I d H |  | _|j	| jtj< tt| j| jtj< d S )N)encodingmax_sync_chunk_sizeexecutor)r?   ry   r=   r#   r   r   r.   r7   r   r(   r  r  compressflushr  rP   r   r   r   r  rt   )rR   r<   
compressorr   r'   r,   r   E  s   
zResponse._do_start_compressionr  )r8   r9   r:   r  r   r  r   r   r   rd   r   r&   r   rS   r  r   r#   r  r  r  r   r   r   r   r.   r   r  r'   r'   r   r,   r0     s`   
 	
Ar0   rI   zapplication/json)r  r  rJ   rK   rL   r   dumpsr   r  r  rJ   rK   rL   r   r-  rN   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  rJ   rK   rL   r   r   rg   r0   )r   r  r  rJ   rK   rL   r   r-  r'   r'   r,   r1   Y  s   r1   r  rJ   rK   rL   r   c                C   s2   | t ur|durtd|| }t|||||dS )zCreate a JSON response using a bytes-returning encoder.

    Use this when your JSON encoder (like orjson) returns bytes
    instead of str, avoiding the encode/decode overhead.
    Nz,only one of data or body should be specifiedr/  r.  )r   r-  r  rJ   rK   rL   r   r'   r'   r,   r2   s  s   r2   )Hasynciocollections.abccollectionsr   enumjsonr   r   rn   r   r   concurrent.futuresr   httpr   http.cookiesr   typingr   r   r	   r
   r   r   	multidictr   r   ra   r   r   abcr   compression_utilsr   r   helpersr   r   r   r   r   r   r   r   r   r   r   r    r!   r"   r#   typedefsr$   r%   r&   re   __all__web_requestr3   r   	BaseClassr4   Enumr.   r   r/   r0   r-  r   rd   r1   r2   r'   r'   r'   r,   <module>   s     4	
"    C O	

	