
    z
gk-                         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 | _        t          j                    | _        t          j                    | _        	 g | _	        |j
                                        D ]`\  }}|                    d          }d|v r| j	                            |                                |                    d          f           a| j                                        }| j                                        }t%          |d          rQt%          |d          rAt'          |j                  |j        g| _        t'          |j                  |j        g| _        nd | _        d | _        | j        j        rUt3          t5          | j	                  | j        j        | j        j        | j        j        | j                  \  | _        | _        g }| j	        D ]J\  }}|dk    r?d t=          |                    d                                         d          D             }K|j!                            d          | _!        tE          j#        | j        j$        | d	t=          | j!                            d                    | j!        | j	        | j%        | j        | j        |d
          | _&        | j&        >| j&        '                    | j(                   | j&        )                    | j*                   n:# tV          $ r- tX          -                    t]          j/                                w xY wtE          j0                    | _1        | j1        S )Nascii   _latin1hostports   sec-websocket-protocolc                 6    g | ]}|                                 S  )strip).0xs     D/var/www/html/env/lib/python3.11/site-packages/daphne/ws_protocol.py
<listcomp>z/WebSocketProtocol.onConnect.<locals>.<listcomp>C   s-     $ $ $&'		$ $ $    ,r   )typepathraw_pathheadersquery_stringclientserversubprotocols)2factoryserver_classr"   protocol_connectedrequestprotocol_to_accepttimesocket_opened	last_pingclean_headersr   itemsencodeappendlower	transportgetPeergetHosthasattrstrr   r   client_addrserver_addrproxy_forwarded_address_headerr	   dictproxy_forwarded_port_headerproxy_forwarded_proto_headerclient_schemer   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   s-   l/&&t,,,"&!Y[[9	!#D&4466 R Re{{7++4<<"))4::<<h9O9O*PQQQQ>))++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   +J'L 7M
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   r6   tuple)rN   rX   s     r   rD   z)WebSocketProtocol.applicationCreateWorkedc   s     "3))63F*GHHH)#'E$*:$;$;;;	 		
 		
 		
 		
 		
r   c                 :    t                               |           |S )z9
        Called when application creation fails.
        )rH   rI   )rN   failures     r   rF   z)WebSocketProtocol.applicationCreateFailedw   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   	connectedrV   rW   )rH   debugr6   r"   rZ   r'   r   r[   rN   s    r   onOpenzWebSocketProtocol.onOpen   sy    8$:JKKK)#'E$*:$;$;;;	 		
 		
 		
 		
 		
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)	mutedrH   r`   r6   r)   r+   rX   rY   r=   )rN   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 %srX   zwebsocket.disconnect)r   coder   disconnectedrV   NrW   )r"   protocol_disconnectedrH   r`   r6   rg   r4   rX   rY   rZ   r'   r   r[   )rN   wasCleanrl   reasons       r   onClosezWebSocketProtocol.onClose   s     	))$///.0@AAAz 	gd,?@@ 	"--/>>   	)#'E$*:$;$;;;	 		
 		
 		
 		
 		
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.closerl   rl   zwebsocket.sendz4Socket has not been accepted, so cannot send over itrd   rf   z'Got invalid WebSocket reply message on z$ - contains both bytes and text keysTF)
ValueErrorserverAcceptgetstateSTATE_CONNECTINGserverRejectserverClose
serverSend)rN   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
        rM   i  zInternal server errorrl   rp   i  rt   N)r4   rM   errbackr   sendCloseFrame)rN   	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)rM   callbackrH   r`   r6   )rN   rs   s     r   rv   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   rejectedrV   NrW   )rM   r   r   r"   rn   rH   r`   r6   rZ   r'   r   r[   ra   s    r   rz   zWebSocketProtocol.serverReject   s     	''O<<<	
 	
 	
 #))$///;T=MNNN)#'E$*:$;$;;;	 		
 		
 		
 		
 		
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 %sre   N)rx   ry   rv   rH   r`   r6   sendMessager.   )rN   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  rt   )	sendClose)rN   rl   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*   ra   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{   rx   ry   websocket_connect_timeoutrz   
STATE_OPENr)   r+   ping_interval_sendAutoPingra   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idra   s    r   __hash__zWebSocketProtocol.__hash__%  s    BtHH~~r   c                 B    t          |           t          |          k    S r   )r   )rN   others     r   __eq__zWebSocketProtocol.__eq__(  s    $xx2e99$$r   c                 (    d| j         d| j        dS )Nz<WebSocketProtocol client=z path=>)r6   r   ra   s    r   __repr__zWebSocketProtocol.__repr__+  s     :>:J:J:JDIIIVVr   r   )F)__name__
__module____qualname____doc__application_typerg   rS   rD   rF   rb   rj   rq   r~   r   rv   rz   r|   r{   r   r   r   r   r   r   r   r   r   r      sH        
 # ED' D' D'L
 
 
(  
 
 
   
 
 
.8 8 8.+ + +O O O O
 
 
*
= 
= 
= 
=" " " "0 0 0- - -(  % % %W W W W W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__)rN   r%   argskwargss       r   r   zWebSocketFactory.__init__8  s1    ('>t>>>v>>>>>r   c                     	 t          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)	superr   buildProtocolr$   rG   rH   rI   rJ   rK   )rN   addrprotocol	__class__s      r   r   zWebSocketFactory.buildProtocol<  sr    	-t44BB4HHH#HO 	 	 	LL4y7K7M7MMNNN	s	   04 :A.)	r   r   r   r   r   r   r   r   __classcell__)r   s   @r   r   r   /  sX          !H? ? ?
 
 
 
 
 
 
 
 
r   r   )loggingr)   rJ   urllib.parser   autobahn.twisted.websocketr   r   r   twisted.internetr   utilsr	   	getLoggerr   rH   r   r   r   r   r   <module>r      s                             
 # " " " " " ( ( ( ( ( (		8	$	$ZW ZW ZW ZW ZW/ ZW ZW ZWz    -     r   