o
    i?                     @   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)BaseRequestZAIOHTTP_NOSENDFILE
NOSENDFILECONTENT_TYPESc                 C   s   i | ]}|t j| qS  )r'   encodings_map).0extr(   r(   R/home/kim/smarthome/.venv/lib/python3.10/site-packages/aiohttp/web_fileresponse.py
<dictcomp>8   s    r-   ).br.gzzapplication/octet-streamr/   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,   r0   J   s    
r0   _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?   r@   )super__init__pathlibPath_path_chunk_size)selfr<   r=   r>   r?   r@   	__class__r(   r,   rC   _   s   
zFileResponse.__init__fobjoffsetc                 C   s   | | ||S N)seekread)rH   rK   rL   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   )	rG   asyncioZget_event_looprun_in_executorrP   writerO   minZdrain)rH   rQ   rK   rL   rR   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 rM   )
rB   preparer&   compressionrZ   _loop	transportsendfileNotImplementedError	write_eof)rH   r[   rK   rL   rR   rQ   rX   r_   rI   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 rM   )Zis_weakvalue)r*   etagrd   rf   r(   r,   	<genexpr>   s    
z+FileResponse._etag_match.<locals>.<genexpr>)lenrg   r   any)rd   re   rf   r(   ri   r,   _etag_match   s
   zFileResponse._etag_matchlast_modifiedc                    s2   |  tj d| _|| _|| _t |I d H S )NF)
set_statusr   status_codeZ_length_checkrh   rn   rB   r\   )rH   r[   rd   rn   rI   r(   r,   _not_modified   s   zFileResponse._not_modifiedc                    s&   |  tj d| _t |I d H S rS   )ro   r!   rp   content_lengthrB   r\   )rH   r[   rI   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)rf   Trb)_get_file_path_stat_encodingr0   r6   st_mtime_nsst_sizeZif_matchrm   r7   Zif_unmodified_sincest_mtime	timestampZif_none_matchr8   Zif_modified_sinceopenr   OSErrorosstatfilenor5   )rH   r[   rt   	file_pathstfile_encodingrd   ZifmatchZ
unmodsinceZifnonematchZmodsincerK   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 rM   )rF   ENCODING_EXTENSIONSitemswith_suffixsuffixr   r~   lstatr   st_moder   )rH   rt   r   Zfile_extensionr   Zcompressed_pathr   r(   r(   r,   rx      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 ru   rv   ) rT   Zget_running_loopr@   getr   ACCEPT_ENCODINGlowerrU   r   PermissionErrorro   r   rp   rB   r\   r~   r   r0   r6   r7   rs   r8   ry   rz   r{   rq   _prepare_open_filecloser9   addZadd_done_callbackremove)rH   r[   rX   rt   Zresponse_resultrK   r   r   rd   rn   Zclose_futurerI   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   )      Fru   rv   byteszbytes {}-{}/{}r   ))Z_statusrz   r{   Zif_ranger|   Z
http_rangestartstop
ValueError_headersr   ZCONTENT_RANGEro   r"   rp   rB   r\   rW   r    ZCONTENT_TYPEsysversion_infor'   Zguess_file_type
guess_typerF   FALLBACK_CONTENT_TYPEcontent_typeZCONTENT_ENCODINGr   ZVARY_compressionry   rh   rn   rr   ZACCEPT_RANGESformatr   methodrc   )rH   r[   rK   r   r   r>   	file_sizeZ
file_mtimerR   r   ZifrangerngendZguesserZ
real_startrL   rI   r(   r,   r   ,  sj   








zFileResponse._prepare_open_file)r:   r;   NN)%r1   r2   r3   r4   r   intr   strr   rC   r   r
   r   rP   r   rZ   rc   staticmethodr   r   boolrm   floatrq   rs   r0   ioBufferedReaderr   stat_resultr   rD   rE   rx   r\   r   __classcell__r(   r(   rI   r,   r$   \   s    
$
8
-r$   )KrT   r   r   rD   r   
contextlibr   enumr   r   	mimetypesr   r   r   typesr   typingr   r	   r
   r   r   r   r   r   r   r   r   r   r   r   r   abcr   Zhelpersr   r   r   Ztypedefsr   r   Zweb_exceptionsr   r   r   r    r!   r"   Zweb_responser#   __all__Zweb_requestr%   r   Z_T_OnChunkSentr   environr   r&   __annotations__r'   r   r   ZADDITIONAL_CONTENT_TYPESr0   r)   clearr   r   	extensionadd_typesetr9   Futurer$   r(   r(   r(   r,   <module>   sR   
 < 

