o
    M,h!=                     @   sN  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	m
Z
 ddlmZmZ ddlmZ 	 zd dlmZ de j d	e j d
efddZW n ey_   ejZde j d	e j d
efddZY n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 dZ(G d d! d!Z)G d"d# d#Z*dS )$    N)Lock)CallableOptionalUnionAny   )WebSocketPayloadExceptionWebSocketProtocolException)validate_utf8)XorMaskerSimple
mask_value
data_valuereturnc                 C   s   t | |}|S N)r   process)r   r   mask_result r   [/var/www/www-root/data/www/bot.pdev.uz/venv/lib/python3.10/site-packages/websocket/_abnf.py_mask%   s   r   c                 C   sH   t |}t|t}t| |d  | d |d   t}||A |tS )N   )lenint
from_bytesnative_byteorderto_bytes)r   r   datalenint_data_valueint_mask_valuer   r   r   r   -   s   )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                   @   sX  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ef  ddfddZd/deddfdd Zed!edefd"d#Zdefd$d%Zed0deeef dededd fd&d'Zdefd(d)Zd*eeef defd+d,Zed*eeef deeef defd-d.ZdS )1r   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   datar   Nc                 C   sB   || _ || _|| _|| _|| _|| _|du rd}|| _tj| _	dS )zG
        Constructor for ABNF. Please check RFC for arguments.
        Nr9   )
r:   r;   r<   r=   r>   r   r?   osurandomget_mask_key)selfr:   r;   r<   r=   r>   r   r?   r   r   r   __init__   s   zABNF.__init__Fskip_utf8_validationc                 C   s  | 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r}t
| j}|s5dS |dks=|dkrAtd|dkrT|sTt| jdd sTtdt| jtra| jdd n	| jdd d	}td
|d }| |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   r8   zInvalid close frame.r.   utf-8!Hr   zInvalid close opcode %r)r;   r<   r=   r	   r>   r   OPCODESOPCODE_PINGr:   OPCODE_CLOSEr   r?   r
   
isinstancebytesencodestructunpack_is_valid_close_status)rC   rE   data_length
data_bytescoder   r   r   validate   s6   



zABNF.validaterS   c                 C   s    | t v pd|   kodk S   S )Ni  i  )VALID_CLOSE_STATUS)rS   r   r   r   rP      s    zABNF._is_valid_close_statusc                 C   s6   t | jtr	| jnt| j}d| j d| j d| S )Nzfin=z opcode=z data=)rK   r?   strreprr:   r>   )rC   	data_reprr   r   r   __str__   s   zABNF.__str__c                 C   s2   |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.
        rF   r   r   )r   OPCODE_TEXTrK   rV   rM   )r?   r>   r:   r   r   r   create_frame   s   
zABNF.create_framec                 C   s`  t d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> | jd> B | jd> B | jd	> B | jB d
}|tjk r]|t| jd> |B d
7 }n2|tjk ry|t| jd> dB d
7 }|td|7 }n|t| jd> dB d
7 }|td|7 }| jst| j
tr| j
d| _
|| j
 S | d	}|| | S )zR
        Format this object to string(byte array) to send data to server.
        c                 s   s    | ]}|d vV  qdS ))r   r   Nr   ).0xr   r   r   	<genexpr>       zABNF.format.<locals>.<genexpr>z
not 0 or 1zInvalid OPCODEzdata is too long         r   latin-1r8   rG      !QrF   )anyr:   r;   r<   r=   
ValueErrorr>   r   rH   r   r?   	LENGTH_63chrrM   LENGTH_7r   	LENGTH_16rN   packrK   rV   rB   _get_masked)rC   lengthframe_headermask_keyr   r   r   format   sB   "





zABNF.formatrp   c                 C   s*   t || j}t|tr|d}|| S )NrF   )r   maskr?   rK   rV   rM   )rC   rp   sr   r   r   rm     s   

zABNF._get_maskedc                 C   sN   |du rd}t | tr| d} t |tr|d}ttd| t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.
        Nr9   rc   B)rK   rV   rM   r   array)rp   r?   r   r   r   rr     s   



z	ABNF.mask)F)r   )__name__
__module____qualname____doc__OPCODE_CONTrZ   OPCODE_BINARYrJ   rI   OPCODE_PONGrH   
OPCODE_MAPrj   rk   rh   r   r   r   rV   rL   rD   boolrT   staticmethodrP   rY   r[   rq   rm   rr   r   r   r   r   r   j   sv    
	
'&#,r   c                   @   s   e Zd ZdZdZdeegef deddfddZdd	d
Z	defddZ
dddZdeeef fddZdefddZdddZdefddZdddZdefddZdedefddZdS )r    rb   ra   recv_fnrE   r   Nc                 C   s&   || _ || _g | _|   t | _d S r   )recvrE   recv_bufferclearr   lock)rC   r   rE   r   r   r   rD   5  s
   zframe_buffer.__init__c                 C   s   d | _ d | _d | _d S r   )headerrn   r   rC   r   r   r   r   @  s   
zframe_buffer.clearc                 C   
   | j d u S r   )r   r   r   r   r   needs_headerE     
zframe_buffer.needs_headerc                 C   s~   |  d}|d }|d? d@ }|d? d@ }|d? d@ }|d? d@ }|d@ }|d }|d? d@ }	|d	@ }
||||||	|
f| _d S )
Nr.   r   r`   r   ra   rb   r      rd   )recv_strictr   )rC   r   b1r:   r;   r<   r=   r>   b2has_masklength_bitsr   r   r   recv_headerH  s   
zframe_buffer.recv_headerc                 C   s   | j sdS | j tj }|S )NF)r   r    _HEADER_MASK_INDEX)rC   
header_valr   r   r   r   V  s   zframe_buffer.has_maskc                 C   r   r   )rn   r   r   r   r   needs_length\  r   zframe_buffer.needs_lengthc                 C   s   | j d u r	td| j tj }|d@ }|dkr'| d}td|d | _d S |dkr;| d}td|d | _d S || _d S )	NHeader not receivedrd   r8   r.   rG   r   r/   re   )r   r	   r    _HEADER_LENGTH_INDEXr   rN   rO   rn   )rC   bitsr   vr   r   r   recv_length_  s   



