o
    `gx@                     @   s  U 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 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mZmZmZ dd	lmZ dd
l m!Z! ddl"m#Z#m$Z$m%Z% ddl&m'Z'm(Z( ddl)m*Z*m+Z+m,Z,m-Z-m.Z.m/Z/ ddl0m1Z1 dZ2erddl3m4Z4 eee5ged f  Z6e7ej89dZ:ee7 e;d< e Z<ee e;d< edd dD Z=dZ>eddddddZ?G dd deZ@e<jAB  e?C D ]
\ZDZEe<FeDeE qeG ZHee jId  e;d < G d!d" d"e1ZJdS )#    N)suppress)Enumauto)	MimeTypes)S_ISREG)MappingProxyType)IOTYPE_CHECKINGAny	AwaitableCallableFinalIteratorListOptionalSetTupleUnioncast   )hdrs)AbstractStreamWriter)ETAG_ANYETagmust_be_empty_body)LooseHeadersPathLike)HTTPForbiddenHTTPNotFoundHTTPNotModifiedHTTPPartialContentHTTPPreconditionFailedHTTPRequestRangeNotSatisfiable)StreamResponse)FileResponse)BaseRequestAIOHTTP_NOSENDFILE
NOSENDFILECONTENT_TYPESc                 C   s   i | ]}|t j| qS  )r(   encodings_map).0extr)   r)   S/var/www/html/propose/venv/lib/python3.10/site-packages/aiohttp/web_fileresponse.py
<dictcomp>8   s    r.   ).br.gzzapplication/octet-streamr0   r/   z.bz2z.Zz.xz)zapplication/gzipzapplication/x-brotlizapplication/x-bzip2zapplication/x-compresszapplication/x-xzc                   @   s(   e Zd ZdZe Ze Ze Ze ZdS )_FileResponseResultz The result of the file response.N)	__name__
__module____qualname____doc__r   	SEND_FILENOT_ACCEPTABLEPRE_CONDITION_FAILEDNOT_MODIFIEDr)   r)   r)   r-   r1   J   s    
r1   _CLOSE_FUTURESc                       s  e Zd ZdZ				d/dedededee d	ee d
df fddZ	de
e deded
efddZdede
e deded
ef
ddZddde
e deded
ef
 fddZededeedf ded
efddZdddeded
ee f fd d!Zddd
ee f fd"d#Zddd$ed
eeeej ejee f fd%d&Zd$ed
eeej  ejee f fd'd(Z!ddd
ee f fd)d*Z"dddejd+ejd,ee d
ee f
 fd-d.Z#  Z$S )0r$   z,A response object can be used to send files.      Npath
chunk_sizestatusreasonheadersreturnc                    s(   t  j|||d t|| _|| _d S )N)r?   r@   rA   )super__init__pathlibPath_path_chunk_size)selfr=   r>   r?   r@   rA   	__class__r)   r-   rD   _   s   
zFileResponse.__init__fobjoffsetc                 C   s   | | ||S N)seekread)rI   rL   rM   r>   r)   r)   r-   _seek_and_readl   s   

zFileResponse._seek_and_readwritercountc                    s   | j }t }|d | j|||I d H }|r8||I d H  || }|dkr(n|d |jt||I d H }|s| I d H  |S Nr   )	rH   asyncioget_event_looprun_in_executorrQ   writerP   mindrain)rI   rR   rL   rM   rS   r>   loopchunkr)   r)   r-   _sendfile_fallbackp   s   
zFileResponse._sendfile_fallbackrequestr%   c              	      s   t  |I d H }|d usJ ts| jr | ||||I d H S |j}|j}|d us,J z|||||I d H  W n tyM   | ||||I d H  Y S w t  	 I d H  |S rN   )
rC   preparer'   compressionr]   _loop	transportsendfileNotImplementedError	write_eof)rI   r^   rL   rM   rS   rR   r[   rb   rJ   r)   r-   	_sendfile   s   
zFileResponse._sendfile
etag_valueetags.weakc                   s6   t |dkr|d jtkrdS t fdd|D S )Nr   r   Tc                 3   s$    | ]}s	|j s|j kV  qd S rN   )is_weakvalue)r+   etagrg   ri   r)   r-   	<genexpr>   s    
z+FileResponse._etag_match.<locals>.<genexpr>)lenrk   r   any)rg   rh   ri   r)   rm   r-   _etag_match   s
   zFileResponse._etag_matchlast_modifiedc                    s2   |  tj d| _|| _|| _t |I d H S )NF)
set_statusr   status_code_length_checkrl   rr   rC   r_   )rI   r^   rg   rr   rJ   r)   r-   _not_modified   s   zFileResponse._not_modifiedc                    s&   |  tj d| _t |I d H S rT   )rs   r!   rt   content_lengthrC   r_   )rI   r^   rJ   r)   r-   _precondition_failed   s   z!FileResponse._precondition_failedaccept_encodingc                 C   sB  |  |\}}}|stjd|dfS |jdd|jd}|j }dur2| j||dds2tjd||fS |j }durK|du rK|j	|
 krKtjd||fS |j }	dura| j||	ddratjd||fS |j }
durz|	du rz|j	|

 krztjd||fS |d}tt t| }W d   n1 sw   Y  tj|||fS )a  Return the response result, io object, stat result, and encoding.

        If an uncompressed file is returned, the encoding is set to
        :py:data:`None`.

        This method should be called from a thread executor
        since it calls os.stat which may block.
        Nx-F)ri   Trb)_get_file_path_stat_encodingr1   r7   st_mtime_nsst_sizeif_matchrq   r8   if_unmodified_sincest_mtime	timestampif_none_matchr9   if_modified_sinceopenr   OSErrorosstatfilenor6   )rI   r^   ry   	file_pathstfile_encodingrg   ifmatch
unmodsinceifnonematchmodsincerL   r)   r)   r-   _make_response   s6   


zFileResponse._make_responsec              	   C   s   | j }t D ]<\}}||vrq||j| }tt | }t|j	r4|||fW  d      S W d    n1 s>w   Y  q|
 }t|j	rR||d fS d |d fS rN   )rG   ENCODING_EXTENSIONSitemswith_suffixsuffixr   r   lstatr   st_moder   )rI   ry   r   file_extensionr   compressed_pathr   r)   r)   r-   r}      s   

z)FileResponse._get_file_path_stat_encodingc              
      s  t  }|jtjd }z|d | j||I d H \}}}}W n/ t	y9   | 
tj t |I d H  Y S  tyP   | 
tj t |I d H  Y S w |tju re| 
tj t |I d H S |tju rr| |I d H S |tju r|jdd|jd}|j}	| |||	I d H S |d usJ z| ||||I d H W |d |j}
t|
 |
tj S |d |j}
t|
 |
tj w )N rz   r{   ) rU   get_running_looprA   getr   ACCEPT_ENCODINGlowerrW   r   PermissionErrorrs   r   rt   rC   r_   r   r   r1   r7   r8   rx   r9   r~   r   r   rv   _prepare_open_filecloser:   addadd_done_callbackremove)rI   r^   r[   ry   response_resultrL   r   r   rg   rr   close_futurerJ   r)   r-   r_      s@   





zFileResponse.preparer   r   c                    s6  | j }|j}|j}|}d }	|j }
d u s||
 krz|j}|j}	|j}W n! tyG   d| | j	t
j< | tj t |I d H  Y S w |	d ur|	dk rc|d u rc|	|7 }	|	dk r^d}	||	 }nt|d urj|n|||	 }|	|krd| | j	t
j< | tj t |I d H S tj}| | t
j| j	vrtjdkrtj}ntj}|| jd pt| _|r|| j	t
j< t
j| j	t
j< d| _|j dd|jd| _!|| _"|| _#d| j	t
j$< |tjkr|	}|d usJ d%||| d	 || j	t
j< |dkst&|j'|rt |I d H S |	pd}| (||||I d H S )
Nzbytes */r   )      Frz   r{   byteszbytes {}-{}/{}r   ))_statusr   r   if_ranger   
http_rangestartstop
ValueError_headersr   CONTENT_RANGErs   r"   rt   rC   r_   rY   r    CONTENT_TYPEsysversion_infor(   guess_file_type
guess_typerG   FALLBACK_CONTENT_TYPEcontent_typeCONTENT_ENCODINGr   VARY_compressionr~   rl   rr   rw   ACCEPT_RANGESformatr   methodrf   )rI   r^   rL   r   r   r?   	file_size
file_mtimerS   r   ifrangerngendguesser
real_startrM   rJ   r)   r-   r   ,  sj   








zFileResponse._prepare_open_file)r;   r<   NN)%r2   r3   r4   r5   r   intr   strr   rD   r   r
   r   rQ   r   r]   rf   staticmethodr   r   boolrq   floatrv   rx   r1   ioBufferedReaderr   stat_resultr   rE   rF   r}   r_   r   __classcell__r)   r)   rJ   r-   r$   \   s    
$
8
-r$   )KrU   r   r   rE   r   
contextlibr   enumr   r   	mimetypesr   r   r   typesr   typingr   r	   r
   r   r   r   r   r   r   r   r   r   r   r   r   abcr   helpersr   r   r   typedefsr   r   web_exceptionsr   r   r   r    r!   r"   web_responser#   __all__web_requestr%   r   _T_OnChunkSentr   environr   r'   __annotations__r(   r   r   ADDITIONAL_CONTENT_TYPESr1   r*   clearr   r   	extensionadd_typesetr:   Futurer$   r)   r)   r)   r-   <module>   sR   
 < 

