
    /Jf{.                         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 j        e          Z G d de          Z G d	 d
e          ZdS )    N)unquote)ConnectionDenyWebSocketServerFactoryWebSocketServerProtocol)defer   )parse_x_forwarded_forc                       e Zd ZdZdZdZd Zd Zd Zd Z	d Z
d	 Zd
 Zd ZddZd ZddZddZd Zd Zd Zd Zd ZdS )WebSocketProtocolzj
    Protocol which supports WebSockets and forwards incoming messages to
    the websocket channels.
    	websocketFc                 `   | j         j        | _        | j                            |            || _        d | _        | j        j        | _        t          j                    | _        t          j                    | _	        	 g | _
        |j                                        D ]\  }}|                    d          }d|v r|                                dk    rt          |          | _        L| j
                            |                                |                    d          f           | j                                        }| j                                        }t)          |d          rQt)          |d          rAt+          |j                  |j        g| _        t+          |j                  |j        g| _        nd | _        d | _        | j        j        rUt7          t9          | j
                  | j        j        | j        j        | j        j        | j                  \  | _        | _        g }| j
        D ]J\  }}|dk    r?d t          |                     d                    !                    d	          D             }K|j"                            d          | _"        tG          j$        | j        j%        | d
t          | j"                             d                    | j"        | j        | j
        | j&        | j        | j        |d	          | _'        | j'        >| j'        (                    | j)                   | j'        *                    | j+                   n:# tX          $ r- tZ          .                    t_          j0                                w xY wtG          j1                    | _2        | j2        S )Nascii   _s   daphne-root-pathlatin1hostports   sec-websocket-protocolc                 6    g | ]}|                                 S  )strip).0xs     U/home/alex/cs2snipeproduction/venv/lib/python3.11/site-packages/daphne/ws_protocol.py
<listcomp>z/WebSocketProtocol.onConnect.<locals>.<listcomp>G   s-     $ $ $&'		$ $ $    ,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$   headers           r   	onConnectzWebSocketProtocol.onConnect   sa   l/&&t,,,"&.!Y[[=	!#D&4466 V Ve{{7++4<<::<<#666%,U^^DNN&--tzz||U\\(=S=S.TUUUU>))++D>))++DtV$$ (v)>)> ($'	NNDI#> $'	NNDI#>  #' #' {9 7L+,,K>K;K<$8 84 $"4 L!%!3  666$ $+25<<3H3H+I+I+O+OPS+T+T$ $ $L  ++G44DI(-(;.'#DI$4$4W$=$=>> $	!%#1$($:".".$0
 
) )D% (4)55d6RSSS)44T5QRRR 	 	 	 LL-//000		 #(."2"2&&s   <KM 7Nc           	          || _         | j                             ddi           | j                            dd| j        j        | j        rdt          | j                  z  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   r7   tuple)rO   rY   s     r   rE   z)WebSocketProtocol.applicationCreateWorkedh   s     "3))63F*GHHH)9=9ISGeD$45555t 		
 		
 		
 		
 		
r   c                 :    t                               |           |S )z9
        Called when application creation fails.
        )rI   rJ   )rO   failures     r   rG   z)WebSocketProtocol.applicationCreateFailed|   s     	Wr   c           	          t                               d| j                   | j                            dd| j        j        | j        rdt          | j                  z  nd d           d S )Nz!WebSocket %s open and establishedr   	connectedrW   rX   )rI   debugr7   r#   r[   r(   r   r\   rO   s    r   onOpenzWebSocketProtocol.onOpen   sv    8$:JKKK)9=9ISGeD$45555t 		
 		
 		
 		
 		
r   c                 j   | j         r"t                              d| j                   d S t                              d| j                   t	          j                    | _        |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)	mutedrI   ra   r7   r*   r,   rY   rZ   r>   )rO   payloadisBinarys      r   	onMessagezWebSocketProtocol.onMessage   s    : 	LL68HIIIF5t7GHHH 	"--,w??     "--,gnnV6L6LMM    r   c           	      p   | j                             |            t                              d| j                   | j        s-t          | d          r| j                            d|d           | j         	                    dd| j
        j        | j        rdt          | j                  z  ndd	           dS )
z8
        Called when Twisted closes the socket.
        zWebSocket closed for %srY   zwebsocket.disconnect)r   coder   disconnectedrW   NrX   )r#   protocol_disconnectedrI   ra   r7   rh   r5   rY   rZ   r[   r(   r   r\   )rO   wasCleanrm   reasons       r   onClosezWebSocketProtocol.onClose   s     	))$///.0@AAAz 	gd,?@@ 	"--/>>   	)9=9ISGeD$45555t 		
 		
 		
 		
 		
r   c                    d|vrt          d          |d         dk    r+|                     |                    dd                      d S |d         dk    rR| j        | j        k    r|                                  d S |                     |                    dd                      d S |d         dk    r| j        | j        k    rt          d	          |                    d
d           r)|                    dd           rt          d|d          |                    d
d           r|                     |d
         d           |                    dd           r |                     |d         d           d S d S d S )Nr   zMessage has no type definedzwebsocket.acceptsubprotocolzwebsocket.closerm   rm   zwebsocket.sendz4Socket has not been accepted, so cannot send over itre   rg   z'Got invalid WebSocket reply message on z$ - contains both bytes and text keysTF)
ValueErrorserverAcceptgetstateSTATE_CONNECTINGserverRejectserverClose
serverSend)rO   messages     r   handle_replyzWebSocketProtocol.handle_reply   s     :;;;6?000gkk->>?????V_ 111zT222!!#####  gkk&$&?&? @@@@@V_ 000zT222 !WXXX{{7D)) gkk&$.G.G  jww!   {{7D)) 8 0$777{{64(( 877777 108 8r   c                     t          | d          r+| j                            t          dd                     dS |                     d           dS )zF
        Called by the server when our application tracebacks
        rN   i  zInternal server errorrm   rq   i  ru   N)r5   rN   errbackr   sendCloseFrame)rO   	exceptions     r   handle_exceptionz"WebSocketProtocol.handle_exception   sn     4-.. 	+ #++C0GHHH     T*****r   Nc                 ~    | j                             |           | ` t                              d| j                   dS )zO
        Called when we get a message saying to accept the connection.
        z$WebSocket %s accepted by applicationN)rN   callbackrI   ra   r7   )rO   rt   s     r   rw   zWebSocketProtocol.serverAccept   s?     	((555#;T=MNNNNNr   c           	      ^   | j                             t          dd                     | ` | j                            |            t
                              d| j                   | j                            dd| j	        j
        | j        rdt          | j                  z  ndd	           dS )
zO
        Called when we get a message saying to reject the connection.
        i  zAccess deniedr   z$WebSocket %s rejected by applicationr   rejectedrW   NrX   )rN   r   r   r#   ro   rI   ra   r7   r[   r(   r   r\   rb   s    r   r{   zWebSocketProtocol.serverReject   s     	''O<<<	
 	
 	
 #))$///;T=MNNN)9=9ISGeD$45555t 		
 		
 		
 		
 		
