
     i!                        d dl m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      O/var/www/cyber-strat/venv/lib/python3.11/site-packages/starlette/staticfiles.py
<dictcomp>z0NotModifiedResponse.__init__.<locals>.<dictcomp>"   s7       D%4444 e444    )status_coder   )super__init__items)r   r   	__class__s   ` r   r#   zNotModifiedResponse.__init__   s`       #*==??   	 	
 	
 	
 	
 	
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=   sK     y)))~2 	2 	2G'5)) ('.$'>++G44D##%O%O%O%O###;**,Vw,V,V,V*** " 0 0T[$<<! ! 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__\   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_pathj   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 \  }}n(# t
          $ r t          d          t          $ r  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  z
index.htmlr<   r]   rP   )r<   )urlz404.htmli  )stat_resultr!   )r   anyio	to_threadrun_synclookup_pathPermissionErrorOSErrorstatS_ISREGst_modefile_responseS_ISDIRr.   r;   r<   rJ   endswithr   replacer
   r	   )r   r<   rP   	full_pathrf   
index_pathre   s          r   rX   zStaticFiles.get_responser   s      ?/11C0000	+0?+C+C $, , & & & & & &"I{{  	1 	1 	1C0000 	 	 		  	I4<(;<< 	I%%ieDDD 	IT\+*=>> 	I49 	I dL99J+0?+C+C *, , & & & & & &"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+C *, , & & & & & &"I{  Yt|K,?@@ Y#I;TWXXXX,,,,s   .A %A2!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
commonpathrm   FileNotFoundErrorNotADirectoryError)r   r<   r,   joined_pathrt   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"   rt   PathLikerf   os.stat_resultr!   intc                    t          |          }t          |||          }|                     |j        |          rt	          |j                  S |S )Nrd   )r!   rf   )r   r	   is_not_modifiedr   r   )r   rt   rf   rP   r!   request_headersrY   s          r   rp   zStaticFiles.file_response   sb     "...;K
 
 
  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;   rm   r|   r>   rq   ro   S_ISLNK)r   rf   s     r   rV   zStaticFiles.check_config   s       >!F	 % 8 8$. Q QQQQQQQKK  	 	 	K$.KKK  	 [011 	T\+BU5V5V 	JT^JJJ  	 	 	 	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!-!-%66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   rv   )r   )
rt   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   rp   rV   r   r   r    r   r+   r+   *   s        &*7;$J J J J J J( &*7;    >- - - -F F F F*- *- *- *-X   .         (     r    r+   )
__future__r   importlib.utilrE   r;   rm   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      sU   " " " " " "     				   ! ! ! ! ! !      + + + + + + 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
 
 
 
 
( 
 
 
*E E E E E E E E E Er    