
    +JfB(                        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	m
Z
 d dlmZ d dlmZ d dlmZ d d	lmZ d d
lmZ d dlmZ d dlmZ d dlmZ  G d d          Zd ZdS )    )annotationsN)normpath)Callable)Headers)FileWrapper)
MediaTypes)IsDirectoryError)MissingFileError)Redirect)
StaticFile)decode_path_info)ensure_leading_trailing_slashc            
          e Zd ZdZ	 	 d'dddddddddd(dZd Zed             Zd)dZd Z	d)dZ
d Zd Zd Zed              Zed)d!            Zd)d"Zd# Zd$ Zd% Zd& ZdS )*
WhiteNoisei NF<   Tzutf-8)autorefreshmax_ageallow_all_originscharset	mimetypesadd_headers_function
index_fileimmutable_file_testr   boolr   
int | Noner   r   strr   dict[str, str] | Noner   *Callable[[Headers, str, str], None] | Noner   str | bool | Noner   Callable | str | Nonec                  || _         || _        || _        || _        |	| _        |
du rd| _        n$t          |
t                    r|
| _        nd | _        |5t          |          st          j
        |          fd| _        n|| _        t          |          | _        || _        i | _        g | _        ||                     ||           d S d S )NTz
index.htmlc                H    t                              |                    S N)r   search)pathurlregexs     R/home/alex/cs2snipeproduction/venv/lib/python3.11/site-packages/whitenoise/base.py<lambda>z%WhiteNoise.__init__.<locals>.<lambda>?   s    T%,,sBSBS=T=T     )extra_types)r   r   r   r   r   r   
isinstancer   callablerecompiler   r   media_typesapplicationfilesdirectories	add_files)selfr1   rootprefixr   r   r   r   r   r   r   r   r'   s               @r(   __init__zWhiteNoise.__init__   s    . '!2$8!*6DOO
C(( 	#(DOO"DO*/00 ?
#677+T+T+T+T((+>(%)<<<&
NN4((((( r*   c                   t          |                    dd                    }| j        r|                     |          }n| j                            |          }||                     ||          S |                     |||          S )N	PATH_INFO )r   getr   	find_filer2   r1   serve)r5   environstart_responser%   static_files        r(   __call__zWhiteNoise.__call__J   s    K < <== 	/....KK*....K##G^<<<::k7NCCCr*   c                
   |                      |d         |          }|j         d|j        j         } ||t          |j                             |j        +|                    dt                    } ||j                  S g S )NREQUEST_METHOD zwsgi.file_wrapper)get_responsestatusphraselistheadersfiler<   r   )rA   r?   r@   responsestatus_linefile_wrappers         r(   r>   zWhiteNoise.serveU   s    ++G4D,EwOO!CC8?+ACC{D)9$:$:;;;=$";;':KHHL<...Ir*   c                   t           j                            |          }|                    t           j        j                  t           j        j        z   }t          |          }| j        r| j                            d||f           d S t           j        	                    |          r| 
                    ||           d S t          j        d| d           d S )Nr   zNo directory at:    )
stacklevel)osr%   abspathrstripsepr   r   r3   insertisdirupdate_files_dictionarywarningswarn)r5   r6   r7   s      r(   r4   zWhiteNoise.add_files`   s    wt$${{27;''"'+5.v66 		H ##Af~66666w}}T"" H,,T6:::::8$88QGGGGGGr*   c                    t          t          |                    }|                                D ]L}|t          |          d          }|                    dd          }||z   }|                     |||           Md S )N\/
stat_cache)dictscantreekeyslenreplaceadd_file_to_dictionary)r5   r6   r7   r_   r%   relative_pathrelative_urlr&   s           r(   rX   z"WhiteNoise.update_files_dictionaryo   s     (4..))
OO%% 	J 	JD T-M(00s;;L<'C''Tj'IIII		J 	Jr*   c                   |                      ||          rd S | j        |                    d| j        z             rp|d t          | j                            }|                    d          }|                     ||          | j        |<   |                     ||          | j        |<   |}|                     |||          }|| j        |<   d S )Nr^   r]   )is_compressed_variantr   endswithrc   rT   redirectr2   get_static_file)r5   r&   r%   r_   	index_urlindex_no_slashrA   s          r(   re   z!WhiteNoise.add_file_to_dictionaryy   s    %%dz%BB 	F?&3<<do8M+N+N&3s4?33334I&--c22N"mmC;;DJsO)-~y)Q)QDJ~&C**4*LL%
3r*   c                    | j         |                    d          rd S |                     |          sd S |                     |          D ]*}	 |                     ||          c S # t
          $ r Y 'w xY wd S Nr]   )r   rj   url_is_canonicalcandidate_paths_for_urlfind_file_at_pathr
   )r5   r&   r%   s      r(   r=   zWhiteNoise.find_file   s    ?"s||C'8'8"F$$S)) 	F0055 	 	D--dC88888#   	 	s   A&&
A32A3c              #  
  K   | j         D ]x\  }}|                    |          r^t          j                            ||t          |          d                    }t          j                            ||f          |k    r|V  yd S r#   )r3   
startswithrR   r%   joinrc   commonprefix)r5   r&   r6   r7   r%   s        r(   rr   z"WhiteNoise.candidate_paths_for_url   s       , 	 	LD&~~f%% w||D#c&kkmm*<==7''t55==JJJ		 	r*   c                (   |                      |          rt          |          | j        Q|                    d          r;t          j                            || j                  }|                     ||          S |                    d| j        z             rQt          j                            |          r1| 	                    ||d t          | j                                      S n	 |                     ||          S # t          $ r` t          j                            t          j                            || j                            r| 	                    ||dz             cY S Y nw xY wt          |          |                     ||          S rp   )ri   r
   r   rj   rR   r%   rv   rl   isfilerk   rc   r	   r5   r%   r&   s      r(   rs   zWhiteNoise.find_file_at_path   s   %%d++ 	)"4(((?&||C   =w||D$/::++D#666cDO344 =7>>$'' L==c2IS5I5I4I2I.JKKKL=//c:::' = = =w~~bgll4&I&IJJ =#}}S#)<<<<<= == #4(((##D#...s   ,D A%E,+E,c                x    d| v rdS t          |           }|                     d          r| dk    r|dz  }|| k    S )z
        Check that the URL path is in canonical format i.e. has normalised
        slashes and no path traversal elements
        r\   Fr]   )r   rj   )r&   
