o
    #`^hm                     @   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Z4erddl5m6Z6 ee7ef Z8nejjZ8G dd dej9Z:G dd de8e&Z;G dd de;Z<e*fddddddej=ddedee7 dee> de?dee7 dee3 d e7d!e2d"e<fd#d$Z@d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LooseHeaders)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)   r*   r+    r/   r/   R/home/air/shanriGPT/back/venv/lib/python3.10/site-packages/aiohttp/web_response.pyr$   8   s    r$   c                       s6  e Zd ZdZdddddedee dee ddfd	d
Ze	de
fddZe	dyd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	dzdedee ddfddZe	dee
 fddZd{ddZe	defddZe	defd d!Zdzd"ee ddfd#d$Z	dzd%eee
ef  ddfd&d'Ze	d|d)d*Ze	defd+d,Zdddd-ddddd.d/ed0ed1ee d2ee d3eeeef  d4ed5ee
 d6ee
 d7ee d8ee ddfd9d:Zdd-d;d/ed2ee d4eddfd<d=Ze	dee f fd>d?Zej d0ee ddfd@d?Ze	def fdAdBZ!e!j d0eddfdCdBZ!e	dee f fdDdEZ"e"j d0ee ddfdFdEZ"e	dee#j# fdGdHZ$e$j d0eeee%e#j#ef  ddfdIdHZ$e	dee& fdJdKZ'e'j d0eee&ef  ddfdLdKZ'e(j)fdMe*ddfdNdOZ+dPeddfdQdRZ,d}dUdVZ-dSdTdee. fdWdXZ/dSdTde.fdYdZZ0d{d[d\Z1d{d]d^Z2d_e3ddfd`daZ4d{dbdcZ5d~d_e3ddfdedfZ6defdgdhZ7diede8fdjdkZ9died0e8ddfdldmZ:dieddfdndoZ;defdpdqZ<de=e fdrdsZ>defdtduZ?dve@de
fdwdxZA  ZBS )r%   T   Nstatusreasonheadersr3   r4   r5   returnc                C   sv   d | _ d | _d| _d| _d | _t | _d | _d | _d| _	d | _
d| _i | _|d ur/t|| _nt | _| || d S )NFr   )_body_keep_alive_chunked_compression_compression_forcer   _cookies_req_payload_writer	_eof_sent_must_be_empty_body_body_length_stater   _headers
set_status)selfr3   r4   r5   r/   r/   r0   __init__K   s    zStreamResponse.__init__c                 C   s
   | j d uS N)r>   rE   r/   r/   r0   preparedg   s   
zStreamResponse.preparedOptional[asyncio.Task[None]]c                 C   s   | j r| j jS d S rG   )r=   taskrH   r/   r/   r0   rK   k   s   zStreamResponse.taskc                 C      | j S rG   )_statusrH   r/   r/   r0   r3   r      zStreamResponse.statusc                 C   rL   rG   )r9   rH   r/   r/   r0   chunkedv   rN   zStreamResponse.chunkedc                 C   rL   rG   )r:   rH   r/   r/   r0   compressionz   rN   zStreamResponse.compressionc                 C   rL   rG   )_reasonrH   r/   r/   r0   r4   ~   rN   zStreamResponse.reasonc                 C   sR   | j rJ dt|| _|d u r$zt| jj}W n ty#   d}Y nw || _d S )NzGCannot change the response status code after the headers have been sent )rI   intrM   r   phrase
ValueErrorrQ   )rE   r3   r4   r/   r/   r0   rD      s   

zStreamResponse.set_statusc                 C   rL   rG   r8   rH   r/   r/   r0   
keep_alive   rN   zStreamResponse.keep_alivec                 C   s
   d| _ d S )NFrV   rH   r/   r/   r0   force_close      
