
    (jR9                         S r SSKrSSKrSSKrSSKrSrSrSrSrSr	Sr
SrS	rS
rSrSrSrSrSrSrSrSrSr " S S5      rg)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                   v    \ rS rSrSrS rS rS rS rS r	S r
S	 rS
 rS rS rS rS rS rS rSS jrSrg)WebSocketProtocol*   zWebSocket 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                 l   Xl         X l        X0l        X@l        SU l        SU l        SU l        SU l        SU l        SU l	        [        R                  " 5       U l        / U l        SU l        [        R                  " 5       U l        [#        5       U l        [        R                  " 5       U l        SU l        g)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        O/var/www/html/KUNJ/venv/lib/python3.13/site-packages/gunicorn/asgi/websocket.py__init__WebSocketProtocol.__init__1   s     #
 !$#MMO  $ &mmo !{"==?	    c                 ~    U(       a6  U R                   R                  U5        U R                  R                  5         gg)zqFeed incoming data from the parent protocol's data_received().

Args:
    data: bytes received on the connection
N)r   extendr    set)r"   datas     r#   	feed_dataWebSocketProtocol.feed_dataU   s0     LL%  " r&   c                 F    SU l         U R                  R                  5         g)z+Signal that the connection has been closed.TN)r!   r    r)   r"   s    r#   feed_eofWebSocketProtocol.feed_eof_   s    	r&   c                   #    U R                   R                  SS05      I Sh  vN   [        R                  " U R	                  5       5      n U R                  U R                  U R                  U R                  5      I Sh  vN   U R                  (       dv  U R                  (       ae  U R                  (       dT  U R                  [         S5      I Sh  vN    [        R"                  " U R$                  R'                  5       SS9I Sh  vN   UR+                  5          UI Sh  vN   g GN N! [         a    U R                  R                  S5         Nf = f N NR! [        R(                   a
    SU l         Nmf = f NZ! [        R,                   a     gf = f! U R                  (       d  U R                  (       a  U R                  (       dx  U R                  [         S5      I Sh  vN     [        R"                  " U R$                  R'                  5       SS9I Sh  vN    O!! [        R(                   a
    SU l         Of = fUR+                  5          UI Sh  vN    f ! [        R,                   a     f f = f= f7f)	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#   run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=  !J D)(J 4D. D,D. AJ EJ 0E E	E J F  #E>$F  (J ,D. .%EF EF J E E;8J :E;;J >F   FJ FJ AI='G*(I=.0H%H!H%$I=%I I=II=I#II#"I=#I:7I=9I::I==J c                 R   #    U R                   R                  5       I Sh  vN $  N7f)zASGI receive callable.N)r   getr.   s    r#   r9   WebSocketProtocol._receive   s      ((,,....s   '%'c                   #    US   nUS:X  a=  U R                   (       a  [        S5      eU R                  U5      I Sh  vN   SU l         gUS:X  a  U R                   (       d  [        S5      eU R                  (       a  [        S5      eUR	                  S	5      nUR	                  S
5      nUb.  U R                  [        UR                  S5      5      I Sh  vN   gUb  U R                  [        U5      I Sh  vN   ggUS:X  a  UR	                  S[        5      nUR	                  SS5      nU R                  XV5      I Sh  vN    [        R                  " U R                  R                  5       SS9I Sh  vN   U R&                  R)                  5         gg GNZ N N N] N)! [        R                   a?    U R                   R#                  S5        SU l        U R                  R%                  5          Nyf = f7f)zASGI send callable.r2   zwebsocket.acceptzWebSocket already acceptedNTzwebsocket.sendzWebSocket not acceptedzWebSocket closedtextbytesutf-8zwebsocket.closecodereasonr   r3   r4   z!WebSocket close handshake timeout)r   RuntimeError_send_acceptr   rH   _send_frameOPCODE_TEXTencodeOPCODE_BINARYCLOSE_NORMALr=   r   r?   r   r@   rA   r   debugr)   r   close)r"   messagemsg_typerK   
bytes_datarN   rO   s          r#   r:   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~   <G9FBG9F!G98F9AG9FG90F# 7F!8F# <G9G9G9G9!F# #AG63G95G66G9c                   #    SnU R                   S    H  u  p4US:X  d  M  Un  O   U(       d  [        S5      e[        R                  " [        R
                  " U[        -   5      R                  5       5      R                  S5      nSSSS	U S
3/nUR                  S5      nU(       a  UR                  SU S
35        UR                  S/ 5      nU Hh  u  p4[        U[        5      (       a  UR                  S5      n[        U[        5      (       a  UR                  S5      nUR                  U SU S
35        Mj     UR                  S
5        U R                  R                  SR                  U5      R!                  S5      5        g7f)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   rP   base64	b64encodehashlibsha1WS_GUIDdigestdecoderH   append
isinstancerL   r   writejoinrT   )	r"   rY   ws_keynamevalue
accept_keyr^   r`   extra_headerss	            r#   rQ   WebSocketProtocol._send_accept   sc     ::i0KD++ 1
 ABB %%LL')*113

&/ 	 3$%$ZL5	
 kk-0NN5k]$GH  Ir2(KD$&&{{9-%''Y/NNdV2eWD12 ) 	vRWWW-44Y?@s   F	E(F	c                   #     U R                   (       a$  U R                  (       GaY  U R                  (       GdG  U R                  5       I Sh  vN nUc  GO*Uu  p#U[        :X  a  U R                  U5      I Sh  vN   GOU[        :X  a  U R                  [        U5      I Sh  vN   OU[        :X  a  OU[        :X  a6  U R                  R                  SUR                  S5      S.5      I Sh  vN   OTU[        :X  a'  U R                  R                  SUS.5      I Sh  vN   O#U[        :X  a  U R                  U5      I Sh  vN   U R                   (       d  GM"  U R                  (       a  U R                  (       d  GMG  U R                   (       dE  SU l         U R                  R                  SU R*                  =(       d    [,        S	.5      I Sh  vN   gg GN GNb GN; N N N! [         R"                   a    e [$         a&  nU R&                  R)                  SU5         SnANSnAff = f N\! U R                   (       dF  SU l         U R                  R                  SU R*                  =(       d    [,        S	.5      I Sh  vN    f f = f7f)
z+Read and process incoming WebSocket frames.Nzwebsocket.receiverM   )r2   rK   )r2   rL   zWebSocket read error: %sTzwebsocket.disconnect)r2   rN   )r   r   r   _read_frameOPCODE_CLOSE_handle_closeOPCODE_PINGrR   OPCODE_PONGrS   r   r6   rg   rU   OPCODE_CONTINUATION_handle_continuationr   rC   r;   r   rW   r   CLOSE_ABNORMAL)r"   frameopcodepayloades        r#   r8   WebSocketProtocol._read_frames   s'    ,	 kkd&6&6&6t?S?S?S"..00="'\),,W555[(**;@@@{*{*--11 3 'w 73    },--11 3!(3    2233G<<<9 kkkd&6&6t?S?S?SH ;;"))--2 OO=~/    G 1 6 A

 =%% 	 	:HHNN5q99	: ;;"))--2 OO=~/    s   JAG& GG& H/ "G& 8G9G& =H/ ?#G& "G#A
G& -G .0G& G"#G& G$G& "G&  AJH-JG& G& G&  G& "G& $G& &H*H% H/ %H**H/ -J/AJ JJJc                   #    U R                  S5      I Sh  vN nU(       d  gUS   US   p2US-	  S-  nUS-	  S-  nUS-	  S-  nUS-	  S-  nUS	-  nU(       d  U(       d  U(       a  U R                  [        S
5      I Sh  vN   gUS-	  S-  n	US-  n
U	(       d  U R                  [        S5      I Sh  vN   gU
S:X  a<  U R                  S5      I Sh  vN nU(       d  g[        R                  " SU5      S   n
OAU
S:X  a;  U R                  S5      I Sh  vN nU(       d  g[        R                  " SU5      S   n
U R                  S5      I Sh  vN nU(       d  gU R                  U
5      I Sh  vN nUc  gU R                  X5      nU[        :X  a  U R                  c  U R                  [        S5      I Sh  vN   gU R                  R                  U5        U(       a8  SR                  U R                  5      nU R                  n/ U l        SU l        X4$ [        S4$ U[        [        4;   a   U(       d  Xl        U/U l        [        S4$ X4$ X4$  GN? GN GN GN GNM GN N N7f)zcRead 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_exactr=   CLOSE_PROTOCOL_ERRORstructunpack_unmaskrx   r   r   rh   rk   rS   rU   )r"   header
first_bytesecond_bytefinrsv1rsv2rsv3r|   maskedpayload_lenext_lenmasking_keyr}   full_payloadfinal_opcodes                   r#   rs   WebSocketProtocol._read_frame  st     ''**"()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"$(,%$33'--]33(.%#*)+S11$$ $$S + I M
 0
 0 0
 6 Xs   I,IA(I, I2I,3I4I,IAI,I":I,I% I,1I(2A	I,;I*<BI,I,I,I,"I,%I,(I,*I,c                   #    [        U R                  5      U:  a  U R                  (       a  gU R                  R	                  5         [        U R                  5      U:  a  OhU R                  R                  5       I Sh  vN   U R                  (       a  [        U R                  5      U:  a  g[        U R                  5      U:  a  M  [        U R                  SU 5      nU R                  SU2	 U$  Ns7f)zpRead exactly n bytes from internal buffer.

Waits for data via the callback-fed buffer instead of StreamReader.
N)lenr   r!   r    clearr@   rL   )r"   nr*   s      r#   r   WebSocketProtocol._read_exactX  s     
 $,,!#yy""$ 4<< A%""'')))yyS.2 $,,!# T\\"1%&LL! *s   A=C5?C3 AC5
*C5c                 R   ^ U(       d  U$ [        U4S j[        U5       5       5      $ )zUnmask WebSocket payload data.c              3   >   >#    U  H  u  pUTUS -     -  v   M     g7f)r   N ).0ibr   s      r#   	<genexpr>,WebSocketProtocol._unmask.<locals>.<genexpr>r  s#     K8JQQU++8Js   )rL   	enumerate)r"   r}   r   s     `r#   r   WebSocketProtocol._unmaskm  s!    NK	'8JKKKr&   c                   #    [        U5      S:  a;  [        R                  " SUSS 5      S   U l        USS R	                  SSS9U l        O[        U l        SU l        S	U l        U R                  (       d.  U R                  U R                  U R
                  5      I Sh  vN   S	U l
        U R                  R                  5         g N&7f)
zHandle incoming close frame.r   r   Nr   rM   replace)errorsr   T)r   r   r   r   rg   r   CLOSE_NO_STATUSr   r   r=   r   r   r)   r"   r}   s     r#   ru   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                    #    g7f)z=Handle continuation frame (already processed in _read_frame).Nr   r   s     r#   ry   &WebSocketProtocol._handle_continuation  s     s   c                 .  #    [        U[        5      (       a  UR                  S5      n[        U5      n[	        5       nUR                  SU-  5        US:  a  UR                  U5        OuUS:  a8  UR                  S5        UR                  [        R                  " SU5      5        O7UR                  S5        UR                  [        R                  " SU5      5        UR                  U5        U R                  R                  [        U5      5        g7f)	zBSend a WebSocket frame.

Server frames are not masked (RFC 6455).
rM      r   i   r   r   r   N)ri   strrT   r   r   rh   r(   r   packr   rj   rL   )r"   r|   r}   lengthr{   s        r#   rR   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                 L  #    U R                   (       a  g[        R                  " SU5      nU(       a  X2R                  S5      SS -  nU R	                  [
        U5      I Sh  vN   SU l         U R                  (       a"  SU l        U R                  R                  5         gg N?7f)zSend a close frame.Nr   rM   {   T)
r   r   r   rT   rR   rt   r   r   r   r)   )r"   rN   rO   r}   s       r#   r=   WebSocketProtocol._send_close  s     ++dD)}}W-ds33G|W555 DK!!#  	 	6s   A B$"B"#A B$)r   r   r   r   r    r!   r   r   r   r   r   r   r   r   r   r   r   N)r   )__name__
__module____qualname____firstlineno____doc__r$   r+   r/   rE   r9   r:   rQ   r8   rs   r   r   ru   ry   rR   r=   __static_attributes__r   r&   r#   r	   r	   *   s[    "H#
8/&#P(AT.`P%d*L $L+:$r&   r	   )r   r   ra   rc   r   rx   rS   rU   rt   rv   rw   rV   CLOSE_GOING_AWAYr   CLOSE_UNSUPPORTEDr   rz   CLOSE_INVALID_DATACLOSE_POLICY_VIOLATIONCLOSE_MESSAGE_TOO_BIGCLOSE_MANDATORY_EXTr>   re   r	   r   r&   r#   <module>r      s   
                2K$ K$r&   