o
    h\C                     @  s  U d dl mZ d dl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
mZmZ d dl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mZmZmZ d dlmZ d dlmZ d d	lmZ d d
l m!Z!m"Z"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/ d dl0m1Z1 d dl2m3Z3 d dl4m5Z5 d dl6m7Z7m8Z8m9Z9m:Z:m;Z;m<Z< d dl=m>Z>m?Z?m@Z@mAZA d dlBmCZC d dlDmEZE e
rd dlFmGZG d dlHmIZI eeJZKdeLd< ddddd ZMd!ZNdeLd"< d#ZOdeLd$< d%ZPdeLd&< d'ZQdeLd(< d)ZRdeLd*< d+ZSdeLd,< d-ZTdeLd.< d/ZUdeLd0< d1eU d2ZVdeLd3< d4ZWdeLd5< d6ZXdeLd7< d8ZYdeLd9< d:ZZdeLd;< d<Z[deLd=< G d>d? d?e\Z]d[dBdCZ^d[dDdEZ_d\dIdJZ`d]dOdPZad^dSdTZbd^dUdVZcG dWdX dXZdd_dYdZZedS )`    )annotationsN)Path)TYPE_CHECKINGAnyFinal)
HTTPServer)cli_utilconfig	file_utilutil)is_authlib_installed)ConfigOption)
get_logger)RuntimeRuntimeConfigRuntimeState)MemoryMediaFileStorage)MemorySessionStorage)MemoryUploadedFileManager)get_max_message_size_bytes)$create_default_cache_storage_manager)AppStaticFileHandler)BrowserWebSocketHandler)ComponentRequestHandler)MediaFileHandler)AddSlashHandlerHealthHandlerHostConfigHandlerMessageCacheHandlerRemoveSlashHandlerStaticFileHandler)DEVELOPMENT_PORTget_cookie_secretis_xsrf_enabledmake_url_path_regex)StatsRequestHandler)UploadFileRequestHandler)	Awaitable)
SSLContextr   _LOGGERT      _streamlit_xsrf)compress_responsewebsocket_ping_intervalwebsocket_ping_timeoutxsrf_cookie_named   MAX_PORT_SEARCH_RETRIESzunix://UNIX_SOCKET_PREFIXz/mediaMEDIA_ENDPOINTz/_stcore/upload_fileUPLOAD_FILE_ENDPOINTz_stcore/streamSTREAM_ENDPOINTz(?:st-metrics|_stcore/metrics)METRIC_ENDPOINTz_stcore/messageMESSAGE_ENDPOINTz_stcore/healthNEW_HEALTH_ENDPOINTz(?:healthz|)HEALTH_ENDPOINTz_stcore/host-configHOST_CONFIG_ENDPOINTz3(?:script-health-check|_stcore/script-health-check)SCRIPT_HEALTH_CHECK_ENDPOINTz/oauth2callbackOAUTH2_CALLBACK_ENDPOINTz/auth/loginAUTH_LOGIN_ENDPOINTz/auth/logoutAUTH_LOGOUT_ENDPOINTc                   @  s   e Zd ZdS )RetriesExceededN)__name__
__module____qualname__ rE   rE   O/var/www/vscode/kcb/lib/python3.10/site-packages/streamlit/web/server/server.pyrA   o   s    rA   returnboolc                   C  s
   t dS )Nserver.port)r	   is_manually_setrE   rE   rE   rF   server_port_is_manually_sets      
rK   c                  C  s   t d} | d uo| tS Nserver.address)r	   
get_option
startswithr3   )addressrE   rE   rF   server_address_is_unix_socketw   s   
rR   apptornado.web.ApplicationNonec                 C  sX   t d}t d}t||}t| t dd d |d}t r&t| dS t| dS )zMakes the server start listening at the configured port.

    In case the port is already taken it tries listening to the next available
    port.  It will error after MAX_PORT_SEARCH_RETRIES attempts.

    zserver.sslCertFilezserver.sslKeyFilezserver.maxUploadSizei   )max_buffer_sizessl_optionsN)r	   rO   _get_ssl_optionsr   rR   start_listening_unix_socketstart_listening_tcp_socket)rS   	cert_filekey_filerW   http_serverrE   rE   rF   start_listening|   s   


