o
    º Ži¤'  ã                   @  s¢   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mZmZmZ d d	lmZmZ G d
d„ dƒZdd„ ZdS )é    )ÚannotationsN)Únormpath)ÚCallable)ÚHeaders)ÚFileWrapper)Ú
MediaTypes)ÚIsDirectoryErrorÚMissingFileErrorÚRedirectÚ
StaticFile)Údecode_path_infoÚensure_leading_trailing_slashc                
   @  sÀ   e Zd ZdZ		d7dddddddddœd8dd„Zdd„ Zedd„ ƒZd9dd„Zdd „ Z	d9d!d"„Z
d#d$„ Zd%d&„ Zd'd(„ Zed)d*„ ƒZed9d+d,„ƒZd9d-d.„Zd/d0„ Zd1d2„ Zd3d4„ Zd5d6„ 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                  s°   || _ || _|| _|| _|	| _|
du rd| _nt|
tƒr |
| _nd | _|d ur;t|ƒs8t	 
|¡‰ ‡ fdd„| _n|| _t|d�| _|| _i | _g | _|d urV|  ||¡ d S d S )NTz
index.htmlc                   s   t ˆ  |¡ƒS ©N)r   Úsearch)ÚpathÚurl©Úregex© úYC:\Users\psant\Downloads\Anu Raj Backend\school\venv\Lib\site-packages\whitenoise/base.pyÚ<lambda>@   s    z%WhiteNoise.__init__.<locals>.<lambda>)Zextra_types)r   r   r   r   r   r   Ú
isinstancer   ÚcallableÚreÚcompiler   r   Úmedia_typesÚapplicationÚfilesÚdirectoriesÚ	add_files)Úselfr-   ÚrootÚprefixr   r   r   r   r   r   r   r   r%   r#   r&   Ú__init__   s,   

ÿzWhiteNoise.__init__c                 C  sP   t | dd¡ƒ}| jr|  |¡}n| j |¡}|d u r!|  ||¡S |  |||¡S )NZ	PATH_INFOÚ )r   Úgetr   Ú	find_filer.   r-   Úserve)r1   ÚenvironÚstart_responser!   Ústatic_filer%   r%   r&   Ú__call__K   s   zWhiteNoise.__call__c                 C  sX   |   |d |¡}|j› d|jj› �}||t|jƒƒ |jd ur*| dt¡}||jƒS g S )NÚREQUEST_METHODú zwsgi.file_wrapper)Zget_responseÚstatusÚphraseÚlistÚheadersÚfiler6   r   )r;   r9   r:   ÚresponseZstatus_lineZfile_wrapperr%   r%   r&   r8   V   s   

zWhiteNoise.servec                 C  sz   t j |¡}| t jj¡t jj }t|ƒ}| jr#| j d||f¡ d S t j 	|¡r1|  
||¡ d S tjd|› �dd� d S )Nr   zNo directory at: é   )Ú
stacklevel)Úosr!   ÚabspathÚrstripÚsepr   r   r/   ÚinsertÚisdirÚupdate_files_dictionaryÚwarningsÚwarn)r1   r2   r3   r%   r%   r&   r0   a   s   zWhiteNoise.add_filesc                 C  sN   t t|ƒƒ}|D ]}|t|ƒd … }| dd¡}|| }| j|||d� qd S )Nú\ú/©Ú
stat_cache)ÚdictÚscantreeÚlenÚreplaceÚadd_file_to_dictionary)r1   r2   r3   rS   r!   Zrelative_pathÚrelative_urlr"   r%   r%   r&   rM   p   s   üz"WhiteNoise.update_files_dictionaryc                 C  s�   | j ||d�r	d S | jd ur9| d| j ¡r9|d t| jƒ … }| d¡}|  ||¡| j|< |  ||¡| j|< |}| j|||d�}|| j|< d S )NrR   rQ   )Úis_compressed_variantr   ÚendswithrV   rI   Úredirectr.   Úget_static_file)r1   r"   r!   rS   Ú	index_urlZindex_no_slashr;   r%   r%   r&   rX   z   s   
z!WhiteNoise.add_file_to_dictionaryc              	   C  s^   | j d u r| d¡rd S |  |¡sd S |  |¡D ]}z	|  ||¡W   S  ty,   Y qw d S ©NrQ   )r   r[   Úurl_is_canonicalÚcandidate_paths_for_urlÚfind_file_at_pathr	   )r1   r"   r!   r%   r%   r&   r7   †   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/   Ú
startswithrG   r!   ÚjoinrV   Úcommonprefix)r1   r"   r2   r3   r!   r%   r%   r&   ra   ’   s   €
€üz"WhiteNoise.candidate_paths_for_urlc              	   C  sâ   |   |¡r	t|ƒ‚| jd urk| d¡r!tj || j¡}|  ||¡S | d| j ¡rAtj |¡r=|  	||d t
| jƒ … ¡S t|ƒ‚z|  ||¡W S  tyj   tj tj || j¡¡re|  	||d ¡ Y S Y t|ƒ‚w |  ||¡S r_   )rZ   r	   r   r[   rG   r!   rd   r]   Úisfiler\   rV   r   ©r1   r!   r"   r%   r%   r&   rb   ™   s&   


