
    9Cg                         d dl mZ 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	 d dl
Z
d dl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 d dlmZmZmZ ej        ed	f         Z G d
 de          Z G d d          ZdS )    )annotationsN)	parsedate)get_route_path)URLHeaders)HTTPException)FileResponseRedirectResponseResponse)ReceiveScopeSendzos.PathLike[str]c                  $     e Zd ZdZd fdZ xZS )NotModifiedResponse)zcache-controlzcontent-locationdateetagexpiresvaryheadersr   c                     t                                          d fd|                                D                        d S )Ni0  c                .    i | ]\  }}|j         v ||S  )NOT_MODIFIED_HEADERS).0namevalueselfs      G/var/www/api/venv/lib/python3.11/site-packages/starlette/staticfiles.py
<dictcomp>z0NotModifiedResponse.__init__.<locals>.<dictcomp>#   s,    iii[T5ttOhGhGhT5GhGhGh    )status_coder   )super__init__items)r   r   	__class__s   ` r   r#   zNotModifiedResponse.__init__    sQ    iiiiGMMOOiii 	 	
 	
 	
 	
 	
r    )r   r   )__name__
__module____qualname__r   r#   __classcell__)r%   s   @r   r   r      sE        
 
 
 
 
 
 
 
 
 
r    r   c                  n    e Zd Zddddddd-dZ	 	 d.d/dZd0dZd1dZd2dZd3dZ	 d4d5d'Z	d6d(Z
d7d,ZdS )8StaticFilesNFT)	directorypackageshtml	check_dirfollow_symlinkr,   PathLike | Noner-   "list[str | tuple[str, str]] | Noner.   boolr/   r0   returnNonec                   || _         || _        |                     ||          | _        || _        d| _        || _        |r4|4t          j        	                    |          st          d| d          d S d S d S )NFDirectory 'z' does not exist)r,   r-   get_directoriesall_directoriesr.   config_checkedr0   ospathisdirRuntimeError)r   r,   r-   r.   r/   r0   s         r   r#   zStaticFiles.__init__(   s     # #33IxHH	#, 	J.rw}}Y7O7O.HYHHHIII	J 	J....r    list[PathLike]c                   g }||                     |           |pg D ]}t          |t                    r|\  }}nd}t          j                            |          }|J d|d            |j        J d|d            t          j        	                    t          j        
                    |j        d|                    }t          j                            |          sJ d|d|d            |                     |           |S )z
        Given `directory` and `packages` arguments, return a list of all the
        directories that should be used for serving static files from.
        NstaticszPackage z could not be found.z..r7   z' in package )append
isinstancetuple	importlibutil	find_specoriginr;   r<   normpathjoinr=   )r   r,   r-   directoriespackagestatics_dirspecpackage_directorys           r   r8   zStaticFiles.get_directories:   sE     y)))~2 	2 	2G'5)) ('.$'>++G44D##%O%O%O%O###;**,Vw,V,V,V*** " 0 0dk4Q\1]1] ^ ^7==!  Y YX[XXXXXY Y Y 01111r    scoper   receiver   sendr   c                   K   |d         dk    sJ | j         s!|                                  d{V  d| _         |                     |          }|                     ||           d{V } ||||           d{V  dS )z'
        The ASGI entry point.
        typehttpNT)r:   check_configget_pathget_response)r   rP   rQ   rR   r<   responses         r   __call__zStaticFiles.__call__W   s       V}&&&&" 	'##%%%%%%%%%"&D}}U##**477777777hugt,,,,,,,,,,,r    strc                    t          |          }t          j                            t          j        j        |                    d                     S )z
        Given the ASGI scope, return the `path` string to serve up,
        with OS specific path separators, and any '..', '.' components removed.
        /)r   r;   r<   rI   rJ   split)r   rP   
route_paths      r   rW   zStaticFiles.get_pathe   s>    
 $E**
wj.>.>s.C.C DEEEr    r<   r   c                |  K   |d         dvrt          d          	 t          j                            | j        |           d{V \  }}nR# t
          $ r t          d          t          $ r,}|j        t          j        k    rt          d          |d}~ww xY w|r0t          j
        |j                  r|                     |||          S |rt          j        |j                  r| j        rt          j                            |d          }t          j                            | j        |           d{V \  }}|t          j
        |j                  rp|d	                             d
          s>t'          |          }|                    |j        d
