o
    OÊÆh"  ã                   @   s¨   d dl Zd dlZd dlZd dlZd dlmZ d dlZd dlm	Z	m
Z
 d dlmZ d dlmZmZmZ d dlmZmZmZ ejedf ZG dd	„ d	eƒZG d
d„ dƒZdS )é    N)Ú	parsedate)ÚURLÚHeaders)ÚHTTPException)ÚFileResponseÚRedirectResponseÚResponse)ÚReceiveÚScopeÚSendzos.PathLike[str]c                       s&   e Zd ZdZdef‡ fdd„Z‡  ZS )ÚNotModifiedResponse)zcache-controlzcontent-locationÚdateÚetagÚexpiresÚvaryÚheadersc                    s&   t ƒ jd‡ fdd„| ¡ D ƒd� d S )Ni0  c                    s    i | ]\}}|ˆ j v r||“qS © )ÚNOT_MODIFIED_HEADERS)Ú.0ÚnameÚvalue©Úselfr   úb/var/www/html/HyperOracle/crypto_trader/venv/lib/python3.10/site-packages/starlette/staticfiles.pyÚ
<dictcomp>   s
    
þz0NotModifiedResponse.__init__.<locals>.<dictcomp>)Ústatus_coder   )ÚsuperÚ__init__Úitems)r   r   ©Ú	__class__r   r   r      s   
þ
þzNotModifiedResponse.__init__)Ú__name__Ú
__module__Ú__qualname__r   r   r   Ú__classcell__r   r   r   r   r      s    	r   c                   @   sT  e Zd Zddddddœdeje dejejejeej	eef f   de
de
d	e
d
dfdd„Z		d'deje dejejejeej	eef f   d
eje fdd„Zdededed
dfdd„Zded
efdd„Zdeded
efdd„Zded
ej	eejej f fdd„Z	d(dedejdeded
ef
dd „Zd)d!d"„Zd#ed$ed
e
fd%d&„ZdS )*ÚStaticFilesNFT)Ú	directoryÚpackagesÚhtmlÚ	check_dirÚfollow_symlinkr&   r'   r(   r)   r*   Úreturnc                C   s`   || _ || _|  ||¡| _|| _d| _|| _|r*|d ur,tj 	|¡s.t
d|› d�ƒ‚d S d S d S )NFúDirectory 'z' does not exist)r&   r'   Úget_directoriesÚall_directoriesr(   Úconfig_checkedr*   ÚosÚpathÚisdirÚRuntimeError)r   r&   r'   r(   r)   r*   r   r   r   r   '   s   ÿzStaticFiles.__init__c                 C   sÄ   g }|dur|  |¡ |pg D ]P}t|tƒr|\}}nd}tj |¡}|dus/J d|›d�ƒ‚|jdus<J d|›d�ƒ‚tj 	tj 
|jd|¡¡}tj |¡sZJ d|›d|›d�ƒ‚|  |¡ q|S )z�
        Given `directory` and `packages` arguments, return a list of all the
        directories that should be used for serving static files from.
        NÚstaticszPackage z could not be found.z..r,   z' in package )ÚappendÚ
isinstanceÚtupleÚ	importlibÚutilÚ	find_specÚoriginr0   r1   ÚnormpathÚjoinr2   )r   r&   r'   ÚdirectoriesÚpackageÚstatics_dirÚspecÚpackage_directoryr   r   r   r-   ;   s(   


ÿÿþzStaticFiles.get_directoriesÚscopeÚreceiveÚsendc                 Ã   s^   �|d dks	J ‚| j s|  ¡ I dH  d| _ |  |¡}|  ||¡I dH }||||ƒI dH  dS )z'
        The ASGI entry point.
        ÚtypeÚhttpNT)r/   Úcheck_configÚget_pathÚget_response)r   rC   rD   rE   r1   Úresponser   r   r   Ú__call__\   s   €
zStaticFiles.__call__c                 C   s   t j t jj|d  d¡Ž ¡S )z�
        Given the ASGI scope, return the `path` string to serve up,
        with OS specific path separators, and any '..', '.' components removed.
        r1   ú/)r0   r1   r<   r=   Úsplit)r   rC   r   r   r   rI   j   s   zStaticFiles.get_pathr1   c                 Ã   s^  �|d dvrt dd�‚ztj | j|¡I dH \}}W n ty'   t dd�‚ ty.   ‚ w |r>t |j	¡r>|  
