Ë
    bQêj�#  ã                  óì   — 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 d d
lmZ e
edf   Z G d„ de«      Z  G d„ d«      Z!y)é    )ÚannotationsN)Ú	parsedate)ÚUnion)Úget_route_path)ÚURLÚHeaders)ÚHTTPException)ÚFileResponseÚRedirectResponseÚResponse)ÚReceiveÚScopeÚSend)ÚWebSocketClosezos.PathLike[str]c                  ó$   ‡ — e Zd ZdZdˆ fd„Zˆ xZS )ÚNotModifiedResponse)zcache-controlzcontent-locationÚdateÚetagÚexpiresÚvaryc           	     ó–   •— t         ‰| �  d|j                  «       D ��ci c]  \  }}|| j                  v sŒ||“Œ c}}¬«       y c c}}w )Ni0  ©Ústatus_codeÚheaders)ÚsuperÚ__init__ÚitemsÚNOT_MODIFIED_HEADERS)Úselfr   ÚnameÚvalueÚ	__class__s       €úZ/home/oem/CyberBrain26-unified/.venv/lib/python3.12/site-packages/starlette/staticfiles.pyr   zNotModifiedResponse.__init__!   sD   ø€ Ü‰ÑØØ4;·M±M³O×i¡[ T¨5ÀtÈt×OhÑOhÒGh�T˜5‘[Óið 	õ 	
ùãis
   ŸA¶A)r   r   )Ú__name__Ú
__module__Ú__qualname__r   r   Ú__classcell__)r"   s   @r#   r   r      s   ø„ ðÐ÷
ñ 
ó    r   c                  óž   — e Zd Zddddddœ	 	 	 	 	 	 	 	 	 	 	 dd„Z	 	 d	 	 	 	 	 dd„Zdd„Zdd„Zdd	„Zdd
„Z	 d	 	 	 	 	 	 	 	 	 dd„Z	dd„Z
dd„Zy)ÚStaticFilesNFT)Ú	directoryÚpackagesÚhtmlÚ	check_dirÚfollow_symlinkc               óà   — || _         || _        | j                  ||«      | _        || _        d| _        || _        |r2|�/t        j                  j                  |«      st        d|› d�«      ‚y y y )NFúDirectory 'z' does not exist)r+   r,   Úget_directoriesÚall_directoriesr-   Úconfig_checkedr/   ÚosÚpathÚisdirÚRuntimeError)r   r+   r,   r-   r.   r/   s         r#   r   zStaticFiles.__init__)   su   € ð #ˆŒØ ˆŒØ#×3Ñ3°I¸xÓHˆÔØˆŒ	Ø#ˆÔØ,ˆÔÙ˜Ð.´r·w±w·}±}ÀYÔ7OÜ ¨Y¨KÐ7GÐHÓIÐIð 8PÐ.ˆ9r(   c                ó  — g }|�|j                  |«       |xs g D ]ã  }t        |t        «      r|\  }}nd}t        j                  j                  |«      }|€J d|›d�«       ‚|j                  €J d|›d�«       ‚t        j                  j                  t        j                  j                  |j                  d|«      «      }t        j                  j                  |«      sJ d|›d|›d�«       ‚|j                  |«       Œå |S )z�
        Given `directory` and `packages` arguments, return a list of all the
        directories that should be used for serving static files from.
        ÚstaticszPackage z could not be found.z..r1   z' in package )ÚappendÚ
