o
    zsgp                     @   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 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/m0Z0 ddlm1Z1 ddl2m3Z3m4Z4 dd eD Z5dZ6dZ7erddl8m9Z9 ee:e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jAddedee: d eeB d!eCd"ee: d#ee4 d$e:d%e3d&e@fd'd(ZDd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).0http_statusr$   r$   P/var/www/html/minecraft/env/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__r0   r1   r2   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 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< ejZ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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.dejfd6eeeef  d7eddfd8d9Z/e!dd;d<Z0e!defd=d>Z1d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 ddfdKdLZ2dd?ddddMdAedDee dFedGee dHee dJee ddfdNdOZ3e!dee f fdPdQZ4e4j5dBee ddfdRdQZ4e!def fdSdTZ6e6j5dBeddfdUdTZ6e!dee f fdVdWZ7e7j5dBee ddfdXdWZ7e!dee8j8 fdYdZZ9e9j5dBeeee:e8j8ef  ddfd[dZZ9e!dee; fd\d]Z<e<j5dBeee;ef  ddfd^d]Z<e=j>fd_e?ddfd`daZ@dbeddfdcddZAddfdgZBded
dee fdhdiZCded
defdjdkZDddldmZEddndoZFdpeeeeGf ddfdqdrZHddsdtZIddpeddfdvdwZJdefdxdyZKdzedeLfd{d|ZMdzedBeLddfd}d~ZNdzeddfddZOdefddZPdeQe fddZRdefddZSdeTd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_headersrD   rE   rF   rG   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)selfrD   rE   rF   rG   r$   r$   r)   __init__^   s   zStreamResponse.__init__c                 C   s   | j p| jd uS N)r@   r?   rL   r$   r$   r)   preparedx   s   zStreamResponse.preparedOptional[asyncio.Task[None]]c                 C   s   | j r| j jS d S rN   )r>   taskrO   r$   r$   r)   rR   |   s   zStreamResponse.taskc                 C      | j S rN   )_statusrO   r$   r$   r)   rD         zStreamResponse.statusc                 C   rS   rN   )r:   rO   r$   r$   r)   chunked   rU   zStreamResponse.chunkedc                 C   rS   rN   )r;   rO   r$   r$   r)   compression   rU   zStreamResponse.compressionc                 C   rS   rN   )_reasonrO   r$   r$   r)   rE      rU   zStreamResponse.reasonc                 C   s   | j rJ d| || d S )NzGCannot change the response status code after the headers have been sent)rP   rK   rL   rD   rE   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)intrT   REASON_PHRASESget
ValueErrorrX   rY   r$   r$   r)   rK      s   

zStreamResponse._set_statusc                 C   rS   rN   r9   rO   r$   r$   r)   
keep_alive   rU   zStreamResponse.keep_alivec                 C   s
   d| _ d S )NFra   rO   r$   r$   r)   force_close      
zStreamResponse.force_closec                 C   rS   rN   )_body_lengthrO   r$   r$   r)   body_length   rU   zStreamResponse.body_lengthc                 C   s   t dt | jsJ | jjS )Nzoutput_length is deprecated)warningswarnDeprecationWarningr?   buffer_sizerO   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_LENGTHrJ   RuntimeErrorrg   rh   ri   r:   )rL   rl   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+   r0   r2   rg   rh   ri   r;   r=   r<   )rL   rp   rq   r$   r$   r)   enable_compression   s   

z!StreamResponse.enable_compressionCIMultiDict[str]c                 C   rS   rN   )rJ   rO   r$   r$   r)   rF      rU   zStreamResponse.headersc                 C   s   | j d u r	t | _ | j S rN   )rB   r   rO   r$   r$   r)   cookies   s   
zStreamResponse.cookies/)expiresdomainmax_agepathsecurehttponlyversionsamesitenamer%   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rf|
|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.
        Nrx   Thu, 01 Jan 1970 00:00:00 GMTry   zmax-ager{   r|   r}   r~   r   )rB   r   r_   str)rL   r   r%   rx   ry   rz   r{   r|   r}   r~   r   cr$   r$   r)   