r^   r[   
str | Noner\   SSLContext | Nonec                 C  s   t | t |krtd td | rd|rdt|  s'td|  td t| s8td| td dd l}||j	j
}z	|| | W |S  |jyc   td| | td Y |S w d S )NzzOptions 'server.sslCertFile' and 'server.sslKeyFile' must be set together. Set missing options or delete existing options.r*   zCert file '%s' does not exist.zKey file '%s' does not exist.r   zWFailed to load SSL certificate. Make sure cert file '%s' and key file '%s' are correct.)rH   r)   errorsysexitr   existssslcreate_default_contextPurposeCLIENT_AUTHload_cert_chainSSLError)r[   r\   re   ssl_ctxrE   rE   rF   rX      s6   




rX   r]   r   c                 C  s<   t d}tj|ttd  }tj	|}| 
| d S rM   )r	   rO   ospath
expanduserlenr3   tornadonetutilbind_unix_socket
add_socket)r]   rQ   	file_nameunix_socketrE   rE   rF   rY      s   
rY   c              
   C  s  d}d }|t k rrtd}td}t|tkrtdt z| || W nK tym } z;|j	t	j
krbt rCtd| td n td| |d7 }|tkrU|d7 }td|tj |d7 }n W Y d }~nd }~ww |t k s|t krtd| d	t  d
d S )Nr   rN   rI   zyPort %s is reserved for internal development. It is strongly recommended to select an alternative port for `server.port`.zPort %s is already in user*   z3Port %s already in use, trying to use the next one.z$Cannot start Streamlit server. Port zG is already in use, and Streamlit was unable to find a free port after z
 attempts.)r2   r	   rO   intr!   r)   warninglistenOSErrorerrno
EADDRINUSErK   ra   rb   rc   debug
set_optionr   STREAMLIT_DEFINITIONrA   )r]   
call_countportrQ   erE   rE   rF   rZ      sN   


%rZ   c                   @  s   e Zd ZdddZedd	d
Zd ddZed ddZdddZ	ed!ddZ
d"ddZed#ddZed#ddZdddZdS )$Servermain_script_pathstris_hellorH   c                 C  sj   t   |   || _tt}t| tt}t	t
|d||t |ttddd| _| jj| dS )z+Create the server. It won't be started yet.Nzserver.disconnectedSessionTTL)ttl_seconds)script_pathcommand_linemedia_file_storageuploaded_file_managercache_storage_managerr   session_storage)_set_tornado_log_levelsinitialize_mimetypes_main_script_pathr   r4   r   initialize_storager   r5   r   r   r   r   r	   rO   _runtime	stats_mgrregister_provider)selfr   r   r   uploaded_file_mgrrE   rE   rF   __init__   s(   
zServer.__init__rG   rU   c                 C  s4   t dd t dd t dd t dd d	S )
zJEnsures that common mime-types are robust against system misconfiguration.z	text/htmlz.htmlzapplication/javascriptz.jsztext/cssz.cssz
image/webpz.webpN)	mimetypesadd_type)clsrE   rE   rF   r     s   zServer.initialize_mimetypesc                 C  s
   t | S N)r   repr_r   rE   rE   rF   __repr__  rL   zServer.__repr__c                 C  s   | j S r   )r   r   rE   rE   rF   r     s   zServer.main_script_pathc                   sF   t d |  }t| td}t d| | j I dH  dS )zaStart the server.

        When this returns, Streamlit is ready to accept new sessions.
        zStarting server...rI   zServer started on port %sN)r)   r|   _create_appr^   r	   rO   r   start)r   rS   r   rE   rE   rF   r     s   

