o
    ïT·jûA  ã                   @  sü  U d dl mZ d dlZd dlZd dlZd dlZd dlZd dlZd dlm	Z	m
Z
 d dlmZ ddlmZmZ ddlmZ zddlmZ W n eyR   ddlmZ Y nw g d	¢ZG d
d„ dejƒZejZejZejZejZej Z!ej"Z#eeefZ$ee!e#fZ%G dd„ dejƒZ&e&j'de&j(de&j)de&j*de&j+de&j,de&j-de&j.de&j/de&j0de&j1de&j2de&j3de&j4de&j5diZ6de7d< e&j'e&j(e&j)e&j*e&j-e&j.e&j/e&j0e&j1e&j2e&j3e&j4hZ8e&j'e&j(e&j+hZ9ej:G dd „ d ƒƒZ;ej:G d!d"„ d"ƒƒZ<	#	#d-d.d*d+„Z=dd,l>m?Z? dS )/é    )ÚannotationsN)Ú	GeneratorÚSequence)ÚCallableé   )ÚPayloadTooBigÚProtocolError)Ú	BytesLike)Ú
apply_mask)ÚOpcodeÚOP_CONTÚOP_TEXTÚ	OP_BINARYÚOP_CLOSEÚOP_PINGÚOP_PONGÚDATA_OPCODESÚCTRL_OPCODESÚ	CloseCodeÚFrameÚClosec                   @  s$   e Zd ZdZd\ZZZd\ZZZ	dS )r   z#Opcode values for WebSocket frames.)r   r   é   )é   é	   é
   N)
Ú__name__Ú
__module__Ú__qualname__Ú__doc__ÚCONTÚTEXTÚBINARYÚCLOSEÚPINGÚPONG© r%   r%   úT/home/dinkstrade/pdmp-scanner/venv/lib/python3.10/site-packages/websockets/frames.pyr   &   s    
r   c                   @  sL   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ZdS )r   z-Close code values for WebSocket close frames.iè  ié  iê  ië  ií  iî  iï  ið  iñ  iò  ió  iô  iõ  iö  i÷  N)r   r   r   r   ÚNORMAL_CLOSUREÚ
GOING_AWAYÚPROTOCOL_ERRORÚUNSUPPORTED_DATAÚNO_STATUS_RCVDÚABNORMAL_CLOSUREÚINVALID_DATAÚPOLICY_VIOLATIONÚMESSAGE_TOO_BIGÚMANDATORY_EXTENSIONÚINTERNAL_ERRORÚSERVICE_RESTARTÚTRY_AGAIN_LATERÚBAD_GATEWAYÚTLS_HANDSHAKEr%   r%   r%   r&   r   8   s"    r   ÚOKz
going awayzprotocol errorzunsupported datazno status received [internal]zabnormal closure [internal]zinvalid frame payload datazpolicy violationzmessage too bigzmandatory extensionzinternal errorzservice restartztry again laterzbad gatewayz TLS handshake failure [internal]zdict[int, str]ÚCLOSE_CODE_EXPLANATIONSc                   @  s¸   e Zd ZU dZded< ded< dZded< d	Zded
< d	Zded< d	Zded< e	e
j dd¡ƒZeded	ediZd)dd„Zd*dd„Zedddœd+d d!„ƒZdd"œd,d$d%„Zd-d'd(„ZdS ).r   aN  
    WebSocket frame.

    Attributes:
        opcode: Opcode.
        data: Payload data.
        fin: FIN bit.
        rsv1: RSV1 bit.
        rsv2: RSV2 bit.
        rsv3: RSV3 bit.

    Only these fields are needed. The MASK bit, payload length and masking-key
    are handled on the fly when parsing and serializing frames.

    r   Úopcoder	   ÚdataTÚboolÚfinFÚrsv1Úrsv2Úrsv3ÚWEBSOCKETS_MAX_LOG_SIZEÚ75ÚreturnÚstrc                 C  s–   | j  | j¡}|  ¡ \}}||krdn|rdnd}t| jƒ› dt| jƒdkr(dnd› �}| jr1dnd}d td	|||gƒ¡}| jj	› d
|› d|› d�S )ax  
        Return a human-readable representation of a frame.

        This function is intended for logging and debugging. It doesn't aim to
        support round-tripping because payloads can be too long for displaying
        conveniently. Instead, it shows the beginning and the end. It's robust
        to incorrect data.

        It attempts to decode UTF-8 payloads whenever possible, even for binary
        frames and control frames, because those frequently contain UTF-8 data.
        It applies the same logic to continuation frames, because we don't know
        if they continue a text frame or a binary frame.

        Ú ÚtextÚbinaryz byter   ÚsÚ	continuedz, Nú z [ú])
