
     f18                        d dl Z d dlZd dlZd dlZd dlmZ d dlmZmZm	Z	 ddl
mZmZ ddlmZ 	 	 d dlmZ de j         d	e j         d
efdZn&# e$ r ej        Zde j         d	e j         d
ef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#dZ$dZ%eeeeeeee e!e"e#e$fZ& G d d          Z' G d d           Z( G d! d"          Z)dS )#    N)Lock)CallableOptionalUnion   )WebSocketPayloadExceptionWebSocketProtocolException)validate_utf8)XorMaskerSimple
mask_value
data_valuereturnc                 J    t          |                               |          }|S N)r   process)r   r   mask_results      R/var/www/api.educacionweb.es/myenv/lib/python3.11/site-packages/websocket/_abnf.py_maskr   %   s#    ,Z88@@LL    c                    t          |          }t                              |t                    }t                              | |dz  z  | d |dz           z   t                    }||z                      |t                    S )N   )lenint
from_bytesnative_byteorderto_bytes)r   r   datalenint_data_valueint_mask_values        r   r   r   -   ss    j//
4DEE'Q,'*]w{]*CCEU
 
 /99'CST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                      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ededededededeeedf         ddfdZd'deddfdZededefd             Zdefd!Zed(deeef         dededd fd"            Zdefd#Zd$eeef         defd%Zed$eeef         deeef         def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             finrsv1rsv2rsv3opcoder   dataNr   c                     || _         || _        || _        || _        || _        || _        |d}|| _        t          j        | _	        dS )zG
        Constructor for ABNF. Please check RFC for arguments.
        Nr<   )
r=   r>   r?   r@   rA   r   rB   osurandomget_mask_key)selfr=   r>   r?   r@   rA   r   rB   s           r   __init__zABNF.__init__   sO     			$<D	Jr   Fskip_utf8_validationc                    | 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        d
                   z  t          | j        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   r;   zInvalid close frame.r1      r   zInvalid close opcode %r)r>   r?   r@   r	   rA   r    OPCODESOPCODE_PINGr=   OPCODE_CLOSEr   rB   r
   r   _is_valid_close_status)rG   rI   lcodes       r   validatezABNF.validate   sa    9 	L	 	LTY 	L,-JKKK;dl**,-@$+NNN;$***48*,-BCCC;$+++DIA Avvc01GHHH1uu1u-	RSRTRT:V:Vu01GHHHTYq\***S1->->>D..t44 R01JDQQQ ,+R Rr   rQ   c                 4    | t           v pd| cxk    odk     nc S )Ni  i  )VALID_CLOSE_STATUS)rQ   s    r   rO   zABNF._is_valid_close_status   s/    ))Bdd.A.A.A.AT.A.A.A.ABr   c                 6    d| j          d| j         d| j         S )Nzfin=z opcode=z data=)r=   rA   rB   rG   s    r   __str__zABNF.__str__   s&    FdhFFFF49FFFr   c           	          |t           j        k    r*t          | t                    r|                     d          } t          |ddd|d|           S )a  
        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)rB   rA   r=   s      r   create_framezABNF.create_frame   sL      T%%%*T3*?*?%;;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                                d	          }|t          j        k     r1|t          | j        dz  |z                                d	          z  }n|t          j        k     rI|t          | j        dz  d
z                                d	          z  }|t#          j        d|          z  }nH|t          | j        dz  dz                                d	          z  }|t#          j        d|          z  }| j        sCt'          | j
        t(                    r| j
                            d          | _
        || 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   latin-1r;   !H   !QrY   )anyr=   r>   r?   r@   
