
    2Bf5                       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mZm	Z	m
Z
mZmZ ddlmZmZ ddlmZ 	 ddlmZ g dZ G d	 d
ej,                        Zej0                  Zej4                  Zej8                  Zej<                  Zej@                  Z!ejD                  Z#eeefZ$ee!e#fZ% G d dej,                        Z&e&jN                  de&jP                  de&jR                  de&jT                  de&jV                  de&jX                  de&jZ                  de&j\                  de&j^                  de&j`                  de&jb                  de&jd                  de&jf                  de&jh                  de&jj                  diZ6de7d<   e&jN                  e&jP                  e&jR                  e&jT                  e&jZ                  e&j\                  e&j^                  e&j`                  e&jb                  e&jd                  e&jf                  e&jh                  hZ8e&jN                  e&jP                  e&jV                  hZ9e:e;e<fZ=ej|                   G d d             Z?d$d Z@d%d!ZAej|                   G d" d#             ZBy# e$ r
 ddlmZ Y 2w xY w)&    )annotationsN)Callable	GeneratorOptionalSequenceTuple   )
exceptions
extensions)Data)
apply_mask)OpcodeOP_CONTOP_TEXT	OP_BINARYOP_CLOSEOP_PINGOP_PONGDATA_OPCODESCTRL_OPCODESFrameprepare_dataprepare_ctrlClosec                  (    e Zd ZdZd\  ZZZd\  ZZZ	y)r   z#Opcode values for WebSocket frames.)r   r	      )   	   
   N)
__name__
__module____qualname____doc__CONTTEXTBINARYCLOSEPINGPONG     Q/var/www/highfloat_scraper/venv/lib/python3.12/site-packages/websockets/frames.pyr   r   %   s    -)D$(E4r+   r   c                  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Zy)	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.   7   sT    7NJNNLONOOKMr+   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                      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<   ddZ	e
ddd	 	 	 	 	 	 	 	 	 dd       Zdd	 	 	 	 	 ddZddZy)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rsv3c                   d}t        | j                         dt        | j                        dk(  rdnd }| j                  rdnd}| j                  t        u r$t        | j                  j                               }n| j                  t        u rM| j                  }t        |      dkD  rdj                  |dd	 d
|dd g      }dj                  d |D              }np| j                  t        u r)t        t        j                  | j                              }n5| j                  r'	 t        | j                  j                               }d}nd}t        |      dkD  r|dd dz   |dd z   }dj                  t        d|||g            }| j                  j                    d| d| dS # t        t        f$ rQ | j                  }t        |      dkD  rdj                  |dd	 d
|dd g      }dj                  d |D              }d}Y w xY w)zE
        Return a human-readable representation of a frame.

        Nz byter	    s	continued   r+      s     i c              3  $   K   | ]  }|d  
 yw02xNr*   .0bytes     r,   	<genexpr>z Frame.__str__.<locals>.<genexpr>   s     =dtCjM=   textc              3  $   K   | ]  }|d  
 ywrQ   r*   rS   s     r,   rV   z Frame.__str__.<locals>.<genexpr>   s     A$4*ArW   binaryz''K   0   z...iz, z [])lenrC   rE   rA   r   reprdecoder   joinr   strr   parseUnicodeDecodeErrorAttributeErrorfiltername)selfcodinglength	non_finalrC   rZ   metadatas          r,   __str__zFrame.__str__   s   
 		N#5s499~/B(LM((B	;;'! 		((*+D[[I% YYF6{R6#2;VBC["IJ88=f==D[[H$u{{499-.DYY"DII,,./ Dt9r>9u$tCDz1D99VD669*EFG++""#1TF"XJa88 '7 "v;# XXvcr{K&MNFxxA&AA!"s   $%F% %AHHN)max_sizer   c             #  \  K    |d      E d{   }t        j                  d|      \  }}|dz  rdnd}|dz  rdnd}	|dz  rdnd}
|d	z  rdnd}	 t        |d
z        }|dz  rdnd|k7  rt	        j
                  d      |dz  }|dk(  r) |d      E d{   }t        j                  d|      \  }n-|dk(  r( |d      E d{   }t        j                  d|      \  }|!||kD  rt	        j                  d| d| d      |r |d      E d{   } ||      E d{   }|rt        |      } | ||||	|
|      }|g }t        |      D ]  }|j                  ||      } |j                          |S 7 k# t        $ r}t	        j
                  d      |d}~ww xY w7 7 7 7 w)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@       rN      zinvalid opcodezincorrect masking   ~   !Hr   z!Qzover size limit (z > z bytes)   )rn   )structunpackr   
