
    &eP9                        U d dl 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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Zd dlm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l0m1Z1 d dl2m3Z3 d dl4m5Z5 d dl6m7Z7 d dl8m9Z9m:Z:m;Z;m<Z<m=Z= d dl>m?Z? d dl@mAZA d dlBmCZC  e#eD          ZEdddddZFdZGdZHdZIeeJd<   d ZKeeJd!<   d"ZLeeJd#<   d$ZMeeJd%<   d&ZNeeJd'<   d(ZOeeJd)<   d*ZPeeJd+<   d,ZQeeJd-<    G d. d/eR          ZSd0eTfd1ZUd0eTfd2ZVd3ejW        jX        d0dfd4ZYd5eeZ         d6eeZ         d0eej[        df         fd7Z\d8ed0dfd9Z]d8ed0dfd:Z^ G d; d<          Z_d>d=Z`dS )?    N)Path)Any	AwaitableListOptionalUnion)
HTTPServer)Final)config	file_utilsource_utilutil)ComponentRegistry)ConfigOption)
get_logger)RuntimeRuntimeConfigRuntimeState)MemoryMediaFileStorage)MemoryUploadedFileManager)get_max_message_size_bytes)$create_default_cache_storage_manager)AppStaticFileHandler)BrowserWebSocketHandler)ComponentRequestHandler)MediaFileHandler)AddSlashHandlerHealthHandlerHostConfigHandlerMessageCacheHandlerStaticFileHandler)make_url_path_regex)StatsRequestHandler)UploadFileRequestHandlerT      _streamlit_xsrf)compress_responsewebsocket_ping_intervalwebsocket_ping_timeoutxsrf_cookie_named   zunix://z/mediaMEDIA_ENDPOINTz/_stcore/upload_fileUPLOAD_FILE_ENDPOINTz_stcore/streamSTREAM_ENDPOINTz(?:st-metrics|_stcore/metrics)METRIC_ENDPOINTz_stcore/messageMESSAGE_ENDPOINTz(?:healthz|_stcore/health)HEALTH_ENDPOINTz_stcore/host-configHOST_CONFIG_ENDPOINTz3(?:script-health-check|_stcore/script-health-check)SCRIPT_HEALTH_CHECK_ENDPOINTc                       e Zd ZdS )RetriesExceededN)__name__
__module____qualname__     ;lib/python3.11/site-packages/streamlit/web/server/server.pyr6   r6   `   s        Dr;   r6   returnc                  *    t          j        d          S )Nserver.port)r   is_manually_setr:   r;   r<   server_port_is_manually_setrA   d   s    !-000r;   c                  f    t          j        d          } | d uo|                     t                    S Nserver.address)r   
get_option
startswithUNIX_SOCKET_PREFIX)addresss    r<   server_address_is_unix_socketrI   h   s2     011G$I7#5#56H#I#IIr;   appc                 &   t          j        d          }t          j        d          }t          ||          }t          | t          j        d          dz  dz  |          }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   rE   _get_ssl_optionsr	   rI   start_listening_unix_socketstart_listening_tcp_socket)rJ   	cert_filekey_filerM   http_servers        r<   start_listeningrT   m   s     !"677I !455H"9h77K)*@AADH4O  K %&& 0#K00000";/////r;   rQ   rR   c                    t          |           t          |          k    r.t                              d           t          j        d           | r%|r"t          |                                           s/t                              d|            t          j        d           t          |                                          s/t                              d|           t          j        d           t          j        t          j	        j
                  }	 |                    | |           nE# t          j        $ r3 t                              d| |           t          j        d           Y nw xY w|S 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.zWFailed to load SSL certificate. Make sure cert file '%s' and key file '%s' are correct.)boolLOGGERerrorsysexitr   existssslcreate_default_contextPurposeCLIENT_AUTHload_cert_chainSSLError)rQ   rR   ssl_ctxs      r<   rN   rN      s`    I$x..((O	
 	
 	
 	 X  I%%'' 	LL99EEEHQKKKH~~$$&& 	LL8(CCCHQKKK,S[-DEE		##Ix8888| 	 	 	LL@	   HQKKKKK	 4s   D0 0?E21E2rS   c                    t          j        d          }t          j                            |t          t                    d                    }t          j        	                    |          }| 
                    |           d S rC   )r   rE   ospath
expanduserlenrG   tornadonetutilbind_unix_socket
add_socket)rS   rH   	file_nameunix_sockets       r<   rO   rO      sk     011G""73/A+B+B+D+D#EFFI/229==K;'''''r;   c                    d}d }|t           k     rt          j        d          }t          j        d          }	 |                     ||           n# t          t
          j        f$ r}|j        t          j        k    rt                      r0t                              d|           t          j        d           nRt                              d|           |dz  }|dk    r|dz  }t          j        d|t          j                   |dz  }n Y d }~nd }~ww xY w|t           k     |t           k    rt#          d| d	t            d
          d S )Nr   rD   r?   zPort %s is already in user%   z3Port %s already in use, trying to use the next one.i  z$Cannot start Streamlit server. Port zG is already in use, and Streamlit was unable to find a free port after z
 attempts.)MAX_PORT_SEARCH_RETRIESr   rE   listenOSErrorsocketrX   errno