normaliseds     r(   rq   zWhiteNoise.url_is_canonical   sN     3;;5c]]
<< 	#JS  r*   c                |    | dd          dv r/| d d         }|t           j                            |          S ||v S dS )N).gz.brF)rR   r%   ry   )r%   r_   uncompressed_paths      r(   ri   z WhiteNoise.is_compressed_variant   sN    9&& $SbS	!w~~&7888(J66ur*   c                   |.t           j                            |          st          |          t	          g           }|                     |||           |                     |||           | j        rd|d<   | j        |                     |||           t          ||
                                ||dz   |dz   d          S )N*zAccess-Control-Allow-Originr   r   )gzipbr)r_   	encodings)rR   r%   existsr
   r   add_mime_headersadd_cache_headersr   r   r   items)r5   r%   r&   r_   rJ   s        r(   rl   zWhiteNoise.get_static_file   s    bgnnT&:&:"4((("++gtS111wc222! 	958G12$0%%gtS999MMOO!#e|4%<@@	
 
 
 	
r*   c                    | j                             |          }|                    d          rdt          | j                  i}ni } |j        dt          |          fi | d S )Nztext/r   zContent-Type)r0   get_typeru   r   r   
add_header)r5   rJ   r%   r&   
media_typeparamss         r(   r   zWhiteNoise.add_mime_headers   sr    %..t44
  )) 	T\!2!23FFF>3z??EEfEEEEEr*   c                    |                      ||          rd                    | j                  |d<   d S | j        d| j         d|d<   d S d S )Nzmax-age={}, public, immutableCache-Controlmax-age=, public)r   formatFOREVERr   )r5   rJ   r%   r&   s       r(   r   zWhiteNoise.add_cache_headers   so    ##D#.. 	I'F'M'M( (GO$$$ \%'H$,'H'H'HGO$$$ &%r*   c                    dS )z
        This should be implemented by sub-classes (see e.g. WhiteNoiseMiddleware)
        or by setting the `immutable_file_test` config option
        F rz   s      r(   r   zWhiteNoise.immutable_file_test   s	    
 ur*   c                    ||dz   k    r|                     d          d         dz   }n&||| j        z   k    rd}nt          d| d|           | j        dd| j         d	i}ni }t	          ||
          S )z
        Return a relative 302 redirect

        We use relative redirects as we don't know the absolute URL the app is
        being hosted under
        r]   z./zCannot handle redirect: z > Nr   r   r   )rJ   )splitr   
ValueErrorr   r   )r5   from_urlto_urlrg   rJ   s        r(   rk   zWhiteNoise.redirect   s     X^###>>#..r2S8LL$/111LLMMMVMMNNN<#&(I4<(I(I(IJGGGg6666r*   )NN)r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r    r#   )__name__
__module____qualname__r   r8   rB   staticmethodr>   r4   rX   re   r=   rr   rs   rq   ri   rl   r   r   r   rk   r   r*   r(   r   r      s        &G
 	/) "  #'+/KO(,59+/) /) /) /) /) /)b	D 	D 	D   \H H H HJ J J
& 
& 
& 
&
 
 
  / / /* 
! 
! \
!    \
 
 
 
$F F FI I I  7 7 7 7 7r*   r   c              #     K   t          j        |           D ]N}|                                rt          |j                  E d{V  1|j        |                                fV  OdS )zR
    Recurse the given directory yielding (pathname, os.stat(pathname)) pairs
    N)rR   scandiris_dirra   r%   stat)r6   entrys     r(   ra   ra     s~       D!! + +<<>> 	+
++++++++++*ejjll*****	+ +r*   )
__future__r   rR   r.   rY   	posixpathr   typingr   wsgiref.headersr   wsgiref.utilr   whitenoise.media_typesr   whitenoise.respondersr	   r
   r   r   whitenoise.string_utilsr   r   r   ra   r   r*   r(   <module>r      sB   " " " " " " 				 				              # # # # # # $ $ $ $ $ $ - - - - - - 2 2 2 2 2 2 2 2 2 2 2 2 * * * * * * , , , , , , 4 4 4 4 4 4 A A A A A Aj7 j7 j7 j7 j7 j7 j7 j7Z+ + + + +r*   