o
    ~#il                     @   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d eD Z4dZ5dZ6erddl7m8Z8 ee9e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j@ddedee9 d eeA d!eBd"ee9 d#ee3 d$e9d%e2d&e?fd'd(ZCd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$   [/var/www/GraceOrthoHospital/venv_grace/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*   E   s    c                       sf  e Zd ZU dZedeeef ed< 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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
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d~dd Zed	e	fd!d"Zed	e	fd#d$Zd}d%e
e	 d	dfd&d'Z	d}d(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d0ddddd1d2ed3ed4e
e d5e
e d6e
ee	ef  d7ed8e
e d9e
e d:e
e d;e
e d	dfd<d=Z"dd0d>d2ed5e
e d7ed	dfd?d@Z#ed	e
e	 f fdAdBZ$e$j%d3e
e	 d	dfdCdBZ$ed	ef fdDdEZ&e&j%d3ed	dfdFdEZ&ed	e
e f fdGdHZ'e'j%d3e
e d	dfdIdHZ'ed	e
e(j( fdJdKZ)e)j%d3e
ee	e*e(j(ef  d	dfdLdKZ)ed	e
e+ fdMdNZ,e,j%d3e
ee+ef  d	dfdOdNZ,e-j.fdPe/d	dfdQdRZ0dSed	dfdTdUZ1ddXdYZ2dVdWd	e
e3 fdZd[Z4dVdWd	e3fd\d]Z5d~d^d_Z6d~d`daZ7dbed	dfdcddZ8d~dedfZ9ddbed	dfdhdiZ:d	efdjdkZ;dled	e<fdmdnZ=dled3e<d	dfdodpZ>dled	dfdqdrZ?d	e	fdsdtZ@d	eAe fdudvZBd	e	fdwdxZCdyeDd	efdzd{ZE  ZFS )r,   TN_body   statusreasonheadersr;   r<   r=   returnc                C   sv   d | _ d | _d| _d| _d | _t | _d | _d | _d| _	d | _
d| _i | _|d ur/t|| _nt | _| || d S )NFr   )r8   _keep_alive_chunked_compression_compression_forcer   _cookies_req_payload_writer	_eof_sent_must_be_empty_body_body_length_stater   _headers_set_status)selfr;   r<   r=   r$   r$   r)   __init__R   s    zStreamResponse.__init__c                 C   s   | j p| jd uS N)rF   rE   rL   r$   r$   r)   preparedn   s   zStreamResponse.preparedOptional[asyncio.Task[None]]c                 C   s   | j r| j jS d S rN   )rD   taskrO   r$   r$   r)   rR   r   s   zStreamResponse.taskc                 C      | j S rN   )_statusrO   r$   r$   r)   r;   y      zStreamResponse.statusc                 C   rS   rN   )r@   rO   r$   r$   r)   chunked}   rU   zStreamResponse.chunkedc                 C   rS   rN   )rA   rO   r$   r$   r)   compression   rU   zStreamResponse.compressionc                 C   rS   rN   )_reasonrO   r$   r$   r)   r<      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   r;   r<   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   r?   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   )rH   rO   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DeprecationWarningrE   buffer_sizerO   r$   r$   r)   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)r@   r   CONTENT_LENGTHrJ   RuntimeErrorrf   rg   rh   )rL   rk   r$   r$   r)   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+   r0   r2   rf   rg   rh   rA   rB   )rL   ro   r$   r$   r)   enable_compression   s   

z!StreamResponse.enable_compressionCIMultiDict[str]c                 C   rS   rN   )rJ   rO   r$   r$   r)   r=      rU   zStreamResponse.headersc                 C   rS   rN   )rC   rO   r$   r$   r)   cookies   rU   zStreamResponse.cookies/)expiresdomainmax_agepathsecurehttponlyversionsamesitenamer%   rv   rw   rx   ry   rz   r{   r|   r}   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.
        Nr[   rv   Thu, 01 Jan 1970 00:00:00 GMTrw   zmax-agery   rz   r{   r|   r}   )rC   r_   coded_valuepopstr)rL   r~   r%   rv   rw   rx   ry   rz   r{   r|   r}   oldcr$   r$   r)   
set_cookie   s2   


zStreamResponse.set_cookie)rw   ry   c                C   s(   | j |d | j|ddd||d dS )zBDelete cookie.

        Creates new empty expired cookie.
        Nr[   r   r   )rx   rv   rw   ry   )rC   r   r   )rL   r~   rw   ry   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@   rm   r   rJ   r   rl   r   rL   r%   r$   r$   r)   r     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   ,  s   
c                    r   rN   )r   charsetrO   r   r$   r)   r   2  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   rm   _content_dictr   r   lowerr   )rL   r%   ctyper$   r$   r)   r   7  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_modifiedF  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   rp   r]   floattimestrftimegmtimemathceildatetimeutctimetupler   r   r$   r$   r)   r   N  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grouprq   )rL   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)rJ   r   r   r   rp   r   r   r   r%   r   r   r`   type)rL   r%   	hdr_valuer$   r$   r)   r   o  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                    sN   |t ju rd S | jd usJ |j| jtj< | j|j | jtj	d  d S rN   )
r+   r2   rE   r%   rJ   r   CONTENT_ENCODINGrr   popallrl   )rL   r7   r$   r$   r)   _do_start_compression  s   
z$StreamResponse._do_start_compressionrequestr/   c                    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[   )	rB   r   r=   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   )rF   rE   r   methodr;   rG   _start)rL   r   r$   r$   r)   prepare  s   
zStreamResponse.preparec                    sD   || _ |j }| _|  I d H  || I d H  |  I d H  |S rN   )rD   rE   _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rr|tkr\td|j| jsh|  d|t
j< t
j|v rq|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)$rD   rE   r?   rb   r|   rJ   rC   valuesoutputaddr   
SET_COOKIErA   r   r@   r    rm   formatrG   enable_chunkingTRANSFER_ENCODINGrl   _length_checkr   lengthr   r   r;   
setdefaultr   DATEr   SERVERr   
CONNECTIONr   )rL   r   r   rb   r|   r=   cookier%   r$   r$   r)   r     sx   





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    )rD   rE   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())	rp   bytes	bytearray
memoryviewr   rF   rm   rE   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)rF   rE   rf   rg   rh   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)rp   r   r   r   r   rF   rE   	write_eofrD   output_sizerH   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<>)rF   rP   rD   r   ry   r   r3   r<   )rL   infor$   r$   r)   __repr__+  s   zStreamResponse.__repr__keyc                 C   s
   | j | S rN   rI   rL   r   r$   r$   r)   __getitem__5  rd   zStreamResponse.__getitem__c                 C   s   || j |< d S rN   r   )rL   r   r%   r$   r$   r)   __setitem__8  s   zStreamResponse.__setitem__c                 C   s   | j |= d S rN   r   r   r$   r$   r)   __delitem__;     zStreamResponse.__delitem__c                 C   
   t | jS rN   )lenrI   rO   r$   r$   r)   __len__>  rd   zStreamResponse.__len__c                 C   r   rN   )iterrI   rO   r$   r$   r)   __iter__A  rd   zStreamResponse.__iter__c                 C   s   t t| S rN   )hashidrO   r$   r$   r)   __hash__D  r   zStreamResponse.__hash__otherc                 C   s   | |u S rN   r$   )rL   r   r$   r$   r)   __eq__G  s   zStreamResponse.__eq__)r>   rQ   rN   )r>   N)r>   rs   )r   r/   r>   Nr   )Gr3   r4   r5   r   r   r   r   r!   __annotations__r]   r
   r   r#   rM   propertyrq   rP   rR   r;   rV   rW   r<   rZ   rK   rb   rc   re   rj   rn   r+   rr   r=   r   rt   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,   L   s  
 




	

