
    DQc6              
       d   d Z 	 ddlZddlZddlZddlZddlT ddlmZ ddlm	Z	 	 ej
        rddlZndZn# e$ r dZY nw xY w	 es	ddlmZ d Zn# e$ r d	 ZY nw xY wg 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eeeeeeeeeef
Z G d de          Z  G d de          Z! G d de          Z"dS )z

    N   )*)validate_utf8)Lock)XorMaskerSimplec                 F    t          |                               |          S N)r   process)_m_ds     /lib/python3.11/site-packages/websocket/_abnf.py_maskr   0   s    "2&&..r222    c                     t          t          |                    D ]}||xx         | |dz           z  cc<   t          j        r|                                S |                                S )N   )rangelensixPY3tobytestostring)r   r   is      r   r   r   4   sc    s2ww 	 	AqEEERAYEEEE7 	!::<<;;== r   )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  c                       e Zd ZdZdZdZdZdZdZdZ	eeeeee	fZ
eded	ed
edede	diZdZdZdZddddeddfdZddZed             Zd Zedd            Zd Zd Zed             ZdS )r   z}
    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             c                     || _         || _        || _        || _        || _        || _        |d}|| _        t          j        | _	        dS )zG
        Constructor for ABNF. Please check RFC for arguments.
        Nr5   )
finrsv1rsv2rsv3opcodemaskdataosurandomget_mask_key)selfr7   r8   r9   r:   r;   r<   r=   s           r   __init__zABNF.__init__   sR    
 				 	D	Jr   Fc                    | j         s| j        s| j        rt          d          | j        t
          j        vrt          d| j                  | j        t
          j        k    r| j        st          d          | j        t
          j	        k    rt          | j                  }|sdS |dk    s|dk    rt          d          |dk    r-|s+t          | j        dd                   st          d          d	t          j        | j        d
d                   z  t          j        | j        dd                   z   }|                     |          st          d          dS dS )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   r4   zInvalid close frame.r*      r   zInvalid close opcode.)r8   r9   r:   WebSocketProtocolExceptionr;   r   OPCODESOPCODE_PINGr7   OPCODE_CLOSEr   r=   r   r   byte2int_is_valid_close_status)rA   skip_utf8_validationlcodes       r   validatezABNF.validate   s    9 	L	 	LTY 	L,-JKKK;dl* 	O,-@$+NNN;$** 	D48 	D,-BCCC;$++ 	JDIA Av Ic I01GHHH1u I1 I-	RSRTRT:V:V I01GHHHTYqs^,,-/2|DIacN/K/KLD..t44 J01HIII	J 	JJ Jr   c                 4    | t           v pd| cxk    odk     nc S )Ni  i  )VALID_CLOSE_STATUS)rM   s    r   rJ   zABNF._is_valid_close_status   s/    ))Bdd.A.A.A.AT.A.A.A.ABr   c                     dt          | j                  z   dz   t          | j                  z   dz   t          | j                  z   S )Nzfin=z opcode=z data=)strr7   r;   r=   rA   s    r   __str__zABNF.__str__   sI    DH%t{++,TY( 	(r   c           	          |t           j        k    r/t          | t          j                  r|                     d          } t          |ddd|d|           S )a  
        Create frame to send text, binary and other data.

        Parameters
        ----------
        data: <type>
            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: <type>
            operation code. please see OPCODE_XXX.
        fin: <type>
            fin flag. if set to 0, create continue fragmentation.
        utf-8r   r   )r   OPCODE_TEXT
isinstancer   	text_typeencode)r=   r;   r7   s      r   create_framezABNF.create_frame   sR      T%% 	(*T3=*I*I 	(;;w''DCAq&!T222r   c                    t          d | j        | j        | j        | j        fD                       rt          d          | j        t          j        vrt          d          t          | j
                  }|t          j        k    rt          d          t          | j        dz  | j        dz  z  | j        dz  z  | j        dz  z  | j        z            }|t          j        k     r2|t          | j        dz  |z            z  }t          j        |          }n|t          j        k     rJ|t          | j        dz  d	z            z  }t          j        |          }|t%          j        d
|          z  }nI|t          | j        dz  dz            z  }t          j        |          }|t%          j        d|          z  }| j        s
|| j
        z   S |                     d          }||                     |          z   S )zR
        Format this object to string(byte array) to send data to server.
        c              3      K   | ]}|d vV  	dS ))r   r   N .0xs     r   	<genexpr>zABNF.format.<locals>.<genexpr>   s&      TT1qTTTTTTr   z
