a
    d                     @  s   d dl m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	Z	d dl
mZ d dlmZ d dlmZ d dlmZmZ d d	lmZ d d
lmZmZmZ edZG dd deZG dd deZG dd deZG dd deZdS )    )annotationsN)
NamedTuple)quote)stat)Headers)HTTPException)Response
guess_type)StaticFiles)ReceiveScopeSendz#^bytes=(?P<start>\d+)-(?P<end>\d*)$c                   @  s:   e Zd ZU ded< ded< ddddZdddd	Zd
S )ClosedRangeintstartend)returnc                 C  s   | j | j d S )N   )r   r   self r   _/var/www/html/stable-diffusion-webui/venv/lib/python3.9/site-packages/gradio/ranged_response.py__len__   s    zClosedRange.__len__boolc                 C  s   t | dkS )Nr   )lenr   r   r   r   __bool__   s    zClosedRange.__bool__N)__name__
__module____qualname____annotations__r   r   r   r   r   r   r      s   
r   c                   @  s4   e Zd ZU ded< dZded< dddddd	ZdS )
	OpenRanger   r   Nz
int | Noner   r   )r   r   r   c                 C  sB   t | j|}tdd | j|fD }t||}t ||}t||S )Nc                 s  s   | ]}|r|V  qd S )Nr   ).0xr   r   r   	<genexpr>'       z"OpenRange.clamp.<locals>.<genexpr>)maxr   minr   r   )r   r   r   beginr   r   r   clamp%   s
    

zOpenRange.clamp)r   r   r   r   r   r(   r   r   r   r   r    !   s   
r    c                
   @  sR   e Zd ZdZdddddddddd	d
dZdddddZdddddddZdS )RangedFileResponsei   Nstr | os.PathLiker    zdict[str, str] | Nonez
str | Nonezos.stat_result | NoneNone)pathrangeheaders
media_typefilenamestat_resultmethodr   c           
      C  s   t d usJ d|| _|| _|| _d | _|d uo:| dk| _|d u rZt|pN|d pXd}|| _| 	|pji  | jd urt
| j}|| jkrd| }	nd| j d}	| jd|	 || _d S )	Nz0'aiofiles' must be installed to use FileResponseHEADr   z
text/plainzattachment; filename*=utf-8''zattachment; filename=""zcontent-disposition)aiofilesr,   r-   r0   Z
backgrounduppersend_header_onlyr	   r/   Zinit_headersr   r.   
setdefaultr1   )
r   r,   r-   r.   r/   r0   r1   r2   Zcontent_disposition_filenamecontent_dispositionr   r   r   __init__2   s$    



zRangedFileResponse.__init__r   )r-   r   c                 C  sL   | j s
J | j j}t|}d|j d|j d| | jd< t|| jd< d S )Nzbytes -/zcontent-rangezcontent-length)r1   st_sizer   r   r   r.   str)r   r-   total_lengthcontent_lengthr   r   r   set_range_headersQ   s    
z$RangedFileResponse.set_range_headersr   r   r   )scopereceivesendr   c              
     s  | j d u rzt| jI d H }|| _ W n8 ty\ } z td| j d|W Y d }~n,d }~0 0 |j}t|std| j d| j	d| j j
}| | tj| jdd4 I d H }||jI d H  |dd| jd	I d H  | jr|d
dddI d H  nt|}	|s8|d
dddI d H  W d   I d H  d S |	dkrt| j|	}
||
I d H }|	t|8 }	|d
||	dkdI d H  q8W d   I d H  q1 I d H s0    Y  d S )NzFile at path z does not exist.z is not a file.r   rb)modezhttp.response.start   )typestatusr.   zhttp.response.bodyr$   F)rH   bodyZ	more_body)r1   aio_statr,   FileNotFoundErrorRuntimeErrorst_moder   S_ISREGr-   r(   r=   rA   r5   openseekr   Zraw_headersr7   r   r&   
chunk_sizeread)r   rB   rC   rD   r1   ZfnferF   Z
byte_rangefileZremaining_bytesrR   chunkr   r   r   __call__[   sV    








zRangedFileResponse.__call__)NNNNN)r   r   r   rR   r:   rA   rV   r   r   r   r   r)   /   s        
r)   c                      s@   e Zd Zddddddd fdd	Zddddd
ddZ  ZS )RangedStaticFiles   r*   zos.stat_resultr   r   r   )	full_pathr1   rB   status_coder   c                   sH   t |d}|dr&| j|||d}nt j||||d}d|jd< |S )NrB   r-   )r1   rB   )r1   rB   rZ   byteszaccept-ranges)r   getranged_file_responsesuperfile_responser.   )r   rY   r1   rB   rZ   request_headersresponse	__class__r   r   r`      s    


zRangedStaticFiles.file_response)rY   r1   rB   r   c                 C  sp   |d }t |d}|d }t|}|s0td|d|d }}	tt||	rZt|	nd }
t||
||dS )Nr2   r[   r-   i  r   r   )r1   r2   )r   RANGE_REGEXsearchr   groupr    r   r)   )r   rY   r1   rB   r2   ra   Zrange_headermatchr   r   r-   r   r   r   r^      s    

z&RangedStaticFiles.ranged_file_response)rX   )r   r   r   r`   r^   __classcell__r   r   rc   r   rW      s    rW   )
__future__r   osrer   typingr   urllib.parser   r5   Zaiofiles.osrK   Zstarlette.datastructuresr   Zstarlette.exceptionsr   Zstarlette.responsesr   r	   Zstarlette.staticfilesr
   Zstarlette.typesr   r   r   compilere   r   r    r)   rW   r   r   r   r   <module>   s"   
`