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

        Set ws_ping_interval = 0 to disable pings.
        Zws_ping_interval)settingsgetWS_PING_INTERVALself r   f/var/www/html/software/conda/envs/catlas/lib/python3.10/site-packages/jupyter_server/base/websocket.pyping_interval   s   zWebSocketMixin.ping_intervalc                 C   s   | j dtd| j 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.
        Zws_ping_timeout   )r   r   maxr   r   r   r   r   r   ping_timeout"   s   zWebSocketMixin.ping_timeoutoriginreturnc                 C   s   | j dkst| dr|  rdS | jjd}|du r|  }|du s'|du r)dS | }t|j	}||kr8dS | j rA| j |k}n| j
rNtt| j
|}nd}|sZ| 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)Zallow_originhasattrr   requestheadersr   
get_originlowerr   netlocZallow_origin_patboolrematchlogwarning)r   r   hostorigin_hostZallowr   r   r   check_origin,   s6   

zWebSocketMixin.check_originc                 O   s   dS )zmeaningless for websocketsNr   )r   argskwargsr   r   r   clear_cookieW   s    zWebSocketMixin.clear_cookiec                 C   sn   | j dds1| jjstdt| | jj }t|dds3| j}|du r5| j	
d t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  Z__allow_unauthenticatedNz*Couldn't authenticate WebSocket connection)r   r   r   methodr   	HTTPErrorgetattrr    current_userr%   r&   )r   r.   userr   r   r   _maybe_authZ   s   

zWebSocketMixin._maybe_authc                    sl   t | ts)| jdd }d| jv r|rtjdtdd |   t j	|i |S t j	|i |ddiS )zHandle a get request.r-   FZidentity_providerz~WebSocketMixin sub-class does not inherit from JupyterHandler preventing proper authentication using custom identity provider.   )
stacklevelZ_redirect_to_login)

isinstancer   r   r   warningswarnr	   r3   superprepare)r   r*   r+   Zshould_authenticate	__class__r   r   r:   l   s   
zWebSocketMixin.preparec                    sf   | j d| jj | jdkr*tj }| | _	| j	| _
t| 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_pongZPeriodicCallback	send_pingping_callbackstartr9   open)r   r*   r+   loopr;   r   r   rG   |   s   



zWebSocketMixin.openc                 C   s   | j du r| jdur| j  dS | j jr|   dS tj  }d|| j	  }d|| j
  }|d| j k rI|| jkrI| jd| |   dS | d || _
dS )z'send a ping to keep the websocket aliveNg     @@r4   z#WebSocket ping timeout after %i ms.    )Zws_connectionrE   stopZclient_terminatedcloser   r?   r@   rA   rC   rB   r   r   r%   r&   Zping)r   nowZsince_last_pongZsince_last_pingr   r   r   rD      s   


zWebSocketMixin.send_pingc                 C   s   t j  | _dS )zHandle a pong message.N)r   r?   r@   rA   rC   )r   datar   r   r   on_pong   s   zWebSocketMixin.on_pong)N)__name__
__module____qualname____doc__rE   rB   rC   r   r   r   __annotations__propertyr   r   r   strr"   r)   r,   r3   r:   rG   rD   rN   __classcell__r   r   r;   r   r
      s,   
 

	*

r
   )rR   r#   r7   typingr   r   urllib.parser   tornador   r   Ztornado.iostreamr   Zjupyter_server.base.handlersr   Zjupyter_server.utilsr	   r   r
   r   r   r   r   <module>   s    