o
    é’OjR"  ã                   @  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Zd dlZd dlm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
ed
f ZG dd„ deƒZG dd„ dƒZdS )é    )ÚannotationsN)Ú	parsedate)ÚUnion)Úget_route_path)ÚURLÚHeaders)ÚHTTPException)ÚFileResponseÚRedirectResponseÚResponse)ÚReceiveÚScopeÚSendzos.PathLike[str]c                      s"   e Zd ZdZd‡ fdd„Z‡  ZS )ÚNotModifiedResponse)zcache-controlzcontent-locationÚdateÚetagÚexpiresÚvaryÚheadersr   c                   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   ú[/var/www/html/pharmsmart-cdr-gen/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__)r   r   )Ú__name__Ú
__module__Ú__qualname__r   r    Ú__classcell__r   r   r"   r   r      s    	r   c                   @  s~   e Zd Zddddddœd6dd„Z		d7d8dd„Zd9dd„Zd:dd„Zd;d!d"„Zd<d$d%„Z	&d=d>d-d.„Z	d?d/d0„Z
d@d4d5„ZdS )AÚStaticFilesNFT)Ú	directoryÚpackagesÚhtmlÚ	check_dirÚfollow_symlinkr)   úPathLike | Noner*   ú"list[str | tuple[str, str]] | Noner+   Úboolr,   r-   ÚreturnÚNonec                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__úlist[PathLike]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..r3   z' in package )ÚappendÚ
isinstanceÚtupleÚ	importlibÚutilÚ	find_specÚoriginr7   r8   ÚnormpathÚjoinr9   )r   r)   r*   ÚdirectoriesÚpackageÚstatics_dirÚspecÚpackage_directoryr   r   r   r4   :   s    	


ÿzStaticFiles.get_directoriesÚscoper   Úreceiver   Úsendr   c                 Ã  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)r6   Úcheck_configÚget_pathÚget_response)r   rK   rL   rM   r8   Úresponser   r   r   Ú__call__W   s   €
zStaticFiles.__call__Ústrc                 C  s"   t |ƒ}tj tjj| d¡Ž ¡S )z�
        Given the ASGI scope, return the `path` string to serve up,
        with OS specific path separators, and any '..', '.' components removed.
        ú/)r   r7   r8   rD   rE   Úsplit)r   rK   Ú
route_pathr   r   r   rQ   e   s   zStaticFiles.get_pathr8   r   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? } z|jtjkr9t dd�‚|‚d}~w t	yJ   t dd�‚w |rZt
 |j¡rZ|  |||¡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�S t dd�‚)z`
        Returns an HTTP response, given the incoming path, method and request headers.
        Úmethod)ÚGETÚHEADi•  )r   Ni‘  i”  z
index.htmlr8   rV   ©rK   )r8   )Úurlz404.html)Ústat_resultr   )r   ÚanyioÚ	to_threadÚrun_syncÚlookup_pathÚPermissionErrorÚOSErrorÚerrnoÚENAMETOOLONGÚ
ValueErrorÚstatÚS_ISREGÚst_modeÚfile_responseÚS_ISDIRr+   r7   r8   rE   Úendswithr   Úreplacer
   r	   )r   r8   rK   Ú	full_pathr^   ÚexcÚ
index_pathr]   r   r   r   rR   m   s>   €


€
þ


zStaticFiles.get_responseú!tuple[str, os.stat_result | None]c              
   C  s¨   |  d¡rdS | jD ]G}tj ||¡}| jr#tj |¡}tj |¡}ntj |¡}tj |¡}tj ||g¡t	|ƒkr<q
z
|t 
|¡fW   S  ttfyQ   Y q
w dS )N)rV   ú\)Ú N)Ú
startswithr5   r7   r8   rE   r-   ÚabspathÚrealpathÚ
commonpathrU   rh   ÚFileNotFoundErrorÚNotADirectoryError)r   r8   r)   Újoined_pathro   r   r   r   rb   š   s"   

ÿzStaticFiles.lookup_pathéÈ   ro   ÚPathLiker^   úos.stat_resultr   Úintc                 C  s4   t |d�}t|||d�}|  |j|¡rt|jƒS |S )Nr\   )r   r^   )r   r	   Úis_not_modifiedr   r   )r   ro   r^   rK   r   Úrequest_headersrS   r   r   r   rk   ¯   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)   r_   r`   ra   r7   rh   ry   r:   rl   rj   ÚS_ISLNK)r   r^   r   r   r   rP   ½   s   €
ÿÿzStaticFiles.check_configÚresponse_headersr   r�   c                 C  sŒ   |  d¡ }r|d }|dd„ | d¡D ƒv S z$t|d ƒ}t|d ƒ}|dur3|dur6||kr9W d	S W d
S W d
S W d
S  tyE   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   c                 S  s   g | ]	}|  ¡  d ¡‘qS )zW/)ÚstripÚremoveprefix)r   Útagr   r   r   Ú
<listcomp>Õ   s    z/StaticFiles.is_not_modified.<locals>.<listcomp>ú,zif-modified-sincezlast-modifiedNTF)ÚgetrW   r   ÚKeyError)r   rƒ   r�   Úif_none_matchr   Úif_modified_sinceÚlast_modifiedr   r   r   r€   Í   s$   ÿûûýýzStaticFiles.is_not_modified)r)   r.   r*   r/   r+   r0   r,   r0   r-   r0   r1   r2   )NN)r)   r.   r*   r/   r1   r;   )rK   r   rL   r   rM   r   r1   r2   )rK   r   r1   rU   )r8   rU   rK   r   r1   r   )r8   rU   r1   rr   )r|   )
ro   r}   r^   r~   rK   r   r   r   r1   r   )r1   r2   )rƒ   r   r�   r   r1   r0   )r$   r%   r&   r    r4   rT   rQ   rR   rb   rk   rP   r€   r   r   r   r   r(   '   s$    ùý



-û
r(   ) Ú
__future__r   re   Úimportlib.utilr@   r7   rh   Úemail.utilsr   Útypingr   r_   Úanyio.to_threadÚstarlette._utilsr   Ústarlette.datastructuresr   r   Ústarlette.exceptionsr   Ústarlette.responsesr	   r
   r   Ústarlette.typesr   r   r   rU   r}   r   r(   r   r   r   r   Ú<module>   s"    