zStreamResponse.force_closec                 C   rL   rG   )rA   rH   r/   r/   r0   body_length   rN   zStreamResponse.body_lengthc                 C   s   t dt | jsJ | jjS )Nzoutput_length is deprecated)warningswarnDeprecationWarningr>   buffer_sizerH   r/   r/   r0   output_length   s   
zStreamResponse.output_length
chunk_sizec                 C   s6   d| _ tj| jv rtd|durtdt dS 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)r9   r   CONTENT_LENGTHrC   RuntimeErrorr[   r\   r]   )rE   r`   r/   r/   r0   enable_chunked_encoding   s   z&StreamResponse.enable_chunked_encodingforcec                 C   sR   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)   r+   r[   r\   r]   r:   r;   )rE   rd   r/   r/   r0   enable_compression   s   

z!StreamResponse.enable_compressionCIMultiDict[str]c                 C   rL   rG   )rC   rH   r/   r/   r0   r5      rN   zStreamResponse.headersc                 C   rL   rG   )r<   rH   r/   r/   r0   cookies   rN   zStreamResponse.cookies/)expiresdomainmax_agepathsecurehttponlyversionsamesitenamevaluerk   rl   rm   rn   ro   rp   rq   rr   c                C   s   | j |}|dur|jdkr| j |d || j |< | j | }|dur)||d< n
|ddkr3|d= |dur;||d< |durFt||d< nd|v rM|d= ||d< |durY||d< |dura||d	< |	duri|	|d
< |
durs|
|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.
        NrR   rk   Thu, 01 Jan 1970 00:00:00 GMTrl   zmax-agern   ro   rp   rq   rr   )r<   getcoded_valuepopstr)rE   rs   rt   rk   rl   rm   rn   ro   rp   rq   rr   oldcr/   r/   r0   
set_cookie   s2   


zStreamResponse.set_cookie)rl   rn   c                C   s(   | j |d | j|ddd||d dS )zBDelete cookie.

        Creates new empty expired cookie.
        NrR   r   ru   )rm   rk   rl   rn   )r<   rx   r|   )rE   rs   rl   rn   r/   r/   r0   
del_cookie   s   
zStreamResponse.del_cookiec                       t  jS rG   )supercontent_lengthrH   	__class__r/   r0   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)rS   r9   rb   ry   rC   r   ra   rx   rE   rt   r/   r/   r0   r     s   c                    r~   rG   )r   content_typerH   r   r/   r0   r     r   zStreamResponse.content_typec                 C   s   | j  t|| _|   d S rG   )r   ry   _content_type_generate_content_type_headerr   r/   r/   r0   r   #  s   
c                    r~   rG   )r   charsetrH   r   r/   r0   r   )  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   rb   _content_dictrx   ry   lowerr   )rE   rt   ctyper/   r/   r0   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   rC   rv   r   LAST_MODIFIEDrH   r/   r/   r0   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)rC   rx   r   r   re   rS   floattimestrftimegmtimemathceildatetimeutctimetuplery   r   r/   r/   r0   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 )N)rt   r      )is_weakrt   )
rC   rv   r   ETAGr   r   r   	fullmatchgrouprf   )rE   quoted_valuematchr   rt   r/   r/   r0   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)rC   rx   r   r   re   ry   r   r   rt   r   r   rU   type)rE   rt   	hdr_valuer/   r/   r0   r   f  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/   ).0kvr/   r/   r0   	<genexpr>  s     z?StreamResponse._generate_content_type_header.<locals>.<genexpr>)r   r   joinitemsrC   )rE   r   paramsr   r/   r/   r0   r   {  s   z,StreamResponse._generate_content_type_headercodingc                    sN   |t jkr%| jd usJ |j| jtj< | j|j | jtj	d  d S d S rG   )
r$   r+   r>   rt   rC   r   CONTENT_ENCODINGrg   popallra   )rE   r   r/   r/   r0   _do_start_compression  s   
z$StreamResponse._do_start_compressionrequestr(   c                    s`   | j r| | j I d H  d S |jtjd }tD ]}|j|v r-| |I d H   d S qd S )NrR   )	r;   r   r5   rv   r   ACCEPT_ENCODINGr   r$   rt   )rE   r   accept_encodingr   r/   r/   r0   _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 rG   )r?   r>   r   methodr3   r@   _start)rE   r   r/   r/   r0   prepare  s   
zStreamResponse.preparec                    sD   || _ |j }| _|  I d H  || I d H  |  I d H  |S rG   )r=   r>   _prepare_headers_prepare_hook_write_headers)rE   r   writerr/   r/   r0   r     s   zStreamResponse._startc                    s  | j }|d us
J | j}|d usJ | j}|d u r|j}|| _|j}| j}| j D ]}|jdddd  }|	t
j| q+| jrJ| |I d H  | jro|tkrYtd|j| jse|  d|t
j< t
j|v rn|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|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 )
NrR   )headerr   z@Using chunked encoding is forbidden for HTTP/{0.major}.{0.minor}rO   Fr   z
keep-aliveclose)$r=   r>   r8   rW   rq   rC   r<   valuesoutputaddr   
SET_COOKIEr:   r   r9   r    rb   formatr@   enable_chunkingTRANSFER_ENCODINGra   _length_checkr   lengthr   r   r3   
setdefaultr   DATEr   SERVERr   
CONNECTIONr   )rE   r   r   rW   rq   r5   cookiert   r/   r/   r0   r     st   





