Ë
    Û�ðif3  ã                   ó„   — 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)ÚWebSocketProtocolzÒWebSocket 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                 ó   — || _         || _        || _        || _        d| _        d| _        d| _        d| _        g | _        d| _	        t        j                  «       | _        t        «       | _        t        j                  «       | _        d| _        y)zìInitialize 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Ú
_fragmentsÚ_fragment_opcodeÚasyncioÚQueueÚ_receive_queueÚ	bytearrayÚ_bufferÚEventÚ_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~   € ð #ˆŒØˆŒ
ØˆŒØˆŒàˆŒØˆŒØˆŒØˆÔð ˆŒØ $ˆÔô &Ÿm™m›oˆÔô !“{ˆŒÜ"Ÿ=™=›?ˆÔØˆ�	ó    c                 ót   — |r6| j                   j                  |«       | j                  j                  «        yy)z‰Feed 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_dataP   s0   € ñ Ø�L‰L×Ñ Ô%Ø×Ñ× Ñ Õ"ð 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_eofZ   s   € àˆŒ	Ø×Ñ×ÑÕr!   c              ƒ   ó4  K  — | j                   j                  ddi«      ƒ d{  –—†  t        j                  | j	                  «       «      }	 | j                  | j                  | j                  | j                  «      ƒ d{  –—†  |j                  «        	 |ƒ d{  –—†  | j                  s,| j                  r| j!                  t"        d«      ƒ d{  –—†  yyy7 Œµ7 ŒZ# t        $ r | j                  j                  d«       Y Œ~w xY w7 Œk# t        j                  $ r Y Œ~w xY w7 ŒP# |j                  «        	 |ƒ d{  –—†7   n# t        j                  $ r Y nw xY w| j                  s-| j                  r | j!                  t"        d«      ƒ d{  –—†7   w w w xY w­w)z#Run the WebSocket ASGI application.Útypezwebsocket.connectNz#Error in WebSocket ASGI applicationzApplication error)r   Úputr   Úcreate_taskÚ_read_framesr   r   Ú_receiveÚ_sendÚ	Exceptionr   Ú	exceptionÚcancelÚCancelledErrorr   r   Ú_send_closeÚCLOSE_INTERNAL_ERROR)r   Ú	read_tasks     r   ÚrunzWebSocketProtocol.run_   sh  è ø€ ð ×!Ñ!×%Ñ% vÐ/BÐ&CÓD×DÐDô ×'Ñ'¨×(9Ñ(9Ó(;Ó<ˆ	ð	RØ—(‘(˜4Ÿ:™: t§}¡}°d·j±jÓA×AÐAð ×ÑÔðØ—�ð
 —;’; 4§=¢=Ø×&Ñ&Ô';Ð=PÓQ×QÑQð $1�;ð# 	Eøð BùÜò 	FØ�H‰H×ÑÐDÖEð	Fúð
  ùÜ×)Ñ)ò Ùðúð
 Rùð ×ÑÔðØ—’øÜ×)Ñ)ò Ùðúð —;’; 4§=¢=Ø×&Ñ&Ô';Ð=PÓQ×QÒQð $1�;üsÏ   ‚!F£C¤'FÁ4C Â CÂC ÂFÂD	 ÂDÂD	 Â 1FÃD"ÃFÃC Ã$DÄD$ ÄDÄD$ ÄD	 Ä	DÄFÄDÄFÄ$FÄ6EÄ;D>Ä<EÅFÅEÅFÅEÅ4FÆFÆFÆFc              ƒ   óR   K  — | j                   j                  «       ƒ d{  –—† S 7 Œ­w)zASGI receive callable.N)r   Úgetr(   s    r   r/   zWebSocketProtocol._receivev   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«      ‚d	|v r1| j	                  t
        |d	   j                  d
