
    \JjR9                         d Z ddlZddlZddlZddl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ZdZdZdZdZdZ G d d      Zy)ze
WebSocket protocol handler for ASGI.

Implements RFC 6455 WebSocket protocol for ASGI applications.
    N         	   
   i  i  i  i  i  i  i  i  i  i  i  s$   258EAFA5-E914-47DA-95CA-C5AB0DC85B11c                   l    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 Zd Zd Zd ZddZy)WebSocketProtocolzWebSocket connection handler for ASGI applications.

    Uses callback-based data feeding instead of StreamReader for efficiency.
    Data is fed via feed_data() from the parent protocol's data_received().
    c                 n   || _         || _        || _        || _        d| _        d| _        d| _        d| _        d| _        d| _	        t        j                         | _        g | _        d| _        t        j                         | _        t#               | _        t        j                         | _        d| _        y)zInitialize WebSocket protocol handler.

        Args:
            transport: asyncio transport for writing
            scope: ASGI WebSocket scope dict
            app: ASGI application callable
            log: Logger instance
        FN )	transportscopeapplogacceptedclosed
close_codeclose_reason_close_sent_close_receivedasyncioEvent_close_event
_fragments_fragment_opcodeQueue_receive_queue	bytearray_buffer_data_event_eof)selfr   r   r   r   s        R/var/www/html/Extract/venv/lib/python3.12/site-packages/gunicorn/asgi/websocket.py__init__zWebSocketProtocol.__init__1   s     #
 !$#MMO  $ &mmo !{"==?	    c                 t    |r6| j                   j                  |       | j                  j                          yy)zFeed incoming data from the parent protocol's data_received().

        Args:
            data: bytes received on the connection
        N)r   extendr   set)r!   datas     r"   	feed_datazWebSocketProtocol.feed_dataU   s0     LL%  " r$   c                 F    d| _         | j                  j                          y)z+Signal that the connection has been closed.TN)r    r   r'   r!   s    r"   feed_eofzWebSocketProtocol.feed_eof_   s    	r$   c                   K   | j                   j                  ddi       d{    t        j                  | j	                               }	 | j                  | j                  | j                  | j                         d{    | j                  sn| j                  rb| j                  sV| j                  t         d       d{    	 t        j"                  | j$                  j'                         d       d{    |j+                          	 | d{    y7 7 # t        $ r | j                  j                  d       Y w xY w7 7 P# t        j(                  $ r
 d| _        Y jw xY w7 W# t        j,                  $ r Y yw xY w# | j                  s| j                  r| j                  sy| j                  t         d       d{  7   	 t        j"                  | j$                  j'                         d       d{  7   n # t        j(                  $ r
 d| _        Y nw xY w|j+                          	 | d{  7   w # t        j,                  $ r Y w w xY wxY ww)	z#Run the WebSocket ASGI application.typezwebsocket.connectNz#Error in WebSocket ASGI applicationzApplication error      @timeoutT)r   putr   create_task_read_framesr   r   _receive_send	Exceptionr   	exceptionr   r   r   _send_closeCLOSE_INTERNAL_ERRORwait_forr   waitTimeoutErrorcancelCancelledError)r!   	read_tasks     r"   runzWebSocketProtocol.rund   s     !!%%v/B&CDDD ''(9(9(;<		((4::t}}djjAAA
 ;;4==9I9I&&';=PQQQ'!**4+<+<+A+A+CSQQQ + 	E B 	FHHDE	F
 R R++ '"&DK'
  ))  ;;4==9I9I&&';=PQQQ'!**4+<+<+A+A+CSQQQ++ '"&DK' )) s;  !ID'I4D  DD =IE	I2E :E;E ?IE/ E-E/ ID $EF EF 	IE E*'I)E**I-E/ /FIFI>IG	I2H?H HIH# I"H##I7I<H?=IIIIIIIc                 R   K   | j                   j                          d{   S 7 w)zASGI receive callable.N)r   getr+   s    r"   r5   zWebSocketProtocol._receive   s!     ((,,....s   '%'c                   K   |d   }|dk(  r8| j                   rt        d      | j                  |       d{    d| _         y|dk(  r| j                   st        d      | j                  rt        d      |j	                  d	      }|j	                  d
      }|.| j                  t        |j                  d             d{    y|| j                  t        |       d{    yy|dk(  r|j	                  dt              }|j	                  dd      }| j                  ||       d{    	 t        j                  | j                  j                         d       d{    | j&                  j)                          yy7 O7 7 7 _7 )# t        j                  $ r? | j                   j#                  d       d| _        | j                  j%                          Y xw xY ww)zASGI send callable.r.   zwebsocket.acceptzWebSocket already acceptedNTzwebsocket.sendzWebSocket not acceptedzWebSocket closedtextbytesutf-8zwebsocket.closecodereasonr   r/   r0   z!WebSocket close handshake timeout)r   RuntimeError_send_acceptr   rC   _send_frameOPCODE_TEXTencodeOPCODE_BINARYCLOSE_NORMALr9   r   r;   r   r<   r=   r   debugr'   r   close)r!   messagemsg_typerE   
bytes_datarH   rI   s          r"   r6   zWebSocketProtocol._send   s    6?))}}"#?@@##G,,, DM))=="#;<<{{"#566 ;;v&D W-J&&{DKK4HIII'&&}jAAA ( **;;v|4D[[2.F""4000(&&t'8'8'='='?MMM NN  " +# - JA
 1 N'' (BC"!!%%'(s~   6G'FBG'F
 G'%F&AG'.F/G'42F &F'F +G'
G'G'G'F AG$!G'#G$$G'c                   K   d}| j                   d   D ]  \  }}|dk(  s|} n |st        d      t        j                  t	        j
                  |t        z         j                               j                  d      }dddd	| d
g}|j                  d      }|r|j                  d| d
       |j                  dg       }|D ]^  \  }}t        |t              r|j                  d      }t        |t              r|j                  d      }|j                  | d| d
       ` |j                  d
       | j                  j                  dj                  |      j!                  d             yw)z)Send WebSocket handshake accept response.Nheaderss   sec-websocket-keyz Missing Sec-WebSocket-Key headerasciiz"HTTP/1.1 101 Switching Protocols
zUpgrade: websocket
zConnection: Upgrade
zSec-WebSocket-Accept: z
subprotocolzSec-WebSocket-Protocol: zlatin-1z: r   )r   rJ   base64	b64encodehashlibsha1WS_GUIDdigestdecoderC   append
isinstancerF   r   writejoinrN   )	r!   rS   ws_keynamevalue
accept_keyrW   rY   extra_headerss	            r"   rK   zWebSocketProtocol._send_accept   sl     ::i0 	KD%++	
 ABB %%LL')*113

&/ 	 3$%$ZL5	
 kk-0NN5k]$GH  Ir2( 	3KD%$&{{9-%'Y/NNdV2eWD12	3 	vRWWW-44Y?@s   E0EE0c                   K   	 | j                   r| j                  r<| j                  s/| j                          d{   }|n|\  }}|t        k(  r| j                  |       d{    n|t        k(  r| j                  t        |       d{    n|t        k(  rn|t        k(  r6| j                  j                  d|j                  d      d       d{    nR|t        k(  r'| j                  j                  d|d       d{    n"|t        k(  r| j                  |       d{    | j                   s| j                  r| j                  s/| j                   s@d| _         | j                  j                  d| j*                  xs t,        d	       d{    yy7 i7 A7 7 7 7 # t         j"                  $ r  t$        $ r&}| j&                  j)                  d|       Y d}~d}~ww xY w7 Z# | j                   sAd| _         | j                  j                  d| j*                  xs t,        d	       d{  7   w w xY ww)
z+Read and process incoming WebSocket frames.Nzwebsocket.receiverG   )r.   rE   )r.   rF   zWebSocket read error: %sTzwebsocket.disconnect)r.   rH   )r   r   r   _read_frameOPCODE_CLOSE_handle_closeOPCODE_PINGrL   OPCODE_PONGrM   r   r2   r`   rO   OPCODE_CONTINUATION_handle_continuationr   r?   r7   r   rQ   r   CLOSE_ABNORMAL)r!   frameopcodepayloades        r"   r4   zWebSocketProtocol._read_frames   s$    ,	 kkd&6&6t?S?S"..00="'\),,W555[(**;@@@{*{*--11 3 'w 73    },--11 3!(3    2233G<<<9 kkd&6&6t?S?SH ;;"))--2 OO=~/    G 1 6 A

 =%% 	 	:HHNN5q99	: ;;"))--2 OO=~/    s   I9F5 F&*F5 (F))'F5 F,AF5 F//F5 	F1
