
    Xh.                       d Z 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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mZm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  ddl!m"Z"m#Z# ddl$m%Z% ddl&m'Z'  ejP                  de)d        e* ejV                  dd            Z, G d dee#      Z- G d de       Z. G d de"      Z/ddl0m1Z1 ddl2m3Z3 de1z  e-fde3z  e/fgZ4y) zGateway API handlers.    )annotationsN)AnyOptionalcast)Session)web)Future)json_decode
url_escapeutf8)HTTPRequest)IOLoopPeriodicCallback)WebSocketHandlerwebsocket_connect)LoggingConfigurable   )
APIHandlerJupyterHandler)url_path_join   )GatewayClientzhThe jupyter_server.gateway.handlers module is deprecated and will not be supported in Jupyter Server 3.0)
stacklevelGATEWAY_WS_PING_INTERVAL_SECS30c                       e Zd ZdZdZdZdZdZddZd Z	d Z
d Zd Z fdZd	 Zd
 Zd Zd fd	Z fdZed        Z xZS )WebSocketChannelsHandlerz$Gateway web socket channels handler.Nc                .    t        j                  | |      S )zCheck origin for the socket.)r   check_origin)selforigins     S/var/www/html/myenv/lib/python3.12/site-packages/jupyter_server/gateway/handlers.pyr   z%WebSocketChannelsHandler.check_origin/   s    **488    c                     y)zVUndo the set_default_headers in JupyterHandler which doesn't make sense for websocketsN r    s    r"   set_default_headersz,WebSocketChannelsHandler.set_default_headers3   s    r#   c                    i S )z+Get the compression options for the socket.r%   r&   s    r"   get_compression_optionsz0WebSocketChannelsHandler.get_compression_options6   s	     	r#   c                4   | j                   0| j                  j                  d       t        j                  d      | j                  dd      r/| j                  J | j                  d      | j                  _        y| j                  j                  d       y)zRun before finishing the GET request

        Extend this method to add logic that should fire before
        the websocket finishes completing.
        Nz*Couldn't authenticate WebSocket connectioni  
session_idzNo session ID specified)current_userlogwarningr   	HTTPErrorget_argumentsessionr&   s    r"   authenticatez%WebSocketChannelsHandler.authenticate;   s|     $HHIJ--$$\40<<+++#'#4#4\#BDLL HH67r#   c                    | j                   j                  d| j                  j                         t	        | j
                        | _        t        t        j                         j                        | _        y)zInitialize the socket.z$Initializing websocket connection %s)config)gateway_urlN)r-   debugrequestpathr   r4   r1   GatewayWebSocketClientr   instanceurlgatewayr&   s    r"   
initializez#WebSocketChannelsHandler.initializeL   sJ    =t||?P?PQdkk2--:P:P:R:V:VWr#   c                x   K   | j                          || _        ||d<   t        |   |i | d{    y7 w)zGet the socket.	kernel_idN)r2   r?   superget)r    r?   argskwargs	__class__s       r"   rA   zWebSocketChannelsHandler.getR   s;     "'{gk4*6***s   /:8:c                    | j                   '| j                  | j                  j                          y| j                  d       y)zSend a ping to the socket.Nr#   )ws_connectionping_callbackstoppingr&   s    r"   	send_pingz"WebSocketChannelsHandler.send_pingY   s9    %$*<*<*H##%		#r#   c                   t        | j                  t        dz        | _        | j                  j	                          | j
                  J | j
                  j                  || j                  | j                                y)z_Handle web socket connection open to notebook server and delegate to gateway web socket handleri  N)r?   message_callbackcompression_options)	r   rJ   r   rG   startr<   on_openwrite_messager)   )r    r?   rB   rC   s       r"   openzWebSocketChannelsHandler.opena   sm    -dnn>[^b>bc  "||'''!// $ < < > 	 	
r#   c                V    | j                   J | j                   j                  |       y)z.Forward message to gateway web socket handler.N)r<   
on_message)r    messages     r"   rS   z#WebSocketChannelsHandler.on_messagem   s$    ||'''(r#   c                D   | j                   r$t        |t              rd}t        |   ||       y| j
                  j                  t        j                        rFt        j                  t        t        |                  }| j
                  j                  d|        yy)zdSend message back to notebook client.  This is called via callback from self.gateway._read_messages.T)binaryz?Notebook client closed websocket connection - message dropped: N)rF   