isinstanceÚtupleÚ	importlibÚutilÚ	find_specÚoriginr5   r6   ÚnormpathÚjoinr7   )r   r+   r,   ÚdirectoriesÚpackageÚstatics_dirÚspecÚpackage_directorys           r#   r2   zStaticFiles.get_directories;   s  € ð ˆØÐ Ø×Ñ˜yÔ)à’~ 2ò 	2ˆGÜ˜'¤5Ô)Ø'.Ñ$�™à'�Ü—>‘>×+Ñ+¨GÓ4ˆDØÐ#ÐO x°¨{Ð:NÐ%OÓOÐ#Ø—;‘;Ð*ÐV¨h°w°kÐAUÐ,VÓVÐ*Ü "§¡× 0Ñ 0´·±·±¸d¿k¹kÈ4ÐQ\Ó1]Ó ^ÐÜ—7‘7—=‘=Ð!2Ô3ð Ø˜k˜_¨M¸'¸ÐDXÐYóÐ3ð ×ÑÐ0Õ1ð	2ð Ðr(   c              ƒ  óJ  K  — |d   dk(  rt        «       } ||||«      ƒ d{  –—†  y|d   dk(  sJ ‚| j                  s| j                  «       ƒ d{  –—†  d| _        | j                  |«      }| j	                  ||«      ƒ d{  –—† } ||||«      ƒ d{  –—†  y7 Œx7 ŒK7 Œ7 Œ­w)z'
        The ASGI entry point.
        ÚtypeÚ	websocketNÚhttpT)r   r4   Úcheck_configÚget_pathÚget_response)r   ÚscopeÚreceiveÚsendÚwebsocket_closer6   Úresponses          r#   Ú__call__zStaticFiles.__call__X   s°   è ø€ ð �‰=˜KÒ'Ü,Ó.ˆOÙ! %¨°$Ó7×7Ð7Øà�V‰} Ò&Ð&Ð&à×"Ò"Ø×#Ñ#Ó%×%Ð%Ø"&ˆDÔà�}‰}˜UÓ#ˆØ×*Ñ*¨4°Ó7×7ˆÙ�u˜g tÓ,×,Ñ,ð 8øð &øð 8øØ,úsE   ‚ B#¢B£.B#ÁBÁ1B#ÂBÂB#ÂB!ÂB#ÂB#ÂB#Â!B#c                ó¨   — t        |«      }t        j                  j                  t        j                  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   r5   r6   rB   rC   Úsplit)r   rP   Ú
route_paths      r#   rN   zStaticFiles.get_pathk   s;   € ô
 $ EÓ*ˆ
