
    @OOf                         d Z ddlZddlZddlmZ ddlmZ ddlmZ ddlm	Z	 e
eeeeeef   Z G d de	j                         Ze G d	 d
e	j$                               Zy)aq  
Mitmproxy used to have its own WebSocketFlow type until mitmproxy 6, but now WebSocket connections now are represented
as HTTP flows as well. They can be distinguished from regular HTTP requests by having the
`mitmproxy.http.HTTPFlow.websocket` attribute set.

This module only defines the classes for individual `WebSocketMessage`s and the `WebSocketData` container.
    N)	dataclass)field)Opcode)serializablec                   <   e Zd ZU dZeed<   	 eed<   	 eed<   	 eed<   	 eed<   	 eed<   	 	 	 	 dde	ez  dedededz  deded	dfd
Z
edefd       Zd	efdZded	dfdZd	efdZd Zed	efd       Zd Zd Zed	efd       Zej0                  ded	dfd       Zy)WebSocketMessagea#  
    A single WebSocket message sent from one peer to the other.

    Fragmented WebSocket messages are reassembled by mitmproxy and then
    represented as a single instance of this class.

    The [WebSocket RFC](https://tools.ietf.org/html/rfc6455) specifies both
    text and binary messages. To avoid a whole class of nasty type confusion bugs,
    mitmproxy stores all message contents as `bytes`. If you need a `str`, you can access the `text` property
    on text messages:

    >>> if message.is_text:
    >>>     text = message.text
    from_clienttypecontent	timestampdroppedinjectedNreturnc                     || _         t        |      | _        || _        |xs t	        j                         | _        || _        || _        y N)r	   r   r
   r   timer   r   r   )selfr
   r	   r   r   r   r   s          T/var/www/premiumrankchecker/venv/lib/python3.12/site-packages/mitmproxy/websocket.py__init__zWebSocketMessage.__init__6   s>     '4L	 ) 8TYY[     statec                      | | S r    )clsr   s     r   
from_statezWebSocketMessage.from_stateF   s    E{r   c                     t        | j                        | j                  | j                  | j                  | j
                  | j                  fS r   )intr
   r	   r   r   r   r   r   s    r   	get_statezWebSocketMessage.get_stateJ   s<    		NLLNNLLMM
 	
r   c                 h    |\  }| _         | _        | _        | _        | _        t        |      | _        y r   )r	   r   r   r   r   r   r
   )r   r   typs      r   	set_statezWebSocketMessage.set_stateT   s4     	
LNLM3K	r   c                 V    | j                   rd| j                  z   S d| j                  z   S )Ns   [OUTGOING] s   [INCOMING] )r	   r   r   s    r   _format_ws_messagez#WebSocketMessage._format_ws_message_   s)    !DLL00!DLL00r   c                     | j                   t        j                  k(  r%t        | j                  j                  d            S t        | j                        S )Nreplace)errors)r
   r   TEXTreprr   decoder   s    r   __repr__zWebSocketMessage.__repr__e   s>    99#++9+=>>%%r   c                 <    | j                   t        j                  k(  S )z
        `True` if this message is assembled from WebSocket `TEXT` frames,
        `False` if it is assembled from `BINARY` frames.
        )r
   r   r(   r   s    r   is_textzWebSocketMessage.is_textk   s     yyFKK''r   c                     d| _         y)z;Drop this message, i.e. don't forward it to the other peer.TN)r   r   s    r   dropzWebSocketMessage.drops   s	    r   c                 \    t        j                  dt        d       | j                          y)z!A deprecated alias for `.drop()`.z;WebSocketMessage.kill() is deprecated, use .drop() instead.   )
stacklevelN)warningswarnDeprecationWarningr/   r   s    r   killzWebSocketMessage.killw   s"    I	

 			r   c                     | j                   t        j                  k7  r0t        | j                   j                  j                          d      | j                  j                         S )z
        The message content as text.

        This attribute is only available if `WebSocketMessage.is_text` is `True`.

        *See also:* `WebSocketMessage.content`
        1 WebSocket frames do not have a 'text' attribute.)r
   r   r(   AttributeErrornametitler   r*   r   s    r   textzWebSocketMessage.text   sS     99# 99>>'')**[\  ||""$$r   valuec                     | j                   t        j                  k7  r0t        | j                   j                  j                          d      |j                         | _        y )Nr8   )r
   r   r(   r9   r:   r;   encoder   )r   r=   s     r   r<   zWebSocketMessage.text   sK    99# 99>>'')**[\  ||~r   )NFF)__name__
__module____qualname____doc__bool__annotations__r   bytesfloatr   r   classmethodWebSocketMessageStater   r   r"   r$   r+   propertyr-   r/   r6   strr<   setterr   r   r   r   r      sO    7
L
 NAAMSNf #'!Fl! ! 	!
 4<! ! ! 
!  4  
0 
	 4 	  	 1E 1& ( ( ( %c % % 
[[&# &$ & &r   r   c                       e Zd ZU dZ ee      Zee   ed<   	 dZ	e
dz  ed<   	 dZedz  ed<   	 dZedz  ed<   	 dZedz  ed<   	 d	 Zd
efdZy)WebSocketDataz
    A data container for everything related to a single WebSocket connection.
    This is typically accessed as `mitmproxy.http.HTTPFlow.websocket`.
    )default_factorymessagesNclosed_by_client
close_codeclose_reasontimestamp_endc                 4    dt        | j                         dS )Nz<WebSocketData (z messages)>)lenrP   r   s    r   r+   zWebSocketData.__repr__   s    !#dmm"4!5[AAr   r   c                 F    dj                  d | j                  D              S )N   
c              3   <   K   | ]  }|j                           y wr   )r$   ).0ms     r   	<genexpr>z8WebSocketData._get_formatted_messages.<locals>.<genexpr>   s     HQ!..0Hs   )joinrP   r   s    r   _get_formatted_messagesz%WebSocketData._get_formatted_messages   s    zzH$--HHHr   )r@   rA   rB   rC   r   listrP   r   rE   rQ   rD   rR   r   rS   rK   rT   rG   r+   rF   r^   r   r   r   rN   rN      s~    
 (-T'BHd#$BC$(dTk(
 "Jd
!I#L#*#K"&M54<&3BI Ir   rN   )rC   r   r3   dataclassesr   r   wsproto.frame_protocolr   mitmproxy.coretypesr   tupler   rD   rF   rG   rI   Serializabler   SerializableDataclassrN   r   r   r   <module>rf      so      !  ) ,c4tTAB B&|00 B&J IL66 I Ir   