U
    a(                     @   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k
r,   Y qX t|}t| || q|rbtdt| d t	| j
d| _|| _i | _g | _| jdkrd| _t| jst| j  fdd| _|d k	r| || d S )Nz!Unexpected keyword argument '{0}'r   )Zextra_typesTz
index.htmlc                    s   t  |S N)boolsearch)pathurlregex ~/home/adriano.carvalho/ftp/files/BrinquedotecaVirtual/brinquedotecavirtual/venv/lib/python3.8/site-packages/whitenoise/base.py<lambda>J       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   s,    


zWhiteNoise.__init__c                 C   sT   t |dd}| jr"| |}n| j|}|d krB| ||S | |||S d S )NZ	PATH_INFO )r   getr   	find_filer-   r,   serve)r3   environstart_responser   static_filer   r   r    __call__N   s    zWhiteNoise.__call__c                 C   sZ   |  |d |}d|j|jj}||t|j |jd k	rR|dt}||jS g S d S )NREQUEST_METHODz{} {}zwsgi.file_wrapper)	Zget_responser(   statusphraser)   headersfiler;   r   )r@   r>   r?   responseZstatus_lineZ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rX| j	d||f n*tj
|rr| || ntd| d S )NT)Z
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 ]8}|t|d  }|dd}|| }| j|||d qd S )N\/
stat_cache)dictscantreer*   lenreplaceadd_file_to_dictionary)r3   r4   r5   rT   r   relative_pathrelative_urlr   r   r   r    rN   u   s    z"WhiteNoise.update_files_dictionaryc                 C   s   | j ||drd S | jrn|d| j rn|d t| j  }|d}| ||| j|< | ||| j|< |}| j|||d}|| j|< d S )NrS   rR   )is_compressed_variantr   endswithrW   rJ   redirectr-   get_static_file)r3   r   r   rT   	index_urlZindex_no_slashr@   r   r   r    rY      s    
z!WhiteNoise.add_file_to_dictionaryc              	   C   s^   | j s|drd S | |s"d S | |D ],}z| ||W   S  tk
rV   Y q,X q,d S NrR   )r   r]   url_is_canonicalcandidate_paths_for_urlfind_file_at_pathr   )r3   r   r   r   r   r    r<      s    
zWhiteNoise.find_filec                 c   sR   | j D ]F\}}||rtj||t|d  }tj||f|kr|V  qd S r   )r.   
startswithrH   r   joinrW   commonprefix)r3   r   r4   r5   r   r   r   r    rc      s
    
z"WhiteNoise.candidate_paths_for_urlc                 C   s4   |  |rt|| jr$| ||S | ||S d S r   )r\   r   r   find_file_at_path_with_indexesr_   r3   r   r   r   r   r    rd      s
    
zWhiteNoise.find_file_at_pathc              	   C   s   | dr&tj|| j}| ||S | d| j r`tj|r| ||d t| j  S nPz| ||W S  t	k
r   tjtj|| jr| ||d  Y S Y nX t
|d S ra   )r]   rH   r   rf   r   r_   isfiler^   rW   r	   r   ri   r   r   r    rh      s    
z)WhiteNoise.find_file_at_path_with_indexesc                 C   s6   d| k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
        rQ   FrR   )r   r]   )r   Z
normalisedr   r   r    rb      s    zWhiteNoise.url_is_canonicalc                 C   s<   | dd  dkr8| d d }|d kr0t j|S ||kS dS )N).gz.brF)rH   r   rj   )r   rT   Zuncompressed_pathr   r   r    r\      s    z WhiteNoise.is_compressed_variantc                 C   s   |d krt j|st|tg }| ||| | ||| | jrNd|d< | jrb| ||| t	||
 ||d |d ddS )N*zAccess-Control-Allow-Originrl   rm   )gzipbr)rT   	encodings)rH   r   existsr   r   add_mime_headersadd_cache_headersr   r   r   items)r3   r   r   rT   rE   r   r   r    r_      s    zWhiteNoise.get_static_filec                 C   sB   | j |}|dr&dt| ji}ni }|jdt|f| d S )Nztext/r   zContent-Type)r+   get_typere   strr   
add_header)r3   rE   r   r   
media_typeparamsr   r   r    rs      s
    
zWhiteNoise.add_mime_headersc                 C   s<   |  ||rd| j|d< n| jd k	r8d| j|d< d S )Nzmax-age={0}, public, immutableCache-Controlmax-age={0}, public)r   r(   FOREVERr   )r3   rE   r   r   r   r   r    rt      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   ri   r   r   r    r      s    zWhiteNoise.immutable_file_testc                 C   sp   ||d kr | dd d }n$||| j kr4d}ntd||| jdk	r`d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
        rR   z./zCannot handle redirect: {} > {}Nr{   r|   )rE   )splitr   
ValueErrorr(   r   r
   )r3   Zfrom_urlZto_urlr[   rE   r   r   r    r^      s    
zWhiteNoise.redirect)NN)N)N)N)N)__name__
__module____qualname__r}   r#   r   r   r   r   r   r   r   r9   rA   staticmethodr=   r2   rN   rY   r<   rc   rd   rh   rb   r\   r_   rs   rt   r   r^   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)rH   scandiris_dirrV   r   stat)r4   entryr   r   r    rV   	  s    rV   )rH   	posixpathr   r0   rO   Zwsgiref.headersr   Zwsgiref.utilr   r+   r   Z
respondersr   r   r	   r
   Zstring_utilsr   r   r   objectr   rV   r   r   r   r    <module>   s    y