
    Mh@                         d Z ddlZddl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 ddlmZ d	Z G d
 d          ZdS )zBase websocket classes.    N)Optionalno_type_check)urlparse)ioloopweb)IOStream)JupyterHandler)JupyterServerAuthWarningi0u  c                       e Zd ZU dZdZdZdZdZee	         e
d<   ed             Zed             Zeddee         defd	            Zd
 Zed             Ze fd            Ze fd            Zed             Zd Z xZS )WebSocketMixinz"Mixin for common websocket optionsNg        streamc                 B    | j                             dt                    S )ziThe interval for websocket keep-alive pings.

        Set ws_ping_interval = 0 to disable pings.
        ws_ping_interval)settingsgetWS_PING_INTERVALselfs    ]/var/www/html/test/jupyter/venv/lib/python3.11/site-packages/jupyter_server/base/websocket.pyping_intervalzWebSocketMixin.ping_interval   s     }  !35EFFF    c                 n    | j                             dt          d| j        z  t                              S )zIf no ping is received in this many milliseconds,
        close the websocket connection (VPNs, etc. can fail to cleanly close ws connections).
        Default is max of 3 pings or 30 seconds.
        ws_ping_timeout   )r   r   maxr   r   r   s    r   ping_timeoutzWebSocketMixin.ping_timeout"   s6     }  s1t'9#9;KLL
 
 	
r   originreturnc                    | j         dk    s$t          | d          r|                                 rdS | j        j                            d          }||                                 }||dS |                                }t          |          j	        }||k    rdS | j         r| j         |k    }n1| j
        r(t          t          j        | j
        |                    }nd}|s| j                            d||           |S )zCheck Origin == Host or Access-Control-Allow-Origin.

        Tornado >= 4 calls this method automatically, raising 403 if it returns False.
        *skip_check_originTHostNFz>Blocking Cross Origin WebSocket Attempt.  Origin: %s, Host: %s)allow_originhasattrr!   requestheadersr   
get_originlowerr   netlocallow_origin_patboolrematchlogwarning)r   r   hostorigin_hostallows        r   check_originzWebSocketMixin.check_origin,   s)    ##D-.. $373I3I3K3K $ 4|#''//>__&&F >T\4v&&- $4  	%/EE" 	$"7@@AAEE E 	HP  
 r   c                     dS )zmeaningless for websocketsN )r   argskwargss      r   clear_cookiezWebSocketMixin.clear_cookieW   s      r   c                 l   | j                             dd          s| j        j        st	          j        d          t          | | j        j                                                  }t          |dd          s9| j        }|2| j	        
                    d           t	          j        d          dS dS dS )z}Verify authentication if required.

        Only used when the websocket class does not inherit from JupyterHandler.
        allow_unauthenticated_accessFi  __allow_unauthenticatedNz*Couldn't authenticate WebSocket connection)r   r   r%   methodr   	HTTPErrorgetattrr(   current_userr.   r/   )r   r<   users      r   _maybe_authzWebSocketMixin._maybe_authZ   s     }  !?GG 
	-<& )mC(((T4<#6#<#<#>#>??F6#<eDD - (<H$$%QRRR-,,,
	- 
	-- -  <r   c                 H   t          | t                    sp| j                            dd           }d| j        v r|rt	          j        dt          d           |                                   t                      j	        |i |S  t                      j	        |i |ddiS )zHandle a get request.r:   Fidentity_providerz~WebSocketMixin sub-class does not inherit from JupyterHandler preventing proper authentication using custom identity provider.   )
stacklevel_redirect_to_login)

isinstancer	   r   r   warningswarnr
   rA   superprepare)r   r6   r7   should_authenticate	__class__s       r   rK   zWebSocketMixin.preparel   s     $// 
	4&*m&7&78VX]&^&^"^"dm338K3X, 	    "577?D3F333uwwIII5IIIIr   c                    | j                             d| j        j                   | j        dk    rt
          j                                        }|                                | _	        | j	        | _
        t          j        | j        | j                  | _        | j                                          t                      j        |i |S )zOpen the websocket.zOpening websocket %sr   )r.   debugr%   pathr   r   IOLoopcurrenttime	last_ping	last_pongPeriodicCallback	send_pingping_callbackstartrJ   open)r   r6   r7   looprM   s       r   rZ   zWebSocketMixin.open|   s     	-t|/@AAA !!=((**D!YY[[DN!^DN!'!8"" "D $$&&&uww|T,V,,,r   c                    | j         "| j        | j                                         dS | j         j        r|                                  dS t
          j                                                                        }d|| j	        z
  z  }d|| j
        z
  z  }|d| j        z  k     r<|| j        k    r1| j                            d|           |                                  dS |                     d           || _
        dS )z'send a ping to keep the websocket aliveNg     @@rD   z#WebSocket ping timeout after %i ms.r   )ws_connectionrX   stopclient_terminatedcloser   rQ   rR   rS   rU   rT   r   r   r.   r/   ping)r   nowsince_last_pongsince_last_pings       r   rW   zWebSocketMixin.send_ping   s     %$*<*H##%%%F/ 	JJLLLF m##%%**,,t~!56t~!56Q!3333$J[8[8[HBOTTTJJLLLF		#r   c                 p    t           j                                                                        | _        dS )zHandle a pong message.N)r   rQ   rR   rS   rU   )r   datas     r   on_pongzWebSocketMixin.on_pong   s'    ..005577r   )N)__name__
__module____qualname____doc__rX   rT   rU   r   r   r   __annotations__propertyr   r   r   strr+   r3   r8   rA   rK   rZ   rW   rg   __classcell__)rM   s   @r   r   r      s]        ,,MII!%FHX%%%G G XG 
 
 X
 ( (8C= (D ( ( ( ](T) ) ) - - ]-" J J J J ]J - - - - ]-    ].8 8 8 8 8 8 8r   r   )rk   r,   rH   typingr   r   urllib.parser   tornador   r   tornado.iostreamr   jupyter_server.base.handlersr	   jupyter_server.utilsr
   r   r   r5   r   r   <module>rv      s      				  * * * * * * * * ! ! ! ! ! !         % % % % % % 7 7 7 7 7 7 9 9 9 9 9 9  U8 U8 U8 U8 U8 U8 U8 U8 U8 U8r   