o
    h)                     @   s  U 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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  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FinalIteratorListOptionalTupleUnioncast   )hdrs)AbstractStreamWriter)ETAG_ANYETagmust_be_empty_body)LooseHeadersPathLike)HTTPNotModifiedHTTPPartialContentHTTPPreconditionFailedHTTPRequestRangeNotSatisfiable)StreamResponse)FileResponse)BaseRequestAIOHTTP_NOSENDFILE
NOSENDFILEc                       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
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                    s(   t  j|||d t|| _|| _d S )N)r#   r$   r%   )super__init__pathlibPath_path_chunk_size)selfr!   r"   r#   r$   r%   	__class__ N/var/www/html/ai/venv/lib/python3.10/site-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-   r2   r3   r4   r5   r"   loopchunkr0   r0   r1   _sendfile_fallback<   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 N)
r'   preparer   compressionrA   _loop	transportsendfileNotImplementedError	write_eof)r-   rB   r3   r4   r5   r2   r?   rG   r.   r0   r1   	_sendfileR   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 rC   )is_weakvalue).0etagrL   r0   r1   	<genexpr>k   s    z2FileResponse._strong_etag_match.<locals>.<genexpr>)lenrO   r   any)rL   rM   r0   rR   r1   _strong_etag_matchg   s   zFileResponse._strong_etag_matchlast_modifiedc                    s2   |  tj d| _|| _|| _t |I d H S )NF)
set_statusr   status_code_length_checkrQ   rW   r'   rD   )r-   rB   rL   rW   r.   r0   r1   _not_modifiedm   s   zFileResponse._not_modifiedc                    s&   |  tj d| _t |I d H S r6   )rX   r   rY   content_lengthr'   rD   )r-   rB   r.   r0   r1   _precondition_failedx   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st3|j4| j5rt% &|I d H S |
d |j6dI d H }|r|}nd
}z| 7||||I d H W t8|
d |j9I d H  S t8|
d |j9I d H  w )NFgzip z.gzTx-zapplication/octet-streamzbytes */r   byteszbytes {}-{}/{}r   rb):r+   r%   getr   ACCEPT_ENCODING	with_namenameis_filer7   r8   r9   statst_mtime_nsst_sizest_mtimeif_matchrV   r]   if_unmodified_since	timestampif_none_matchr[   if_modified_sinceCONTENT_TYPE	mimetypes
guess_typestr_statusif_range
http_rangestartstop
ValueErrorCONTENT_RANGErX   r   rY   r'   rD   r=   r   content_typeCONTENT_ENCODINGVARYrQ   rW   r\   ACCEPT_RANGESr   intformatr   methodr#   openrK   shieldclose)r-   rB   filepathr^   	gzip_pathr?   strL   rW   ifmatch
unmodsinceifnonematchmodsincectencodingshould_set_ctr#   	file_sizer5   ry   ifrangerngend
real_startr3   r4   r.   r0   r1   rD      s   








8zFileResponse.prepare)r   r    NN)__name__
__module____qualname____doc__r   r   r
   ru   r   r(   r   r   r   rA   rK   staticmethodr   r   boolrV   floatr[   r]   rD   __classcell__r0   r0   r.   r1   r   ,   st    
 "r   ).r7   rs   osr)   typingr   r   r   r   r   r   r   r	   r
   r   r   r   r_   r   abcr   helpersr   r   r   typedefsr   r   web_exceptionsr   r   r   r   web_responser   __all__web_requestr   rb   _T_OnChunkSentr   environrd   r   __annotations__r   r0   r0   r0   r1   <module>   s"   
 8