not 0 or 1zInvalid OPCODEzdata is too long         r   r4   !H   !Q)anyr7   r8   r9   r:   
ValueErrorr;   r   rF   r   r=   	LENGTH_63chrLENGTH_7r<   r   b	LENGTH_16structpackr@   _get_masked)rA   lengthframe_headermask_keys       r   formatzABNF.format   s    TT49di(STTTTT 	+\***;dl* 	/-...TYT^# 	1/00048q=!Y!^,.2i1n=?CyA~N![) * * DM! 
	6C	Q 7888L5..LLdn$ 	6C	Q 5666L5..LFKf555LLC	Q 5666L5..LFKf555Ly 	=$)++((++H$"2"28"<"<<<r   c                     t                               || j                  }t          |t          j                  r|                    d          }||z   S )NrV   )r   r<   r=   rX   r   rY   rZ   )rA   ru   ss      r   rr   zABNF._get_masked   sF    IIh	**h.. 	0w//H!|r   c                    |d}t          | t          j                  rt          j        |           } t          |t          j                  rt          j        |          }t          rt          |          }| d         dz  | d         dz  z  | d         dz  z  | d	         z  }|t          d
dt          |          dz  z
  z  d          z  }t	          j        |d          }t	          j        ||g          	                    d          }t          |          |k    r|
                                d|         S |
                                S t          j        d|           }t          j        d|          }t          ||          S )z
        Mask or unmask data. Just do xor for each byte

        Parameters
        ----------
        mask_key: <type>
            4 byte string(byte).
        data: <type>
            data to mask/unmask.
        Nr5         r*      r   r+   r    r   zus-asciiuint32)dtypeB)rX   r   rY   rn   numpyr   bytes
frombufferbitwise_xorastyper   arrayr   )ru   r=   origlen	_mask_keyamaskedr   r   s           r   r<   z	ABNF.mask  si     	Dh.. 	'uXHdCM** 	5;;D 	!$iiG r)HQK2,==q@PPS[\]S^^I E#c$ii!m!45zBBBD X666A&q9+66==hGGF4yy7" 0^^%%hwh//>>###S(++BS$''BR== r   N)F)r   )__name__
__module____qualname____doc__OPCODE_CONTrW   OPCODE_BINARYrH   rG   OPCODE_PONGrF   
OPCODE_MAPrm   ro   rk   rB   rN   staticmethodrJ   rT   r[   rv   rr   r<   r^   r   r   r   r   l   sP         KKMLKK KK)G
 	VVxgVVJ HII111#!"' ' ' ' J J J J> C C \C( ( (
 3 3 3 \3(= = =B   "! "! \"! "! "!r   r   c                   X    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S )r   re   rd   c                 ~    || _         || _        g | _        |                                  t	                      | _        d S r	   )recvrK   recv_bufferclearr   lock)rA   recv_fnrK   s      r   rB   zframe_buffer.__init__.  s7    	$8! 

FF			r   c                 0    d | _         d | _        d | _        d S r	   )headerrs   r<   rS   s    r   r   zframe_buffer.clear7  s    			r   c                     | j         d u S r	   )r   rS   s    r   has_received_headerz frame_buffer.has_received_header<      {d""r   c                 <   |                      d          }|d         }t          j        rt          |          }|dz	  dz  }|dz	  dz  }|dz	  dz  }|dz	  dz  }|dz  }|d         }t          j        rt          |          }|dz	  dz  }	|d	z  }
||||||	|
f| _        d S )
Nr*   r   rc   r   rd   re   r      rg   )recv_strictr   PY2ordr   )rA   r   b1r7   r8   r9   r:   r;   b2has_masklength_bitss              r   recv_headerzframe_buffer.recv_header?  s    !!!$$AY7 	RBAgkQw{Qw{Qw{cAY7 	RB7Q;4iD$fhLr   c                 B    | j         sdS | j         t          j                 S )NF)r   r   _HEADER_MASK_INDEXrS   s    r   r   zframe_buffer.has_maskU  s!    { 	5{<:;;r   c                     | j         d u S r	   )rs   rS   s    r   has_received_lengthz frame_buffer.has_received_lengthZ  r   r   c                 @   | j         t          j                 }|dz  }|dk    r7|                     d          }t	          j        d|          d         | _        d S |dk    r7|                     d          }t	          j        d|          d         | _        d S || _        d S )Nrg   r4   r*   rf   r   r+   rh   )r   r   _HEADER_LENGTH_INDEXr   rp   unpackrs   )rA   bitsr   vs       r   recv_lengthzframe_buffer.recv_length]  s    {<<=Tk$ 	&  ##A -a003DKKKD  	&  ##A -a003DKKK%DKKKr   c                     | j         d u S r	   )r<   rS   s    r   has_received_maskzframe_buffer.has_received_maski  s    yD  r   c                 f    |                                  r|                     d          nd| _        d S )Nr   r5   )r   r   r<   rS   s    r   	recv_maskzframe_buffer.recv_maskl  s-    +/==??BD$$Q'''			r   c           
      X   | j         5  |                                 r|                                  | j        \  }}}}}}}|                                 r|                                  | j        }|                                 r|                                  | j	        }	| 
                    |          }
