B
    tZ                 @   s   d Z ddlmZmZ yddlmZ W n  ek
rD   ddlmZ Y nX ddlZddlZddl	Z
ddlZ
dd ZG dd de
jjZdS )	z9Tornado websocket handler to serve a terminal interface.
    )absolute_importprint_function)urlparseNc             C   s   t | tr| dS | S )Nzutf-8)
isinstancebytesdecode)s r	   2lib/python3.7/site-packages/terminado/websocket.py_cast_unicode   s    

r   c                   s\   e Zd ZdZdd ZdddZd fdd	Zd	d
 Zdd Zdd Z	dd Z
dd Z  ZS )
TermSocketz Handler for a terminal websocketc             C   s(   || _ d| _d| _d | _tt| _d S )N )NN)term_manager	term_namesizeterminalloggingZ	getLogger__name___logger)selfr   r	   r	   r
   
initialize   s
    zTermSocket.initializeNc             C   s   |  |p| jjdS )z1Deprecated: backward-compat for terminado <= 0.5.ZOrigin)Zcheck_originZrequestZheadersget)r   originr	   r	   r
   origin_check$   s    zTermSocket.origin_checkc                s   t t| | | jd| t|}|p,d| _| j|| _	x| j	j
D ]}| | qHW | j	j|  | di g | jd| j dS )zWebsocket connection opened.
        
        Call our terminal manager to get a terminal, and connect to it as a
        client.
        zTermSocket.open: %sZttyZsetupzTermSocket.open: Opened %sN)superr   openr   infor   r   r   Zget_terminalr   Zread_bufferon_pty_readclientsappendsend_json_message)r   Zurl_componentr   )	__class__r	   r
   r   (   s    
zTermSocket.openc             C   s   |  d|g dS )z$Data read from pty; send to frontendstdoutN)r    )r   textr	   r	   r
   r   >   s    zTermSocket.on_pty_readc             C   s   t |}| | d S )N)jsondumpsZwrite_message)r   ZcontentZjson_msgr	   r	   r
   r    B   s    
zTermSocket.send_json_messagec             C   sR   t |}|d }|dkr.| jj|d  n |dkrN|dd | _| j  dS )zHandle incoming websocket message
        
        We send JSON arrays, where the first element is a string indicating
        what kind of message this is. Data associated with the message follows.
        r   stdin   Zset_size   N)r$   loadsr   Zptyprocwriter   resize_to_smallest)r   messageZcommandZmsg_typer	   r	   r
   
on_messageF   s    
zTermSocket.on_messagec             C   s:   | j d | jr*| jj|  | j  | j|  dS )zHandle websocket closing.
        
        Disconnect from our terminal, and tell the terminal manager we're
        disconnecting.
        zWebsocket closedN)r   r   r   r   remover+   r   Zclient_disconnected)r   r	   r	   r
   on_closeV   s
    
zTermSocket.on_closec             C   s   |  ddg |   dS )zBTerminal closed: tell the frontend, and close the socket.
        Z
disconnectr'   N)r    close)r   r	   r	   r
   on_pty_diedb   s    zTermSocket.on_pty_died)N)N)r   
__module____qualname____doc__r   r   r   r   r    r-   r/   r1   __classcell__r	   r	   )r!   r
   r      s   
r   )r4   Z
__future__r   r   Zurllib.parser   ImportErrorr$   r   Ztornado.webZtornadoZtornado.websocketr   Z	websocketZWebSocketHandlerr   r	   r	   r	   r
   <module>   s   