o
    \"<f(                     @   s   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 ddl	m
Z
 ddlmZmZmZmZ ddlmZmZmZ G d	d
 d
eZdd ZdS )    N)normpath)Headers)FileWrapper   )
MediaTypes)
StaticFileMissingFileErrorIsDirectoryErrorRedirect)decode_if_byte_stringdecode_path_infoensure_leading_trailing_slashc                   @   s   e Zd ZdZdZdZdZdZdZdZ	dZ
dZd*dd	Zd
d Zedd Zd+ddZdd Zd+ddZdd Zdd Zdd Zdd Zedd Zed+ddZd+d d!Zd"d# Zd$d% Zd&d' Zd(d) ZdS ),
WhiteNoisei )autorefreshmax_ageallow_all_originscharset	mimetypesadd_headers_function
index_fileimmutable_file_testF<   Tzutf-8Nc              	      s   | j D ]}z||}W n	 ty   Y qw t|}t| || q|r0tdt| d t	| j
d| _|| _i | _g | _| jdu rHd| _t| jsZt| j  fdd| _|d urf| || d S d S )Nz!Unexpected keyword argument '{0}'r   )extra_typesTz
index.htmlc                    s   t  |S N)boolsearch)pathurlregex F/var/www/html/kck/venv/lib/python3.10/site-packages/whitenoise/base.py<lambda>J   s    z%WhiteNoise.__init__.<locals>.<lambda>)config_attrspopKeyErrorr   setattr	TypeErrorformatlistkeysr   r   media_typesapplicationfilesdirectoriesr   callabler   recompile	add_files)selfr,   rootprefixkwargsattrvaluer    r   r!   __init__5   s0   


zWhiteNoise.__init__c                 C   sP   t |dd}| jr| |}n| j|}|d u r!| ||S | |||S )N	PATH_INFO )r   getr   	find_filer-   r,   serve)r3   environstart_responser   static_filer    r    r!   __call__N   s   zWhiteNoise.__call__c                 C   sV   |  |d |}d|j|jj}||t|j |jd ur)|dt}||jS g S )NREQUEST_METHODz{} {}zwsgi.file_wrapper)	get_responser(   statusphraser)   headersfiler<   r   )rA   r?   r@   responsestatus_linefile_wrapperr    r    r!   r>   Y   s   

zWhiteNoise.servec                 C   s   t |dd}tj|}|tjjtjj }t |}t|}| jr-| j	d||f d S tj
|r;| || d S td| d S )NT)
force_textr   zNo directory at: {})r   osr   abspathrstripsepr   r   r.   insertisdirupdate_files_dictionarywarningswarnr(   )r3   r4   r5   r    r    r!   r2   d   s   zWhiteNoise.add_filesc                 C   sR   t t|}| D ]}|t|d  }|dd}|| }| j|||d q
d S )N\/
stat_cache)dictscantreer*   lenreplaceadd_file_to_dictionary)r3   r4   r5   rY   r   relative_pathrelative_urlr   r    r    r!   rS   u   s   z"WhiteNoise.update_files_dictionaryc                 C   s   | j ||dr	d S | jr7|d| j r7|d t| j  }|d}| ||| j|< | ||| j|< |}| j|||d}|| j|< d S )NrX   rW   )is_compressed_variantr   endswithr\   rO   redirectr-   get_static_file)r3   r   r   rY   	index_urlindex_no_slashrA   r    r    r!   r^      s   
z!WhiteNoise.add_file_to_dictionaryc              	   C   sZ   | j s
|dr
d S | |sd S | |D ]}z	| ||W   S  ty*   Y qw d S NrW   )r   rb   url_is_canonicalcandidate_paths_for_urlfind_file_at_pathr   )r3   r   r   r    r    r!   r=      s   
zWhiteNoise.find_filec                 c   sT    | j D ]#\}}||r'tj||t|d  }tj||f|kr'|V  qd S r   )r.   
startswithrM   r   joinr\   commonprefix)r3   r   r4   r5   r   r    r    r!   ri      s   
z"WhiteNoise.candidate_paths_for_urlc                 C   s0   |  |r	t|| jr| ||S | ||S r   )ra   r   r   find_file_at_path_with_indexesrd   r3   r   r   r    r    r!   rj      s
   
zWhiteNoise.find_file_at_pathc              	   C   s   | drtj|| j}| ||S | d| j r3tj|r/| ||d t| j  S t
|z| ||W S  t	y\   tjtj|| jrW| ||d  Y S Y t
|w rg   )rb   rM   r   rl   r   rd   isfilerc   r\   r	   r   ro   r    r    r!   rn      s   
z)WhiteNoise.find_file_at_path_with_indexesc                 C   s6   d| v rdS t | }| dr| dkr|d7 }|| kS )z
        Check that the URL path is in canonical format i.e. has normalised
        slashes and no path traversal elements
        rV   FrW   )r   rb   )r   
normalisedr    r    r!   rh      s   zWhiteNoise.url_is_canonicalc                 C   s<   | dd  dv r| d d }|d u rt j|S ||v S dS )N).gz.brF)rM   r   rp   )r   rY   uncompressed_pathr    r    r!   ra      s   z WhiteNoise.is_compressed_variantc                 C   s   |d u rt j|st|tg }| ||| | ||| | jr'd|d< | jr1| ||| t	||
 ||d |d ddS )N*zAccess-Control-Allow-Originrs   rt   )gzipbr)rY   	encodings)rM   r   existsr   r   add_mime_headersadd_cache_headersr   r   r   items)r3   r   r   rY   rG   r    r    r!   rd      s   zWhiteNoise.get_static_filec                 C   sF   | j |}|drdt| ji}ni }|jdt|fi | d S )Nztext/r   zContent-Type)r+   get_typerk   strr   
add_header)r3   rG   r   r   
media_typeparamsr    r    r!   r{      s
   
zWhiteNoise.add_mime_headersc                 C   sB   |  ||rd| j|d< d S | jd urd| j|d< d S d S )Nzmax-age={0}, public, immutableCache-Controlmax-age={0}, public)r   r(   FOREVERr   )r3   rG   r   r   r    r    r!   r|      s   
zWhiteNoise.add_cache_headersc                 C   s   dS )z
        This should be implemented by sub-classes (see e.g. WhiteNoiseMiddleware)
        or by setting the `immutable_file_test` config option
        Fr    ro   r    r    r!   r      s   zWhiteNoise.immutable_file_testc                 C   sp   ||d kr| dd d }n||| j krd}ntd||| jdur0dd| ji}ni }t||d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
        rW   z./zCannot handle redirect: {} > {}Nr   r   )rG   )splitr   
ValueErrorr(   r   r
   )r3   from_urlto_urlr`   rG   r    r    r!   rc      s   
zWhiteNoise.redirect)NNr   )__name__
__module____qualname__r   r#   r   r   r   r   r   r   r   r9   rB   staticmethodr>   r2   rS   r^   r=   ri   rj   rn   rh   ra   rd   r{   r|   r   rc   r    r    r    r!   r      s<    







	r   c                 c   s@    t | D ]}| rt|jE dH  q|j| fV  qdS )zR
    Recurse the given directory yielding (pathname, os.stat(pathname)) pairs
    N)rM   scandiris_dirr[   r   stat)r4   entryr    r    r!   r[   	  s   r[   )rM   	posixpathr   r0   rT   wsgiref.headersr   wsgiref.utilr   r+   r   
respondersr   r   r	   r
   string_utilsr   r   r   objectr   r[   r    r    r    r!   <module>   s     y