zStreamResponse._prepare_headersc                    s`   | j }|d us
J | j}|d usJ |j}d|d |d | j| j}||| jI d H  d S )NzHTTP/{}.{} {} {}r   r   )r=   r>   rq   r   rM   rQ   write_headersrC   )rE   r   r   rq   status_liner/   r/   r0   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())	re   bytes	bytearray
memoryviewr   r?   rb   r>   writerE   r   r/   r/   r0   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>   r[   r\   r]   drainrH   r/   r/   r0   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)re   r   r   r   r   r?   r>   	write_eofr=   output_sizerA   r   r/   r/   r0   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eof znot prepared<>)r?   rI   r=   r   rn   r   r,   r4   )rE   infor/   r/   r0   __repr__"  s   zStreamResponse.__repr__keyc                 C   s
   | j | S rG   rB   rE   r   r/   r/   r0   __getitem__,  rY   zStreamResponse.__getitem__c                 C   s   || j |< d S rG   r   )rE   r   rt   r/   r/   r0   __setitem__/  s   zStreamResponse.__setitem__c                 C   s   | j |= d S rG   r   r   r/   r/   r0   __delitem__2     zStreamResponse.__delitem__c                 C   
   t | jS rG   )lenrB   rH   r/   r/   r0   __len__5  rY   zStreamResponse.__len__c                 C   r   rG   )iterrB   rH   r/   r/   r0   __iter__8  rY   zStreamResponse.__iter__c                 C   s   t t| S rG   )hashidrH   r/   r/   r0   __hash__;  r   zStreamResponse.__hash__otherc                 C   s   | |u S rG   r/   )rE   r   r/   r/   r0   __eq__>  s   zStreamResponse.__eq__)r6   rJ   rG   )r6   N)r6   rh   )r   r(   r6   Nr   )Cr,   r-   r.   r   rS   r
   ry   r#   rF   propertyrf   rI   rK   r3   rO   rP   r4   rD   rW   rX   rZ   r_   rc   r   r$   rg   r5   r   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__r/   r/   r   r0   r%   G   s   



	

4
 

	


B


r%   c                       sV  e Z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 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&   Nr1   )	bodyr3   r4   textr5   r   r   zlib_executor_sizezlib_executorr   r3   r4   r   r5   r   r   r   r   r6   c       	            sX  |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 | _|| _|	| _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=r2   )rU   r   re   r   r   ry   	TypeErrorr   encoder   rF   r   r   _compressed_body_zlib_executor_size_zlib_executor)rE   r   r3   r4   r   r5   r   r   r   r   real_headersr   r/   r0   rF   C  sT   







zResponse.__init__c                 C   rL   rG   )r7   rH   r/   r/   r0   r     rN   zResponse.bodyc                 C   s   |d u rd | _ d| _nPt|ttfr|| _ d| _nBztj| | _ }W n tjy4   t	dt
| w d| _| j}tj|vrF|j|tj< |jr[|j D ]\}}||vrZ|||< qNd | _d S )NFzUnsupported body type %rT)r7   _body_payloadre   r   r   r   PAYLOAD_REGISTRYrv   LookupErrorrU   r   rC   r   r   r   r5   r   r   )rE   r   r5   r   rt   r/   r/   r0   r     s*   

c                 C   s    | j d u rd S | j | jpdS )Nr   )r7   decoder   rH   r/   r/   r0   r     s   
zResponse.textc                 C   s`   |d u st |tsJ dt| | jdkrd| _| jd u r!d| _|| j| _d| _d | _d S )Nr   r   r   r   F)	re   ry   r   r   r   r   r7   r  r   )rE   r   r/   r/   r0   r     s   




