a
    }3e *                     @   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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 ddlmZmZ ddlmZmZmZmZ dd	l m!Z! d
Z"erddl#m$Z$ ee
e%ge	d f  Z&e'ej()dZ*ee' e+d< G dd de!Z,dS )    N)IOTYPE_CHECKINGAny	AwaitableCallableIteratorListOptionalTupleUnioncast   )hdrs)AbstractStreamWriter)ETAG_ANYETag)FinalLooseHeaders)HTTPNotModifiedHTTPPartialContentHTTPPreconditionFailedHTTPRequestRangeNotSatisfiable)StreamResponse)FileResponse)BaseRequestZAIOHTTP_NOSENDFILE
NOSENDFILEc                       s   e Zd ZdZdeeejf 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dddZdeee	e d fddZde	e d f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                    s6   t  j|||d t|tr&t|}|| _|| _d S )N)r    r!   r"   )super__init__
isinstancestrpathlibPath_path_chunk_size)selfr   r   r    r!   r"   	__class__ K/home/pi/bot/my_env/lib/python3.9/site-packages/aiohttp/web_fileresponse.pyr%   /   s
    

zFileResponse.__init__)writerfobjoffsetcountr#   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+   asyncioget_event_looprun_in_executorseekreadwriteminZdrain)r,   r1   r2   r3   r4   r   loopchunkr/   r/   r0   _sendfile_fallback?   s    zFileResponse._sendfile_fallbackr   )requestr2   r3   r4   r#   c              	      s   t  |I d H }|d usJ ts2tjdk s2| jrH| ||||I d H S |j}|j}|d us`J z|	||||I d H  W n( t
y   | ||||I d H  Y S 0 t   I d H  |S )N)      )r$   preparer   sysversion_infocompressionr?   Z_loop	transportsendfileNotImplementedError	write_eof)r,   r@   r2   r3   r4   r1   r=   rG   r-   r/   r0   	_sendfileU   s    zFileResponse._sendfile.)
etag_valueetagsr#   c                    s4   t |dkr|d jtkrdS t fdd|D S )Nr   r   Tc                 3   s   | ]}|j s|j kV  qd S )N)Zis_weakvalue).0etagrL   r/   r0   	<genexpr>n       z2FileResponse._strong_etag_match.<locals>.<genexpr>)lenrN   r   any)rL   rM   r/   rQ   r0   _strong_etag_matchj   s    zFileResponse._strong_etag_match)r@   rL   last_modifiedr#   c                    s0   |  tj d| _|| _|| _t |I d H S )NF)
set_statusr   status_codeZ_length_checkrP   rW   r$   rC   )r,   r@   rL   rW   r-   r/   r0   _not_modifiedp   s
    zFileResponse._not_modified)r@   r#   c                    s$   |  tj d| _t |I d H S r5   )rX   r   rY   content_lengthr$   rC   )r,   r@   r-   r/   r0   _precondition_failed{   s    z!FileResponse._precondition_failedc              
      s  | j }d}d|jtjdv r>||jd }| r>|}d}t	 }|
d |jI d H }|jdd|jd}|j}|j}	|	d ur| ||	s| |I d H S |j}
|
d ur|	d u r|j|
 kr| |I d H S |j}|d ur| ||r| |||I d H S |j}|d urD|d u rD|j| krD| |||I d H S tj| jvrttt|\}}|snd}d}n|r~dnd }d}| j}|j}|}d }|j}|d u s|j| krz|j}|j}|j}W nD t y   d	| | jtj!< | "t#j$ t% &|I d H  Y S 0 |d us*|d ur|d
k r^|d u r^||7 }|d
k rTd
}|| }nt'|d urn|n||| }||krd	| | jtj!< | "t#j$ t% &|I d H S t(j$}| "| |r|| _)|r|| jtj*< |rtj| jtj+< || _,|j| _-|| _.d| jtj/< t0t1|}|t(j$krJd2||| d || jtj!< |d
ksn|j3tj4ksn| j5dv rt% &|I d H S |
d |j6dI d H }|r|}nd
}z,| 7||||I d H W |
d |j8I d H  S |
d |j8I d H  0 d S )NFgzip z.gzTx-zapplication/octet-streamzbytes */r   byteszbytes {}-{}/{}r   )   i0  rb)9r*   r"   getr   ACCEPT_ENCODING	with_namenameis_filer6   r7   r8   statst_mtime_nsst_sizest_mtimeZif_matchrV   r\   Zif_unmodified_since	timestampZif_none_matchrZ   Zif_modified_sinceCONTENT_TYPE	mimetypes
guess_typer'   Z_statusZif_rangeZ
http_rangestartstop
ValueErrorZCONTENT_RANGErX   r   rY   r$   rC   r<   r   content_typeZCONTENT_ENCODINGZVARYrP   rW   r[   ZACCEPT_RANGESr   intformatmethodZ	METH_HEADr    openrK   close)r,   r@   filepathr]   Z	gzip_pathr=   strL   rW   ZifmatchZ
unmodsinceZifnonematchZmodsincectencodingZshould_set_ctr    	file_sizer4   rq   ZifrangerngendZ
real_startr2   r3   r-   r/   r0   rC      s    








$zFileResponse.prepare)r   r   NN)__name__
__module____qualname____doc__r   r'   r(   r)   ru   r	   r   r%   r   r   r   r?   rK   staticmethodr
   r   boolrV   floatrZ   r\   rC   __classcell__r/   r/   r-   r0   r   ,   s8       r   )-r6   ro   osr(   rD   typingr   r   r   r   r   r   r   r	   r
   r   r   r^   r   abcr   Zhelpersr   r   Ztypedefsr   r   Zweb_exceptionsr   r   r   r   Zweb_responser   __all__Zweb_requestr   ra   Z_T_OnChunkSentr   environrd   r   __annotations__r   r/   r/   r/   r0   <module>   s"   
4