
    ;3h                       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j2                  d      Z G d de      Z G d de      Z G d de      Z G d de      Zy)    )annotationsN)
NamedTuple)quote)stat)Headers)HTTPException)Response
guess_type)StaticFiles)ReceiveScopeSendz#^bytes=(?P<start>\d+)-(?P<end>\d*)$c                  2    e Zd ZU ded<   ded<   ddZddZy)	ClosedRangeintstartendc                :    | j                   | j                  z
  dz   S )N   )r   r   selfs    V/var/www/html/audio-gradio/venv/lib/python3.12/site-packages/gradio/ranged_response.py__len__zClosedRange.__len__   s    xx$**$q((    c                    t        |       dkD  S )Nr   )lenr   s    r   __bool__zClosedRange.__bool__   s    4y1}r   N)returnr   )r   bool)__name__
__module____qualname____annotations__r   r    r   r   r   r      s    J	H)r   r   c                  .    e Zd ZU ded<   dZded<   ddZy)	OpenRanger   r   Nz
int | Noner   c                    t        | j                  |      }t        d | j                  |fD              }t        ||      }t        ||      }t	        ||      S )Nc              3  &   K   | ]	  }|s|  y w)Nr$   ).0xs     r   	<genexpr>z"OpenRange.clamp.<locals>.<genexpr>'   s     2!2s   )maxr   minr   r   )r   r   r   begins       r   clampzOpenRange.clamp%   sM    DJJ&2dhh_22E3%o5#&&r   )r   r   r   r   r   r   )r    r!   r"   r#   r   r/   r$   r   r   r&   r&   !   s    JC'r   r&   c                  R    e Zd ZdZ	 	 	 	 	 d	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 ddZddZd	dZy)
RangedFileResponsei   Nc                   t         t        d      || _        || _        || _        d | _        |d uxr |j                         dk(  | _        |t        |xs |      d   xs d}|| _	        | j                  |xs i        | j                  Vt        | j                        }|| j                  k7  rd| }	nd| j                   d}	| j                  j                  d|	       || _        y )	Nz0'aiofiles' must be installed to use FileResponseHEADr   z
text/plainzattachment; filename*=utf-8''zattachment; filename=""zcontent-disposition)aiofilesModuleNotFoundErrorpathrangefilename
backgrounduppersend_header_onlyr
   
media_typeinit_headersr   headers
setdefaultstat_result)
r   r7   r8   r?   r=   r9   rA   methodcontent_disposition_filenamecontent_dispositions
             r   __init__zRangedFileResponse.__init__2   s     %B  	
  &d 2 Ov||~7O#H$45a8HLJ$'-R(==$+0+?(+t}}<34P3QR $ )?t}}oQ&O#LL##$9;NO&r   c                    | j                   st        d      | j                   j                  }t        |      }d|j                   d|j
                   d| | j                  d<   t        |      | j                  d<   y )Nz(No stat result to set range headers withzbytes -/zcontent-rangezcontent-length)rA   
ValueErrorst_sizer   r   r   r?   str)r   r8   total_lengthcontent_lengths       r   set_range_headersz$RangedFileResponse.set_range_headersT   sv    GHH''//UU[[M599+Q|n= 	_% *-^)<%&r   c                n  K   | j                   _	 t        | j                         d {   }|| _         |j                  }t	        j
                  |      st        d| j                   d      | j                  j                  d| j                   j                        }| j                  |       t        j                  | j                  d      4 d {   }|j                  |j                         d {     |dd| j                   d	       d {    | j"                  r |d
ddd       d {    nt%        |      }	|s& |d
ddd       d {    	 d d d       d {    y |	dkD  rZt'        | j(                  |	      }
|j+                  |
       d {   }|	t%        |      z  }	 |d
||	dkD  d       d {    |	dkD  rZd d d       d {    y 7 # t        $ r}t        d| j                   d      |d }~ww xY w7 87 7 7 7 7 7 |7 Y7 E# 1 d {  7  sw Y   y xY ww)NzFile at path z is not a file.z does not exist.r   rb)modezhttp.response.start   )typestatusr?   zhttp.response.bodyr   F)rS   body	more_body)rA   aio_statr7   st_moder   S_ISREGRuntimeErrorFileNotFoundErrorr8   r/   rJ   rN   r5   openseekr   raw_headersr<   r   r-   
chunk_sizeread)r   scopereceivesendrA   rQ   fnfe
byte_rangefileremaining_bytesr_   chunks               r   __call__zRangedFileResponse.__call___   sD    #
S$,TYY$77#.  #**||D)&tyyk'QRRZZ%%a)9)9)A)AB
z*==6  	  	$))J,,---1!#//   $$13US   #&j/!!5sQVW   ) 	  	  	, &)!$T__o!FJ"&))J"77E#s5z1O$8$))81)<  	 &)- 	  	  	 8$ "#DII;.>? 	-# 	0 85 	  	  	  	s  H5G! GG! B H5HH5H 7H8H HH 5H6!H HH H5(H)H5./H H$H H	H H5HH5G! !	H	*HH		H5H H H H H5H H H5 H2&H)'H2.H5)NNNNN)r7   str | os.PathLiker8   r&   r?   zdict[str, str] | Noner=   
str | Noner9   rk   rA   zos.stat_result | NonerB   rk   r   None)r8   r   r   rl   )ra   r   rb   r   rc   r   r   rl   )r    r!   r"   r_   rE   rN   ri   r$   r   r   r1   r1   /   sv    J *.!%#-1! ' '  ' '	 '
  '  ' + '  ' 
 'D	1r   r1   c                  N     e Zd Z	 d	 	 	 	 	 	 	 	 	 d fdZ	 	 	 	 	 	 	 	 ddZ xZS )RangedStaticFilesc                    t        |      }|j                  d      r| j                  |||      }nt        |   ||||      }d|j
                  d<   |S )Nra   r8   )rA   ra   )rA   ra   status_codebyteszaccept-ranges)r   getranged_file_responsesuperfile_responser?   )r   	full_pathrA   ra   rq   request_headersresponse	__class__s          r   rv   zRangedStaticFiles.file_response   so     ".w'00{% 1 H w,{%[ - H -4)r   c                   |d   }t        |      }|d   }t        j                  |      }|st        d      |j	                  d      |j	                  d      }	}t        t        |      |	rt        |	      nd       }
t        ||
||      S )NrB   rp   r8   i  r   r   )rA   rB   )r   RANGE_REGEXsearchr   groupr&   r   r1   )r   rw   rA   ra   rB   rx   range_headermatchr   r   r8   s              r   rt   z&RangedStaticFiles.ranged_file_response   s     x!.&w/""<0$$[[)5;;u+=s#e*#c#h4@!u+f
 	
r   )   )
rw   rj   rA   os.stat_resultra   r   rq   r   r   r	   )rw   rj   rA   r   ra   r   r   r	   )r    r!   r"   rv   rt   __classcell__)rz   s   @r   rn   rn      sh     $ $ 	
  
(
$
 $
 	

 

r   rn   )
__future__r   osrer   typingr   urllib.parser   r5   aiofiles.osrW   starlette.datastructuresr   starlette.exceptionsr   starlette.responsesr	   r
   starlette.staticfilesr   starlette.typesr   r   r   compiler|   r   r&   r1   rn   r$   r   r   <module>r      su    # 	 	     ( , . 4 - 0 0bjj?@* '
 'a aH*
 *
r   