o
    i{                     @   sV   d Z ddl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)IOStreami0u  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 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/var/www/edux/Edux_v2/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_cookieR   s   zWebSocketMixin.clear_cookiec                    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startsuperopen)r   r,   r-   loop	__class__r   r   r;   V   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     @@   z#WebSocket ping timeout after %i ms.    )ws_connectionr8   stopclient_terminatedcloser   r1   r2   r3   r5   r4   r   r   r&   r'   ping)r   nowsince_last_pongsince_last_pingr   r   r   r7   g   s   


zWebSocketMixin.send_pingc                 C   s   t j  | _dS )zHandle a pong message.N)r   r1   r2   r3   r5   )r   datar   r   r   on_pong   s   zWebSocketMixin.on_pong)N)__name__
__module____qualname____doc__r8   r4   r5   r   r   r   __annotations__propertyr   r   r   strr#   r+   r.   r;   r7   rJ   __classcell__r   r   r=   r   r      s$   
 

	*
r   )rN   r$   typingr   r   urllib.parser   tornador   tornado.iostreamr   r   r   r   r   r   r   <module>   s    