
    ?wgB(                        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y)    )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y)
WhiteNoisei NF<   Tzutf-8)autorefreshmax_ageallow_all_originscharset	mimetypesadd_headers_function
index_fileimmutable_file_testc                  || _         || _        || _        || _        |	| _        |
du rd| _        nt        |
t              r|
| _        nd | _        |2t        |      s t        j                  |      fd| _        n|| _        t        |      | _        || _        i | _        g | _        || j#                  ||       y y )NTz
index.htmlc                8    t        j                  |            S N)boolsearch)pathurlregexs     F/var/www/horilla/myenv/lib/python3.12/site-packages/whitenoise/base.py<lambda>z%WhiteNoise.__init__.<locals>.<lambda>?   s    T%,,sBS=T     )extra_types)r   r   r   r   r   r   
isinstancestrcallablerecompiler   r   media_typesapplicationfilesdirectories	add_files)selfr,   rootprefixr   r   r   r   r   r   r   r   r!   s               @r"   __init__zWhiteNoise.__init__   s    . '!2$8!*6DO
C((DO"DO*/0

#67+T(+>(%)<&
NN4( r$   c                    t        |j                  dd            }| j                  r| j                  |      }n| j                  j                  |      }|| j                  ||      S | j                  |||      S )N	PATH_INFO )r   getr   	find_filer-   r,   serve)r0   environstart_responser   static_files        r"   __call__zWhiteNoise.__call__J   sl    K <=...K**...K##G^<<::k7NCCr$   c                   | j                  |d   |      }|j                   d|j                  j                   } ||t        |j                               |j
                  (|j                  dt              } ||j
                        S g S )NREQUEST_METHOD zwsgi.file_wrapper)get_responsestatusphraselistheadersfiler7   r   )r<   r:   r;   responsestatus_linefile_wrappers         r"   r9   zWhiteNoise.serveU   s~    ++G4D,EwO!)8??+A+A*BC{D)9)9$:;==$";;':KHL..Ir$   c                   t         j                  j                  |      }|j                  t         j                  j                        t         j                  j                  z   }t        |      }| j                  r| j                  j                  d||f       y t         j                  j                  |      r| j                  ||       y t        j                  d| d       y )Nr   zNo directory at:    )
stacklevel)osr   abspathrstripsepr   r   r.   insertisdirupdate_files_dictionarywarningswarn)r0   r1   r2   s      r"   r/   zWhiteNoise.add_files`   s    wwt${{277;;'"''++5.v6 ##Af~6ww}}T",,T6: 1$8QGr$   c                    t        t        |            }|j                         D ];  }|t        |      d  }|j	                  dd      }||z   }| j                  |||       = y )N\/
stat_cache)dictscantreekeyslenreplaceadd_file_to_dictionary)r0   r1   r2   rZ   r   relative_pathrelative_urlr    s           r"   rS   z"WhiteNoise.update_files_dictionaryo   sk     (4.)
OO% 	JD T-M(00s;L<'C''Tj'I		Jr$   c                   | j                  ||      ry | j                  |j                  d| j                  z         rj|d t        | j                          }|j	                  d      }| j                  ||      | j                  |<   | j                  ||      | j                  |<   |}| j                  |||      }|| j                  |<   y )NrY   rX   )is_compressed_variantr   endswithr^   rO   redirectr-   get_static_file)r0   r    r   rZ   	index_urlindex_no_slashr<   s          r"   r`   z!WhiteNoise.add_file_to_dictionaryy   s    %%dz%B??&3<<doo8M+N3s4??334I&--c2N"mmC;DJJsO)-~y)QDJJ~&C**4*L%

3r$   c                    | j                   |j                  d      ry | j                  |      sy | j                  |      D ]  }	 | j	                  ||      c S  y # t
        $ r Y %w xY wNrX   )r   re   url_is_canonicalcandidate_paths_for_urlfind_file_at_pathr
   )r0   r    r   s      r"   r8   zWhiteNoise.find_file   sq    ??"s||C'8$$S)005 	D--dC88	 $ s   A	A('A(c              #    K   | j                   D ]l  \  }}|j                  |      st        j                  j	                  ||t        |      d        }t        j                  j                  ||f      |k(  si| n y wr   )r.   
startswithrM   r   joinr^   commonprefix)r0   r    r1   r2   r   s        r"   rm   z"WhiteNoise.candidate_paths_for_url   sj      ,, 	LD&~~f%ww||D#c&km*<=77''t5=J		s   $A?AA?8A?c                   | j                  |      rt        |      | j                  |j                  d      r<t        j
                  j                  || j                        }| j                  ||      S |j                  d| j                  z         rHt        j
                  j                  |      r<| j                  ||d t        | j                                S 	 | j                  ||      S t        |      | j                  ||      S # t        $ rk t        j
                  j                  t        j
                  j                  || j                              r| j                  ||dz         cY S Y t        |      w xY wrk   )rd   r
   r   re   rM   r   rq   rg   isfilerf   r^   r	   r0   r   r    s      r"   rn   zWhiteNoise.find_file_at_path   s8   %%d+"4((??&||C ww||D$//:++D#66cDOO3477>>$'==c2IS5I4I.JKK=//c:: #4((##D#.. ( =ww~~bggll4&IJ#}}S#)<< K"4((=s   D A%F ?F c                b    d| v ryt        |       }| j                  d      r
| dk7  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
        rW   FrX   )r   re   )r    