ûÿýzWhiteNoise.find_file_at_pathc                 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
        rP   FrQ   N)r   r[   )r"   Z
normalisedr%   r%   r&   r`   ®   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)rG   r!   rf   )r!   rS   Zuncompressed_pathr%   r%   r&   rZ   »   s   z WhiteNoise.is_compressed_variantc                 C  sˆ   |d u rt j |¡st|ƒ‚tg ƒ}|  |||¡ |  |||¡ | jr'd|d< | jd ur3|  |||¡ t	|| 
¡ ||d |d dœd�S )NÚ*zAccess-Control-Allow-Originri   rj   )ÚgzipÚbr)rS   Ú	encodings)rG   r!   Úexistsr	   r   Úadd_mime_headersÚadd_cache_headersr   r   r   Úitems)r1   r!   r"   rS   rB   r%   r%   r&   r]   Å   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_typerc   r   r   Ú
add_header)r1   rB   r!   r"   Ú
media_typeÚparamsr%   r%   r&   rp   ×   s
   
zWhiteNoise.add_mime_headersc                 C  sF   |   ||¡rd| j› d�|d< d S | jd ur!d| j› d�|d< d S d S )Númax-age=z, public, immutableúCache-Controlú, public)r   ÚFOREVERr   )r1   rB   r!   r"   r%   r%   r&   rq   ß   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
        FNr%   rg   r%   r%   r&   r   å   s   zWhiteNoise.immutable_file_testc                 C  sv   ||d kr|  d¡d d }n||| j krd}n
td|› d|› �ƒ‚| jdur3dd| j› d	�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
        rQ   éÿÿÿÿz./zCannot handle redirect: z > Nrx   rw   ry   )rB   )Úsplitr   Ú
ValueErrorr   r
   )r1   Zfrom_urlZto_urlrY   rB   r%   r%   r&   r\   ì   s   
zWhiteNoise.redirect)NN)r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   )Ú__name__Ú
__module__Ú__qualname__rz   r4   r<   Ústaticmethodr8   r0   rM   rX   r7   ra   rb   r`   rZ   r]   rp   rq   r   r\   r%   r%   r%   r&   r      s@    ü	ë1






	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)rG   ÚscandirÚis_dirrU   r!   Ústat)r2   Úentryr%   r%   r&   rU      s   €ürU   )Ú
__future__r   rG   r*   rN   Ú	posixpathr   Útypingr   Zwsgiref.headersr   Zwsgiref.utilr   Zwhitenoise.media_typesr   Zwhitenoise.respondersr   r	   r
   r   Zwhitenoise.string_utilsr   r   r   rU   r%   r%   r%   r&   Ú<module>   s     l