ValueErrorr
   ProtocolErrorPayloadTooBigr   reversedr`   check)cls
read_exactmaskrn   r   rC   head1head2rE   rF   rG   rH   rA   excrj   
mask_bytesframe	extensions                     r,   rc   zFrame.parse   s    < %Q-'}}UD1u j(dez)tuz)tuz)tu	FEJ./F J&DEd:**+>??#S=(m+DdD1IVs](m+DdD1IVFX$5**#F83xj@  $.qM1J %V,,dJ/DFD#tT48J!*- 	?I$$UX$>E	? 	[ (  	F**+;<#E	F , , 2 -sx   F,E9AF,E< 6F,F#-F,F&AF,F(F, F*!AF,<	F FF  F,&F,(F,*F,)r   c               F   | j                          |g }|D ]  }|j                  |       }  t        j                         }| j                  rdnd| j
                  rdndz  | j                  rdndz  | j                  rdndz  | j                  z  }|rdnd}t        | j                        }|dk  r*|j                  t        j                  d|||z               nZ|dk  r+|j                  t        j                  d	||dz  |             n*|j                  t        j                  d
||dz  |             |r&t        j                  d      }|j                  |       |rt!        | j                        }	n| j                  }	|j                  |	       |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.

        rq   r   rr   rs   rN   rv   rp   i   z!BBHz!BBQru   rx   )r   encodeioBytesIOrE   rF   rG   rH   rA   r^   rC   writery   packsecretstoken_bytesr   getvalue)
rh   r   r   r   outputr   r   rj   r   rC   s
             r,   	serializezFrame.serialize  sm   $ 	

J# 	*I##D)D	*   88Z!YYzA/!YYzA/ "YYzA/ kk	 	 #
TYYC<LLUE56>BCe^LLVUECKHILLVUECKHI ,,Q/JLL$ dii4D99DT  r+   c                8   | j                   s| j                  s| j                  rt        j                  d      | j
                  t        v rOt        | j                        dkD  rt        j                  d      | j                  st        j                  d      yy)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)
rF   rG   rH   r
   r|   rA   r   r^   rC   rE   rh   s    r,   r   zFrame.checkL  sz     99		TYY**+DEE;;,&499~# ../GHH88 ../IJJ  'r+   returnrb   )
r   z-Callable[[int], Generator[None, None, bytes]]r   rD   rn   zOptional[int]r   (Optional[Sequence[extensions.Extension]]r   zGenerator[None, None, Frame])r   rD   r   r   r   rB   r   None)r    r!   r"   r#   __annotations__rE   rF   rG   rH   rm   classmethodrc   r   r   r*   r+   r,   r   r   |   s      N
KCD$D$D$-9^  #'?CJAJ 	J
  J =J 
&J J` @D	9! 9! =	9!
 
9!vKr+   r   c                    t        | t              rt        | j                  d      fS t        | t              rt
        | fS t        d      )a  
    Convert a string or byte-like object to an opcode and a bytes-like object.

    This function is designed for data frames.

    If ``data`` is a :class:`str`, return ``OP_TEXT`` and a :class:`bytes`
    object encoding ``data`` in UTF-8.

    If ``data`` is a bytes-like object, return ``OP_BINARY`` and a bytes-like
    object.

    Raises:
        TypeError: if ``data`` doesn't have a supported type.

    utf-8data must be str or bytes-like)
isinstancerb   r   r   	BytesLiker   	TypeErrorrC   s    r,   r   r   ^  sB      $G,,,	D)	$$899r+   c                    t        | t              r| j                  d      S t        | t              rt	        |       S t        d      )ai  
    Convert a string or byte-like object to bytes.

    This function is designed for ping and pong frames.

    If ``data`` is a :class:`str`, return a :class:`bytes` object encoding
    ``data`` in UTF-8.

    If ``data`` is a bytes-like object, return a :class:`bytes` object.

    Raises:
        TypeError: if ``data`` doesn't have a supported type.

    r   r   )r   rb   r   r   rB   r   r   s    r,   r   r   v  s=     ${{7##	D)	$T{899r+   c                  P    e Zd ZU dZded<   ded<   ddZedd       ZddZdd	Z	y
)r   z
    Code and reason for WebSocket close frames.

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

    intcoderb   reasonc                   d| j                   cxk  rdk  rn nd}n;d| j                   cxk  rdk  rn nd}n t        j                  | 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 ()rO   )r   r?   getr   )rh   explanationresults      r,   rm   zClose.__str__  s|    
 499#t#&KTYY%%'K155diiKKII;bQ/;;xq.Fr+   c                &   t        |      dk\  rJt        j                  d|dd       \  }|dd j                  d      } | ||      }|j	                          |S t        |      dk(  r | t
        j                  d      S t        j                  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.

        r   rw   Nr   r   rJ   zclose frame too short)	r^   ry   rz   r`   r   r.   r3   r
   r|   )r   rC   r   r   closes        r,   rc   zClose.parse  s     t9>mmD$r(3GT!"X__W-Ff%EKKMLY!^y//44**+BCCr+   c                    | j                          t        j                  d| j                        | j                  j                  d      z   S )z:
        Serialize the payload of a close frame.

        rw   r   )r   ry   r   r   r   r   r   s    r,   r   zClose.serialize  s6    
 	

{{4+dkk.@.@.IIIr+   c                    | j                   t        v s-d| j                   cxk  rdk  sn t        j                  d      yy)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   s    r,   r   zClose.check  s<     		11TTYY5M5M**+@AA 6N1r+   Nr   )rC   rB   r   r   )r   rB   r   )
r    r!   r"   r#   r   rm   r   rc   r   r   r*   r+   r,   r   r     s:     IK$ D D.J	Br+   r   )rC   r   r   zTuple[int, bytes])rC   r   r   rB   )C
__future__r   dataclassesenumr   r   ry   typingr   r   r   r   r   rJ   r
   r   r   speedupsr   ImportErrorutils__all__IntEnumr   r$   r   r%   r   r&   r   r'   r   r(   r   r)   r   r   r   r.   r/   r0   r1   r2   r3   r4   r5   r6   r7   r8   r9   r:   r;   r<   r=   r?   r   r   OK_CLOSE_CODESrB   	bytearray
memoryviewr   	dataclassr   r   r   r   r*   r+   r,   <module>r      sy   "   	   A A $ "$
")T\\ ) ++
++MM	<<
++
++*') . d,. 2= =8 20!!#8.00=?+  , !! "  9j(	 ^K ^K ^KB:0:. HB HB HB}  "!!"s   I# #I21I2