o
    >h{.                     @   s~   d dl Z d dlZd dlZd dlmZ d dlmZmZmZ d dl	m
Z
 ddlmZ e eZG dd deZG d	d
 d
eZdS )    N)unquote)ConnectionDenyWebSocketServerFactoryWebSocketServerProtocol)defer   )parse_x_forwarded_forc                   @   s   e Zd ZdZdZdZdd Zdd Zdd	 Zd
d Z	dd Z
dd Zdd Zdd Zd'ddZdd Zd(ddZd'ddZdd Zdd  Zd!d" Zd#d$ Zd%d& ZdS ))WebSocketProtocolzj
    Protocol which supports WebSockets and forwards incoming messages to
    the websocket channels.
    	websocketFc                 C   s  | j j| _| j|  || _d | _| jj| _t | _t | _	zg | _
|j D ]'\}}|d}d|v r7q)| dkrCt|| _q)| j
| |df q)| j }| j }t|drxt|drxt|j|jg| _t|j|jg| _nd | _d | _| jjrtt| j
| jj| jj| jj| j\| _| _g }| j
D ]\}}|dkrdd	 t| d!d
D }q|j"d| _"t#$| jj%| dt| j" d| j"| j| j
| j&| j| j|d	| _'| j'd ur| j'(| j) | j'*| j+ W n t,y   t-.t/0   w t#1 | _2| j2S )Nascii   _s   daphne-root-pathlatin1hostports   sec-websocket-protocolc                 S   s   g | ]}|  qS  )strip).0xr   r   r/var/www/vedio/testing/chatpythonscript.ninositsolution.com/env/lib/python3.10/site-packages/daphne/ws_protocol.py
<listcomp>G   s    z/WebSocketProtocol.onConnect.<locals>.<listcomp>,r
   )	typepathraw_path	root_pathheadersquery_stringclientserversubprotocols)3factoryserver_classr   protocol_connectedrequestprotocol_to_acceptr   timesocket_opened	last_pingclean_headersr   itemsencodelowerr   append	transportgetPeergetHosthasattrstrr   r   client_addrserver_addrproxy_forwarded_address_headerr   dictproxy_forwarded_port_headerproxy_forwarded_proto_headerclient_schemedecodesplitr   r   maybeDeferredcreate_application_raw_query_stringapplication_deferredaddCallbackapplicationCreateWorked
addErrbackapplicationCreateFailed	Exceptionloggererror	traceback
format_excDeferredhandshake_deferred)selfr#   namevaluepeerr   r   headerr   r   r   	onConnect   s~   








zWebSocketProtocol.onConnectc                 C   sH   || _ | j ddi | jdd| jj| jrdt| j ndd dS )zk
        Called when the background thread has successfully made the application
        instance.
        r   zwebsocket.connectr
   
connecting%s:%sNr   r   )application_queue
put_nowaitr   
log_actionr#   r   r2   tuple)rJ   rS   r   r   r   r@   h   s   z)WebSocketProtocol.applicationCreateWorkedc                 C   s   t | |S )z9
        Called when application creation fails.
        )rD   rE   )rJ   failurer   r   r   rB   |   s   
z)WebSocketProtocol.applicationCreateFailedc                 C   s@   t d| j | jdd| jj| jrdt| j nd d d S )Nz!WebSocket %s open and establishedr
   	connectedrQ   rR   )rD   debugr2   r   rU   r#   r   rV   rJ   r   r   r   onOpen   s   zWebSocketProtocol.onOpenc                 C   sf   | j rtd| j d S td| j t | _|r%| jd|d d S | jd|dd d S )NzMuting incoming frame on %szWebSocket incoming frame on %szwebsocket.receive)r   bytesutf8)r   text)	mutedrD   rY   r2   r%   r'   rS   rT   r9   )rJ   payloadisBinaryr   r   r   	onMessage   s   
zWebSocketProtocol.onMessagec                 C   sn   | j |  td| j | jst| dr| jd|d | j 	dd| j
j| jr0dt| j ndd	 dS )
z8
        Called when Twisted closes the socket.
        zWebSocket closed for %srS   zwebsocket.disconnect)r   coder
   disconnectedrQ   NrR   )r   protocol_disconnectedrD   rY   r2   r_   r0   rS   rT   rU   r#   r   rV   )rJ   wasCleanrc   reasonr   r   r   onClose   s   zWebSocketProtocol.onClosec                 C   s   d|vrt d|d dkr| |dd  d S |d dkr7| j| jkr+|   d S | j|dd d d S |d dkrx| j| jkrGt d	|d