«      «      ƒ d{  –—†  yd|v r"| j	                  t        |d   «      ƒ d{  –—†  yy|dk(  rJ|j                  dt        «      }|j                  dd«      }| j                  ||«      ƒ d{  –—†  d| _        yy7 Œë7 Œ~7 ŒZ7 Œ­w)zASGI send callable.r+   zwebsocket.acceptzWebSocket already acceptedNTzwebsocket.sendzWebSocket not acceptedzWebSocket closedÚtextúutf-8Úbyteszwebsocket.closeÚcodeÚreasonr   )r   ÚRuntimeErrorÚ_send_acceptr   Ú_send_frameÚOPCODE_TEXTÚencodeÚOPCODE_BINARYr:   ÚCLOSE_NORMALr5   )r   ÚmessageÚmsg_typer?   r@   s        r   r0   zWebSocketProtocol._sendz   s-  è ø€ à˜6‘?ˆàÐ)Ò)Ø�}Š}Ü"Ð#?Ó@Ð@Ø×#Ñ# GÓ,×,Ð,Ø ˆD�MàÐ)Ò)Ø—=’=Ü"Ð#;Ó<Ð<Ø�{Š{Ü"Ð#5Ó6Ð6à˜Ñ Ø×&Ñ&¤{°G¸F±O×4JÑ4JÈ7Ó4SÓT×TÑTØ˜GÑ#Ø×&Ñ&¤}°g¸gÑ6FÓG×GÑGð $ð Ð*Ò*Ø—;‘;˜v¤|Ó4ˆDØ—[‘[ ¨2Ó.ˆFØ×"Ñ" 4¨Ó0×0Ð0ØˆD�Kð	 +ð -øð UøàGøð
 1úsG   ‚6D,¸D$¹A.D,Â'D&Â(%D,ÃD(ÃAD,ÄD*ÄD,Ä&D,Ä(D,Ä*D,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   rA   Úbase64Ú	b64encodeÚhashlibÚsha1ÚWS_GUIDÚdigestÚdecoder:   ÚappendÚ
isinstancer>   r   ÚwriteÚjoinrE   )	r   rH   Úws_keyÚnameÚvalueÚ
accept_keyrK   rM   Úextra_headerss	            r   rB   zWebSocketProtocol._send_accept•   sl  è ø€ ð ˆØŸ:™: iÑ0ò 	‰KˆD�%ØÐ+Ó+Ø�Ùð	ñ
 ÜÐAÓBÐBô ×%Ñ%Ü�L‰L˜¤'Ñ)Ó*×1Ñ1Ó3ó