set_cookie   s0   



zStreamResponse.set_cookie)ry   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.
        Nr[   r   r   )rz   rx   ry   r{   r|   r}   r   )rB   popr   )rL   r   ry   r{   r|   r}   r   r$   r$   r)   
del_cookie  s   

zStreamResponse.del_cookiec                       t  jS rN   )supercontent_lengthrO   	__class__r$   r)   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)r]   r:   rn   r   rJ   r   rm   r   rL   r%   r$   r$   r)   r   2  s   c                    r   rN   )r   content_typerO   r   r$   r)   r   >  r   zStreamResponse.content_typec                 C   s   | j  t|| _|   d S rN   )r   r   _content_type_generate_content_type_headerr   r$   r$   r)   r   C  s   
c                    r   rN   )r   charsetrO   r   r$   r)   r   I  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   rn   _content_dictr   r   lowerr   )rL   r%   ctyper$   r$   r)   r   N  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   rJ   r_   r   LAST_MODIFIEDrO   r$   r$   r)   last_modified]  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)rJ   r   r   r   rr   r]   floattimestrftimegmtimemathceildatetimeutctimetupler   r   r$   r$   r)   r   e  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 )Nr6   r      )is_weakr%   )
rJ   r_   r   ETAGr   r   r   	fullmatchgrouprs   )rL   quoted_valuematchr   r%   r$   r$   r)   etagv  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)rJ   r   r   r   rr   r   r   r   r%   r   r   r`   type)rL   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itemsrJ   )rL   r   paramsr   r$   r$   r)   r     s   z,StreamResponse._generate_content_type_headerr7   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 rN   )r+   r2   r?   r%   rJ   r   CONTENT_ENCODINGrt   r<   popallrm   )rL   r7   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 )Nr[   )	r=   r   rF   r_   r   ACCEPT_ENCODINGr   CONTENT_CODINGSr   )rL   r   accept_encodingr%   r7   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 rN   )r@   r?   r   methodrD   rA   _start)rL   r   r$   r$   r)   prepare  s   
zStreamResponse.preparec                    sD   || _ |j }| _|  I d H  || I d H  |  I d H  |S rN   )r>   r?   _prepare_headers_prepare_hook_write_headers)rL   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 )Nr[   )headerr   z@Using chunked encoding is forbidden for HTTP/{0.major}.{0.minor}rV   Fr   r   z
keep-aliveclose)$r>   r?   r9   rb   r~   rJ   rB   valuesoutputaddr   
SET_COOKIEr;   r   r:   r    rn   formatrA   enable_chunkingTRANSFER_ENCODING_length_checkr   lengthrm   r   r   rD   
setdefaultr   DATEr   SERVERr   
CONNECTIONr   )rL   r   r   rb   r~   rF   cookier%   r$   r$   r)   r     st   




zStreamResponse._prepare_headersc                    sl   | j }|d us
J | j}|d usJ |j}d|d  d|d  d| j d| j }||| jI d H  d S )NzHTTP/r   .r    )r>   r?   r~   rT   rX   write_headersrJ   )rL   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())	rr   bytes	bytearray
memoryviewr   r@   rn   r?   writerL   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?   rg   rh   ri   drainrO   r$   r$   r)   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)rr   r   r   r   r   r@   r?   	write_eofr>   output_sizere   r   r$   r$   r)   r   2  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@   rP   r>   r   r{   r   r3   rE   )rL   infor$   r$   r)   __repr__B  s   zStreamResponse.__repr__keyc                 C   s
   | j | S rN   rI   rL   r   r$   r$   r)   __getitem__L  rd   zStreamResponse.__getitem__c                 C   s   || j |< d S rN   r   )rL   r   r%   r$   r$   r)   __setitem__O  s   zStreamResponse.__setitem__c                 C   s   | j |= d S rN   r   r   r$   r$   r)   __delitem__R     zStreamResponse.__delitem__c                 C   
   t | jS rN   )lenrI   rO   r$   r$   r)   __len__U  rd   zStreamResponse.__len__c                 C   r   rN   )iterrI   rO   r$   r$   r)   __iter__X  rd   zStreamResponse.__iter__c                 C   s   t t| S rN   )hashidrO   r$   r$   r)   __hash__[  r   zStreamResponse.__hash__otherc                 C   s   | |u S rN   r$   )rL   r   r$   r$   r)   __eq__^  s   zStreamResponse.__eq__)rH   rQ   rN   )rH   N)rH   ru   )r   r/   rH   Nr   )Wr3   r4   r5   r   r   r   r!   __annotations__r   r8   r9   r
   rs   r:   r;   zlibZ_DEFAULT_STRATEGYr<   r]   r=   r+   r>   r?   r   r@   rA   re   rB   r   r   r#   r   rM   propertyrP   rR   rD   rV   rW   rE   rZ   rK   rb   rc   rf   rk   ro   rt   rF   rv   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   __classcell__r$   r$   r   r)   r,   M   sT  
 






	

5	
 




A



r,   c                       sd  e Zd ZU dZee ed< 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_bodyrC   )	bodyrD   rE   textrF   r   r   zlib_executor_sizezlib_executorr  rD   rE   r  rF   r   r   r  r  rH   c       	            sR  |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 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=)rD   rE   rG   )r`   r   rr   r   r   r   	TypeErrorr   encoder   rM   r  r  _zlib_executor_size_zlib_executor)rL   r  rD   rE   r  rF   r   r   r  r  real_headersr   r$   r)   rM   f  sR   