normaliseds     r"   rl   zWhiteNoise.url_is_canonical   s>     3;c]
<<#JS  r$   c                f    | dd  dv r*| d d }|t         j                  j                  |      S ||v S y)N).gz.brF)rM   r   rt   )r   rZ   uncompressed_paths      r"   rd   z WhiteNoise.is_compressed_variant   sD    9& $Sb	!ww~~&788(J66r$   c                h   |*t         j                  j                  |      st        |      t	        g       }| j                  |||       | j                  |||       | j                  rd|d<   | j                  | j                  |||       t        ||j                         ||dz   |dz   d      S )N*zAccess-Control-Allow-Originrz   r{   )gzipbr)rZ   	encodings)rM   r   existsr
   r   add_mime_headersadd_cache_headersr   r   r   items)r0   r   r    rZ   rE   s        r"   rg   zWhiteNoise.get_static_file   s    bggnnT&:"4(("+gtS1wc2!!58G12$$0%%gtS9MMO!#e|4%<@	
 	
r$   c                    | j                   j                  |      }|j                  d      rdt        | j                        i}ni } |j
                  dt        |      fi | y )Nztext/r   zContent-Type)r+   get_typerp   r'   r   
add_header)r0   rE   r   r    
media_typeparamss         r"   r   zWhiteNoise.add_mime_headers   sY    %%..t4
  )T\\!23FF>3z?EfEr$   c                    | j                  ||      rdj                  | j                        |d<   y | j                  d| j                   d|d<   y y )Nzmax-age={}, public, immutableCache-Controlmax-age=, public)r   formatFOREVERr   )r0   rE   r   r    s       r"   r   zWhiteNoise.add_cache_headers   sV    ##D#.'F'M'M(GO$ \\%)1$,,x'HGO$ &r$   c                     y)z
        This should be implemented by sub-classes (see e.g. WhiteNoiseMiddleware)
        or by setting the `immutable_file_test` config option
        F ru   s      r"   r   zWhiteNoise.immutable_file_test   s    
 r$   c                    ||dz   k(  r|j                  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
        rX   z./zCannot handle redirect: z > r   r   r   )rE   )splitr   
ValueErrorr   r   )r0   from_urlto_urlrb   rE   s        r"   rf   zWhiteNoise.redirect   s     X^##>>#.r2S8L$//11L7zVHMNN<<#&(4<<.(IJGGg66r$   )NN)r   r   r   z
int | Noner   r   r   r'   r   zdict[str, str] | Noner   z*Callable[[Headers, str, str], None] | Noner   zstr | bool | Noner   zCallable | str | Noner   )__name__
__module____qualname__r   r3   r=   staticmethodr9   r/   rS   r`   r8   rm   rn   rl   rd   rg   r   r   r   rf   r   r$   r"   r   r      s    &G
 	/) "  #'+/KO(,59+/) /) /)   !/)" #/)$ )%/)& I'/)( &)/)* 3+/)b	D  HJ
&
/* 
! 
!  
$FI7r$   r   c              #     K   t        j                  |       D ]N  }|j                         rt        |j                        E d{    1|j                  |j                         f P y7 &w)zR
    Recurse the given directory yielding (pathname, os.stat(pathname)) pairs
    N)rM   scandiris_dirr\   r   stat)r1   entrys     r"   r\   r\     sS      D! +<<>

+++**ejjl**	++s   AA,A*'A,)
__future__r   rM   r)   rT   	posixpathr   typingr   wsgiref.headersr   wsgiref.utilr   whitenoise.media_typesr   whitenoise.respondersr	   r
   r   r   whitenoise.string_utilsr   r   r   r\   r   r$   r"   <module>r      sD    " 	 	    # $ - 2 2 * , 4 Aj7 j7Z+r$   