ç
‰&�‹/ð 	ð 3Ø$Ø%Ø$ Z L°Ð5ð	
ˆð —k‘k -Ó0ˆÙØ�N‰NÐ5°k°]À$ÐGÔHð  Ÿ™ I¨rÓ2ˆØ(ò 	3‰KˆD�%Ü˜$¤Ô&Ø—{‘{ 9Ó-�Ü˜%¤Ô'ØŸ™ YÓ/�Ø�N‰N˜d˜V 2 e W¨DÐ1Õ2ð	3ð 	�‰�vÔØ�‰×Ñ˜RŸW™W WÓ-×4Ñ4°YÓ?Õ@ùs   ‚E0 EE0c              ƒ   ó8  K  — 	 | 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                   s@d| _         | j                  j                  d| j&                  xs t(        d	œ«      ƒ d{  –—†  yy7 �ŒN7 �Œ'7 �Œ7 Œ»7 Œ�7 Œl# 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.receiver=   )r+   r<   )r+   r>   zWebSocket read error: %sTzwebsocket.disconnect)r+   r?   )r   Ú_read_frameÚOPCODE_CLOSEÚ_handle_closeÚOPCODE_PINGrC   ÚOPCODE_PONGrD   r   r,   rT   rF   ÚOPCODE_CONTINUATIONÚ_handle_continuationr   r4   r1   r   Údebugr   ÚCLOSE_ABNORMAL)r   ÚframeÚopcodeÚpayloadÚes        r   r.   zWebSocketProtocol._read_frames¿   s  è ø€ ð*	Ø—k“kØ"×.Ñ.Ó0×0�Ø�=Øà"'‘�˜àœ\Ò)Ø×,Ñ,¨WÓ5×5Ð5Øàœ[Ò(Ø×*Ñ*¬;¸Ó@×@Ñ@Øœ{Ò*àØœ{Ò*Ø×-Ñ-×1Ñ1Ø 3Ø '§¡¨wÓ 7ñ3ó ÷ ñ ð œ}Ò,Ø×-Ñ-×1Ñ1Ø 3Ø!(ñ3ó ÷ ñ ð Ô2Ò2à×3Ñ3°GÓ<×<Ð<ð9 —k”kðH —;’;Ø"�”Ø×)Ñ)×-Ñ-Ø2Ø ŸO™OÒ=¬~ñ/ó ÷ ñ ð ðG 1ùð 6ùð Aùð
øð
øð =ùä×%Ñ%ò 	ØÜò 	:Ø�H‰H�N‰NÐ5°q×9Ñ9ûð	:úðùð —;’;Ø"�”Ø×)Ñ)×-Ñ-Ø2Ø ŸO™OÒ=¬~ñ/ó ÷ ò ð üsÅ   ‚H„ F ¤E2¥)F ÁE5Á'F Á6E8Á7AF Â?E;Ã /F Ã/E=Ã0"F ÄE?ÄF Ä%AHÅ+GÅ,HÅ2F Å5F Å8F Å;F Å=F Å?F ÆGÆF>Æ9G Æ>GÇG ÇHÇAHÈHÈHÈH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_exactr5   ÚCLOSE_PROTOCOL_ERRORÚstructÚunpackÚ_unmaskrd   r   r   rU   rX   rD   rF   )r   ÚheaderÚ
first_byteÚsecond_byteÚfinÚrsv1Úrsv2Úrsv3ri   ÚmaskedÚpayload_lenÚext_lenÚmasking_keyrj   Úfull_payloadÚfinal_opcodes                   r   r_   zWebSocketProtocol._read_frameí   sˆ  è ø€ ð ×'Ñ'¨Ó*×*ˆÙØà"(¨¡)¨V°A©Y�Kˆ
à˜Q‰ !Ñ#ˆØ˜a‘ 1Ñ$ˆØ˜a‘ 1Ñ$ˆØ˜a‘ 1Ñ$ˆØ˜dÑ"ˆñ ‘4™4Ø×"Ñ"Ô#7¸ÓH×HÐHØà Ñ" aÑ'ˆØ! DÑ(ˆñ Ø×"Ñ"Ô#7Ð9KÓL×LÐLØð ˜#ÒØ ×,Ñ,¨QÓ/×/ˆGÙØÜ Ÿ-™-¨¨gÓ6°qÑ9‰KØ˜CÒØ ×,Ñ,¨QÓ/×/ˆGÙØÜ Ÿ-™-¨¨gÓ6°qÑ9ˆKð !×,Ñ,¨QÓ/×/ˆÙØð ×(Ñ(¨Ó5×5ˆØˆ?Øð —,‘,˜w¨Ó4ˆð Ô(Ò(Ø×$Ñ$Ð,Ø×&Ñ&Ô';Ð=VÓW×WÐWØØ�O‰O×"Ñ" 7Ô+Ùà"Ÿx™x¨¯©Ó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)z€Read exactly n bytes from internal buffer.

        Waits for data via the callback-fed buffer instead of StreamReader.
        N)Úlenr   r   r   ÚclearÚwaitr>   )r   Únr%   s      r   rv   zWebSocketProtocol._read_exact?  sÁ   è ø€ ô
 �$—,‘,Ó !Ò#Ø�yŠyØØ×Ñ×"Ñ"Ô$ô �4—<‘<Ó  AÒ%ØØ×"Ñ"×'Ñ'Ó)×)Ð)Ø�yŠyœS §¡Ó.°Ò2Øô �$—,‘,Ó !Ó#ô �T—\‘\ " 1Ð%Ó&ˆØ�L‰L˜˜!˜ÐØˆð *ú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)rp   N© )Ú.0ÚiÚbr…   s      €r   ú	<genexpr>z,WebSocketProtocol._unmask.<locals>.<genexpr>Y  s#   øè ø€ ÒK±°°1�Q˜ Q¨¡UÑ+Õ+ÑKùs   ƒ)r>   Ú	enumerate)r   rj   r…   s     `r   rz   zWebSocketProtocol._unmaskT  s!   ø€ áØˆNäÓK¼	À'Ó8JÔKÓKÐKr!   c              ƒ   óL  K  — t        |«      dk\  r=t        j                  d|dd «      d   | _        |dd j	                  dd¬«      | _        nt        | _        d| _        | j                  s.| j                  | j                  | j
                  «      ƒ d{  –—†  d	| _        y7 Œ­w)