|rt          	                    |	|
          }
|                                  t          |||||||
          }|                    | j                   d d d            n# 1 swxY w Y   |S r	   )r   r   r   r   r   r   rs   r   r   r<   r   r   r   rN   rK   )rA   r7   r8   r9   r:   r;   r   _rs   r<   payloadframes               r   
recv_framezframe_buffer.recv_frameo  sk   Y 	6 	6'')) #  """;?;8S$dFHa '')) #  """[F %%'' !   9D &&v..G 3))D'22 JJLLLdD$'JJENN445553	6 	6 	6 	6 	6 	6 	6 	6 	6 	6 	6 	6 	6 	6 	66 s   DDD#&D#c                    |t          d | j        D                       z
  }|dk    rU|                     t          d|                    }| j                            |           |t          |          z  }|dk    Ut          j        d                              | j                  }|dk    r	g | _        |S ||d          g| _        |d |         S )Nc              3   4   K   | ]}t          |          V  d S r	   )r   r_   s     r   rb   z+frame_buffer.recv_strict.<locals>.<genexpr>  s(       B BAQ B B B B B Br   r   i @  r5   )	sumr   r   minappendr   r   rn   join)rA   bufsizeshortagebytes_unifieds        r   r   zframe_buffer.recv_strict  s    S B B1A B B BBBBl 		$ YYs5(3344F##F+++F#H l 		$ %))..!122q= 	%!DN ' 12D8G8$$r   N)r   r   r   r   r   rB   r   r   r   r   r   r   r   r   r   r   r^   r   r   r   r   *  s            
# # #M M M,< < <
# # #
& 
& 
&! ! !C C C  >% % % % %r   r   c                   ,    e Zd Zd Zd Zd Zd Zd ZdS )r   c                 >    || _         || _        d | _        d | _        d S r	   )fire_cont_framerK   	cont_datarecving_frames)rA   r   rK   s      r   rB   zcontinuous_frame.__init__  s'    .$8!"r   c                     | j         s$|j        t          j        k    rt	          d          | j         r.|j        t          j        t          j        fv rt	          d          d S d S )NzIllegal frame)r   r;   r   r   rE   rW   r   rA   r   s     r   rN   zcontinuous_frame.validate  ss    " 	>u|t7G'G 	>,_=== 	>!143E FF	>,_===	> 	> 	> 	>r   c                     | j         r| j         dxx         |j        z  cc<   n>|j        t          j        t          j        fv r|j        | _        |j        |j        g| _         |j        r	d | _        d S d S )Nr   )r   r=   r;   r   rW   r   r   r7   r   s     r   addzcontinuous_frame.add  s    > 	8N1+| 0$2DEE 3&+l##lEJ7DN9 	'"&D	' 	'r   c                     |j         p| j        S r	   )r7   r   r   s     r   is_firezcontinuous_frame.is_fire  s    y0D00r   c                    | j         }d | _         |d         |_        | j        sU|d         t          j        k    r?| j        s8t          |j                  s$t          dt          |j                  z             |d         |gS )Nr   r   zcannot decode: )	r   r=   r   r   rW   rK   r   WebSocketPayloadExceptionrepr)rA   r   r=   s      r   extractzcontinuous_frame.extract  s    ~!W
# 	6Q43C(C 	6DLe 	6n{  }B  }G  oH  oH 	6+!D$4$446 6 6 Qr   N)r   r   r   rB   rN   r   r   r   r^   r   r   r   r     s_        # # #> > >	' 	' 	'1 1 1         r   r   )#r   r   r>   rp   r   _exceptions_utilsr   	threadingr   r   r   ImportErrorwsaccel.xormaskr   r   __all__r   r   r   r   r    r!   r"   r#   r$   r%   r&   r'   r(   rP   objectr   r   r   r^   r   r   <module>r      s3   (  				  



     ! ! ! ! ! !      
w    EEE! 3333333	3 	3 	3 	! 	! 	!! ! ! ! !	!  $   # "      "  !    {! {! {! {! {!6 {! {! {!|x% x% x% x% x%6 x% x% x%v%  %  %  %  % v %  %  %  %  % s   4 >>A AA