U
    u?dOk                     @   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   8/tmp/pip-unpacked-wheel-_pk67_um/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 k	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 k	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   sV   | j rtdt|| _|d krLz|| j d }W n tk
rJ   d}Y nX || _d S )NzGCannot change the response status code after the headers have been sentr    )rL   AssertionError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 )NFrW   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t| jjS )Nzoutput_length is deprecated)warningswarnDeprecationWarningrA   rT   buffer_sizerK   r2   r2   r3   output_length   s    
zStreamResponse.output_length)
chunk_sizer9   c                 C   s2   d| _ tj| jkrtd|dk	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   RuntimeErrorr[   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k	rDt|tsDt	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.   r[   r\   r]   
isinstancerT   r=   r>   )rG   rd   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valuerk   rl   rm   rn   ro   rp   rq   r+   r9   c                C   s   | j |}|dk	r,|jdkr,| j |d || j |< | j | }|dk	rR||d< n|ddkrf|d= |dk	rv||d< |dk	rt||d< nd|kr|d= ||d< |dk	r||d< |dk	r||d	< |	dk	r|	|d
< |
dk	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   rk   Thu, 01 Jan 1970 00:00:00 GMTrl   zmax-agern   ro   rp   rq   r+   )r?   getcoded_valuepopstr)rG   rr   rs   rk   rl   rm   rn   ro   rp   rq   r+   oldcr2   r2   r3   
set_cookie   s0    


zStreamResponse.set_cookie)rl   rn   )rr   rl   rn   r9   c                C   s(   | j |d | j|ddd||d dS )zBDelete cookie.

        Creates new empty expired cookie.
        NrS   r   rt   )rm   rk   rl   rn   )r?   rw   r{   )rG   rr   rl   rn   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rs   r9   c                 C   sD   |d k	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)rU   r<   rb   rx   rE   r   ra   rw   rG   rs   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   rx   _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 k	s$t|d k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   rb   _content_dictrT   rw   rx   lowerr   )rG   rs   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   ru   r   LAST_MODIFIEDrK   r2   r2   r3   last_modifiedB  s    zStreamResponse.last_modifiedc                 C   s   |d k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   rw   r   r   rg   rU   floattimestrftimegmtimemathceildatetimeutctimetuplerx   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)rs   r      )is_weakrs   )
rE   ru   r   ETAGr   r   r   	fullmatchgrouprf   )rG   Zquoted_valuematchr   rs   r2   r2   r3   etag[  s    

zStreamResponse.etagc                 C   s   |d k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   rw   r   r   rg   rx   r   r   rs   r   r   
ValueErrorre   )rG   rs   Z	hdr_valuer2   r2   r3   r   k  s$    

")CONTENT_TYPEr9   c                 C   s^   | j d k	st| jd k	st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>  s     z?StreamResponse._generate_content_type_header.<locals>.<genexpr>)r   rT   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 k	st|j| jtj< | j|j | j	tj
d  d S rJ   )r%   r.   rA   rT   rs   rE   r   CONTENT_ENCODINGrh   Zpopallra   )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|kr2| |I d H   d S q2d S )NrS   )	r>   r   r8   ru   r   ACCEPT_ENCODINGr   r%   rs   )rG   r   accept_encodingr   r2   r2   r3   _start_compression  s    
z!StreamResponse._start_compressionc                    s*   | j r
d S | jd k	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 k	st| j}|d k	s$t| j}|d k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|kr|tj= n~| jrT| j|_|jd kr6|tkr0| jdkr0|  d|tj< tj|kr4|tj= nd}n|tkrT| jdkrT|tj= | jd	krn|tjd
 |tjt  |tjt tj |k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@   rT   rA   r;   rX   rq   rE   r?   valuesoutputaddr   Z
SET_COOKIEr=   r   r<   r!   rb   formatZenable_chunkingZTRANSFER_ENCODINGra   _length_checkr~   lengthr6   
setdefaultr   ZDATEr   ZSERVERr   Z
CONNECTIONr    )rG   r   r   rX   rq   r8   cookiers   r2   r2   r3   r     s^    