zHandle incoming close frame.r   rt   Nr   r=   Úreplace)Úerrorsr   T)	r‰   rx   ry   r   rT   r   ÚCLOSE_NO_STATUSr   r5   ©r   rj   s     r   ra   zWebSocketProtocol._handle_close[  s’   è ø€ äˆw‹<˜1ÒÜ$Ÿm™m¨D°'¸"¸1°+Ó>¸qÑAˆDŒOØ '¨¨ × 2Ñ 2°7À9Ð 2Ó MˆDÕä-ˆDŒOØ "ˆDÔð �{Š{Ø×"Ñ" 4§?¡?°D×4EÑ4EÓF×FÐFàˆ�ð Gús   ‚BB$ÂB"ÂB$c              ƒ   ó   K  — y­w)z=Handle continuation frame (already processed in _read_frame).Nr�   r™   s     r   re   z&WebSocketProtocol._handle_continuationj  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).
        r=   é€   rs   i   rt   rr   ru   N)rV   ÚstrrE   r‰   r   rU   r#   rx   Úpackr   rW   r>   )r   ri   rj   Úlengthrh   s        r   rC   zWebSocketProtocol._send_framen  sÈ   è ø€ ô
 �gœsÔ#Ø—n‘n WÓ-ˆGä�W“ˆÜ“ˆð 	�‰�T˜F‘]Ô#ð �CŠ<Ø�L‰L˜Õ Ø�eŠ^Ø�L‰L˜ÔØ�L‰LœŸ™ T¨6Ó2Õ3à�L‰L˜ÔØ�L‰LœŸ™ T¨6Ó2Ô3ð 	�‰�WÔà�‰×ÑœU 5›\Õ*ùs   ‚D
Dc              ƒ   ó¸   K  — t        j                  d|«      }|r||j                  d«      dd z  }| j                  t        |«      ƒ d{  –—†  d| _        y7 Œ­w)zSend a close frame.rt   r=   Né{   T)rx   rž   rE   rC   r`   r   )r   r?   r@   rj   s       r   r5   zWebSocketProtocol._send_close‹  sU   è ø€ ä—+‘+˜d DÓ)ˆÙØ�v—}‘} WÓ-¨d¨sÐ3Ñ3ˆGØ×Ñœ|¨WÓ5×5Ð5Øˆ�ð 	6ús   ‚A	AÁAÁAN)r   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r    r&   r)   r8   r/   r0   rB   r.   r_   rv   rz   ra   re   rC   r5   r�   r!   r   r	   r	   *   sZ   „ ñòò>#òò
Rò./òò6(AòT,ò\P%òdò*LòòLò+ô:r!   r	   )r¥   r   rN   rP   rx   rd   rD   rF   r`   rb   rc   rG   ÚCLOSE_GOING_AWAYrw   ÚCLOSE_UNSUPPORTEDr˜   rg   ÚCLOSE_INVALID_DATAÚCLOSE_POLICY_VIOLATIONÚCLOSE_MESSAGE_TOO_BIGÚCLOSE_MANDATORY_EXTr6   rR   r	   r�   r!   r   ú<module>r¬      s�   ðñ
ó Û Û Û ð Ð Ø€Ø€Ø€Ø€Ø€ð €ØÐ ØÐ ØÐ Ø€Ø€ØÐ ØÐ ØÐ ØÐ ØÐ ð 2€÷gò gr!   