"F5 ,F3-F5 ?F5 AIG: I&F5 )F5 ,F5 /F5 1F5 3F5 5G7G2-G< 2G77G< :I<AIIIIc                 r  K   | j                  d       d{   }|sy|d   |d   }}|dz	  dz  }|dz	  dz  }|dz	  dz  }|dz	  dz  }|d	z  }|s|s|r| j                  t        d
       d{    y|dz	  dz  }	|dz  }
|	s| j                  t        d       d{    y|
dk(  r6| j                  d       d{   }|syt        j                  d|      d   }
n:|
dk(  r5| j                  d       d{   }|syt        j                  d|      d   }
| j                  d       d{   }|sy| j                  |
       d{   }|y| j                  ||      }|t        k(  r| j                  | j                  t        d       d{    y| j                  j                  |       |r9dj                  | j                        }| j                  }g | _        d| _        ||fS t        dfS |t        t        fv r|s|| _        |g| _        t        dfS ||fS ||fS 7 
7 7 7 p7 87 7 7 w)z{Read a single WebSocket frame.

        Returns:
            tuple: (opcode, payload) or None if connection closed
        r   Nr   r                  zRSV bits set   zFrame not masked~   !Hr   !QzUnexpected continuationr$   )_read_exactr9   CLOSE_PROTOCOL_ERRORstructunpack_unmaskrp   r   r   ra   rd   rM   rO   )r!   header
