U
    ar"                     @   s   d dl mZ d dlmZmZ d dlZ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 edd	Zeejd
gdd	ZdZG dd deZG dd deZG dd deZG dd deZG dd deZG dd deZdS )    )
namedtuple)
formatdate	parsedateN)
HTTPStatus)mktime)quote)HeadersResponsestatusheadersfile)ZAllowz	GET, HEAD)zCache-ControlzContent-LocationDateETagZExpiresVaryc                   @   s   e Zd ZdddZdd Zdd Zdd	 Zed
d Zedd Z	edd Z
dd Zedd Zedd Zdd Zdd ZdS )
StaticFileNc                 C   sP   |  |||}| ||}t|d | _|d | _| || _| ||| _d S )NLast-Modifiedr   )	get_file_statsget_headersr   last_modifiedetagget_not_modified_responsenot_modified_responseget_alternativesalternatives)selfpathr   	encodings
stat_cachefiles r    /home/adriano.carvalho/ftp/files/BrinquedotecaVirtual/brinquedotecavirtual/venv/lib/python3.8/site-packages/whitenoise/responders.py__init__"   s    
zStaticFile.__init__c                 C   s   |dkrt S | |r| jS | |\}}|dkr>t|d}nd }|d}|rvz| |||W S  tk
rt   Y nX tt	j
||S )N)GETHEADr$   rbZ
HTTP_RANGE)NOT_ALLOWED_RESPONSEis_not_modifiedr   get_path_and_headersopengetget_range_response
ValueErrorr	   r   OK)r   methodrequest_headersr   r   file_handlerange_headerr    r    r!   get_response*   s    

zStaticFile.get_responsec           	      C   s   g }|D ](}|d dkr&t |d }q|| q| ||\}}||krV| ||S |d k	rp|dkrp|| |dd|||f |dt|| d f ttj	||S )Nr   Content-Length   Content-Rangezbytes {}-{}/{})
intappendget_byte_range"get_range_not_satisfiable_responseseekformatstrr	   r   PARTIAL_CONTENT)	r   r1   base_headersr0   r   itemsizestartendr    r    r!   r+   ?   s    
zStaticFile.get_range_responsec                 C   sL   |  |\}}|dk r$t|| d}|d kr6|d }nt||d }||fS )Nr   r4   )parse_byte_rangemaxmin)r   r1   r@   rA   rB   r    r    r!   r8   O   s    
zStaticFile.get_byte_rangec           	      C   st   |   d\}}}|dkr"t |  d\}}}|s@t |sTt| }d }nt|}|rht|nd }||fS )N=bytes-)strip	partitionr,   r6   )	r1   Zunits_Z
range_specZ	start_strsepZend_strrA   rB   r    r    r!   rC   Y   s    
zStaticFile.parse_byte_rangec                 C   s*   | d k	r|    ttjdd|fgd S )Nr5   z
bytes */{})closer	   r   REQUESTED_RANGE_NOT_SATISFIABLEr;   )r0   r@   r    r    r!   r9   k   s    z-StaticFile.get_range_not_satisfiable_responsec              	   C   sT   d t | |i}|rP| D ]4\}}zt ||||< W q tk
rL   Y qY qX q|S N)	FileEntryitemsMissingFileError)r   r   r   r   encodingZalt_pathr    r    r!   r   u   s    zStaticFile.get_file_statsc                 C   s   t |}|d  }t|dkr$d|d< d|krH|jj}|rHt|dd|d< d|krt|d }|rtt|}d||jj	|d< |S )	Nr4   zAccept-Encodingr   r   T)usegmtr   z"{:x}-{:x}")
r   lenstatst_mtimer   r   r6   r   r;   st_size)r   Zheaders_listr   r   Z	main_filemtimer   	timestampr    r    r!   r      s"     zStaticFile.get_headersc                 C   s8   g }t D ]}|| kr||| | f qttj|d dS )Nr
   )NOT_MODIFIED_HEADERSr7   r	   r   NOT_MODIFIED)r   Znot_modified_headerskeyr    r    r!   r      s      z$StaticFile.get_not_modified_responsec                 C   s   g }t | dd d}|D ]`\}}t|  }t|jj|d< |r\||d< td| }n
td}|||j	| f q|S )Nc                 S   s   | d j jS )Nr4   )rV   rX   )ir    r    r!   <lambda>       z-StaticFile.get_alternatives.<locals>.<lambda>)r]   r3   zContent-Encodingz\b%s\b )
sortedrQ   r   r<   rV   rX   recompiler7   r   )r>   r   r   Zfiles_by_sizerS   Z
file_entryr   encoding_rer    r    r!   r      s    
zStaticFile.get_alternativesc                 C   s\   | d}|d k	r|| jkS | jd kr*dS z|d }W n tk
rL   Y dS X t|| jkS )NZHTTP_IF_NONE_MATCHFZHTTP_IF_MODIFIED_SINCE)r*   r   r   KeyErrorr   )r   r/   Zprevious_etagZlast_requestedr    r    r!   r'      s    


zStaticFile.is_not_modifiedc                 C   s8   | dd}| jD ] \}}}||r||f  S qd S )NZHTTP_ACCEPT_ENCODINGra   )r*   r   search)r   r/   accept_encodingre   r   r   r    r    r!   r(      s    
zStaticFile.get_path_and_headers)NN)__name__
__module____qualname__r"   r2   r+   r8   staticmethodrC   r9   r   r   r   r   r'   r(   r    r    r    r!   r   !   s"   



	

	
r   c                   @   s   e Zd ZdddZdd ZdS )RedirectNc                 C   s@   |rt | ng }|dt|df ttj|d | _d S )NZLocationutf8)	listrQ   r7   r   encoder	   r   FOUNDresponse)r   locationr   r    r    r!   r"      s    zRedirect.__init__c                 C   s   | j S rO   )rr   )r   r.   r/   r    r    r!   r2      s    zRedirect.get_response)N)ri   rj   rk   r"   r2   r    r    r    r!   rm      s   
rm   c                   @   s   e Zd ZdS )NotARegularFileErrorNri   rj   rk   r    r    r    r!   rt      s   rt   c                   @   s   e Zd ZdS )rR   Nru   r    r    r    r!   rR      s   rR   c                   @   s   e Zd ZdS )IsDirectoryErrorNru   r    r    r    r!   rv      s   rv   c                   @   s"   e Zd ZdddZedd ZdS )rP   Nc                 C   s,   |d krt jn|j}| ||| _|| _d S rO   )osrV   __getitem__stat_regular_filer   )r   r   r   stat_functionr    r    r!   r"      s    zFileEntry.__init__c              
   C   s   z|| }W nZ t k
r(   t| Y n@ tk
rf } z"|jtjtjfkrTt| n W 5 d}~X Y nX t|jst	|jrt
d| ntd| |S )zj
        Wrap `stat_function` to raise appropriate errors if `path` is not a
        regular file
        NzPath is a directory: {0}zNot a regular file: {0})rf   rR   OSErrorerrnoENOENTZENAMETOOLONGrV   S_ISREGst_modeS_ISDIRrv   r;   rt   )r   rz   stat_resulter    r    r!   ry      s    
zFileEntry.stat_regular_file)N)ri   rj   rk   r"   rl   ry   r    r    r    r!   rP      s   
rP   )collectionsr   email.utilsr   r   r|   httpr   rw   rc   rV   timer   urllib.parser   Zwsgiref.headersr   r	   METHOD_NOT_ALLOWEDr&   r[   objectr   rm   	Exceptionrt   rR   rv   rP   r    r    r    r!   <module>   s.   
  
 #
