
    vKg18                        S SK r S SKrS SKrS SKrS SKJr  S SKJrJrJ	r	  SSK
JrJr  SSKJr    S SKJr  S\ R                   S	\ R                   S
\4S jr/ SQrSrSrSrSrSrSrSrSrSrSr Sr!Sr"Sr#Sr$Sr%\\\\\\\\ \!\"\#\$4r& " S S5      r' " S S 5      r( " S! S"5      r)g! \ a.    \R(                  rS\ R                   S	\ R                   S
\4S jr Nf = f)#    N)Lock)CallableOptionalUnion   )WebSocketPayloadExceptionWebSocketProtocolException)validate_utf8)XorMaskerSimple
mask_value
data_valuereturnc                 :    [        U 5      R                  U5      nU$ N)r   process)r   r   mask_results      O/var/www/highfloat_scraper/venv/lib/python3.13/site-packages/websocket/_abnf.py_maskr   %   s    ,Z8@@L    c                     [        U5      n[        R                  U[        5      n[        R                  XS-  -  U S US-   -   [        5      nX4-  R	                  U[        5      $ )N   )lenint
from_bytesnative_byteorderto_bytes)r   r   datalenint_data_valueint_mask_values        r   r   r   -   s`    j/
4DEQ,'*]w{*CCEU
 /99'CSTTr   )ABNFcontinuous_frameframe_bufferSTATUS_NORMALSTATUS_GOING_AWAYSTATUS_PROTOCOL_ERRORSTATUS_UNSUPPORTED_DATA_TYPESTATUS_STATUS_NOT_AVAILABLESTATUS_ABNORMAL_CLOSEDSTATUS_INVALID_PAYLOADSTATUS_POLICY_VIOLATIONSTATUS_MESSAGE_TOO_BIGSTATUS_INVALID_EXTENSIONSTATUS_UNEXPECTED_CONDITIONSTATUS_BAD_GATEWAYSTATUS_TLS_HANDSHAKE_ERRORi  i  i  i  i  i  i  i  i  i  i  i  i  i  i  c                      \ rS rSrSrSrSrSrSrSr	Sr
\\\\\	\
4r\S	\S
\S\S\	S\
S0rSrSrSrSSSS\SS4S\S\S\S\S\S\S\\\S4   SS4S jjrS(S\SS4S jjr\S\S\4S  j5       rS\4S! jr\S)S\\\4   S\S\SS 4S" jj5       rS\4S# jrS$\\\4   S\4S% jr\S$\\\4   S\\\4   S\4S& j5       rS'rg)*r    j   zm
ABNF frame class.
See http://tools.ietf.org/html/rfc5234
and http://tools.ietf.org/html/rfc6455#section-5.2
r   r         	   
   conttextbinaryclosepingpong~   i   l             finrsv1rsv2rsv3opcoder   dataNr   c                     Xl         X l        X0l        X@l        XPl        X`l        Uc  SnXpl        [        R                  U l	        g)z7
Constructor for ABNF. Please check RFC for arguments.
Nr=   )
r>   r?   r@   rA   rB   r   rC   osurandomget_mask_key)selfr>   r?   r@   rA   rB   r   rC   s           r   __init__ABNF.__init__   s=     			$<D	JJr   skip_utf8_validationc                    U R                   (       d"  U R                  (       d  U R                  (       a  [        S5      eU R                  [
        R                  ;  a  [        SU R                  5      eU R                  [
        R                  :X  a  U R                  (       d  [        S5      eU R                  [
        R                  :X  a  [        U R                  5      nU(       d  gUS:X  d  US:  a  [        S5      eUS:  a/  U(       d(  [        U R                  SS 5      (       d  [        S5      eS	[        U R                  S
   5      -  [        U R                  S   5      -   nU R                  U5      (       d  [        SU5      egg)z]
Validate the ABNF frame.

Parameters
----------
skip_utf8_validation: skip utf8 validation.
zrsv is not implemented, yetzInvalid opcode %rzInvalid ping frame.Nr   r<   zInvalid close frame.r2      r   zInvalid close opcode %r)r?   r@   rA   r	   rB   r    OPCODESOPCODE_PINGr>   OPCODE_CLOSEr   rC   r
   r   _is_valid_close_status)rH   rK   lcodes       r   validateABNF.validate   s%    99		TYY,-JKK;;dll*,-@$++NN;;$***488,-BCC;;$+++DIIAAvc01GHH1u1-		RSRT:V:V01GHHTYYq\**S1->>D..t4401JDQQ 5 ,r   rS   c                 L    U [         ;   =(       d    SU s=:*  =(       a    S:  $ s  $ )Ni  i  )VALID_CLOSE_STATUS)rS   s    r   rQ   ABNF._is_valid_close_status   s&    ))Bdd.A.AT.AB.ABr   c                 T    SU R                    SU R                   SU R                   3$ )Nzfin=z opcode=z data=)r>   rB   rC   rH   s    r   __str__ABNF.__str__   s'    dhhZx}F499+FFr   c           	          U[         R                  :X  a&  [        U [        5      (       a  U R	                  S5      n [        USSSUSU 5      $ )az  
Create frame to send text, binary and other data.

Parameters
----------
data: str
    data to send. This is string value(byte array).
    If opcode is OPCODE_TEXT and this value is unicode,
    data value is converted into unicode string, automatically.
opcode: int
    operation code. please see OPCODE_MAP.
fin: int
    fin flag. if set to 0, create continue fragmentation.
utf-8r   r   )r    OPCODE_TEXT
isinstancestrencode)rC   rB   r>   s      r   create_frameABNF.create_frame   sC      T%%%*T3*?*?;;w'DCAq&!T22r   c                    [        S U R                  U R                  U R                  U R                  4 5       5      (       a  [        S5      eU R                  [        R                  ;  a  [        S5      e[        U R                  5      nU[        R                  :  a  [        S5      e[        U R                  S-  U R                  S-  -  U R                  S-  -  U R                  S-  -  U R                  -  5      R                  S	5      nU[        R                  :  a.  U[        U R                  S-  U-  5      R                  S	5      -  nOU[        R                   :  aH  U[        U R                  S-  S
-  5      R                  S	5      -  nU["        R$                  " SU5      -  nOGU[        U R                  S-  S-  5      R                  S	5      -  nU["        R$                  " SU5      -  nU R                  (       dM  ['        U R                  [(        5      (       a   U R                  R                  S5      U l
        X R                  -   $ U R+                  S5      nX R-                  U5      -   $ )zB
Format this object to string(byte array) to send data to server.
c              3   (   #    U H	  oS ;  v   M     g7f))r   r   N ).0xs     r   	<genexpr>ABNF.format.<locals>.<genexpr>   s     T(S1(Ss   z
not 0 or 1zInvalid OPCODEzdata is too long         r   latin-1r<   !H   !Qr^   )anyr>   r?   r@   rA   
ValueErrorrB   r    rN   r   rC   	LENGTH_63chrrb   LENGTH_7r   	LENGTH_16structpackr`   ra   rG   _get_masked)rH   lengthframe_headermask_keys       r   formatABNF.format   s    T499dii(STTT\**;;dll*-..TYYT^^#/00HHMii1nii1n ii1n kk	
 &
 	 DMM!C1 4v =>EEiPPLdnn$C1 4t ;<CCINNLFKKf55LC1 4t ;<CCINNLFKKf55L$))S)) II,,W5	))++$$Q'..x888r   r~   c                     [         R                  XR                  5      n[        U[        5      (       a  UR                  S5      nX-   $ )Nr^   )r    maskrC   r`   ra   rb   )rH   r~   ss      r   r{   ABNF._get_masked  s7    IIh		*h$$w/H|r   c                    Uc  Sn[        U [        5      (       a  U R                  S5      n [        U[        5      (       a  UR                  S5      n[        [        R                  " SU 5      [        R                  " SU5      5      $ )z
Mask or unmask data. Just do xor for each byte

Parameters
----------
mask_key: bytes or str
    4 byte mask.
data: bytes or str
    data to mask/unmask.
r=   ro   B)r`   ra   rb   r   array)r~   rC   s     r   r   	ABNF.mask  sg     <Dh$$y1HdC  ;;y)DU[[h/S$1GHHr   )rC   r>   rG   r   rB   r?   r@   rA   )F)r   )__name__
__module____qualname____firstlineno____doc__OPCODE_CONTr_   OPCODE_BINARYrP   rO   OPCODE_PONGrN   
OPCODE_MAPrw   rx   ru   r   r   ra   bytesrI   boolrT   staticmethodrQ   r[   rc   r   r{   r   __static_attributes__rg   r   r   r    r    j   s    KKMLKK 	G 	VVxgVVJ HII !(*'' ' 	'
 ' ' ' C$%' 
'0RT Rd R< CS CT C CG G 35, 3c 3 3F 3 3(!9 !9FE#u*$5 %  IuS%Z( Ic5j0A Ie I Ir   r    c                       \ rS rSrSrSrS\\/\4   S\SS4S jr	SS	 jr
S\4S
 jrSS jrS\\\4   4S jrS\4S jrSS jrS\4S jrSS jrS\4S jrS\S\4S jrSrg)r"   i'  rn   rm   recv_fnrK   r   Nc                 h    Xl         X l        / U l        U R                  5         [	        5       U l        g r   )recvrK   recv_bufferclearr   lock)rH   r   rK   s      r   rI   frame_buffer.__init__+  s+     	$8! "$

F	r   c                 .    S U l         S U l        S U l        g r   )headerr|   r   rZ   s    r   r   frame_buffer.clear6  s    '+%)37r   c                     U R                   S L $ r   )r   rZ   s    r   has_received_header frame_buffer.has_received_header;      {{d""r   c                     U R                  S5      nUS   nUS-	  S-  nUS-	  S-  nUS-	  S-  nUS-	  S-  nUS-  nUS   nUS-	  S-  n	US	-  n
X4XVXyU
4U l        g )
Nr2   r   rl   r   rm   rn   r      rq   )recv_strictr   )rH   r   b1r>   r?   r@   rA   rB   b2has_masklength_bitss              r   recv_headerframe_buffer.recv_header>  s    !!!$AYAgkQw{Qw{Qw{cAY7Q;4i$fLr   c                 d    U R                   (       d  gU R                   [        R                     nU$ )NF)r   r"   _HEADER_MASK_INDEX)rH   
header_vals     r   r   frame_buffer.has_maskL  s&    {{++l&E&EF
r   c                     U R                   S L $ r   )r|   rZ   s    r   has_received_length frame_buffer.has_received_lengthR  r   r   c                 0   U R                   [        R                     nUS-  nUS:X  a1  U R                  S5      n[        R
                  " SU5      S   U l        g US:X  a1  U R                  S5      n[        R
                  " SU5      S   U l        g X l        g )Nrq   r<   r2   rp   r   r3   rr   )r   r"   _HEADER_LENGTH_INDEXr   ry   unpackr|   )rH   bitsr   vs       r   recv_lengthframe_buffer.recv_lengthU  s    {{<<<=Tk$  #A --a03DKD   #A --a03DK%Kr   c                     U R                   S L $ r   )r   rZ   s    r   has_received_maskframe_buffer.has_received_maska  s    $&&r   c                 j    U R                  5       (       a  U R                  S5      U l        g SU l        g )Nr   r=   )r   r   r   rZ   s    r   	recv_maskframe_buffer.recv_maskd  s$    15$**1-br   c           
      P   U R                      U R                  5       (       a  U R                  5         U R                  u  pp4pVnU R	                  5       (       a  U R                  5         U R                  nU R                  5       (       a  U R                  5         U R                  n	U R                  U5      n
U(       a  [        R                  X5      n
U R                  5         [        XX4XVU
5      nUR                  U R                  5        S S S 5        U$ ! , (       d  f       W$ = fr   )r   r   r   r   r   r   r|   r   r   r   r   r    r   r   rT   rK   )rH   r>   r?   r@   rA   rB   r   _r|   r   payloadframes               r   
recv_frameframe_buffer.recv_frameg  s    YY''))  ";?;;8SFa ''))  "[[F %%'' J &&v.G))J8 JJLD'JENN44453 6 7 Y6 s   C?D
D%bufsizec                 d   U[        [        [        U R                  5      5      -
  nUS:  aL  U R	                  [        SU5      5      nU R                  R                  U5        U[        U5      -  nUS:  a  ML  SR                  U R                  5      nUS:X  a	  / U l        U$ XAS  /U l        US U $ )Nr   i @  r   )summapr   r   r   minappendjoin)rH   r   shortagebytes_unifieds        r   r   frame_buffer.recv_strict  s    SS$*:*:!;<<l YYs5(34F##F+F#H l ((4++,q=!DN ' 12D8G$$r   )r   r|   r   r   r   r   rK   )r   N)r   r   r   r   r   r   r   r   r   rI   r   r   r   r   r   r   r   r   r   r    r   r   r   r   rg   r   r   r"   r"   '  s    	s
+	CG			8
#T #M%c	* #T #
&'4 'ID <%3 %5 %r   r"   c                   |    \ rS rSrS\S\SS4S jrS\SS4S jrS\SS4S	 jrS\S\	\\
4   4S
 jrS\S\4S jrSrg)r!   i  fire_cont_framerK   r   Nc                 8    Xl         X l        S U l        S U l        g r   )r   rK   	cont_datarecving_frames)rH   r   rK   s      r   rI   continuous_frame.__init__  s    .$8!)--1r   r   c                    U R                   (       d)  UR                  [        R                  :X  a  [	        S5      eU R                   (       a:  UR                  [        R
                  [        R                  4;   a  [	        S5      eg g )NzIllegal frame)r   rB   r    r   r	   r_   r   rH   r   s     r   rT   continuous_frame.validate  sg    ""u||t7G7G'G,_==5<<4
 $
 -_==	$
r   c                 T   U R                   (       a"  U R                   S==   UR                  -  ss'   O\UR                  [        R                  [        R
                  4;   a  UR                  U l        UR                  UR                  /U l         UR                  (       a  S U l        g g )Nr   )r   rC   rB   r    r_   r   r   r>   r   s     r   addcontinuous_frame.add  sr    >>NN1+|| 0 0$2D2DEE&+ll##llEJJ7DN99"&D r   c                 @    UR                   =(       d    U R                  $ r   )r>   r   r   s     r   is_firecontinuous_frame.is_fire  s    yy0D000r   c                 2   U R                   nS U l         US   Ul        U R                  (       dc  US   [        R                  :X  aL  U R
                  (       d;  [        UR                  5      (       d!  [        S[        UR                  5       35      eUS   U4$ )Nr   r   zcannot decode: )	r   rC   r   r    r_   rK   r
   r   repr)rH   r   rC   s      r   extractcontinuous_frame.extract  sz    ~~!W
$$Q4+++--!%**--+od5::>N=O,PQQAw~r   )r   r   r   rK   )r   r   r   r   r   rI   r    rT   r   r   r   r   tupler   r   rg   r   r   r!   r!     sq    2 2D 2T 2>d >t >	' 	'$ 	'1T 1eD#I&6 1T e r   r!   )*r   rE   ry   sys	threadingr   typingr   r   r   _exceptionsr   r	   _utilsr
   wsaccel.xormaskr   r   r   ImportError	byteorderr   __all__r#   r$   r%   r&   r'   r(   r)   r*   r+   r,   r-   STATUS_SERVICE_RESTARTSTATUS_TRY_AGAIN_LATERr.   r/   rW   r    r"   r!   rg   r   r   <module>r      sL    	  
  , , N !&U
 0%++ 5;; 5 "(   # "      "    !     zI zIzr% r%j) )g  
U}}U%++ U5;; U5 U	
Us   %B% %1CC