isinstancebytesr@   rP   r-   isEnabledForloggingDEBUGr   _get_message_summaryr
   r   r6   )r    rT   rV   msg_summaryrD   s       r"   rP   z&WebSocketChannelsHandler.write_messager   s    '5)G!'&!9XX""7==12GGTXY`TaHbcKHHNNQR]Q^_ 2r#   c                    | j                   j                  d| j                  j                         | j                  J | j                  j                          t        |           y)zHandle a closing socket.zClosing websocket connection %sN)r-   r6   r7   r8   r<   on_closer@   )r    rD   s    r"   r_   z!WebSocketChannelsHandler.on_close~   sK    8$,,:K:KL||'''r#   c                H   g }| d   }|j                  d|        |dk(  r'|j                  dj                  | d   d                nK|dk(  r5|j                  dj                  | d   d	   | d   d
   | d   d                n|j                  d       dj                  |      S )zGet a summary of a message.msg_typeztype: statusz, state: {}contentexecution_stateerrorz
, {}:{}:{}enameevalue	tracebackz, ... )appendformatjoin)rT   summarymessage_types      r"   r\   z-WebSocketChannelsHandler._get_message_summary   s     z*~./8#NN=//	0BCT0UVWW$NN##I&w/I&x0I&{3 NN7#wwwr#   N)F)__name__
__module____qualname____doc__r1   r<   r?   rG   r   r'   r)   r2   r=   rA   rJ   rQ   rS   rP   r_   staticmethodr\   __classcell__rD   s   @r"   r   r   '   sg    .GGIM9e
8"X+

)

    r#   r   c                  R     e Zd ZdZ fdZd Zd Zd Zd Zd Z	d Z
d	 Zd
 Z xZS )r9   z;Proxy web socket connection to a kernel/enterprise gateway.c                x    t         |           d| _        d| _        t	               | _        d| _        d| _        y)z)Initialize the gateway web socket client.NFr   )r@   __init__r?   wsr	   	ws_futuredisconnectedretry)r    rC   rD   s     r"   ry   zGatewayWebSocketClient.__init__   s4    &,h!
r#   c                (   K   d _         | _        t        j                         }|j                  J t        |j                  |j                  t        |      d      } j                  j                  d|        i } |j                  di |}t        |fi |}t        dt        |             _         j                  j                   j                          t#        j$                         }|j'                   j                   fd       yw)zConnect to the socket.NchannelszConnecting to zFuture[Any]c                &    j                        S ro   )_read_messages)futurerL   r    s    r"   <lambda>z1GatewayWebSocketClient._connect.<locals>.<lambda>   s    t7J7JK[7\ r#   r%   )rz   r?   r   r:   ws_urlr   kernels_endpointr   r-   infoload_connection_argsr   r   r   r{   add_done_callback_connection_doner   current
add_future)r    r?   rL   clientr   rC   r7   loops   ` `     r"   _connectzGatewayWebSocketClient._connect   s      "'')}}(((MM##y!	
 	vh/0!#,,,6v6f//m->w-GH(()>)>?~~(\]s   DDc                T   | j                   sU|j                         E|j                         | _        d| _        | j
                  j                  d| j                          y| j
                  j                  d| j                   dt        j                         j                          y)zHandle a finished connection.Nr   zConnection is ready: ws: z]Websocket connection has been closed via client disconnect or due to error.  Kernel with ID 'z*' may not be terminated on GatewayClient: )r|   	exceptionresultrz   r}   r-   r6   r.   r?   r   r:   r;   )r    futs     r"   r   z'GatewayWebSocketClient._connection_done   s     !!cmmo&=jjlDGDJHHNN6twwi@AHH##'>>"22\]j]s]s]u]y]y\z|r#   c                   d| _         | j                  | j                  j                          y| j                  j	                         sC| j                  j                          | j                  j                  d| j                           yy)zHandle a disconnect.TNz-_disconnect: future cancelled, disconnected: )r|   rz   closer{   donecancelr-   r6   r&   s    r"   _disconnectz"GatewayWebSocketClient._disconnect   se     77GGMMO$$&NN!!#HHNNJ4K\K\J]^_ 'r#   c                d  K   | j                   d}| j                  sc	 | j                   j                          d{   }|5| j                  s(| j                  j                  d| j                          n ||       nn| j                   | j                  sZ| j                  t        j                         j                  k  r-t        j                  dd      dz  }t        t        j                         j                  d| j                  z  z  t        j                         j                         |z   }| xj                  dz  c_        | j                  j#                  d	|| j                  t        j                         j                  | j                         t%        j&                  |       d{    t)        j*                         }|j-                  | j.                  | j                  |       yyy7 # t        $ r)}| j                  j                  d|        Y d}~d}~ww xY w7 zw)
z"Read messages from gateway server.Nz*Exception reading message from websocket: zLost connection to Gateway: 
   d   g{Gz?r   r   zKAttempting to re-establish the connection to Gateway in %s secs (%s/%s): %s)rz   r|   read_message	Exceptionr-   re   r.   r?   r}   r   r:   gateway_retry_maxrandomrandintmingateway_retry_intervalgateway_retry_interval_maxr   asynciosleepr   r   spawn_callbackr   )r    callbackrT   ejitterretry_intervalr   s          r"   r   z%GatewayWebSocketClient._read_messages   s    gg!G$$$(GG$8$8$::G
 ?,,((+GGW)XY # gg!(   TZZ-2H2H2J2\2\%\^^B,t3F!**,CCq$**}U!**,GG 	  JJ!OJHHMM]

&&(:: --///>>#Dt~~xH' &] ! ;  HHNNDQCH @ 0sS   H0G9 G6G9  AH0D%H03H.4AH06G9 9	H+H& H0&H++H0c                f    t        j                         }|j                  | j                  ||       y)z2Web socket connection open against gateway server.N)r   r   r   r   )r    r?   rL   rC   r   s        r"   rO   zGatewayWebSocketClient.on_open  s%    ~~DMM96FGr#   c                      j                   5t        j                         }|j                   j                   fd       y j                         y)Send message to gateway server.Nc                &    j                        S ro   )_write_message)r   rT   r    s    r"   r   z3GatewayWebSocketClient.on_message.<locals>.<lambda>  s    4;N;Nw;W r#   )rz   r   r   r   r{   r   )r    rT   r   s   `` r"   rS   z!GatewayWebSocketClient.on_message
  s9    77?>>#DOODNN,WX(r#   c                    	 | j                   s)| j                  | j                  j                  |       yyy# t        $ r(}| j                  j                  d|        Y d}~yd}~ww xY w)r   Nz(Exception writing message to websocket: )r|   rz   rP   r   r-   re   )r    rT   r   s      r"   r   z%GatewayWebSocketClient._write_message  sa    	K$$)<%%g. *=$ 	KHHNNEaSIJJ	Ks   38 	A)A$$A)c                $    | j                          y)zWeb socket closed event.N)r   r&   s    r"   r_   zGatewayWebSocketClient.on_close  s    r#   )rp   rq   rr   rs   ry   r   r   r   r   rO   rS   r   r_   ru   rv   s   @r"   r9   r9      s9    E^2	`)IVH
)Kr#   r9   c                  6    e Zd ZdZej
                  dd       Zy)GatewayResourceHandlerzWRetrieves resources for specific kernelspec definitions from kernel/enterprise gateway.c                  K   d}| j                   }|j                  ||       d{   }|#| j                  j                  d| d| d       nt	        j
                  |      d   xs d}| j                  ||       y7 Yw)z(Get a gateway resource by name and path.NzKernelspec resource 'z' for 'z7' not found.  Gateway may not support resource serving.r   z
text/plain)set_content_type)kernel_spec_managerget_kernel_spec_resourcer-   r.   	mimetypes
guess_typefinish)r    kernel_namer8   include_bodymimetypeksmkernel_spec_ress          r"   rA   zGatewayResourceHandler.get"  s      #'&& # < <!
 
 "HH'vW[M B% %
 !++D1!4DHOh?
s   $BB ABN)T)rp   rq   rr   rs   r   authenticatedrA   r%   r#   r"   r   r     s    a@ @r#   r   )_kernel_id_regex)kernel_name_regexz/api/kernels/%s/channelsz/kernelspecs/%s/(?P<path>.*))5rs   
__future__r   r   rZ   r   osr   warningstypingr   r   r   jupyter_client.sessionr   tornador   tornado.concurrentr	   tornado.escaper
   r   r   tornado.httpclientr   tornado.ioloopr   r   tornado.websocketr   r   traitlets.config.configurabler   base.handlersr   r   utilsr   gateway_clientr   warnDeprecationWarningintgetenvr   r   r9   r   services.kernels.handlersr   services.kernelspecs.handlersr   default_handlersr%   r#   r"   <module>r      s     #    	   & & *  % 8 8 * 3 A = 6 ! ) n !$IBII.Mt$T U r / r j@0 @F@Z @* 9 = !#335MN$'88:PQ r#   