z             }t+          |          S |                     |||          S | j        r[t          j                            | j        d           d{V \  }}|r+t          j
        |j                  rt-          ||d          S t          d          )z`
        Returns an HTTP response, given the incoming path, method and request headers.
        method)GETHEADi  )r!   Ni  i  z
index.htmlr<   r]   rP   )r<   )urlz404.html)stat_resultr!   )r   anyio	to_threadrun_synclookup_pathPermissionErrorOSErrorerrnoENAMETOOLONGstatS_ISREGst_modefile_responseS_ISDIRr.   r;   r<   rJ   endswithr   replacer
   r	   )r   r<   rP   	full_pathrf   exc
index_pathre   s           r   rX   zStaticFiles.get_responsem   sx      ?/11C0000		+0?+C+CDDTVZ+[+[%[%[%[%[%[%["I{{ 	1 	1 	1C0000 	 	 	yE...#4444I	  	I4<(;<< 	I%%ieDDD 	IT\+*=>> 	I49 	I dL99J+0?+C+CDDTV`+a+a%a%a%a%a%a%a"I{&4<8K+L+L&V}--c22 5E***C++38c>+::C+4444)))[%HHH9 	Y+0?+C+CDDTV`+a+a%a%a%a%a%a%a"I{ Yt|K,?@@ Y#I;TWXXXX,,,,s   .A #B0'BB!tuple[str, os.stat_result | None]c                   | j         D ]}t          j                            ||          }| j        r t          j                            |          }nt          j                            |          }t          j                            |          }t          j                            ||g          |k    r	 |t          j        |          fc S # t          t          f$ r Y w xY wdS )N) N)r9   r;   r<   rJ   r0   abspathrealpath
commonpathro   FileNotFoundErrorNotADirectoryError)r   r<   r,   joined_pathrv   s        r   rj   zStaticFiles.lookup_path   s    - 	 	I',,y$77K" :GOOK88		G,,[99	((33Iw!!9i"899YFF  "')"4"44444%'9:   xs   6CC"!C"   rv   PathLikerf   os.stat_resultr!   intc                    t          |          }t          |||          }|                     |j        |          rt	          |j                  S |S )Nrd   )r!   rf   )r   r	   is_not_modifiedr   r   )r   rv   rf   rP   r!   request_headersrY   s          r   rr   zStaticFiles.file_response   sZ     "...	{P[\\\ 0/BB 	9&x'7888r    c                n  K   | j         dS 	 t          j                            t          j        | j                    d{V }n&# t          $ r t          d| j          d          w xY wt          j        |j	                  s1t          j
        |j	                  st          d| j          d          dS dS )z
        Perform a one-off configuration check that StaticFiles is actually
        pointed at a directory, so that we can raise loud errors rather than
        just returning 404 responses.
        NzStaticFiles directory 'z' does not exist.zStaticFiles path 'z' is not a directory.)r,   rg   rh   ri   r;   ro   r   r>   rs   rq   S_ISLNK)r   rf   s     r   rV   zStaticFiles.check_config   s       >!F	\ % 8 8$. Q QQQQQQQKK  	\ 	\ 	\ZZZZ[[[	\[011 	[T\+BU5V5V 	[YDNYYYZZZ	[ 	[ 	[ 	[s   5A #A&response_headersr   r   c                    	 |d         }|d         }|d |                     d          D             v rdS n# t          $ r Y nw xY w	 t          |d                   }t          |d                   }|
|||k    rdS n# t          $ r Y nw xY wd	S )
z
        Given the request and response headers, return `True` if an HTTP
        "Not Modified" response could be returned instead.
        zif-none-matchr   c                8    g | ]}|                     d           S )z W/)strip)r   tags     r   
<listcomp>z/StaticFiles.is_not_modified.<locals>.<listcomp>   s$    MMMS		%((MMMr    ,Tzif-modified-sincezlast-modifiedNF)r^   KeyErrorr   )r   r   r   if_none_matchr   if_modified_sincelast_modifieds          r   r   zStaticFiles.is_not_modified   s    
	+O<M#F+DMMM4G4G4L4LMMMMMt N 	 	 	D		 )/:M*N O O%&6&GHHM ,1JO`dqOqOqt 	 	 	D	 us!   16 
AA4A> >
B
B)r,   r1   r-   r2   r.   r3   r/   r3   r0   r3   r4   r5   )NN)r,   r1   r-   r2   r4   r?   )rP   r   rQ   r   rR   r   r4   r5   )rP   r   r4   r[   )r<   r[   rP   r   r4   r   )r<   r[   r4   ry   )r   )
rv   r   rf   r   rP   r   r!   r   r4   r   )r4   r5   )r   r   r   r   r4   r3   )r&   r'   r(   r#   r8   rZ   rW   rX   rj   rr   rV   r   r   r    r   r+   r+   '   s	        &*7;$J J J J J J( &*7;    :- - - -F F F F(- (- (- (-T   .     [ [ [ [      r    r+   ) 
__future__r   rm   importlib.utilrE   r;   ro   typingemail.utilsr   rg   anyio.to_threadstarlette._utilsr   starlette.datastructuresr   r   starlette.exceptionsr   starlette.responsesr	   r
   r   starlette.typesr   r   r   Unionr[   r   r   r+   r   r    r   <module>r      s^   " " " " " "      				   ! ! ! ! ! !      + + + + + + 1 1 1 1 1 1 1 1 . . . . . . H H H H H H H H H H 0 0 0 0 0 0 0 0 0 0<//0
 
 
 
 
( 
 
 
"u u u u u u u u u ur    