4
 





C



r,   c                       sR  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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-   Nr9   )	bodyr;   r<   textr=   r   r   zlib_executor_sizezlib_executorr   r;   r<   r   r=   r   r   r  r  r>   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=r:   )r`   r   rp   r   r   r   	TypeErrorr   encoder   rM   r   r   _compressed_body_zlib_executor_size_zlib_executor)rL   r   r;   r<   r   r=   r   r   r  r  real_headersr   r$   r)   rM   L  sT   







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   rp   r   r   r   PAYLOAD_REGISTRYr_   LookupErrorr`   r   rJ   r   r   r   r=   r   r  )rL   r   r=   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  )rp   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   rl   rJ   r]   r  r   rp   r8   r!   rO   r$   r$   r)   r     s   



zResponse.content_lengthr%   c                 C   s   t d)Nz#Content length is set automatically)rm   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 )rF   r  r8   rD   rE   rG   r   r   rp   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sQt| jt	r.| jj
d ur-t| jj
| jt j< n#| jr6t| jnd}|dksI| jdkrQ|j t jkrQt|| jt j< t |I d H S )N0i0  )r   rl   rJ   r   r   r;   r@   rp   r8   r!   sizer   r   upper	METH_HEADr   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@   rp   r8   r!   r   r   r+   r2   r   r%   r	  r
  r   LARGE_BODY_SIZErf   rg   compressflushr  rJ   r   r   r   rl   )rL   r7   
compressorr   r$   r)   r     s*   
zResponse._do_start_compressionr   )r3   r4   r5   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)   r-   K  s\    	
Dr-   r9   zapplication/json)r   r   r;   r<   r=   r   dumpsr   r   r   r;   r<   r=   r   r  r>   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   r;   r<   r=   r   )r   r`   r-   )r   r   r   r;   r<   r=   r   r  r$   r$   r)   r.     s   r.   )Dasynciocollections.abccollectionsr   enumjsonr   r   rf   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
     O	