ÚDEFAULT_IS_TEXTÚgetr8   Ú
_data_reprÚlenr9   r;   ÚjoinÚfilterÚname)ÚselfÚexpect_textÚ	data_reprÚis_textÚ	data_typeÚlengthÚ	non_finalÚmetadatar%   r%   r&   Ú__str__˜   s   &zFrame.__str__útuple[str, bool | None]c              	   C  s¸  | j sd| j | j¡fS | jtu r(ztt | j ¡ƒdfW S  tt	fy'   Y nw t
| j ƒd| j krkt| j dd| j d … ƒ}t| j d| j d d… ƒ}t|| jtkd�o]t|| jd	�}|rjt|| jd
d�ƒ}nt| j ƒ}t|| jtk| jd�}|r…t|jd
d�ƒ}|s¹| j }t
|ƒ| jd kr¯| jd d d }d |dd| … d|| d… g¡}d dd„ |D ƒ¡}t
|ƒ| jkrØ| jd d }|dd| … d || d…  }||fS )zí
        Return a human-readable representation of the payload.

        Also returns whether the payload is text.

        The representation is elided to fit ``MAX_LOG_SIZE``.

        This is a helper for the __str__ method.

        z''Té   Nr   é   éüÿÿÿ)Úmust_start_clean)Úmust_end_cleanÚreplace)Úerrors)r^   r_   r   ó    r   s     rH   c                 s  s   � | ]}|d ›V  qdS )Ú02xNr%   )Ú.0Úbyter%   r%   r&   Ú	<genexpr>ï   s   € z#Frame._data_repr.<locals>.<genexpr>z...)r9   rJ   rK   r8   r   rB   r   Úparser   ÚUnicodeDecodeErrorrM   ÚMAX_LOG_SIZEÚbytesÚis_utf8_fragmentr   r;   ÚreprÚdecoderN   )rQ   Ú
data_startÚdata_endrT   rS   r9   rE   Úcutr%   r%   r&   rL   ±   sR   
ÿþþý€
ý&"zFrame._data_reprN)Úmax_sizeÚ
extensionsÚ
read_exactú9Callable[[int], Generator[None, None, bytes | bytearray]]Úmaskrq   ú
int | Nonerr   ú%Sequence[extensions.Extension] | NoneúGenerator[None, None, Frame]c             
   c  s�  � |dƒE dH }t  d|¡\}}|d@ rdnd}|d@ rdnd}	|d@ r&dnd}
|d	@ r.dnd}zt|d
@ ƒ}W n tyI } ztdƒ|‚d}~ww |d@ rPdnd|krXtdƒ‚|d@ }|dkro|dƒE dH }t  d|¡\}n|dkr�|dƒE dH }t  d|¡\}|durŽ||krŽt||ƒ‚|r—|dƒE dH }||ƒE dH }|r¥t||ƒ}| ||||	|
|ƒ}|du r´g }t|ƒD ]	}|j||d�}q¸| 	¡  |S )aá  
        Parse a WebSocket frame.

        This is a generator-based coroutine.

        Args:
            read_exact: Generator-based coroutine that reads the requested
                bytes or raises an exception if there isn't enough data.
            mask: Whether the frame should be masked i.e. whether the read
                happens on the server side.
            max_size: Maximum payload size in bytes.
            extensions: List of extensions, applied in reverse order.

        Raises:
            EOFError: If the connection is closed without a full WebSocket frame.
            PayloadTooBig: If the frame's payload size exceeds ``max_size``.
            ProtocolError: If the frame contains incorrect values.

        r   Nú!BBé€   TFé@   é    é   é   zinvalid opcodezincorrect maskingé   é~   ú!Hr   z!Qr[   )rq   )
ÚstructÚunpackr   Ú
ValueErrorr   r   r
   Úreversedrm   Úcheck)Úclsrs   ru   rq   rr   r9   Úhead1Úhead2r;   r<   r=   r>   r8   ÚexcrV   Ú
mask_bytesÚframeÚ	extensionr%   r%   r&   rg   ù   sH   €
€ÿ

zFrame.parse©rr   rj   c          
      C  s&  |   ¡  |du r
g }|D ]}| | ¡} qt ¡ }| jrdnd| jr#dndB | jr*dndB | jr1dndB | jB }|r;dnd}t	| j
ƒ}|dk rS| t d|||B ¡¡ n|d	k re| t d
||dB |¡¡ n| t d||dB |¡¡ |r~t d¡}| |¡ |r‡t| j
|ƒ}	n| j
}	| |	¡ | ¡ S )aH  
        Serialize a WebSocket frame.

        Args:
            mask: Whether the frame should be masked i.e. whether the write
                happens on the client side.
            extensions: List of extensions, applied in order.

        Raises:
            ProtocolError: If the frame contains incorrect values.

        Nrz   r   r{   r|   r}   r€   ry   i   z!BBHz!BBQr   r[   )r†   ÚencodeÚioÚBytesIOr;   r<   r=   r>   r8   rM   r9   Úwriter‚   ÚpackÚsecretsÚtoken_bytesr
   Úgetvalue)
rQ   ru   rr   r�   Úoutputrˆ   r‰   rV   r‹   r9   r%   r%   r&   Ú	serializeC  s>   ÿþýüÿ