r   c                    | 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 %srf   N)ry   rz   rw   rI   ra   r7   sendMessager/   )rO   contentbinarys      r   r}   zWebSocketProtocol.serverSend   s     :...=t?OPPP 	=Wf-----W^^F33V<<<<<r   c                 >    |dn|}|                      |           dS )zA
        Server-side channel message to close the socket
        Ni  ru   )	sendClose)rO   rm   s     r   r|   zWebSocketProtocol.serverClose  s+     |ttD!!!!!r   c                 8    t          j                     | j        z
  S )z>
        Returns the time since the socket was opened
        )r*   r+   rb   s    r   durationzWebSocketProtocol.duration  s     y{{T///r   c                    |                                  | j        j        k    r$| j        j        dk    r|                                  | j        | j        k    r:|                                  | j        j        k    r|                                  dS dS | j        | j        k    rWt          j	                    | j
        z
  | j        j        k    r0|                                  t          j	                    | _
        dS dS dS )zK
        Called periodically to see if we should timeout something
        r   N)r   r#   websocket_timeoutr|   ry   rz   websocket_connect_timeoutr{   
STATE_OPENr*   r,   ping_interval_sendAutoPingrb   s    r   check_timeoutsz WebSocketProtocol.check_timeouts  s     MMOOdk;;;-22 :...}}!FFF!!##### GFZ4?**	dn,0III""$$$!% +*IIr   c                 :    t          t          |                     S N)hashidrb   s    r   __hash__zWebSocketProtocol.__hash__*  s    BtHH~~r   c                 B    t          |           t          |          k    S r   )r   )rO   others     r   __eq__zWebSocketProtocol.__eq__-  s    $xx2e99$$r   c                 (    d| j         d| j        dS )Nz<WebSocketProtocol client=z path=>)r7   r   rb   s    r   __repr__zWebSocketProtocol.__repr__0  s     TD,<TTdiTTTTr   r   )F)__name__
__module____qualname____doc__application_typerh   rT   rE   rG   rc   rk   rr   r   r   rw   r{   r}   r|   r   r   r   r   r   r   r   r   r   r      sH        
 # EI' I' I'V
 
 
(  
 
 
   
 
 
.8 8 8.+ + +O O O O
 
 
*
= 
= 
= 
=" " " "0 0 0- - -(  % % %U U U U Ur   r   c                   ,     e Zd ZdZeZd Z fdZ xZS )WebSocketFactoryz
    Factory subclass that remembers what the "main"
    factory is, so WebSocket protocols can access it
    to get reply ID info.
    c                 >    || _         t          j        | g|R i | d S r   )r&   r   __init__)rO   r&   argskwargss       r   r   zWebSocketFactory.__init__=  s1    ('>t>>>v>>>>>r   c                     	 t                                          |          }| |_        |S # t          $ r0 t                              dt          j                    z              w xY w)zh
        Builds protocol instances. We use this to inject the factory object into the protocol.
        zCannot build protocol: %s)superbuildProtocolr%   rH   rI   rJ   rK   rL   )rO   addrprotocol	__class__s      r   r   zWebSocketFactory.buildProtocolA  sk    	ww,,T22H#HO 	 	 	LL4y7K7M7MMNNN	s	   )- :A')	r   r   r   r   r   r   r   r   __classcell__)r   s   @r   r   r   4  sX          !H? ? ?
 
 
 
 
 
 
 
 
r   r   )loggingr*   rK   urllib.parser   autobahn.twisted.websocketr   r   r   twisted.internetr   utilsr	   	getLoggerr   rI   r   r   r   r   r   <module>r      s                             
 # " " " " " ( ( ( ( ( (		8	$	$_U _U _U _U _U/ _U _U _UD	    -     r   