ValueErrorrA   r    rL   r   rB   	LENGTH_63chrr]   LENGTH_7r   	LENGTH_16structpackr[   r\   rF   _get_masked)rG   lengthframe_headermask_keys       r   formatzABNF.format   s)    TT49di(STTTTT 	+\***;dl**-...TYT^##/000HMi1ni1n i1n k	
 
 &

 	 DM!!C1 4v =>>EEiPPPLLdn$$C1 4t ;<<CCINNNLFKf555LLC1 4t ;<<CCINNNLFKf555L 	,$)S)) 6 I,,W55	$)++$$Q''d..x8888r   rw   c                     t                               || j                  }t          |t                    r|                    d          }||z   S )NrY   )r    maskrB   r[   r\   r]   )rG   rw   ss      r   rt   zABNF._get_masked  sD    IIh	**h$$ 	0w//H!|r   c                    |d}t          | t                    r|                     d          } t          |t                    r|                    d          }t          t	          j        d|           t	          j        d|                    S )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.
        Nr<   rh   B)r[   r\   r]   r   array)rw   rB   s     r   rz   z	ABNF.mask  s|     <Dh$$ 	2y11HdC   	*;;y))DU[h//S$1G1GHHHr   )F)r   )__name__
__module____qualname____doc__OPCODE_CONTrZ   OPCODE_BINARYrN   rM   OPCODE_PONGrL   
OPCODE_MAPrp   rq   rn   r   r   r\   bytesrH   boolrR   staticmethodrO   rW   r^   rx   rt   rz   ra   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 RT Rd R R R R< CS CT C C C \CG G G G G 3 35, 3c 3 3F 3 3 3 \3(!9 !9 !9 !9 !9FE#u*$5 %     IuS%Z( Ic5j0A Ie I I I \I I Ir   r    c                       e Zd ZdZdZdeegef         deddfdZddZ	defd	Z
dd
Zdeeef         fdZdefdZddZdefdZddZdefdZdedefdZdS )r"   rg   rf   recv_fnrI   r   Nc                 ~    || _         || _        g | _        |                                  t	                      | _        d S r   )recvrI   recv_bufferclearr   lock)rG   r   rI   s      r   rH   zframe_buffer.__init__+  s9     	$8! "$

FF			r   c                 0    d | _         d | _        d | _        d S r   )headerru   r   rV   s    r   r   zframe_buffer.clear6  s    '+%)37r   c                     | j         d u S r   )r   rV   s    r   has_received_headerz frame_buffer.has_received_header;      {d""r   c                     |                      d          }|d         }|dz	  dz  }|dz	  dz  }|dz	  dz  }|dz	  dz  }|dz  }|d         }|dz	  dz  }	|d	z  }
||||||	|
f| _        d S )
Nr1   r   re   r   rf   rg   r      rj   )recv_strictr   )rG   r   b1r=   r>   r?   r@   rA   b2has_masklength_bitss              r   recv_headerzframe_buffer.recv_header>  s    !!!$$AYAgkQw{Qw{Qw{cAY7Q;4iD$fhLr   c                 F    | j         sdS | j         t          j                 }|S )NF)r   r"   _HEADER_MASK_INDEX)rG   
header_vals     r   r   zframe_buffer.has_maskL  s&    { 	5+l&EF
r   c                     | j         d u S r   )ru   rV   s    r   has_received_lengthz frame_buffer.has_received_lengthR  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 )Nrj   r;   r1   ri   r   r2   rk   )r   r"   _HEADER_LENGTH_INDEXr   rr   unpackru   )rG   bitsr   vs       r   recv_lengthzframe_buffer.recv_lengthU  s    {<<=Tk$  ##A -a003DKKKD    ##A -a003DKKK%DKKKr   c                     | j         d u S r   )r   rV   s    r   has_received_maskzframe_buffer.has_received_maska  s    $&&r   c                 f    |                                  r|                     d          nd| _        d S )Nr   r<   )r   r   r   rV   s    r   	recv_maskzframe_buffer.recv_maskd  s-    15H$**1---b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   ru   r   r   r   r   r    rz   r   rR   rI   )rG   r=   r>   r?   r@   rA   r   _ru   r   payloadframes               r   
recv_framezframe_buffer.recv_frameg  sk   Y 	6 	6'')) #  """;?;8S$dFHa '')) #  """[F %%'' !   J &&v..G 9))J88 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#bufsizec                    |t          t          t          | j                            z
  }|dk    rU|                     t          d|                    }| j                            |           |t          |          z  }|dk    Ud                    | j                  }|dk    r	g | _        |S ||d          g| _        |d |         S )Nr   i @  r   )summapr   r   r   minappendjoin)rG   r   shortagebytes_unifieds        r   r   zframe_buffer.recv_strict  s    SS$*:!;!;<<<ll YYs5(3344F##F+++F#H ll ((4+,,q==!DN ' 12D8G8$$r   )r   N)r   r   r   r   r   r   r   r   rH   r   r   r   r   r   r   r   r   r   r    r   r   r   ra   r   r   r"   r"   '  sa       	s
+	CG			 	 	 	8 8 8 8
#T # # # #M M M M%c	*    #T # # # #
& 
& 
& 
&'4 ' ' ' 'I I I ID    <%3 %5 % % % % % %r   r"   c                   r    e Zd ZdededdfdZdeddfdZdeddfdZdedeee	f         fd	Z
dedefd
ZdS )r!   fire_cont_framerI   r   Nc                 >    || _         || _        d | _        d | _        d S r   )r   rI   	cont_datarecving_frames)rG   r   rI   s      r   rH   zcontinuous_frame.__init__  s'    .$8!)--1r   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   rA   r    r   r	   rZ   r   rG   r   s     r   rR   zcontinuous_frame.validate  sx    " 	>u|t7G'G'G,_=== 	>5<4
 $
 $
 -_===		> 	> $
 $
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   rB   rA   r    rZ   r   r   r=   r   s     r   addzcontinuous_frame.add  s    > 	8N1+| 0$2DEEE&+l##lEJ7DN9 	'"&D	' 	'r   c                     |j         p| j        S r   )r=   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                             |d         |fS )Nr   r   zcannot decode: )	r   rB   r   r    rZ   rI   r
   r   repr)rG   r   rB   s      r   extractzcontinuous_frame.extract  s    ~!W
$	RQ4+++- ,!%*-- , ,,Pd5:>N>N,P,PQQQAw~r   )r   r   r   r   rH   r    rR   r   r   r   r   tupler   ra   r   r   r!   r!     s        2 2D 2T 2 2 2 2>d >t > > > >	' 	'$ 	' 	' 	' 	'1T 1eD#I&6 1 1 1 1T e      r   r!   )*r~   rD   rr   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/   rT   r    r"   r!   ra   r   r   <module>r      ss    				  



       , , , , , , , , , , N N N N N N N N ! ! ! ! ! !&U
 0/////%+ 5; 5       
U 
U 
U}U%+ U5; U5 U U U U U U	
U  (   # "      "    !     zI zI zI zI zI zI zI zIzr% r% r% r% r% r% r% r%j) ) ) ) ) ) ) ) ) )s   A  A/.A/