U
    ;g&6                     @   s  U 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 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 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l+m,Z, dZ-erddl.m/Z/ eee0ged f  Z1e2ej34dZ5ee2 e6d< e Z7ee e6d< ej8dk rbde7j9d< edd dD Z:dZ;eddddddZ<e7j9=  e<> D ]\Z?Z@e7Ae?e@ qG dd  d e,ZBdS )!    N)suppress)	MimeTypes)S_ISREG)MappingProxyType)IOTYPE_CHECKINGAny	AwaitableCallableFinalIteratorListOptional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_TYPES)   	   br.brc                 C   s   i | ]}|t j| qS  )r$   encodings_map).0extr)   r)   X/opt/bot/vods_filmes/script/venv/lib/python3.8/site-packages/aiohttp/web_fileresponse.py
<dictcomp>8   s      r.   )r(   .gzzapplication/octet-streamr/   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deeeee ee dd fddZ	e
ee eee
dd	d
Zdee eee
d fddZeeeedf eedddZdeeee
 d fddZdee
 d fddZeeejejee f dddZdee
 d fddZ  ZS )r!   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)r4   r5   r6   )super__init__pathlibPath_path_chunk_size)selfr2   r3   r4   r5   r6   	__class__r)   r-   r9   R   s    zFileResponse.__init__)writerfobjoffsetcountr7   c                    s   | j }t }|d |j|I d H  |d |j|I d H }|r~||I d H  || }|dkr`q~|d |jt||I d H }q:| I d H  |S Nr   )	r=   asyncioZget_event_looprun_in_executorseekreadwriteminZdrain)r>   rA   rB   rC   rD   r3   loopchunkr)   r)   r-   _sendfile_fallback_   s    zFileResponse._sendfile_fallbackr"   )requestrB   rC   rD   r7   c              	      s   t  |I d H }|d k	stts(| jr>| ||||I d H S |j}|j}|d k	sVtz|||||I d H  W n* t	k
r   | ||||I d H  Y S X t  
 I d H  |S N)r8   prepareAssertionErrorr#   compressionrN   _loop	transportsendfileNotImplementedError	write_eof)r>   rO   rB   rC   rD   rA   rL   rU   r?   r)   r-   	_sendfileu   s    
zFileResponse._sendfile.)
etag_valueetagsweakr7   c                   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 rP   )Zis_weakvalue)r+   etagrZ   r\   r)   r-   	<genexpr>   s      z+FileResponse._etag_match.<locals>.<genexpr>)lenr]   r   any)rZ   r[   r\   r)   r_   r-   _etag_match   s
    zFileResponse._etag_match)rO   rZ   last_modifiedr7   c                    s0   |  tj d| _|| _|| _t |I d H S )NF)
set_statusr   status_codeZ_length_checkr^   rd   r8   rQ   )r>   rO   rZ   rd   r?   r)   r-   _not_modified   s
    zFileResponse._not_modified)rO   r7   c                    s$   |  tj d| _t |I d H S rE   )re   r   rf   content_lengthr8   rQ   )r>   rO   r?   r)   r-   _precondition_failed   s    z!FileResponse._precondition_failed)accept_encodingr7   c                 C   s   | j }t D ]b\}}||kr q||j| }tt2 | }t|j	rf|||fW  5 Q R    S W 5 Q R X q||
 dfS )a  Return the file path, 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)r<   ENCODING_EXTENSIONSitemswith_suffixsuffixr   OSErrorlstatr   st_modestat)r>   rj   	file_pathZfile_extensionfile_encodingZcompressed_pathstr)   r)   r-   _get_file_path_stat_encoding   s    

&z)FileResponse._get_file_path_stat_encodingc                    s8  t  }|jtjd }z |d | j|I d H \}}}W n2 t	k
rn   | 
tj t |I d H  Y S X t|js| 
tj t |I d H S |jdd|jd}|j}|j}	|	d k	r| j||	dds| |I d H S |j}
|
d k	r|	d kr|j|
 kr| |I d H S |j}|d k	rR| j||ddrR| |||I d H S |j}|d k	r|d kr|j| kr| |||I d H S | j}|j}|}d }|j}|d ks|j| krz|j}|j }|j!}W nF t"k
r    d| | jtj#< | 
t$j t |I d H  Y S X |d k	s6|d k	r|dk rj|d krj||7 }|dk r`d}|| }nt%|d k	rz|n||| }||krd| | jtj#< | 
t$j t |I d H S t&j}| 
| tj'| jkrt()| j*d pt+| _,|r|| jtj-< tj| jtj.< d| _/|| _0|j| _1|| _2d	| jtj3< t4t5|}|t&jkrpd
6||| d || jtj#< |dkst7|j8| j9rt |I d H S z|d |j:dI d H }W n4 t;k
r   | 
tj t |I d H  Y S X |r|}nd}z| >||||I d H W S t <|d |j=I d H  X d S )N x-F)r\   Tzbytes */r   byteszbytes {}-{}/{}r   rb)?rF   Zget_running_loopr6   getr   ACCEPT_ENCODINGlowerrG   rv   ro   re   r   rf   r8   rQ   r   rq   r   st_mtime_nsst_sizest_mtimeZif_matchrc   ri   Zif_unmodified_since	timestampZif_none_matchrg   Zif_modified_sinceZ_statusZif_rangeZ
http_rangestartstop
ValueErrorZCONTENT_RANGEr   rK   r   ZCONTENT_TYPEr$   
guess_typer<   FALLBACK_CONTENT_TYPEcontent_typeZCONTENT_ENCODINGZVARY_compressionr^   rd   rh   ZACCEPT_RANGESr   intformatr   methodr4   openPermissionErrorshieldcloserY   )r>   rO   rL   rj   rs   ru   rt   rZ   rd   ZifmatchZ
unmodsinceZifnonematchZmodsincer4   	file_sizerD   r   ZifrangerngendZ
real_startrB   rC   r?   r)   r-   rQ      s      
    








 
 zFileResponse.prepare)r0   r1   NN)__name__
__module____qualname____doc__r   r   r   strr   r9   r   r   r   rN   rY   staticmethodr   r   boolrc   floatrg   ri   r:   r;   osstat_resultrv   rQ   __classcell__r)   r)   r?   r-   r!   O   sN               r!   )CrF   r   r:   sys
contextlibr   	mimetypesr   rr   r   typesr   typingr   r   r   r	   r
   r   r   r   r   r   r   r   rw   r   abcr   Zhelpersr   r   r   Ztypedefsr   r   Zweb_exceptionsr   r   r   r   r   r   Zweb_responser    __all__Zweb_requestr"   rz   Z_T_OnChunkSentr   environr|   r#   __annotations__r$   version_infor*   rk   r   ZADDITIONAL_CONTENT_TYPESclearrl   r   	extensionadd_typer!   r)   r)   r)   r-   <module>   sN    8 

