o
    tf^                     @   sh   d Z ddlZddlmZ ddlmZmZmZ G dd dejZ						dddZ
G d	d
 d
ejZdS )zw
Authenticated HTTP proxy for Jupyter Notebooks

Some original inspiration from https://github.com/senko/tornado-proxy
    N)ensure_async)
httpclienthttputil	websocketc                       s(   e Zd ZdZ fddZdd Z  ZS )PingableWSClientConnectionz5A WebSocketClientConnection with an on_ping callback.c                    s.   d|v r|d | _ |d= t jdi | d S )Non_ping_callback )_on_ping_callbacksuper__init__)selfkwargs	__class__r   g/var/www/html/software/conda/envs/catlas/lib/python3.10/site-packages/jupyter_server_proxy/websocket.pyr      s   
z#PingableWSClientConnection.__init__c                 C   s   | j r
|  | d S d S N)r	   )r   datar   r   r   on_ping   s   z"PingableWSClientConnection.on_ping)__name__
__module____qualname____doc__r   r   __classcell__r   r   r   r   r      s    r   c              
   C   sX   t | j| _t| tjj} |rd|ini }td| i ||tt	dd|d|}|j
S )zo
    A variation on websocket_connect that returns a PingableWSClientConnection
    with on_ping_callback.
    resolverZ_default_max_message_sizei   )requestZcompression_optionson_message_callbackr   Zmax_message_sizesubprotocolsNr   )r   ZHTTPHeadersheadersr   Z_RequestProxyZHTTPRequestZ	_DEFAULTSr   getattrr   Zconnect_future)r   r   r   r   r   r   connr   r   r   pingable_ws_connect   s    	r    c                       s(   e Zd Z fddZ fddZ  ZS )WebSocketHandlerMixinc                    s   t  j|i | tt}t|v sJ |t}z||d   W n ty.   tdw  fdd}dD ]
}t	||| q8 jg|R i | d S )N   zHWebSocketHandlerMixin should be followed by another parent to make sensec                    s    fdd}|S )Nc                     s    t  g| R i | d S r   )r   )Zargs2Zkwargs2)method
nextparentr   r   r   
undisallowR   s    zCWebSocketHandlerMixin.__init__.<locals>.wrapper.<locals>.undisallowr   )r#   r%   r$   r   )r#   r   wrapperQ   s   z/WebSocketHandlerMixin.__init__.<locals>.wrapper)writeredirectZ
set_header
set_cookieZ
set_statusflushfinish)
r
   r   inspectgetmrotyper!   index
IndexError	Exceptionsetattr)r   argsr   basesZmeindexr'   r#   r   r&   r   r   @   s   
	zWebSocketHandlerMixin.__init__c                    sP   | j jdd dkr| j|i |I d H S tt j|i |I d H  d S )NZUpgrade r   )r   r   getlowerZhttp_getr   r
   )r   r4   r   r   r   r   r7   c   s    zWebSocketHandlerMixin.get)r   r   r   r   r7   r   r   r   r   r   r!   ?   s    #r!   )NNNNN)r   r-   Zjupyter_server.utilsr   tornador   r   r   ZWebSocketClientConnectionr   r    ZWebSocketHandlerr!   r   r   r   r   <module>   s    
$