U
    ðßŽiš&  ã                   @  s  d dl mZ d dl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 G d
d„ dƒZee
jdgdd�ZdZG dd„ deƒZG dd„ dƒZG dd„ dƒZG dd„ deƒZG dd„ deƒZG dd„ deƒZG dd„ dƒZdS )é    )ÚannotationsN)Ú
formatdate)Ú	parsedate)Ú
HTTPStatus)ÚBufferedIOBase)Úmktime)Úquote)ÚHeadersc                   @  s   e Zd ZdZdd„ ZdS )ÚResponse©ÚstatusÚheadersÚfilec                 C  s   || _ || _|| _d S ©Nr   )Úselfr   r   r   © r   úS/var/www/html/IITS/school/venv/lib/python3.8/site-packages/whitenoise/responders.pyÚ__init__   s    zResponse.__init__N)Ú__name__Ú
__module__Ú__qualname__Ú	__slots__r   r   r   r   r   r
      s   r
   )ÚAllowz	GET, HEADr   )zCache-ControlzContent-LocationÚDateÚETagÚExpiresÚVaryc                   @  s*   e Zd ZdZdd„ Zd
dd„Zdd„ Zd	S )Ú
SlicedFilez³
    A file like wrapper to handle seeking to the start byte of a range request
    and to return no further output once the end byte of a range request has
    been reached.
    c                 C  s"   |  |¡ || _|| d | _d S ©Né   )ÚseekÚfileobjÚ	remaining)r   r!   ÚstartÚendr   r   r   r   2   s    
zSlicedFile.__init__éÿÿÿÿc                 C  sL   | j dkrdS |dk r| j }nt|| j ƒ}| j |¡}|  j t|ƒ8  _ |S )Nr   ó    )r"   Úminr!   ÚreadÚlen)r   ÚsizeÚdatar   r   r   r(   7   s    
zSlicedFile.readc                 C  s   | j  ¡  d S r   )r!   Úclose)r   r   r   r   r,   B   s    zSlicedFile.closeN)r%   )r   r   r   Ú__doc__r   r(   r,   r   r   r   r   r   +   s   
r   c                   @  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)r   Úpathr   Ú	encodingsÚ
stat_cacheÚfilesr   r   r   r   G   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_modifiedr5   Úget_path_and_headersÚopenÚgetÚget_range_responseÚ
ValueErrorr
   r   ÚOK)r   ÚmethodÚrequest_headersr8   r   Úfile_handleÚrange_headerr   r   r   Úget_responseO   s    

zStaticFile.get_responsec           	   	   C  s²   g }|D ](}|d dkr&t |d ƒ}q| |¡ q|  ||¡\}}||krV|  ||¡S |d k	rjt|||ƒ}| dd|› d|› d|› �f¡ | dt|| d ƒf¡ ttj||ƒS )Nr   úContent-Lengthr   úContent-Rangezbytes ú-ú/)	ÚintÚappendÚget_byte_rangeÚ"get_range_not_satisfiable_responser   Ústrr
   r   ÚPARTIAL_CONTENT)	r   rJ   Úbase_headersrI   r   Úitemr*   r#   r$   r   r   r   rD   d   s     zStaticFile.get_range_responsec                 C  sL   |   |¡\}}|dk r$t|| dƒ}|d kr6|d }nt||d ƒ}||fS )Nr   r   )Úparse_byte_rangeÚmaxr'   )r   rJ   r*   r#   r$   r   r   r   rR   t   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ú=ÚbytesrN   )ÚstripÚ	partitionrE   rP   )	rJ   ÚunitsÚ_Z
range_specZ	start_strÚsepZend_strr#   r$   r   r   r   rX   ~   s    
zStaticFile.parse_byte_rangec                 C  s*   | d k	r|   ¡  ttjdd|› �fgd ƒS )NrM   zbytes */)r,   r
   r   ÚREQUESTED_RANGE_NOT_SATISFIABLE)rI   r*   r   r   r   rS   �   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 r   )Ú	FileEntryÚitemsÚMissingFileError)r8   r9   r:   r;   ÚencodingZalt_pathr   r   r   r0   š   s    zStaticFile.get_file_statsc                 C  sŠ   t |ƒ}|d  }t|ƒdkr$d|d< d|krF|j}|rFt|dd�|d< d|kr†t|d ƒ}|r†tt|ƒƒ}d|d	›d
