o
    n~b *                     @   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rgd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#deeejf dedede	e d	e	e
 d
df 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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	e f 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__ C/usr/local/lib/python3.10/dist-packages/aiohttp/web_fileresponse.pyr%   /   s
   


zFileResponse.__init__writerfobjoffsetcountc                    s   | j }t }|d |j|I d H  |d |j|I d H }|rA||I d H  || }|dkr1n|d |jt||I d H }|s | I d H  |S Nr   )	r+   asyncioget_event_looprun_in_executorseekreadwritemindrain)r,   r1   r2   r3   r4   r   loopchunkr/   r/   r0   _sendfile_fallback?   s   zFileResponse._sendfile_fallbackrequestr   c              	      s   t  |I d H }|d usJ tstjdk s| jr%| ||||I d H S |j}|j}|d us1J z|	||||I d H  W n t
yR   | ||||I d H  Y S w t   I d H  |S )N)      )r$   preparer   sysversion_infocompressionr@   _loop	transportsendfileNotImplementedError	write_eof)r,   rA   r2   r3   r4   r1   r>   rI   r-   r/   r0   	_sendfileU   s   zFileResponse._sendfile
etag_valueetags.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rN   r/   r0   	<genexpr>n   s    z2FileResponse._strong_etag_match.<locals>.<genexpr>)lenrP   r   any)rN   rO   r/   rS   r0   _strong_etag_matchj   s   zFileResponse._strong_etag_matchlast_modifiedc                    s2   |  tj d| _|| _|| _t |I d H S )NF)
set_statusr   status_codeZ_length_checkrR   rX   r$   rD   )r,   rA   rN   rX   r-   r/   r0   _not_modifiedp   s   zFileResponse._not_modifiedc                    s&   |  tj d| _t |I d H S r5   )rY   r   rZ   content_lengthr$   rD   )r,   rA   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rQ| ||	sQ| |I d H S |j}
|
d urk|	d u rk|j|
 krk| |I d H S |j}|d ur| ||r| |||I d H S |j}|d ur|d u r|j| kr| |||I d H S tj| jvrtt|\}}|sd}d}n|rdnd }d}| j}|j}|}d }|j}|d u s|j| krZz|j}|j}|j}W n" t y   d	| | jtj!< | "t#j$ t% &|I d H  Y S w |d us|d urZ|d
k r'|d u r'||7 }|d
k r"d
}|| }nt'|d ur/|n||| }||krRd	| | jtj!< | "t#j$ t% &|I d H S t(j$}| "| |r`|| _)|ri|| jtj*< |rstj| jtj+< || _,|j| _-|| _.d| jtj/< t0t1|}|t(j$krd2||| d || jtj!< |d
ks|j3tj4ks| 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  w )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_matchrW   r]   Zif_unmodified_since	timestampZif_none_matchr[   Zif_modified_sinceCONTENT_TYPE	mimetypes
guess_typer'   Z_statusZif_rangeZ
http_rangestartstop
ValueErrorZCONTENT_RANGErY   r   rZ   r$   rD   r<   r   content_typeZCONTENT_ENCODINGZVARYrR   rX   r\   ZACCEPT_RANGESr   intformatmethodZ	METH_HEADr    openrM   close)r,   rA   filepathr^   Z	gzip_pathr>   strN   rX   ZifmatchZ
unmodsinceZifnonematchZmodsincectencodingZshould_set_ctr    	file_sizer4   rr   ZifrangerngendZ
real_startr2   r3   r-   r/   r0   rD      s   








$,zFileResponse.prepare)r   r   NN)__name__
__module____qualname____doc__r   r'   r(   r)   rv   r	   r   r%   r   r   r   r@   rM   staticmethodr
   r   boolrW   floatr[   r]   rD   __classcell__r/   r/   r-   r0   r   ,   st    
 "r   )-r6   rp   osr(   rE   typingr   r   r   r   r   r   r   r	   r
   r   r   r_   r   abcr   helpersr   r   Ztypedefsr   r   Zweb_exceptionsr   r   r   r   Zweb_responser   __all__Zweb_requestr   rb   Z_T_OnChunkSentr   environre   r   __annotations__r   r/   r/   r/   r0   <module>   s$   
 4