zStreamResponse._prepare_headersc                    s^   | j }|d k	st| j}|d k	s$t|j}d|d |d | j| j}||| jI d H  d S )NzHTTP/{}.{} {} {}r   r   )	r@   rT   rA   rq   r   rN   rQ   Zwrite_headersrE   )rG   r   r   rq   Zstatus_liner2   r2   r3   r     s       zStreamResponse._write_headersdatar9   c                    sV   t |tttfs tdt| | jr.td| jd k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())
rg   bytes	bytearray
memoryviewrT   re   rB   rb   rA   writerG   r   r2   r2   r3   r     s     

zStreamResponse.writec                    sD   | j rtd| jd k	s t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   rT   rA   r[   r\   r]   drainrK   r2   r2   r3   r     s    zStreamResponse.drain    c                    sn   t |tttfs tdt| | jr*d S | jd k	s<td| j|I d H  d| _d | _	| jj
| _d | _d S )Nr   r   T)rg   r   r   r   rT   re   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 k	s t| jj d| jj d}nd}d| jj d| j d| dS )Neof znot prepared<>)	rB   rL   r@   rT   methodrn   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   rs   r9   c                 C   s   || j |< d S rJ   r   )rG   r   rs   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   | |kS rJ   r2   )rG   r   r2   r2   r3   __eq__:  s    zStreamResponse.__eq__)N)N)r   )Er/   r0   r1   r   rU   r   rx   r$   rH   propertyrf   rL   rM   r6   rO   rP   r7   r   r	   r   rF   rX   rY   rZ   r_   rc   r   r%   rh   r8   ri   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   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 k	r|d k	rt d|d kr(t }
nt|ts<t|}
n|}
|d k	rXd|krXt d|d k	rtj|
kr||sr|rt dnRt|tstdt| |d krd}|d krd}|d | |
tj< ||}d }nNtj|
kr|d k	s|d k	rt dn*|d k	r|d k	r|d| 7 }||
tj< t	 j
|||
d	 |d k	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   rg   r   r   rx   	TypeErrorre   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   ra   r9   c                 C   s   |d krd | _ d| _nt|ttfr2|| _ d| _nztj| | _ }W n& tjk
rn   t	dt
| Y nX d| _| j}| js||kr|j}|d k	rt|||< ||kr|j||< |jr|j D ]\}}||kr|||< qd | _d S )NFzUnsupported body type %rT)r:   _body_payloadrg   r   r   r   ZPAYLOAD_REGISTRYru   LookupErrorr   re   rE   r<   sizerx   r   r8   r   r   )rG   r   r   ra   r8   r   r   rs   r2   r2   r3   r     s.    

c                 C   s    | j d k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 ks"t |ts"tdt| | jdkr2d| _| jd krBd| _|| j| _d| _d | _	d S )Nr   r   r   r   F)
rg   rx   rT   re   r   r   r   r:   r   r   )rG   r   r2   r2   r3   r     s    
 


c                    sX   | j r
d S tj| jkrt jS | jd k	r2t| jS | jr<d S | j	d k	rPt| j	S dS d S )Nr   )
r<   r   ra   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)rb   r   r2   r2   r3   r~     s    r   r   c                    s   | j r
d S | jd kr| j}n| j}|r4td|| jd k	sBt| jd k	sPt|d k	r| jjtjksp| j	dk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:   rT   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krF| jsF| jd k	r:tt| j| jtj< nd| jtj< t 	|I d H S )N0)
r<   r   ra   rE   r   r:   rx   r   r}   r   r   r   r2   r3   r     s    
zResponse._start)	zlib_moder9   c                 C   sB   |dkst tj|d}| j}|d k	s*t |||  | _d S )Nr   )wbits)rT   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 k	sTt
| jd k	rt|| jkrt | j| j|I d H  n
| | | j}|d k	st
|j| jtj< tt|| jtj< d S )N   )r   r<   r}   r   r%   r.   r-   r  	MAX_WBITSr:   rT   r   r   asyncioZget_event_loopZrun_in_executorr   r  r   rs   rE   r   r   rx   ra   )rG   r   r   r  Zbody_outr   r2   r3   r     s*    
  
zResponse._do_start_compression)r   )r/   r0   r1   r   rU   r   rx   r$   r   rH   r   r   r   r"   r   r   r   r   ra   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 k	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   r[   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)   rx   Z	BaseClass	_reservedEnumr%   r&   r'   r
  r   rU   r(   r2   r2   r2   r3   <module>   sh   0,
   u f