|jd	›d�|d< |S )Nr   zAccept-Encodingr   r/   T)Úusegmtr   ú"ÚxrN   )r	   r)   Úmtimer   r   rP   r   r*   )r   Zheaders_listr;   r   Z	main_fileri   r2   Ú	timestampr   r   r   r1   ¦   s    zStaticFile.get_headersc                 C  s8   g }t D ]}|| kr| || | f¡ qttj|d d�S )Nr   )ÚNOT_MODIFIED_HEADERSrQ   r
   r   ÚNOT_MODIFIED)r   Znot_modified_headersÚkeyr   r   r   r4   ¸   s      ÿz$StaticFile.get_not_modified_responsec                 C  s€   g }t | ¡ dd„ d�}|D ]^\}}t|  ¡ ƒ}t|jƒ|d< |rZ||d< t d| ¡}n
t d¡}| ||j| ¡ f¡ q|S )Nc                 S  s
   | d j S r   )r*   )Úir   r   r   Ú<lambda>Æ   r&   z-StaticFile.get_alternatives.<locals>.<lambda>)rm   rL   zContent-Encodingz\b%s\bÚ )	Úsortedrc   r	   rT   r*   ÚreÚcompilerQ   r8   )rV   r;   r7   Zfiles_by_sizere   Z
file_entryr   Úencoding_rer   r   r   r6   Â   s    
zStaticFile.get_alternativesc                 C  sl   |  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|ƒ}|d k	rh|| jkS dS )NÚHTTP_IF_NONE_MATCHFÚHTTP_IF_MODIFIED_SINCE)rC   r3   r2   ÚKeyErrorr   )r   rH   Zprevious_etagZlast_requestedZlast_requested_tsr   r   r   r@   Ò   s    



zStaticFile.is_not_modifiedc                 C  sD   |  dd¡}|dkrd}| jD ] \}}}| |¡r||f  S qd S )NZHTTP_ACCEPT_ENCODINGrp   Ú*)rC   r7   Úsearch)r   rH   Zaccept_encodingrt   r8   r   r   r   r   rA   á   s    
zStaticFile.get_path_and_headers)NN)r   r   r   r   rK   rD   rR   ÚstaticmethodrX   rS   r0   r1   r4   r6   r@   rA   r   r   r   r   r.   F   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 )NÚLocationÚutf8)	Úlistrc   rQ   r   Úencoder
   r   ÚFOUNDÚresponse)r   Úlocationr   r   r   r   r   ì   s    zRedirect.__init__c                 C  s   | j S r   )r�   )r   rG   rH   r   r   r   rK   ñ   s    zRedirect.get_response)N)r   r   r   r   rK   r   r   r   r   r{   ë   s   
r{   c                   @  s   e Zd ZdS )ÚNotARegularFileErrorN©r   r   r   r   r   r   r   rƒ   õ   s   rƒ   c                   @  s   e Zd ZdS )rd   Nr„   r   r   r   r   rd   ù   s   rd   c                   @  s   e Zd ZdS )ÚIsDirectoryErrorNr„   r   r   r   r   r…   ý   s   r…   c                   @  s&   e Zd ZdZddd„Zedd„ ƒZdS )rb   )r8   r*   ri   Nc                 C  s:   || _ |d krtjn|j}|  ||¡}|j| _|j| _d S r   )	r8   ÚosÚstatÚ__getitem__Ústat_regular_fileÚst_sizer*   Úst_mtimeri   )r   r8   r:   Ústat_functionr‡   r   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¡sžt 	|j¡r�t
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: zNot a regular file: )rw   rd   ÚOSErrorÚerrnoÚENOENTZENAMETOOLONGr‡   ÚS_ISREGÚst_modeÚS_ISDIRr…   rƒ   )r8   rŒ   Ústat_resultÚer   r   r   r‰     s    
zFileEntry.stat_regular_file)N)r   r   r   r   r   rz   r‰   r   r   r   r   rb     s   
rb   )Ú
__future__r   rŽ   r†   rr   r‡   Úemail.utilsr   r   Úhttpr   Úior   Útimer   Úurllib.parser   Úwsgiref.headersr	   r
   ÚMETHOD_NOT_ALLOWEDr?   rk   r   r.   r{   Ú	Exceptionrƒ   rd   r…   rb   r   r   r   r   Ú<module>   s4   	ý
 &
