Ë
    úmxiº  ã                  ó¾   — d dl mZ d dlmZmZ d dlmZ d dlZd dl	m
Z
 d dlmZmZ d dlmZmZ d dlmZmZ  e
e«      Z G d	„ d
ej,                  j.                  «      Zy)é    )Úannotations)ÚAnyÚcast)ÚquoteN)Ú
get_logger)ÚMediaFileKindÚMediaFileStorageError)ÚMemoryMediaFileStorageÚget_extension_for_mimetype)Úallow_all_cross_origin_requestsÚis_allowed_originc                  ó”   — e Zd ZU ded<   edd„«       Zdd„Zdd„Z	 	 	 	 	 	 dd„Zdd„Z	dd„Z
edd	„«       Ze	 d	 	 	 	 	 	 	 dd„«       Zy
)ÚMediaFileHandlerr
   Ú_storagec                ó   — || _         y)z{Set the MemoryMediaFileStorage object used by instances of this
        handler. Must be called on server startup.
        N)r   )ÚclsÚstorages     ú^/home/htdocs/ttos/venv/lib/python3.12/site-packages/streamlit/web/server/media_file_handler.pyÚinitialize_storagez#MediaFileHandler.initialize_storage$   s   € ð ˆ�ó    c                óØ   — t        «       r| j                  dd«       y t        | j                  j                  j                  d«      x}«      r| j                  dt        d|«      «       y y )NzAccess-Control-Allow-OriginÚ*ÚOriginÚstr)r   Ú
set_headerr   ÚrequestÚheadersÚgetr   )ÚselfÚorigins     r   Úset_default_headersz$MediaFileHandler.set_default_headers.   sU   € Ü*Ô,Ø�O‰OÐ9¸3Õ?Ü¨¯©×)=Ñ)=×)AÑ)AÀ(Ó)KÐK˜vÔLØ�O‰OÐ9¼4ÀÀvÓ;NÕOð Mr   c                ó\  — | j                   j                  |«      }|rr|j                  t        j                  k(  rT|j
                  }|sdt        |j                  «      › �}	 |j                  d«       d|› d�}| j                  dd|› �«       yyy# t        $ r dt        |«      › �}Y Œ1w xY w)	a  Add Content-Disposition header for downloadable files.

        Set header value to "attachment" indicating that file should be saved
        locally instead of displaying inline in browser.

        We also set filename to specify the filename for downloaded files.
        Used for serving downloadable files, like files stored via the
        `st.download_button` widget.
        Ústreamlit_downloadÚlatin1z
filename="ú"zfilename*=utf-8''zContent-Dispositionzattachment; N)r   Úget_fileÚkindr   ÚDOWNLOADABLEÚfilenamer   ÚmimetypeÚencodeÚUnicodeEncodeErrorr   r   )r   ÚpathÚ
media_filer)   Ú	file_exprs        r   Úset_extra_headersz"MediaFileHandler.set_extra_headers4   s»   € ð —]‘]×+Ñ+¨DÓ1ˆ
á˜*Ÿ/™/¬]×-GÑ-GÒGØ!×*Ñ*ˆHáØ/Ô0JÈ:×K^ÑK^Ó0_Ð/`Ða�ðBð —‘ Ô)Ø(¨¨
°!Ð4�	ð �O‰OÐ1°\À)ÀÐ3MÕNð! Hˆ:øô &ò Bð 0´°h³Ð/@ÐA’	ðBús   Á"B ÂB+Â*B+c                óÄ   — 	 | j                   j                  |«       |S # t        $ r7 t        j	                  d|«       t
        j                  j                  dd«      ‚w xY w)Nú!MediaFileHandler: Missing file %si”  z	not found)r   r&   r	   Ú_LOGGERÚ	exceptionÚtornadoÚwebÚ	HTTPError)r   ÚrootÚabsolute_paths      r   Úvalidate_absolute_pathz'MediaFileHandler.validate_absolute_pathY   sZ   € ð
	:Ø�M‰M×"Ñ" =Ô1ð
 Ðøô	 %ò 	:Ü×ÑÐAÀ=ÔQÜ—+‘+×'Ñ'¨¨[Ó9Ð9ð	:ús
   ‚ ŸA Ac                ón   — | j                   }|€y| j                  j                  |«      }|j                  S )Nr   )r9   r   r&   Úcontent_size)r   Úabspathr.   s      r   Úget_content_sizez!MediaFileHandler.get_content_sizef   s5   € Ø×$Ñ$ˆØˆ?Øà—]‘]×+Ñ+¨GÓ4ˆ
Ø×&Ñ&Ð&r   c                 ó   — y ©N© )r   s    r   Úget_modified_timez"MediaFileHandler.get_modified_timen   s   € ð r   c                ó   — |S r@   rA   )r   r8   r-   s      r   Úget_absolute_pathz"MediaFileHandler.get_absolute_paths   s	   € ð ˆr   Nc                óf  — t         j                  d|«       	 | j                  j                  |«      }t         j                  d|j                  |«       |€|€|j                  S |€d}|€t        |j                  «      }|j                  || S # t        $ r t         j                  d|«       Y y w xY w)NzMediaFileHandler: GET %sr2   z$MediaFileHandler: Sending %s file %sr   )	r3   Údebugr   r&   Ú	Exceptionr4   r*   ÚcontentÚlen)r   r=   ÚstartÚendr.   s        r   Úget_contentzMediaFileHandler.get_contenty   s·   € ô 	�‰Ð0°'Ô:ð	àŸ™×.Ñ.¨wÓ7ˆJô
 	�‰Ø2°J×4GÑ4GÈô	
ð
 ˆ=˜S˜[Ø×%Ñ%Ð%àˆ=ØˆEØˆ;Ü�j×(Ñ(Ó)ˆCð ×!Ñ! %¨Ð,Ð,øô% ò 	Ü×ÑÐAÀ7ÔKÙð	ús   ˜B ÂB0Â/B0)r   r
   ÚreturnÚNone)rM   rN   )r-   r   rM   rN   )r8   r   r9   r   rM   r   )rM   Úint)r8   r   r-   r   rM   r   )NN)r=   r   rJ   ú
int | NonerK   rP   rM   r   )Ú__name__Ú
__module__Ú__qualname__Ú__annotations__Úclassmethodr   r!   r0   r:   r>   rB   rD   rL   rA   r   r   r   r   !   s�   … Ø$Ó$àòó ðóPóOðJàðð ðð 
ó	ó'óð
 òó ðð
 àGKð-Øð-Ø",ð-Ø:Dð-à	ò-ó ñ-r   r   )Ú
__future__r   Útypingr   r   Úurllib.parser   Útornado.webr5   Ústreamlit.loggerr   Ú$streamlit.runtime.media_file_storager   r	   Ú+streamlit.runtime.memory_media_file_storager
   r   Ústreamlit.web.serverr   r   rQ   r3   r6   ÚStaticFileHandlerr   rA   r   r   ú<module>r_      sF   ðõ #ç Ý ã å 'ß U÷÷ Tá
�XÓ
€ôs-�w—{‘{×4Ñ4õ s-r   