Ü�w‰w×Ñ¤§¡§¡¨j×.>Ñ.>¸sÓ.CÐ DÓEÐEr(   c              ƒ  óÜ  K  — |d   dvrt        dddi¬«      ‚	 t        j                  j                  | j                  |«      ƒ d{  –—† \  }}|r2t        j                  |j                  «      r| j                  |||«      S |rÿt        j                  |j                  «      rà| j                  rÔt         j"                  j%                  |d«      }t        j                  j                  | j                  |«      ƒ d{  –—† \  }}|�}t        j                  |j                  «      r^|d   j'                  d«      s7t)        |¬«      }|j+                  |j"                  dz   ¬«      }t-        |¬«      S | j                  |||«      S | j                  rdt        j                  j                  | j                  d«      ƒ d{  –—† \  }}|r-t        j                  |j                  «      rt/        ||d
¬«      S t        d
¬	«      ‚7 �Œ¹# t
        $ r t        d¬	«      ‚t        $ r0}|j                  t        j                  k(  rt        d
¬	«      ‚|‚d}~wt        $ r t        d
¬	«      ‚w xY w7 �Œj7 Œ¬­w)z`
        Returns an HTTP response, given the incoming path, method and request headers.
        Úmethod)ÚGETÚHEADi•  ÚAllowz	GET, HEADr   Ni‘  )r   i”  z
index.htmlr6   rW   ©rP   )r6   )Ú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-   r5   r6   rC   Úendswithr   Úreplacer   r
   )r   r6   rP   Ú	full_pathra   ÚexcÚ
index_pathr`   s           r#   rO   zStaticFiles.get_responses   s  è ø€ ð �‰? /Ñ1Ü¨C¸'À;Ð9OÔPÐPð	1Ü+0¯?©?×+CÑ+CÀD×DTÑDTÐVZÓ+[×%[Ñ"ˆI�{ñ œ4Ÿ<™<¨×(;Ñ(;Ô<à×%Ñ% i°¸eÓDÐDáœTŸ\™\¨+×*=Ñ*=Ô>À4Ç9Â9ô Ÿ™Ÿ™ d¨LÓ9ˆJÜ+0¯?©?×+CÑ+CÀD×DTÑDTÐV`Ó+a×%aÑ"ˆI�{ØÐ&¬4¯<©<¸×8KÑ8KÔ+LØ˜V‘}×-Ñ-¨cÔ2ä EÔ*�CØŸ+™+¨3¯8©8°c©>˜+Ó:�CÜ+°Ô4Ð4Ø×)Ñ)¨)°[À%ÓHÐHà�9Š9ä+0¯?©?×+CÑ+CÀD×DTÑDTÐV`Ó+a×%aÑ"ˆI�{ÙœtŸ|™|¨K×,?Ñ,?Ô@Ü# I¸;ÐTWÔXÐXÜ¨Ô,Ð,ðG &\úÜò 	1Ü¨CÔ0Ð0Üò 	à�y‰yœE×.Ñ.Ò.Ü#°Ô4Ð4àˆIûÜò 	1ä¨CÔ0Ð0ð	1úð &bùð &bús[   ‚I,š-H ÁH ÁH ÁB.I,Ã=I'Ã>B?I,Æ=I*Æ>AI,È H ÈI$È +IÉI$É$I,É*I,c                óV  — |j                  d«      ry| j                  D ]ò  }t        j                  j	                  ||«      }| j
                  r?t        j                  j                  |«      }t        j                  j                  |«      }n>t        j                  j                  |«      }t        j                  j                  |«      }t        j                  j                  ||g«      t        |«      k7  rŒÚ	 |t        j                  |«      fc S  y# t        t        f$ r Y �Œw xY w)N)rW   ú\)Ú N)Ú
startswithr3   r5   r6   rC   r/   ÚabspathÚrealpathÚ
commonpathÚstrrk   ÚFileNotFoundErrorÚNotADirectoryError)r   r6   r+   Újoined_pathrr   s        r#   re   zStaticFiles.lookup_path    sê   € à�?‰?˜;Ô'ØØ×-Ñ-ò 	ˆIÜŸ'™'Ÿ,™, y°$Ó7ˆKØ×"Ò"ÜŸG™GŸO™O¨KÓ8�	ÜŸG™GŸO™O¨IÓ6‘	äŸG™G×,Ñ,¨[Ó9�	ÜŸG™G×,Ñ,¨YÓ7�	Ü�w‰w×!Ñ! 9¨iÐ"8Ó9¼SÀ»^ÒKàðØ ¤"§'¡'¨)Ó"4Ð4Ò4ð	ð øô &Ô'9Ð:ò Úðús   Ã:DÄD(Ä'D(c                óœ   — t        |¬«      }t        |||¬«      }| j                  |j                  |«      rt	        |j                  «      S |S )Nr_   )r   ra   )r   r
   Úis_not_modifiedr   r   )r   rr   ra   rP   r   Úrequest_headersrT   s          r#   rn   zStaticFiles.file_responseµ   sI   € ô "¨Ô.ˆä 	°{ÐP[Ô\ˆØ×Ñ × 0Ñ 0°/ÔBÜ& x×'7Ñ'7Ó8Ð8Øˆr(   c              ƒ  ó¨  K  — | j                   €y	 t        j                  j                  t        j
                  | j                   «      ƒ d{  –—† }t        j                  |j                  «      s9t        j                  |j                  «      st        d| j                   › d�«      ‚yy7 Œ]# t        $ r t        d| j                   › d�«      ‚w xY w­w)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+   rb   rc   rd   r5   rk   r}   r8   ro   rm   ÚS_ISLNK)r   ra   s     r#   rM   zStaticFiles.check_configÃ   s¶   è ø€ ð �>‰>Ð!Øð	\Ü %§¡× 8Ñ 8¼¿¹À$Ç.Á.Ó Q×QˆKô —‘˜[×0Ñ0Ô1´T·\±\À+×BUÑBUÔ5VÜÐ!3°D·N±NÐ3CÐCXÐYÓZÐZð 6WÐ1ð RùÜ ò 	\ÜÐ!8¸¿¹Ð8HÐHYÐZÓ[Ð[ð	\üs/   ‚C‘;B, ÁB*ÁB, ÁACÂ*B, Â,#CÃCc                óN  — |j                  d«      x}rW|j                  «       dk(  ry|d   }||j                  d«      D �cg c]!  }|j                  «       j                  d«      ‘Œ# c}v S 	 t	        |d   «      }t	        |d   «      }|�|�||k\  ryy	c c}w # t
        $ r Y y	w xY w)