EADDRINUSErA   rW   rY   rZ   debug
set_optionr   STREAMLIT_DEFINITIONr6   )rS   
call_countportrH   es        r<   rP   rP      s   JD
.
.
.#$455 //	tW---& 	 	 	w%***.00 $LL!<dCCCHQKKKKLLMt   AID t||	%%t\-N   !OJJ)	 .
.
.< ,,,b4 b b>Ub b b
 
 	
 -,s   A D'B%DDc                       e Zd ZdedefdZdefdZedefd            ZddZ	ede
d         fd	            Zdej        j        fd
Zedefd            Zedefd            ZddZdS )Servermain_script_pathis_helloc           
      L   t                       || _        t          t                    }t	          j        |           t          t                    }t          t          |d||t                      |                    | _        | j        j                            |           dS )z+Create the server. It won't be started yet.N)script_pathcommand_linemedia_file_storageuploaded_file_managercache_storage_managerr~   )_set_tornado_log_levels_main_script_pathr   r-   r   initialize_storager   r.   r   r   r   _runtime	stats_mgrregister_provider)selfr}   r~   r   uploaded_file_mgrs        r<   __init__zServer.__init__   s    !!!!1 4NCC+,>???56JKK,!#5&7&J&L&L!  	
 	
 	112DEEEEEr;   r=   c                 *    t          j        |           S N)r   repr_r   s    r<   __repr__zServer.__repr__   s    z$r;   c                     | j         S r   )r   r   s    r<   r}   zServer.main_script_path   s    %%r;   Nc                    K   t                               d           |                                 }t          |           t	          j        d          }t                               d|           | j                                         d{V  dS )zaStart the server.

        When this returns, Streamlit is ready to accept new sessions.
        zStarting server...r?   zServer started on port %sN)rW   ru   _create_apprT   r   rE   r   start)r   rJ   ry   s      r<   r   zServer.start   s       	)***   //0$777m!!###########r;   c                     | j         j        S )z>A Future that completes when the Server's run loop has exited.)r   stoppedr   s    r<   r   zServer.stopped  s     }$$r;   c                 r    t          j        d          }t          |t                    t          t           j                  ft          |t                    t          t           fd          ft          |t                    t          t           j        j                  ft          |t                    t          t           j        j                  ft          |t                    t           ft          |t"           d          t$          t           j        j         j        j                  ft          |t*           d	          t,          d
dift          |d          t.          t          t1          j                              fg}t          j        d          rB|                    t          |t6                    t          t           fd          fg           t          j        d          rE|                    t          |d          t8          d
t;          j         j                  ifg           t          j        d          rt@          !                    d           n{t;          j"                    }t@          !                    d|           |                    t          |d          tF          d|z  d fddft          |d          tH          fg           tK          j&        j'        |ft          j        d          t          j        d          tQ                      dtR          S )zCreate our tornado web app.zserver.baseUrlPath)runtimec                       j         j        S r   )r   is_ready_for_browser_connectionr   s   r<   <lambda>z$Server._create_app.<locals>.<lambda>  s    dm&S r;   )callback)cache)stats_managerz)/(?P<session_id>[^/]+)/(?P<file_id>[^/]+))file_mgris_active_sessionz/(.*)re    zcomponent/(.*))registryzserver.scriptHealthCheckEnabledc                  6     j                                         S r   )r   does_script_run_without_errorr   s   r<   r   z$Server._create_app.<locals>.<lambda>M  s    T]-X-X-Z-Z r;   zserver.enableStaticServingzapp/static/(.*)global.developmentModez/Serving static content from the Node dev serverzServing static content from %sz(.*)z%s/z
index.htmlc                      t          d t          j         j                                                  D                       S )Nc                     g | ]
}|d          S )	page_namer:   ).0	page_infos     r<   
<listcomp>z8Server._create_app.<locals>.<lambda>.<locals>.<listcomp>m  s-     !" !" !"(1 %.k$:!" !" !"r;   )setr   	get_pagesr}   valuesr   s   r<   r   z$Server._create_app.<locals>.<lambda>l  sI    !" !"5@5J(,(=6& 6&&,fhh	!" !" !"2 2 r;   )re   default_filenamer   F)trailing_slashzserver.cookieSecretzserver.enableXsrfProtection)cookie_secretxsrf_cookieswebsocket_max_message_size)*r   rE   r"   r/   r   dictr   r2   r   r1   r    message_cacher0   r#   r   r3   r   r.   r$   r   r   r-   r   r   r   instanceextendr4   r   r   get_app_static_dirr}   rW   ru   get_static_dirr!   r   rh   webApplicationr   TORNADO_SETTINGS)r   baseroutesstatic_paths   `   r<   r   zServer._create_app  s_    !566 $D/::'T]+++ $D/::SSSSTTT $D*:;;#4=6777 $D/::#4=#:;;; $D*>??!
 $,WWW  )!]<&*m&E  
 $D^*B*B*BCC  $D*:;;'/8::;;;S.