zframe_buffer.recv_lengthc                 C   r   r   )r   r   r   r   r   
needs_maskm  r   zframe_buffer.needs_maskc                 C   s"   |   r| d| _d S d| _d S )Nr   r9   )r   r   r   r   r   r   r   	recv_maskp  s   "zframe_buffer.recv_maskc              	   C   s   | j k |  r|   | jd u rtd| j\}}}}}}}|  r'|   | j}|  r2| 	  | j
}	|d u r=td| |}
|rR|	d u rLtdt|	|
}
|   t|||||||
}|| j W d    |S 1 sqw   Y  |S )Nr   zLength not receivedzMask not received)r   r   r   r   r	   r   r   rn   r   r   r   r   r   rr   r   rT   rE   )rC   r:   r;   r<   r=   r>   r   _rn   r   payloadframer   r   r   
recv_frames  s4   


!!zframe_buffer.recv_framebufsizec                 C   s   t |ts	td|tdd | jD  }|dkr8| td|}t |tr3| j| |t	|8 }nn|dksd
| j}|dkrGg | _|S ||d  g| _|d | S )Nzbufsize must be an integerc                 s   s    | ]}t |V  qd S r   )r   )r\   bufr   r   r   r^     r_   z+frame_buffer.recv_strict.<locals>.<genexpr>r   i @      )rK   r   rg   sumr   r   minrL   appendr   join)rC   r   shortagebytes_unifiedr   r   r   r     s    

zframe_buffer.recv_strict)r   N)rv   rw   rx   r   r   r   r   r~   rD   r   r   r   r   r   r   r   r   r   r   r   rL   r   r   r   r   r   r    1  s(    




$r    c                   @   sr   e Zd ZdededdfddZdeddfdd	Zdeddfd
dZdedeee	f fddZ
dedefddZdS )r   fire_cont_framerE   r   Nc                 C   s   || _ || _d | _d | _d S r   )r   rE   	cont_datarecving_frames)rC   r   rE   r   r   r   rD     s   
zcontinuous_frame.__init__r   c                 C   sB   | 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   rz   r	   rZ   r{   rC   r   r   r   r   rT     s   
zcontinuous_frame.validatec                 C   sX   | j r| j d  |j7  < 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   rZ   r{   r   r:   r   r   r   r   add  s   
zcontinuous_frame.addc                 C   s   |j p| jS r   )r:   r   r   r   r   r   is_fire  s   zcontinuous_frame.is_firec                 C   s   | j }|d u rtdd | _ |d |_| js3|d ur3|d tjkr3| js3t|js3tdt	|j |d u r;td|d |fS )NzNo continuation data availabler   r   zcannot decode: )
r   r	   r?   r   r   rZ   rE   r
   r   rW   )rC   r   r?   r   r   r   extract  s"   
zcontinuous_frame.extract)rv   rw   rx   r~   rD   r   rT   r   r   r   r   tupler   r   r   r   r   r     s    	r   )+ru   r@   rN   sys	threadingr   typingr   r   r   r   _exceptionsr   r	   _utilsr
   wsaccel.xormaskr   rL   r   ImportError	byteorderr   __all__r!   r"   r#   r$   r%   r&   r'   r(   r)   r*   r+   STATUS_SERVICE_RESTARTSTATUS_TRY_AGAIN_LATERr,   r-   rU   r   r    r   r   r   r   r   <module>   sd     H 