|||¡S |rˆt |j	¡rˆ| jrˆtj |d¡}tj | j|¡I dH \}}|durˆt |j	¡rˆ|d  d	¡s�t|d
�}|j|jd	 d�}t|d�S |  
|||¡S | jrªtj | jd¡I dH \}}|rªt |j	¡rªt|||d dd�S t dd�‚)z`
        Returns an HTTP response, given the incoming path, method and request headers.
        Úmethod)ÚGETÚHEADi•  )r   Ni‘  z
index.htmlr1   rM   ©rC   )r1   )Úurlz404.htmli”  )Ústat_resultrO   r   )r   ÚanyioÚ	to_threadÚrun_syncÚlookup_pathÚPermissionErrorÚOSErrorÚstatÚS_ISREGÚst_modeÚfile_responseÚS_ISDIRr(   r0   r1   r=   Úendswithr   Úreplacer   r   )r   r1   rC   Ú	full_pathrT   Ú
index_pathrS   r   r   r   rJ   q   sJ   €
ÿ
ÿÿ

ÿü
zStaticFiles.get_responsec              
   C   sŠ   | j D ]?}tj ||¡}| jrtj |¡}ntj |¡}tj |¡}tj ||g¡|kr-qz
|t |¡fW   S  t	t
fyB   Y qw dS )N)Ú N)r.   r0   r1   r=   r*   ÚabspathÚrealpathÚ
commonpathr[   ÚFileNotFoundErrorÚNotADirectoryError)r   r1   r&   Újoined_pathrb   r   r   r   rX   ¢   s   
ÿzStaticFiles.lookup_pathéÈ   rb   rT   r   c                 C   s>   |d }t |d�}t||||d�}|  |j|¡rt|jƒS |S )NrO   rR   )r   rT   rO   )r   r   Úis_not_modifiedr   r   )r   rb   rT   rC   r   rO   Úrequest_headersrK   r   r   r   r^   ¶   s   
ÿ
zStaticFiles.file_responsec                 Ã   s€   �| j du rdS ztj tj| j ¡I dH }W n ty&   td| j › d�ƒ‚w t |j	¡s<t 
|j	¡s>td| j › d�ƒ‚dS dS )zÇ
        Perform a one-off configuration check that StaticFiles is actually
        pointed at a directory, so that we can raise loud errors rather than
        just returning 404 responses.
        NzStaticFiles directory 'z' does not exist.zStaticFiles path 'z' is not a directory.)r&   rU   rV   rW   r0   r[   rh   r3   r_   r]   ÚS_ISLNK)r   rT   r   r   r   rH   Ç   s   €
ÿÿÿÿzStaticFiles.check_configÚresponse_headersrm   c                 C   s”   z|d }|d }||krW dS W n	 t y   Y nw z$t|d ƒ}t|d ƒ}|dur7|dur:||kr=W dS W dS W dS W dS  t yI   Y dS w )z�
        Given the request and response headers, return `True` if an HTTP
        "Not Modified" response could be returned instead.
        zif-none-matchr   Tzif-modified-sincezlast-modifiedNF)ÚKeyErrorr   )r   ro   rm   Úif_none_matchr   Úif_modified_sinceÚlast_modifiedr   r   r   rl   Û   s4   ÿÿüùúýýzStaticFiles.is_not_modified)NN)rk   )r+   N)r!   r"   r#   ÚtypingÚOptionalÚPathLikeÚListÚUnionÚstrÚTupleÚboolr   r-   r
   r	   r   rL   rI   r   rJ   r0   rT   rX   Úintr^   rH   r   rl   r   r   r   r   r%   &   sx    ÷ýÿüùø	÷

öûþÿý
ú!1ÿ
þûþýüû
ú
ÿÿþr%   )Úimportlib.utilr8   r0   r[   rt   Úemail.utilsr   rU   Ústarlette.datastructuresr   r   Ústarlette.exceptionsr   Ústarlette.responsesr   r   r   Ústarlette.typesr	   r
   r   rx   ry   rv   r   r%   r   r   r   r   Ú<module>   s    