o
    ^i@                     @   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.
        ws_ping_interval)settingsgetWS_PING_INTERVALself r   X/home/ubuntu/hpml_nyu/venv/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.
        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)allow_originhasattrr   requestheadersr   
get_originlowerr   netlocallow_origin_patboolrematchlogwarning)r   r   hostorigin_host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  __allow_unauthenticatedNz*Couldn't authenticate WebSocket connection)r   r   r    methodr   	HTTPErrorgetattrr#   current_userr)   r*   )r   r4   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.r2   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	   r9   superprepare)r   r/   r0   should_authenticate	__class__r   r   rB   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_pongPeriodicCallback	send_pingping_callbackstartrA   open)r   r/   r0   looprD   r   r   rQ   |   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     @@r;   z#WebSocket ping timeout after %i ms.    )ws_connectionrO   stopclient_terminatedcloser   rH   rI   rJ   rL   rK   r   r   r)   r*   ping)r   nowsince_last_pongsince_last_pingr   r   r   rN      s   


zWebSocketMixin.send_pingc                 C   s   t j  | _dS )zHandle a pong message.N)r   rH   rI   rJ   rL   )r   datar   r   r   on_pong   s   zWebSocketMixin.on_pong)N)__name__
__module____qualname____doc__rO   rK   rL   r   r   r   __annotations__propertyr   r   r   strr&   r.   r1   r9   rB   rQ   rN   r]   __classcell__r   r   rD   r   r
      s,   
 

	*

r
   )ra   r'   r?   typingr   r   urllib.parser   tornador   r   tornado.iostreamr   jupyter_server.base.handlersr   jupyter_server.utilsr	   r   r
   r   r   r   r   <module>   s    