U
    -e *                     @   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__ Y/var/www/html/Darija-Ai-Train/env/lib/python3.8/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min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 k	stts2tjdk s2| jrH| ||||I d H S |j}|j	}|d k	s`tz|
||||I d H  W n* tk
r   | ||||I d H  Y S X t   I d H  |S )N)      )r$   prepareAssertionErrorr   sysversion_infocompressionr@   _loop	transportsendfileNotImplementedError	write_eof)r,   rA   r2   r3   r4   r1   r>   rJ   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rO   r/   r0   	<genexpr>n   s      z2FileResponse._strong_etag_match.<locals>.<genexpr>)lenrQ   r   any)rO   rP   r/   rT   r0   _strong_etag_matchj   s    zFileResponse._strong_etag_match)rA   rO   last_modifiedr#   c                    s0   |  tj d| _|| _|| _t |I d H S )NF)
set_statusr   status_codeZ_length_checkrS   rY   r$   rD   )r,   rA   rO   rY   r-   r/   r0   _not_modifiedp   s
    zFileResponse._not_modified)rA   r#   c                    s$   |  tj d| _t |I d H S r5   )rZ   r   r[   content_lengthr$   rD   )r,   rA   r-   r/   r0   _precondition_failed{   s    z!FileResponse._precondition_failedc              
      s  | j }d}d|jtjdkr>||jd }| r>|}d}t	 }|
d |jI d H }|jdd|jd}|j}|j}	|	d k	r| ||	s| |I d H S |j}
|
d k	r|	d kr|j|
 kr| |I d H S |j}|d k	r| ||r| |||I d H S |j}|d k	rD|d krD|j| krD| |||I d H S tj| jkrttt|\}}|snd}d}n|r~dnd }d}| 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	s,|d k	r|d
k r`|d kr`||7 }|d
k rVd
}|| }nt'|d k	rp|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rLd2||| d || jtj!< |d
ksp|j3tj4ksp| j5dkrt% &|I d H S |
d |j6dI d H }|r|}nd
}z| 8||||I d H W S |
d |j7I d H  X 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_matchrX   r^   Zif_unmodified_since	timestampZif_none_matchr\   Zif_modified_sinceZCONTENT_TYPE	mimetypes
guess_typer'   Z_statusZif_rangeZ
http_rangestartstop
ValueErrorZCONTENT_RANGErZ   r   r[   r$   rD   r<   r   content_typeZCONTENT_ENCODINGZVARYrS   rY   r]   ZACCEPT_RANGESr   intformatmethodZ	METH_HEADr    opencloserN   )r,   rA   filepathr_   Z	gzip_pathr>   strO   rY   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@   rN   staticmethodr
   r   boolrX   floatr\   r^   rD   __classcell__r/   r/   r-   r0   r   ,   sH               r   )-r6   rp   osr(   rF   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   rc   Z_T_OnChunkSentr   environrf   r   __annotations__r   r/   r/   r/   r0   <module>   s$    4