zResponse.__init__c                 C   rS   rN   )r8   rO   r$   r$   r)   r    rU   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)r8   rr   r   r   r   PAYLOAD_REGISTRYr_   LookupErrorr`   r   rJ   r   r   r   rF   r   r  )rL   r  rF   r   r%   r$   r$   r)   r    s$   

c                 C   s    | j d u rd S | j | jpdS )Nr  )r8   decoder   rO   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  )rr   r   r   r   r   r
  r8   r  )rL   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   rm   rJ   r]   r  r   rr   r8   r!   rO   r$   r$   r)   r     s   



zResponse.content_lengthr%   c                 C   s   t d)Nz#Content length is set automatically)rn   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	rT| j
| 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  r8   r>   r?   rA   r   r   rr   r!   r   r   r   )rL   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j
| 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   rm   rJ   r   r   rD   r:   rr   r8   r!   sizer   r   METH_HEAD_ALLr   r   )rL   r   body_lenr   r$   r)   r     s   
zResponse._startr7   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)encoding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.)r:   rr   r8   r!   r   r   r+   r2   r   r%   r  r  r   LARGE_BODY_SIZErg   rh   compressflushr  rJ   r   r   r   rm   )rL   r7   
compressorr   r$   r)   r     s*   
zResponse._do_start_compressionr   )r3   r4   r5   r  r
   r   r   r   r]   r   r#   r   rM   r   r   r!   r  r   r  r   r   r   r   r+   r   r   r$   r$   r   r)   r-   b  s^   
 	
Cr-   rC   zapplication/json)r  r  rD   rE   rF   r   dumpsr   r  r  rD   rE   rF   r   r  rH   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  rD   rE   rF   r   )r   r`   r-   )r   r  r  rD   rE   rF   r   r  r$   r$   r)   r.   1  s   r.   )Easynciocollections.abccollectionsr   enumjsonr   r   rg   r   concurrent.futuresr   httpr   http.cookiesr   typingr   r   r   r   r	   r
   r   r   	multidictr   r   r[   r   r   abcr   compression_utilsr   helpersr   r   r   r   r   r   r   r   r   r   r   r   r    r!   typedefsr"   r#   r^   r  __all__web_requestr/   r   	BaseClassEnumr+   r   r,   r-   r  r   r]   r.   r$   r$   r$   r)   <module>   s    (0
     Q	
