U
    EZh1                     @  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
mZ ddlmZmZ zddlmZ W n  ek
r   ddlmZ Y nX ddd	d
dddddddg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$j.de$j/de$j0d e$j1d!e$j2d"e$j3d#iZ4d$e5d%< e$j%e$j&e$j'e$j(e$j+e$j,e$j-e$j.e$j/e$j0e$j1e$j2hZ6e$j%e$j&e$j)hZ7e8e9e:fZ;ej<G d&d dZ=ej<G d'd dZ>dd(l?m@Z@ dS ))    )annotationsN)Callable	GeneratorSequence   )PayloadTooBigProtocolError)
apply_maskOpcodeOP_CONTOP_TEXT	OP_BINARYOP_CLOSEOP_PINGOP_PONGDATA_OPCODESCTRL_OPCODES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#   X/home/aprabhat/apps/x.techxrdev.in/venv/lib/python3.8/site-packages/websockets/frames.pyr
   #   s   
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 )	CloseCodez-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%   5   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ddddZedddddddddddZddddddddZd 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
   opcodebytesdataTboolfinFrsv1rsv2rsv3ZWEBSOCKETS_MAX_LOG_SIZEZ75strreturnc              
   C  s  d}t | j dt | jdkr"dnd }| jr4dnd}| jtkrTt| j }n6| jtkr| j}t || jd kr| jd d d }d	|dd	|  d
|| d g}d	dd |D }n| jt
krtt| j}n| jrzt| j }d}W n ttfk
r   | j}t || jd krf| jd d d }d	|dd	|  d
|| d g}d	dd |D }d}Y nX nd}t || jkr| jd d }|dd	|  d || d  }d	td|||g}| jj d| d| dS )zE
        Return a human-readable representation of a frame.

        Nz byter    s	continued       r   s      c                 s  s   | ]}|d V  qdS 02xNr#   .0byter#   r#   r$   	<genexpr>   s     z Frame.__str__.<locals>.<genexpr>textc                 s  s   | ]}|d V  qdS rH   r#   rJ   r#   r#   r$   rM      s     binaryz''z...z, z [])lenr9   r;   r7   r   reprdecoder   MAX_LOG_SIZEjoinr   r?   r   parseUnicodeDecodeErrorAttributeErrorfiltername)selfZcodinglengthZ	non_finalr9   rO   cutmetadatar#   r#   r$   __str__   s<    &

&
&"zFrame.__str__N)max_size
extensionsz-Callable[[int], Generator[None, None, bytes]]z
int | Nonez%Sequence[extensions.Extension] | NonezGenerator[None, None, Frame])
read_exactmaskr`   ra   rA   c             
   c  s  |dE dH }t d|\}}|d@ r*dnd}|d@ r:dnd}	|d@ rJdnd}
|d	@ rZdnd}zt|d
@ }W n, tk
r } ztd|W 5 d}~X Y nX |d@ rdnd|krtd|d@ }|dkr|dE dH }t d|\}n&|dkr|dE dH }t d|\}|dk	r6||kr6td| d| d|rJ|dE dH }||E dH }|rht||}| ||||	|
|}|dkrg }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.
            UnicodeDecodeError: If the frame contains invalid UTF-8.
            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!Qzover size limit (z > z bytes)   )r`   )
structunpackr
   
ValueErrorr   r   r	   reversedrS   check)clsrb   rc   r`   ra   r9   head1head2r;   r<   r=   r>   r7   excr\   
mask_bytesframe	extensionr#   r#   r$   rV      sB    


zFrame.parsera   )rc   ra   rA   c          
      C  s(  |    |dkrg }|D ]}|| } qt }| jr:dnd| jrFdndB | jrTdndB | jrbdndB | jB }|rvdnd}t	| j
}|dk r|td|||B  n>|d	k r|td
||dB | n|td||dB | |rt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.

        Nre   r   rf   rg   rh   rk   rd   i   z!BBHz!BBQrj   rm   )rr   encodeioBytesIOr;   r<   r=   r>   r7   rQ   r9   writern   packsecretsZtoken_bytesr	   getvalue)
r[   rc   ra   ry   outputrt   ru   r\   rw   r9   r#   r#   r$   	serialize  s>    



zFrame.serializeNonec                 C  sL   | j s| js| jrtd| jtkrHt| jdkr:td| jsHtd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   r7   r   rQ   r9   r;   r[   r#   r#   r$   rr   N  s    
zFrame.check)r   r   r   r   __annotations__r;   r<   r=   r>   intosenvirongetrT   r_   classmethodrV   r   rr   r#   r#   r#   r$   r   z   s    
2N;c                   @  s`   e Zd ZU dZded< ded< ddddZed	d d
ddZd	dddZddddZ	dS )r   z
    Code and reason for WebSocket close frames.

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

    r   coder?   reasonr@   c                 C  sz   d| j   krdk r n nd}n.d| j   kr6dk r@n nd}nt| j d}| j  d| d}| jrv| d	| j }|S )
zU
        Return a human-readable representation of a close code and reason.

          i  
registered  zprivate useunknownz ()rG   )r   r6   r   r   )r[   Zexplanationresultr#   r#   r$   r_   n  s    zClose.__str__r8   )r9   rA   c                 C  sl   t |dkrHtd|dd \}|dd  }| ||}|  |S t |dkr`| tjdS tddS )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.

        r   rl   Nr   rB   zclose frame too short)rQ   rn   ro   rS   rr   r%   r*   r   )rs   r9   r   r   closer#   r#   r$   rV     s    
zClose.parsec                 C  s    |    td| j| j  S )z:
        Serialize the payload of a close frame.

        rl   )rr   rn   r   r   r   r{   r   r#   r#   r$   r     s    zClose.serializer   c                 C  s.   | j tks*d| j   kr dk s*n td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$   rr     s    "zClose.checkN)
r   r   r   r   r   r_   r   rV   r   rr   r#   r#   r#   r$   r   `  s   
	rz   )A
__future__r   dataclassesenumr|   r   r   rn   typingr   r   r   
exceptionsr   r   Z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.   r/   r0   r1   r2   r3   r4   r6   r   r   ZOK_CLOSE_CODESr8   	bytearray
memoryviewZ	BytesLike	dataclassr   r   rB   ra   r#   r#   r#   r$   <module>   s    

               
 fL