d rZ|dd rZt d|f |d
d rh| |d
 d |dd rz| |d d d S d S d S )Nr   zMessage has no type definedzwebsocket.acceptsubprotocolzwebsocket.closerc   rc   zwebsocket.sendz4Socket has not been accepted, so cannot send over itr\   r^   zMGot invalid WebSocket reply message on %s - contains both bytes and text keysTF)
ValueErrorserverAcceptgetstateSTATE_CONNECTINGserverRejectserverClose
serverSend)rJ   messager   r   r   handle_reply   s.   
zWebSocketProtocol.handle_replyc                 C   s2   t | dr| jtddd dS | jdd dS )zF
        Called by the server when our application tracebacks
        rI   i  zInternal server errorrc   rg   i  rj   N)r0   rI   errbackr   sendCloseFrame)rJ   	exceptionr   r   r   handle_exception   s
   

z"WebSocketProtocol.handle_exceptionNc                 C   s"   | j | | ` td| j dS )zO
        Called when we get a message saying to accept the connection.
        z$WebSocket %s accepted by applicationN)rI   callbackrD   rY   r2   )rJ   ri   r   r   r   rl      s   zWebSocketProtocol.serverAcceptc                 C   sd   | j tddd | ` | j|  td| j | jdd| j	j
| jr+dt| j ndd	 dS )
zO
        Called when we get a message saying to reject the connection.
        i  zAccess deniedru   z$WebSocket %s rejected by applicationr
   rejectedrQ   NrR   )rI   rv   r   r   re   rD   rY   r2   rU   r#   r   rV   rZ   r   r   r   rp      s   
zWebSocketProtocol.serverRejectc                 C   sL   | j | jkr
|   td| j |r| || dS | |d| dS )z@
        Server-side channel message to send a message.
        z&Sent WebSocket packet to client for %sr]   N)rn   ro   rl   rD   rY   r2   sendMessager*   )rJ   contentbinaryr   r   r   rr      s   zWebSocketProtocol.serverSendc                 C   s    |du rdn|}| j |d dS )zA
        Server-side channel message to close the socket
        Ni  rj   )	sendClose)rJ   rc   r   r   r   rq     s   zWebSocketProtocol.serverClosec                 C   s   t   | j S )z>
        Returns the time since the socket was opened
        )r%   r&   rZ   r   r   r   duration  s   zWebSocketProtocol.durationc                 C   s   |   | jjkr| jjdkr|   | j| jkr(|   | jjkr&|   dS dS | j| jkrDt		 | j
 | jjkrF|   t		 | _
dS dS dS )zK
        Called periodically to see if we should timeout something
        r   N)r   r   websocket_timeoutrq   rn   ro   websocket_connect_timeoutrp   
STATE_OPENr%   r'   ping_interval_sendAutoPingrZ   r   r   r   check_timeouts  s   z WebSocketProtocol.check_timeoutsc                 C   s   t t| S N)hashidrZ   r   r   r   __hash__*  s   zWebSocketProtocol.__hash__c                 C   s   t | t |kS r   )r   )rJ   otherr   r   r   __eq__-  s   zWebSocketProtocol.__eq__c                 C   s   d| j d| jdS )Nz<WebSocketProtocol client=z path=>)r2   r   rZ   r   r   r   __repr__0  s   zWebSocketProtocol.__repr__r   )F)__name__
__module____qualname____doc__application_typer_   rO   r@   rB   r[   rb   rh   rt   ry   rl   rp   rr   rq   r   r   r   r   r   r   r   r   r   r	      s*    K	


	r	   c                       s,   e Zd ZdZeZdd Z fddZ  ZS )WebSocketFactoryz
    Factory subclass that remembers what the "main"
    factory is, so WebSocket protocols can access it
    to get reply ID info.
    c                 O   s"   || _ tj| g|R i | d S r   )r!   r   __init__)rJ   r!   argskwargsr   r   r   r   =  s   zWebSocketFactory.__init__c                    s<   zt  |}| |_|W S  ty   tdt    w )zh
        Builds protocol instances. We use this to inject the factory object into the protocol.
        zCannot build protocol: %s)superbuildProtocolr    rC   rD   rE   rF   rG   )rJ   addrprotocol	__class__r   r   r   A  s   zWebSocketFactory.buildProtocol)	r   r   r   r   r	   r   r   r   __classcell__r   r   r   r   r   4  s
    r   )loggingr%   rF   urllib.parser   autobahn.twisted.websocketr   r   r   twisted.internetr   utilsr   	getLoggerr   rD   r	   r   r   r   r   r   <module>   s    
  $