` >?? 	MM ,D2NOO%%Z%Z%Z%Z  
 
 
 9:: 		MM ,D2CDD,!=d>S!T!TU   566 	LLJKKKK#244KLL9;GGGMM ,D&99)$)K$70<* * * *   )eDDDoV#  , {&
 +,ABB*+HII'A'C'C
 
 
 
 	
r;   c                 6    | j         j        t          j        k    S r   )r   stater   ONE_OR_MORE_SESSIONS_CONNECTEDr   s    r<   browser_is_connectedzServer.browser_is_connected  s    }"l&QQQr;   c                 .    ddl m} | j        |j        k    S )Nr   )Hello)streamlit.hellor   r   __file__)r   r   s     r<   is_running_hellozServer.is_running_hello  s$    ))))))%77r;   c                 d    t          j        dd           | j                                         d S )Nz  Stopping...blue)fg)clicksechor   stopr   s    r<   r   zServer.stop  s1    O////r;   r=   N)r7   r8   r9   strrV   r   r   propertyr}   r   r   r   rh   r   r   r   r   r   r   r:   r;   r<   r|   r|      sJ       F F F F F F2 #         &# & & & X&$ $ $ $  %4 % % % X%o
W[4 o
 o
 o
 o
b Rd R R R XR 8$ 8 8 8 X8
     r;   r|   c                  X   t          j        d          st          j        d                              t          j                   t          j        d                              t          j                   t          j        d                              t          j                   d S d S )Nr   ztornado.accessztornado.applicationztornado.general)r   rE   logging	getLoggersetLevelERRORr:   r;   r<   r   r     s    566 E 	*++44W]CCC/0099'-HHH+,,55gmDDDDDE Er;   r   )ars   r   rd   rr   r\   rY   pathlibr   typingr   r   r   r   r   r   tornado.concurrentrh   tornado.lockstornado.netutiltornado.webtornado.websockettornado.httpserverr	   typing_extensionsr
   	streamlitr   r   r   r   "streamlit.components.v1.componentsr   streamlit.config_optionr   streamlit.loggerr   streamlit.runtimer   r   r   +streamlit.runtime.memory_media_file_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!    streamlit.web.server.server_utilr"   *streamlit.web.server.stats_request_handlerr#   0streamlit.web.server.upload_file_request_handlerr$   r7   rW   r   ro   rG   r-   __annotations__r.   r/   r0   r1   r2   r3   r4   	Exceptionr6   rV   rA   rI   r   r   rT   r   
SSLContextrN   rO   rP   r|   r   r:   r;   r<   <module>r      s     				  



 



       8 8 8 8 8 8 8 8 8 8 8 8 8 8                      ) ) ) ) ) ) # # # # # # : : : : : : : : : : : : @ @ @ @ @ @ 0 0 0 0 0 0 ' ' ' ' ' ' B B B B B B B B B B N N N N N N T T T T T T E E E E E E      N M M M M M R R R R R R R R R R R R D D D D D D              A @ @ @ @ @ J J J J J J U U U U U U	H		   ! !)  "           4 e 4 4 4* * * *: : : :, % , , ,6 6 6 64 e 4 4 4: e   
	 	 	 	 	i 	 	 	1T 1 1 1 1Jt J J J J
00 0T 0 0 0 0.$}$(0$
3>4 $ $ $ $N(Z (D ( ( ( (&
J &
4 &
 &
 &
 &
Rs s s s s s s slE E E E E Er;   