c                    sT   | j rd S tj| jv rt jS | jd urt| jS | jrd S | j	d ur(t| j	S dS )Nr   )
r9   r   ra   rC   r   r   r   r   r  r7   rH   r   r/   r0   r     s   



zResponse.content_lengthrt   c                 C   s   t d)Nz#Content length is set automatically)rb   r   r/   r/   r0   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rc| jr:t  I d H  d S | jrUt	t
|}|| jI d H  t  I d H  d S t t	t|I d H  d S t  I d H  d S )Nzdata arg is not supported, got )r?   r   r7   r=   r>   r@   r   r   r  r   r!   r   r   )rE   r   r   r   r   r/   r0   r     s$   

zResponse.write_eofr   r(   c                    s   t |j| jrtj| jv r| jtj= nC| jsWtj| jvrW| jr4tt	| j
j}|d ur3t|| jtj< n#| j
r<t| j
nd}|dksO| jdkrW|j tjkrWt|| jtj< t |I d H S )N0i0  )r   r   r3   r   ra   rC   r9   r  r   r!   r7   sizery   r   upper	METH_HEADr   r   )rE   r   r  body_lenr   r/   r0   r     s    
zResponse._startr   c                    s   | j s| jrt |I d H S |tjkritt|j| j	| j
d}| jd us(J | j	d u r@t| jdkr@tdt| j d || jI d H |  | _| jd usUJ |j| jtj< tt| j| jtj< d S d S )N)encodingmax_sync_chunk_sizeexecutori   z2Synchronous 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  r9   r   r   r$   r+   r   ry   rt   r   r   r7   r   r[   r\   compressflushr   rC   r   r   ra   )rE   r   
compressorr   r/   r0   r      s,   
zResponse._do_start_compressionr   )r,   r-   r.   r   rS   r
   ry   r#   r   rF   r   r   r   r!   r   r   r   r   r   r   r   r$   r   r   r/   r/   r   r0   r&   B  s\    	
Fr&   r1   zapplication/json)r   r   r3   r4   r5   r   dumpsr   r   r   r3   r4   r5   r   r  r6   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   r3   r4   r5   r   )r   rU   r&   )r   r   r   r3   r4   r5   r   r  r/   r/   r0   r'     s   r'   )Aasynciocollections.abccollectionsr   enumjsonr   r   r[   concurrent.futuresr   httpr   http.cookiesr   typingr   r   r   r   r	   r
   r   r   	multidictr   r   rR   r   r   abcr   compression_utilsr   helpersr   r   r   r   r   r   r   r   r   r   r   r   r    r!   typedefsr"   r#   __all__web_requestr(   ry   	BaseClassEnumr$   r%   r&   r  r   rS   r'   r/   r/   r/   r0   <module>   sx    (0   ~ ]	
