o
    4˜Žj®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r´d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'   úQ/var/www/kodo/Anonymous/send/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!d’d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'	d“d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*d”d.d/„Z+e!defd0d1„ƒZ,e!defd2d3„ƒZ-d“d4edB ddfd5d6„Z.		d•d7e
eB dB d8edB ddfd9d:„Z/e!d–d<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„ZAd—dhdi„ZBdgd
dedB fdjdk„ZCdgd
defdldm„ZDd”dndo„ZEd”dpdq„ZFdreeB eGB ddfdsdt„ZHd”dudv„ZId˜dre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d€d~„ZOeLd|eMeN dCeNddfd�d‚„ƒZQeLd|edCePddfdƒd‚„ƒZQd|eeMeN B dCePddfd„d‚„ZQd|eeMeN B ddfd…d†„ZRdefd‡dˆ„ZSdeTeeMeP B  fd‰dŠ„ZUdefd‹dŒ„ZVd�eWde
fdŽd�„ZXde
fd�d‘„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 )zŸSet 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ƒrJ|jr<|jdd�tjdd� }t d| ¡ ¡| j tj< d S t|tƒrW|| j tj< d S dt|ƒj› �}t|ƒ‚)Nz%a, %d %b %Y %H:%M:%S GMTr   )Úmicrosecondr   )Úsecondsz$Unsupported type for last_modified: )rP   r�   r   rž   ry   rd   ÚfloatÚtimeÚstrftimeÚgmtimeÚmathÚceilÚdatetimer    ÚreplaceÚ	timedeltaÚ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s‘d}| jr®t
j|v r¤t|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rád
|t
j#< d S d S |tkrðd|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ð   6  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__P  s   zStreamResponse.__repr__Úkeyc                 C   ó   d S rT   r'   ©rR   rù   r'   r'   r,   Ú__getitem__Z  ó   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__c  rý   zStreamResponse.__setitem__c                 C   rú   rT   r'   rÿ   r'   r'   r,   r   f  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   )ÚNotAppKeyWarningz„It 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   i  s   ÿ
ûc                 C   s   | j |= d S rT   rþ   rû   r'   r'   r,   Ú__delitem__{  ó   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krOt|ƒ| jt j< tƒ  |¡I d H S )NÚ0i0  )r   rt   rP   r   rÉ   rJ   r?   ry   r=   r#   ÚsizerŠ   r  Ú	METH_HEADr�   rÊ   )rR   rÄ   r(  Úbody_lenr’   r'   r,   rÊ   5  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Ã   G  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–   r1  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–   r1  r'   r'   r,   r1   [  s   úr1   ©r  rJ   rK   rL   r–   c                C   s2   | t ur|durtdƒ‚|| ƒ}t|||||d�S )z¶Create 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 specifiedr3  r2  )rç   r1  r  rJ   rK   rL   r–   r'   r'   r,   r2   u  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   r1  ré   rd   r1   r2   r'   r'   r'   r,   Ú<module>   s²     4	
"    E Oÿ÷ÿýüûúùø	÷

öÿøÿýüûúùø	÷