
    ,h18                        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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)y# e$ r- ej(                  Zde j                   d	e j                   d
efdZY w xY w)#    N)Lock)CallableOptionalUnion   )WebSocketPayloadExceptionWebSocketProtocolException)validate_utf8)XorMaskerSimple
mask_value
data_valuereturnc                 :    t        |       j                  |      }|S N)r   process)r   r   mask_results      Q/var/www/html/Resume-Scraper/venv/lib/python3.12/site-packages/websocket/_abnf.py_maskr   %   s    ,Z8@@L    c                     t        |      }t        j                  |t              }t        j                  | |dz  z  | d |dz   z   t              }||z  j	                  |t              S )N   )lenint
from_bytesnative_byteorderto_bytes)r   r   datalenint_data_valueint_mask_values        r   r   r   -   sd    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                   b   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y)(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                  | _	        y)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__   sK     			$<D	JJr   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y|dk(  s|dk\  rt        d      |dkD  r%|s#t        | j                  dd       st        d      d	t        | j                  d
         z  t        | j                  d         z   }| j                  |      st        d|      yy)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   s    99		TYY,-JKK;;dll*,-@$++NN;;$***488,-BCC;;$+++DIIAAvc01GHH1u1-		RSRT:V01GHHTYYq\**S1->>D..t401JDQQ 5 ,r   rQ   c                 6    | t         v xs d| cxk  xr dk  S c S )Ni  i  )VALID_CLOSE_STATUS)rQ   s    r   rO   zABNF._is_valid_close_status   s#    ))Bdd.AT.AB.ABr   c                 T    d| j                    d| j                   d| j                   S )Nzfin=z opcode=z data=)r=   rA   rB   rG   s    r   __str__zABNF.__str__   s'    dhhZx}F499+FFr   c           	          |t         j                  k(  r!t        | t              r| j	                  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   s@      T%%%*T3*?;;w'DCAq&!T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        j                  d	      }|t        j                  k  r.|t        | j                  dz  |z        j                  d	      z  }n|t        j                   k  rG|t        | j                  dz  d
z        j                  d	      z  }|t#        j$                  d|      z  }nF|t        | j                  dz  dz        j                  d	      z  }|t#        j$                  d|      z  }| j                  sIt'        | j                  t(              r | j                  j                  d      | _
        || j                  z   S | j+                  d      }|| j-                  |      z   S )zR
        Format this object to string(byte array) to send data to server.
        c              3   $   K   | ]  }|d v 
 yw))r   r   N ).0xs     r   	<genexpr>zABNF.format.<locals>.<genexpr>   s     T1qTs   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499dii(S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'd..x888r   rw   c                     t         j                  || j                        }t        |t              r|j                  d      }||z   S )NrY   )r    maskrB   r[   r\   r]   )rG   rw   ss      r   rt   zABNF._get_masked  s8    IIh		*h$w/H!|r   c                     |d}t        | t              r| j                  d      } t        |t              r|j                  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.
        r<   rh   B)r[   r\   r]   r   array)rw   rB   s     r   rz   z	ABNF.mask  sa     <Dh$y1HdC ;;y)DU[[h/S$1G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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                       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y)r"   rg   rf   recv_fnrI   r   Nc                 l    || _         || _        g | _        | j                          t	               | _        y r   )recvrI   recv_bufferclearr   lock)rG   r   rI   s      r   rH   zframe_buffer.__init__+  s/     	$8! "$

F	r   c                 .    d | _         d | _        d | _        y 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                     | j                  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| _        y )
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                 Z    | j                   sy| j                   t        j                     }|S )NF)r   r"   _HEADER_MASK_INDEX)rG   
header_vals     r   r   zframe_buffer.has_maskL  s&    {{++l&E&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(  r0| j                  d      }t	        j
                  d|      d   | _        y |dk(  r0| j                  d      }t	        j
                  d|      d   | _        y || _        y )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3DKD   #A --a03DK%DKr   c                     | j                   d u S r   )r   rV   s    r   has_received_maskzframe_buffer.has_received_maska  s    $&&r   c                 `    | j                         r| j                  d      | _        y d| _        y )Nr   r<   )r   r   r   rV   s    r   	recv_maskzframe_buffer.recv_maskd  s"    15$**1-br   c           
      ,   | j                   5  | j                         r| j                          | j                  \  }}}}}}}| j	                         r| j                          | j                  }| j                         r| j                          | j                  }	| j                  |      }
|rt        j                  |	|
      }
| j                          t        |||||||
      }|j                  | j                         d d d        |S # 1 sw Y   S xY w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  s    YY 	6'')  ";?;;8S$dFHa '')  "[[F %%' J &&v.G))J8 JJLdD$'JENN44453	66 7	66 s   C2D		Dbufsizec                 ^   |t        t        t        | j                              z
  }|dkD  rJ| j	                  t        d|            }| j                  j                  |       |t        |      z  }|dkD  rJdj                  | 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$*:*:!;<<l YYs5(34F##F+F#H l ((4++,q=!DN ' 12D8G$$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"   '  s    	s
+	CG			8
#T #M%c	* #T #
&'4 'ID <%3 %5 %r   r"   c                   j    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y)r!   fire_cont_framerI   r   Nc                 <    || _         || _        d | _        d | _        y 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                   r8|j                  t        j
                  t        j                  fv rt	        d      y y )NzIllegal frame)r   rA   r    r   r	   rZ   r   rG   r   s     r   rR   zcontinuous_frame.validate  sg    ""u||t7G7G'G,_==5<<4
 $
 -_==	$
r   c                 <   | j                   r"| j                   dxx   |j                  z  cc<   nZ|j                  t        j                  t        j
                  fv r|j                  | _        |j                  |j                  g| _         |j                  rd | _        y y )Nr   )r   rB   rA   r    rZ   r   r   r=   r   s     r   addzcontinuous_frame.add  sr    >>NN1+|| 0 0$2D2DEE&+ll##llEJJ7DN99"&D r   c                 6    |j                   xs | j                  S r   )r=   r   r   s     r   is_firezcontinuous_frame.is_fire  s    yy0D000r   c                    | j                   }d | _         |d   |_        | j                  sX|d   t        j                  k(  rB| j
                  s6t        |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  sw    ~~!W
$$Q4+++--!%**-+od5::>N=O,PQQAw~r   )r   r   r   r   rH   r    rR   r   r   r   r   tupler   ra   r   r   r!   r!     sq    2 2D 2T 2>d >t >	' 	'$ 	'1T 1eD#I&6 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      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$ $/CC