
    h{.                         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y)    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y)WebSocketProtocolzj
    Protocol which supports WebSockets and forwards incoming messages to
    the websocket channels.
    	websocketFc                 ^   | j                   j                  | _        | j                  j                  |        || _        d | _        | j                  j                  | _        t        j                         | _        t        j                         | _	        	 g | _
        |j                  j                         D ]y  \  }}|j                  d      }d|v r|j                         dk(  rt        |      | _        @| j                  j!                  |j                         |j                  d      f       { | j"                  j%                         }| j"                  j'                         }t)        |d      rYt)        |d      rMt+        |j,                        |j.                  g| _        t+        |j,                        |j.                  g| _        nd | _        d | _        | j                  j4                  rut7        t9        | j                        | j                  j4                  | j                  j:                  | j                  j<                  | j0                        \  | _        | _        g }| j                  D ]O  \  }}|dk(  st        |jA                  d            jC                  d      D cg c]  }|jE                          }}Q |jF                  j                  d      | _#        tI        jJ                  | j                  jL                  | d	t        | jF                  jA                  d            | jF                  | j                  | j                  | jN                  | j0                  | j2                  |d
	      | _(        | jP                  J| jP                  jS                  | jT                         | jP                  jW                  | jX                         tI        jd                         | _3        | jf                  S c c}w # tZ        $ r) t\        j_                  ta        jb                                 w xY w)Nascii   _s   daphne-root-pathlatin1hostports   sec-websocket-protocol,r   )	typepathraw_path	root_pathheadersquery_stringclientserversubprotocols)4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splitstripr   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   headerxs	            N/var/www/Befach/backend/env/lib/python3.12/site-packages/daphne/ws_protocol.py	onConnectzWebSocketProtocol.onConnect   s9   ll//&&t,"&..!YY[=	!#D&446e{{7+4<::<#66%,U^DN&&--tzz|U\\(=S.TU  7 >>))+D>>))+DtV$v)>$'		NDII#> $'		NDII#> #' #' {{997L++,KK>>KK;;KK<<$$84 $"4 L!%!3!366+25<<3H+I+O+OPS+T$&'	$L $ "4  ++G4DI(-(;(;..'#DII$4$4W$=> $		!%#11$($:$:".."..$0
)D% ((4))55d6R6RS))44T5Q5QR #(.."2&&&?$.  	 LL--/0		s&   G(O: <+O: 'O5>DO: 5O: :2P,c           	          || _         | j                   j                  ddi       | j                  j                  dd| j                  j
                  | j                  rdt        | j                        z  ndd       y)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   r/   tuple)rH   rT   s     rN   r>   z)WebSocketProtocol.applicationCreateWorkedh   sm     "3))63F*GH))9=9I9IGeD$4$455t		
    c                 0    t         j                  |       |S )z9
        Called when application creation fails.
        )rB   rC   )rH   failures     rN   r@   z)WebSocketProtocol.applicationCreateFailed|   s     	WrX   c           	          t         j                  d| j                         | j                  j	                  dd| j
                  j                  | j                  rdt        | j                        z  nd d       y )Nz!WebSocket %s open and establishedr   	connectedrR   rS   )rB   debugr/   r   rV   r    r   rW   rH   s    rN   onOpenzWebSocketProtocol.onOpen   s^    8$:J:JK))9=9I9IGeD$4$455t		
rX   c                 l   | j                   r!t        j                  d| j                         y t        j                  d| j                         t	        j                         | _        |r| j                  j                  d|d       y | j                  j                  d|j                  d      d       y )NzMuting incoming frame on %szWebSocket incoming frame on %szwebsocket.receive)r   bytesutf8)r   text)	mutedrB   r]   r/   r"   r$   rT   rU   r6   )rH   payloadisBinarys      rN   	onMessagezWebSocketProtocol.onMessage   s    ::LL68H8HI5t7G7GH""--,w? ""--,gnnV6LMrX   c           	         | j                   j                  |        t        j                  d| j                         | j
                  s*t        | d      r| j                  j                  d|d       | j                   j                  dd| j                  j                  | j                  rdt        | j                        z  ndd	       y)
z8
        Called when Twisted closes the socket.
        zWebSocket closed for %srT   zwebsocket.disconnect)r   coder   disconnectedrR   NrS   )r   protocol_disconnectedrB   r]   r/   rd   r-   rT   rU   rV   r    r   rW   )rH   wasCleanri   reasons       rN   onClosezWebSocketProtocol.onClose   s     	))$/.0@0@Azzgd,?@""--/> 	))9=9I9IGeD$4$455t		
rX   c                 ~   d|vrt        d      |d   dk(  r"| j                  |j                  dd              y |d   dk(  rM| j                  | j                  k(  r| j                          y | j                  |j                  dd              y |d   dk(  r| j                  | j                  k(  rt        d	      |j                  d
d       r!|j                  dd       rt        d|d      |j                  d
d       r| j                  |d
   d       |j                  dd       r| j                  |d   d       y y y )Nr   zMessage has no type definedzwebsocket.acceptsubprotocolzwebsocket.closeri   ri   zwebsocket.sendz4Socket has not been accepted, so cannot send over itra   rc   z'Got invalid WebSocket reply message on z$ - contains both bytes and text keysTF)
