
    Ke{                     d    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	          ZdS )
zBase websocket classes.    N)Optionalno_type_check)urlparse)ioloop)IOStreami0u  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 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    =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_cookieR   s    r   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startsuperopen)r   r3   r4   loop	__class__s       r   rC   zWebSocketMixin.openV   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     @@   z#WebSocket ping timeout after %i ms.r   )ws_connectionr@   stopclient_terminatedcloser   r9   r:   r;   r=   r<   r   r   r+   r,   ping)r   nowsince_last_pongsince_last_pings       r   r?   zWebSocketMixin.send_pingg   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   r9   r:   r;   r=   )r   datas     r   on_pongzWebSocketMixin.on_pong   s'    ..005577r   )N)__name__
__module____qualname____doc__r@   r<   r=   r
   r   r   __annotations__propertyr   r   r   strr(   r0   r5   rC   r?   rR   __classcell__)rE   s   @r   r	   r	      s        ,,MII!%FHX%%%G G XG 
 
 X
 ( (8C= (D ( ( ( ](T   - - - - ]-    ].8 8 8 8 8 8 8r   r	   )rV   r)   typingr   r   urllib.parser   tornador   tornado.iostreamr   r   r	   r2   r   r   <module>r_      s      				 * * * * * * * * ! ! ! ! ! !       % % % % % %  t8 t8 t8 t8 t8 t8 t8 t8 t8 t8r   