zServer.startAwaitable[None]c                 C  s   | j jS )z>A Future that completes when the Server's run loop has exited.)r   stoppedr   rE   rE   rF   r   /  s   zServer.stoppedrT   c                   s  t d}t|ttd jift|ttd fddift|tt	d jj
ift|ttd jjift|ttft|t dt jj jjd	ft|t d
tddift|dtd jjifg}t dry|t|ttd fddifg t dr|t|dtdt jifg t rddlm }m!}m"} |t|t#|d|ift|t$|d|ift|t%|d|ifg t drt&'d n-t( }t&'d| |t|dddt)ft|dt*d| dt+tgdft|d dt,fg t-j.j/|ft0 t1 t2 d!t3S )"zCreate our tornado web app.zserver.baseUrlPathruntimecallbackc                     s    j jS r   )r   is_ready_for_browser_connectionrE   r   rE   rF   <lambda>A  s    z$Server._create_app.<locals>.<lambda>cachestats_managerz)/(?P<session_id>[^/]+)/(?P<file_id>[^/]+))file_mgris_active_sessionz/(.*)rm    zcomponent/(.*)registryzserver.scriptHealthCheckEnabledc                     s
    j  S r   )r   does_script_run_without_errorrE   r   rE   rF   r   o  s   
 zserver.enableStaticServingzapp/static/(.*)r   )AuthCallbackHandlerAuthLoginHandlerAuthLogoutHandlerbase_urlglobal.developmentModez/Serving static content from the Node dev serverzServing static content from %sz	(?!/)(.*)required)trailing_slashz(.*)z%s/z
index.html)rm   default_filenamereserved_paths
prohibited)cookie_secretxsrf_cookieswebsocket_max_message_size)4r	   rO   r$   r6   r   r   r;   r   r8   r   message_cacher7   r%   r   r<   r   r5   r&   r   r   r4   r   r   component_registryextendr=   r   r
   get_app_static_dirr   r   )streamlit.web.server.oauth_authlib_routesr   r   r   r>   r?   r@   r)   r|   get_static_dirr   r    r9   r   rp   webApplicationr"   r#   r   TORNADO_SETTINGS)r   baseroutesr   r   r   static_pathrE   r   rF   r   4  s   




0




 zServer._create_appc                 C  s   | j jtjkS r   )r   stater   ONE_OR_MORE_SESSIONS_CONNECTEDr   rE   rE   rF   browser_is_connected  s   zServer.browser_is_connectedc                 C  s   ddl m} | j|jkS )Nr   )streamlit_app)streamlit.hellor   r   __file__)r   r   rE   rE   rF   is_running_hello  s   zServer.is_running_helloc                 C  s   t jddd | j  d S )Nz  Stopping...blue)fg)r   print_to_clir   stopr   rE   rE   rF   r     s   zServer.stopN)r   r   r   rH   rG   rU   )rG   r   )rG   r   )rG   rT   rG   rH   )rB   rC   rD   r   classmethodr   r   propertyr   r   r   r   r   r   r   rE   rE   rE   rF   r      s"    



 r   c                   C  sH   t ds"tdtj tdtj tdtj d S d S )Nr   ztornado.accessztornado.applicationztornado.general)r	   rO   logging	getLoggersetLevelERRORrE   rE   rE   rF   r     s
   
r   r   )rS   rT   rG   rU   )r[   r_   r\   r_   rG   r`   )r]   r   rG   rU   r   )f
__future__r   rz   r   r   rl   rb   pathlibr   typingr   r   r   tornado.concurrentrp   tornado.lockstornado.netutiltornado.webtornado.websockettornado.httpserverr   	streamlitr   r	   r
   r   streamlit.auth_utilr   streamlit.config_optionr   streamlit.loggerr   streamlit.runtimer   r   r   +streamlit.runtime.memory_media_file_storager   (streamlit.runtime.memory_session_storager   .streamlit.runtime.memory_uploaded_file_managerr   streamlit.runtime.runtime_utilr   *streamlit.web.cache_storage_manager_configr   ,streamlit.web.server.app_static_file_handlerr   .streamlit.web.server.browser_websocket_handlerr   .streamlit.web.server.component_request_handlerr   'streamlit.web.server.media_file_handlerr   streamlit.web.server.routesr   r   r   r   r   r     streamlit.web.server.server_utilr!   r"   r#   r$   *streamlit.web.server.stats_request_handlerr%   0streamlit.web.server.upload_file_request_handlerr&   collections.abcr'   re   r(   rB   r)   __annotations__r   r2   r3   r4   r5   r6   r7   r8   r9   r;   r<   r=   r>   r?   r@   	ExceptionrA   rK   rR   r^   rX   rY   rZ   r   r   rE   rE   rE   rF   <module>   s    





'
0 h