zFrame.serializeÚNonec                 C  sP   | j s	| js	| jrtdƒ‚| jtv r$t| jƒdkrtdƒ‚| js&tdƒ‚dS dS )z¦
        Check that reserved bits and opcode have acceptable values.

        Raises:
            ProtocolError: If a reserved bit or the opcode is invalid.

        zreserved bits must be 0é}   zcontrol frame too longzfragmented control frameN)	r<   r=   r>   r   r8   r   rM   r9   r;   ©rQ   r%   r%   r&   r†     s   
üzFrame.check©rA   rB   )rA   rZ   )
rs   rt   ru   r:   rq   rv   rr   rw   rA   rx   )ru   r:   rr   rw   rA   rj   ©rA   r™   )r   r   r   r   Ú__annotations__r;   r<   r=   r>   ÚintÚosÚenvironrK   ri   r   r   r   rJ   rY   rL   Úclassmethodrg   r˜   r†   r%   r%   r%   r&   r   z   s&   
 

HúMü<r   c                   @  sN   e Zd ZU dZded< ded< ddd„Zeddd„ƒZddd„Zddd„Z	dS )r   z
    Code and reason for WebSocket close frames.

    Attributes:
        code: Close code.
        reason: Close reason.

    zCloseCode | intÚcoderB   ÚreasonrA   c                 C  sz   d| j   krdk rn nd}nd| j   krdk r n nd}nt | j d¡}| j › d|› d�}| jr;|› d	| j› �}|S )
zU
        Return a human-readable representation of a close code and reason.

        é¸  i   Ú
registeredéˆ  zprivate useÚunknownz (ú)rH   )r£   r7   rK   r¤   )rQ   ÚexplanationÚresultr%   r%   r&   rY   Ÿ  s   zClose.__str__r9   r	   c                 C  sz   t |tƒr	tdƒ‚t|ƒdkr-t d|dd… ¡\}|dd…  ¡ }| ||ƒ}| ¡  |S t|ƒdkr9| tj	dƒS t
dƒ‚)z÷
        Parse the payload of a close frame.

        Args:
            data: Payload of the close frame.

        Raises:
            ProtocolError: If data is ill-formed.
            UnicodeDecodeError: If the reason isn't valid UTF-8.

        z.only compressed outgoing frames use memoryviewr   r�   Nr   rC   zclose frame too short)Ú
isinstanceÚ
memoryviewÚAssertionErrorrM   r‚   rƒ   rm   r†   r   r+   r   )r‡   r9   r£   r¤   Úcloser%   r%   r&   rg   ±  s   

zClose.parserj   c                 C  s    |   ¡  t d| j¡| j ¡  S )z:
        Serialize the payload of a close frame.

        r�   )r†   r‚   r“   r£   r¤   r�   r›   r%   r%   r&   r˜   Ë  s   zClose.serializer™   c                 C  s8   | j tv sd| j   krdk stdƒ‚ tdƒ‚dS dS )z›
        Check that the close code has a valid value for a close frame.

        Raises:
            ProtocolError: If the close code is invalid.

        r¥   r§   zinvalid status codeN)r£   ÚEXTERNAL_CLOSE_CODESr   r›   r%   r%   r&   r†   Ó  s
   ÿÿzClose.checkNrœ   )r9   r	   rA   r   )rA   rj   r�   )
r   r   r   r   rž   rY   r¢   rg   r˜   r†   r%   r%   r%   r&   r   ‘  s   
 	

r   Fr9   rj   r^   r:   r_   rA   c           
      C  s(  dt | ƒ}}|s$tdt | ƒƒ}||k r$| | }|d@ dkr#|d7 }q	 |sy|d8 }tt | ƒd |ƒ}||kry| | }|d@ dkrF|d8 }q3|d@ dkrOd}n|d@ dkrXd}n|d	@ dkrad}n|d
@ d	krjd}nd}|t | ƒ| krxt | ƒ}	 z
| ||…  ¡ }	W n
 ty�   Y dS w dt|	ƒvS )z*Guess if data is a fragment of UTF-8 text.r   r\   éÀ   rz   r   r[   éà   r   éð   éø   Fz\x)rM   ÚminÚmaxrm   rh   rl   )
r9   r^   r_   ÚstartÚendÚ	max_startre   Úmin_endÚseq_lenrD   r%   r%   r&   rk   ß  sF   ÿrk   rŽ   )FF)r9   rj   r^   r:   r_   r:   rA   r:   )@Ú
__future__r   ÚdataclassesÚenumr�   r    r”   r‚   Úcollections.abcr   r   Útypingr   Ú
exceptionsr   r   r	   Úspeedupsr
   ÚImportErrorÚutilsÚ__all__ÚIntEnumr   r   r   r    r   r!   r   r"   r   r#   r   r$   r   r   r   r   r'   r(   r)   r*   r+   r,   r-   r.   r/   r0   r1   r2   r3   r4   r5   r7   rž   r°   ÚOK_CLOSE_CODESÚ	dataclassr   r   rk   rC   rr   r%   r%   r%   r&   Ú<module>   sŒ    ÿ

ñôý  OýI