z�
        Given the request and response headers, return `True` if an HTTP
        "Not Modified" response could be returned instead.
        zif-none-matchÚ*Tr   ú,zW/zif-modified-sincezlast-modifiedF)ÚgetÚstriprX   Úremoveprefixr   ÚKeyError)r   Úresponse_headersr‚   Úif_none_matchr   ÚtagÚif_modified_sinceÚlast_modifieds           r#   r�   zStaticFiles.is_not_modifiedÓ   sÊ   € ð
 ,×/Ñ/°Ó@Ð@ˆ=Ð@Ø×"Ñ"Ó$¨Ò+Øà# FÑ+ˆDØÀm×FYÑFYÐZ]ÓF^Ö_¸s˜CŸI™I›K×4Ñ4°TÕ:Ò_Ð_Ð_ð	Ü )¨/Ð:MÑ*NÓ OÐÜ%Ð&6°Ñ&GÓHˆMØ Ð,°Ð1JÐO`ÐdqÒOqØð ùò `øô ò 	Øàð	ús   Á&BÁ,%B Â	B$Â#B$)r+   úPathLike | Noner,   ú"list[str | tuple[str, str]] | Noner-   Úboolr.   r“   r/   r“   ÚreturnÚNone)NN)r+   r‘   r,   r’   r”   zlist[PathLike])rP   r   rQ   r   rR   r   r”   r•   )rP   r   r”   r|   )r6   r|   rP   r   r”   r   )r6   r|   r”   z!tuple[str, os.stat_result | None])éÈ   )
rr   ÚPathLikera   zos.stat_resultrP   r   r   Úintr”   r   )r”   r•   )rŒ   r   r‚   r   r”   r“   )r$   r%   r&   r   r2   rU   rN   rO   re   rn   rM   r�   © r(   r#   r*   r*   (   sß   „ ð &*Ø7;ØØØ$ñJð #ðJð 5ð	Jð
 ðJð ðJð ðJð 
óJð( &*Ø7;ðà"ðð 5ðð 
ó	ó:-ó&Fó+-óZð4 ðàðð $ðð ð	ð
 ðð 
óó[ô r(   r*   )"Ú
__future__r   rh   Úimportlib.utilr>   r5   rk   Úemail.utilsr   Útypingr   rb   Úanyio.to_threadÚstarlette._utilsr   Ústarlette.datastructuresr   r   Ústarlette.exceptionsr	   Ústarlette.responsesr
   r   r   Ústarlette.typesr   r   r   Ústarlette.websocketsr   r|   r—   r   r*   r™   r(   r#   ú<module>r¥      s`   ðÝ "ã Û Û 	Û Ý !Ý ã Û å +ß 1Ý .ß HÑ Hß 0Ñ 0Ý /à�Ð(Ð(Ñ)€ô
˜(ô 
÷"ò r(   