first_bytesecond_bytefinrsv1rsv2rsv3rt   maskedpayload_lenext_lenmasking_keyru   full_payloadfinal_opcodes                   r"   rk   zWebSocketProtocol._read_frame  s     ''**"()VAYK
Q!#a1$a1$a1$d" 44""#7HHH"a'!D( ""#79KLLL # ,,Q//G --g6q9KC ,,Q//G --g6q9K !,,Q// ((55? ,,w4 (($$,&&';=VWWWOO""7+"xx8#44"$(,%$l33'--]33(.%#*)+S11G$$ G$$S + I M
 0
 0 0
 6 Xs   H7H!AH7-H$.-H7H'H7:H*;:H75H-64H7*H0+H7H3AH7H5BH7$H7'H7*H7-H70H73H75H7c                   K   t        | j                        |k  r| j                  ry| j                  j	                          t        | j                        |k\  rn`| j                  j                          d{    | j                  rt        | j                        |k  ryt        | j                        |k  rt        | j                  d|       }| j                  d|= |S 7 kw)zRead exactly n bytes from internal buffer.

        Waits for data via the callback-fed buffer instead of StreamReader.
        N)lenr   r    r   clearr<   rF   )r!   nr(   s      r"   r   zWebSocketProtocol._read_exactX  s     
 $,,!#yy""$ 4<< A%""'')))yyS.2 $,,!# T\\"1%&LL! *s   A6C&8C$9AC&;*C&c                 F    |s|S t        fdt        |      D              S )zUnmask WebSocket payload data.c              3   :   K   | ]  \  }}||d z     z    yw)r{   N ).0ibr   s      r"   	<genexpr>z,WebSocketProtocol._unmask.<locals>.<genexpr>r  s#     K1QQU++Ks   )rF   	enumerate)r!   ru   r   s     `r"   r   zWebSocketProtocol._unmaskm  s!    NK	'8JKKKr$   c                   K   t        |      dk\  r=t        j                  d|dd       d   | _        |dd j	                  dd      | _        nt        | _        d| _        d	| _        | j                  s.| j                  | j                  | j
                         d{    d	| _
        | j                  j                          y7 &w)
zHandle incoming close frame.r   r   Nr   rG   replace)errorsr   T)r   r   r   r   r`   r   CLOSE_NO_STATUSr   r   r9   r   r   r'   r!   ru   s     r"   rm   zWebSocketProtocol._handle_closet  s     w<1$mmD'"1+>qADO ' 2 279 2 MD-DO "D# ""4??D4E4EFFF Gs   BCC'Cc                    K   yw)z=Handle continuation frame (already processed in _read_frame).Nr   r   s     r"   rq   z&WebSocketProtocol._handle_continuation  s     s   c                   K   t        |t              r|j                  d      }t        |      }t	               }|j                  d|z         |dk  r|j                  |       nr|dk  r7|j                  d       |j                  t        j                  d|             n6|j                  d       |j                  t        j                  d|             |j                  |       | j                  j                  t        |             yw)	zRSend a WebSocket frame.

        Server frames are not masked (RFC 6455).
        rG      r~   i   r   r}   r   N)rb   strrN   r   r   ra   r&   r   packr   rc   rF   )r!   rt   ru   lengthrs   s        r"   rL   zWebSocketProtocol._send_frame  s     
 gs#nnW-GW 	TF]# C<LL e^LLLLT623LLLLT623 	WU5\*s   D
Dc                 .  K   | j                   ryt        j                  d|      }|r||j                  d      dd z  }| j	                  t
        |       d{    d| _         | j                  r"d| _        | j                  j                          yy7 :w)zSend a close frame.Nr   rG   {   T)
r   r   r   rN   rL   rl   r   r   r   r'   )r!   rH   rI   ru   s       r"   r9   zWebSocketProtocol._send_close  s     ++dD)v}}W-ds33G|W555 DK!!#  	 	6s   ABB;BN)r   )__name__
__module____qualname____doc__r#   r)   r,   rA   r5   r6   rK   r4   rk   r   r   rm   rq   rL   r9   r   r$   r"   r	   r	   *   s[    "H#
8/&#P(AT.`P%d*L $L+:$r$   r	   )r   r   rZ   r\   r   rp   rM   rO   rl   rn   ro   rP   CLOSE_GOING_AWAYr   CLOSE_UNSUPPORTEDr   rr   CLOSE_INVALID_DATACLOSE_POLICY_VIOLATIONCLOSE_MESSAGE_TOO_BIGCLOSE_MANDATORY_EXTr:   r^   r	   r   r$   r"   <module>r      s   
                2K$ K$r$   