ValueErrorserverAcceptgetstateSTATE_CONNECTINGserverRejectserverClose
serverSend)rH   messages     rN   handle_replyzWebSocketProtocol.handle_reply   s+    :;;6?00gkk->?V_ 11zzT222!!#  gkk&$&? @V_ 00zzT222 !WXX{{7D)gkk&$.G !  {{7D) 0$7{{64(7 ) 1rX   c                     t        | d      r'| j                  j                  t        dd             y| j	                  d       y)zF
        Called by the server when our application tracebacks
        rG   i  zInternal server errorri   rm   i  rq   N)r-   rG   errbackr   sendCloseFrame)rH   	exceptions     rN   handle_exceptionz"WebSocketProtocol.handle_exception   sC     4-. ##++C0GH T*rX   Nc                 ~    | j                   j                  |       | ` t        j                  d| j                         y)zO
        Called when we get a message saying to accept the connection.
        z$WebSocket %s accepted by applicationN)rG   callbackrB   r]   r/   )rH   rp   s     rN   rs   zWebSocketProtocol.serverAccept   s3     	((5#;T=M=MNrX   c           	      z   | j                   j                  t        dd             | ` | j                  j	                  |        t
        j                  d| j                         | j                  j                  dd| j                  j                  | j                  rdt        | j                        z  ndd	       y)
zO
        Called when we get a message saying to reject the connection.
        i  zAccess deniedr}   z$WebSocket %s rejected by applicationr   rejectedrR   NrS   )rG   r~   r   r   rk   rB   r]   r/   rV   r    r   rW   r^   s    rN   rw   zWebSocketProtocol.serverReject   s     	''O<	
 #))$/;T=M=MN))9=9I9IGeD$4$455t		
rX   c                    | j                   | j                  k(  r| j                          t        j	                  d| j
                         |r| j                  ||       y| j                  |j                  d      |       y)z@
        Server-side channel message to send a message.
        z&Sent WebSocket packet to client for %srb   N)ru   rv   rs   rB   r]   r/   sendMessager'   )rH   contentbinarys      rN   ry   zWebSocketProtocol.serverSend   sc     ::...=t?O?OPWf-W^^F3V<rX   c                 4    |dn|}| j                  |       y)zA
        Server-side channel message to close the socket
        Ni  rq   )	sendClose)rH   ri   s     rN   rx   zWebSocketProtocol.serverClose  s     |tD!rX   c                 D    t        j                          | j                  z
  S )z>
        Returns the time since the socket was opened
        )r"   r#   r^   s    rN   durationzWebSocketProtocol.duration  s     yy{T////rX   c                 @   | j                         | j                  j                  kD  r)| j                  j                  dk\  r| j                          | j                  | j
                  k(  r9| j                         | j                  j                  kD  r| j                          yy| j                  | j                  k(  rct        j                         | j                  z
  | j                  j                  kD  r*| j                          t        j                         | _
        yyy)zK
        Called periodically to see if we should timeout something
        r   N)r   r   websocket_timeoutrx   ru   rv   websocket_connect_timeoutrw   
STATE_OPENr"   r$   ping_interval_sendAutoPingr^   s    rN   check_timeoutsz WebSocketProtocol.check_timeouts  s     MMOdkk;;;--2 ::...}}!F!FF!!# GZZ4??*		dnn,0I0II""$!% J +rX   c                 *    t        t        |             S N)hashidr^   s    rN   __hash__zWebSocketProtocol.__hash__*  s    BtH~rX   c                 0    t        |       t        |      k(  S r   )r   )rH   others     rN   __eq__zWebSocketProtocol.__eq__-  s    $x2e9$$rX   c                 <    d| j                   d| j                  dS )Nz<WebSocketProtocol client=z path=>)r/   r   r^   s    rN   __repr__zWebSocketProtocol.__repr__0  s#    +D,<,<+?vdii]RSTTrX   r   )F)__name__
__module____qualname____doc__application_typerd   rO   r>   r@   r_   rg   rn   r{   r   rs   rw   ry   rx   r   r   r   r   r    rX   rN   r   r      so    
 # EI'V
(
 
.8.+O
*
="0-(%UrX   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                 D    || _         t        j                  | g|i | y r   )r   r   __init__)rH   r   argskwargss       rN   r   zWebSocketFactory.__init__=  s"    (''>t>v>rX   c                     	 t         |   |      }| |_        |S # t        $ r, t        j                  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   rA   rB   rC   rD   rE   )rH   addrprotocol	__class__s      rN   r   zWebSocketFactory.buildProtocolA  sQ    	w,T2H#HO 	LL4y7K7K7MMN	s	    5A)	r   r   r   r   r   r   r   r   __classcell__)r   s   @rN   r   r   4  s     !H?
 
rX   r   )loggingr"   rD   urllib.parser   autobahn.twisted.websocketr   r   r   twisted.internetr   utilsr	   	getLoggerr   rB   r   r   r   rX   rN   <module>r      sT         
 # (			8	$_U/ _UD	- rX   