a
    ñ»j!=  ã                   @   sD  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 e j e j edœd	d
„ZW n. ey´   ejZe j e j edœdd
„ZY n0 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   Zmask_result© r   ú5E:\soccer\ml_env\Lib\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   ZdatalenZint_data_valueZ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                   @   s:  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eeeeeeeeeef  ddœdd„Zd+eddœdd„Zeeedœdd„ƒZedœdd„Zed,eeef eed d œd!d"„ƒZedœd#d$„Zeeef ed%œd&d'„Zeeeef eeef ed(œd)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ÚcloseZpingÚpongé~   i   l            Ú N)ÚfinÚrsv1Úrsv2Úrsv3Úopcoder   Údatar   c                 C   sB   || _ || _|| _|| _|| _|| _|du r0d}|| _tj| _	dS )zG
        Constructor for ABNF. Please check RFC for arguments.
        Nr4   )
r5   r6   r7   r8   r9   r   r:   ÚosÚurandomÚget_mask_key)Úselfr5   r6   r7   r8   r9   r   r:   r   r   r   Ú__init__’   s    zABNF.__init__F)Úskip_utf8_validationr   c                 C   sþ   | j s| js| jrtdƒ‚| jtjvr2td| jƒ‚| jtjkrL| jsLtdƒ‚| jtj	krút
| jƒ}|sjdS |dksz|dkr‚tdƒ‚|dkr¨|s¨t| jdd… ƒs¨tdƒ‚t| jtƒrÂ| jdd… n| jdd…  d	¡}t d
|¡d }|  |¡sútd|ƒ‚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   r3   zInvalid close frame.r*   úutf-8ú!Hr   zInvalid close opcode %r)r6   r7   r8   r	   r9   r   ÚOPCODESÚOPCODE_PINGr5   ÚOPCODE_CLOSEr   r:   r
   Ú
isinstanceÚbytesÚencodeÚstructÚunpackÚ_is_valid_close_status)r>   r@   Zdata_lengthZ
data_bytesÚcoder   r   r   Úvalidateª   s4    
ÿþý
ÿý
zABNF.validate)rL   r   c                 C   s    | t v pd|   kodk S   S )Ni¸  iˆ  )ÚVALID_CLOSE_STATUS)rL   r   r   r   rK   Ñ   s    zABNF._is_valid_close_status©r   c                 C   s6   t | jtƒr| jnt| jƒ}d| j› d| j› d|› �S )Nzfin=z opcode=z data=)rF   r:   ÚstrÚreprr5   r9   )r>   Z	data_reprr   r   r   Ú__str__Õ   s    zABNF.__str__)r:   r9   r5   r   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.
        rA   r   r   )r   ÚOPCODE_TEXTrF   rP   rH   )r:   r9   r5   r   r   r   Úcreate_frameÙ   s    
zABNF.create_framec                 C   sd  t dd„ | j| j| j| jfD ƒƒr*tdƒ‚| jtjvr>tdƒ‚t	| j
ƒ}|tjkrZt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 }nd|tjk rò|t| jd> dB ƒ d
¡7 }|t d|¡7 }n,|t| jd> dB ƒ d
¡7 }|t d|¡7 }| j�sLt| j
tƒ�rB| 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-1r3   rB   é   ú!QrA   )Úanyr5   r6   r7   r8   Ú
ValueErrorr9   r   rC   r   r:   Ú	LENGTH_63ÚchrrH   ÚLENGTH_7r   Ú	LENGTH_16rI   ÚpackrF   rP   r=   Ú_get_masked)r>   ÚlengthZframe_headerÚmask_keyr   r   r   Úformatî   sB    "

ÿþýüÿú



zABNF.format)rh   r   c                 C   s*   t  || j¡}t|tƒr"| d¡}|| S )NrA   )r   Úmaskr:   rF   rP   rH   )r>   rh   Úsr   r   r   rf     s    

zABNF._get_masked)rh   r:   r   c                 C   sN   |du rd}t | tƒr |  d¡} t |tƒr4| 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.
        Nr4   r\   ÚB)rF   rP   rH   r   Úarray)rh   r:   r   r   r   rj     s    



z	ABNF.mask)F)r   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__ÚOPCODE_CONTrS   ÚOPCODE_BINARYrE   rD   ZOPCODE_PONGrC   Z
OPCODE_MAPrc   rd   ra   r   r   r   rP   rG   r?   ÚboolrM   ÚstaticmethodrK   rR   rT   ri   rf   rj   r   r   r   r   r   j   sf   úú
ø÷' #r   c                   @   sÆ   e Zd ZdZdZeegef eddœdd„Zddœdd	„Z	edœd
d„Z
ddœdd„Zeeef dœdd„Zedœdd„Zddœdd„Zedœdd„Zddœdd„Zedœdd„Zeedœdd„ZdS )r   r[   rZ   N)Úrecv_fnr@   r   c                 C   s&   || _ || _g | _|  ¡  tƒ | _d S r   )Úrecvr@   Úrecv_bufferÚclearr   Úlock)r>   rv   r@   r   r   r   r?   5  s
    zframe_buffer.__init__rO   c                 C   s   d | _ d | _d | _d S r   )Úheaderrg   r   ©r>   r   r   r   ry   @  s    zframe_buffer.clearc                 C   s
   | j d u S r   )r{   r|   r   r   r   Úneeds_headerE  s    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   rY   r   rZ   r[   r   é   r]   )Úrecv_strictr{   )r>   r{   Úb1r5   r6   r7   r8   r9   Ú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)r>   Z
header_valr   r   r   r‚   V  s    zframe_buffer.has_maskc                 C   s
   | j d u S r   )rg   r|   r   r   r   Úneeds_length\  s    zframe_buffer.needs_lengthc                 C   s|   | j d u rtdƒ‚| j tj }|d@ }|dkrL|  d¡}t d|¡d | _n,|dkrr|  d¡}t d|¡d | _n|| _d S )	NúHeader not receivedr]   r3   r*   rB   r   r+   r^   )r{   r	   r   Ú_HEADER_LENGTH_INDEXr   rI   rJ   rg   )r>   Úbitsrƒ   Úvr   r   r   Úrecv_length_  s    


zframe_buffer.recv_lengthc                 C   s
   | j d u S r   )r   r|   r   r   r   Ú
needs_maskm  s    zframe_buffer.needs_maskc                 C   s   |   ¡ r|  d¡nd| _d S )Nr   r4   )r‚   r   r   r|   r   r   r   Ú	recv_maskp  s    zframe_buffer.recv_maskc              	   C   sî   | j �Ô |  ¡ r|  ¡  | jd u r*tdƒ‚| j\}}}}}}}|  ¡ rN|  ¡  | j}|  ¡ rd|  	¡  | j
}	|d u rztdƒ‚|  |¡}
|r¤|	d u r˜tdƒ‚t |	|
¡}
|  ¡  t|||||||
ƒ}| | j¡ W d   ƒ n1 sà0    Y  |S )Nr‡   zLength not receivedzMask not received)rz   r}   r„   r{   r	   r†   r‹   rg   rŒ   r�   r   r   r   rj   ry   rM   r@   )r>   r5   r6   r7   r8   r9   r‚   Ú_rg   r   ÚpayloadÚframer   r   r   Ú
recv_frames  s.    

*zframe_buffer.recv_frame)Úbufsizer   c                 C   s¨   t |tƒstdƒ‚|tdd„ | jD ƒƒ }|dkrj|  td|ƒ¡}t |tƒrj| j |¡ |t	|ƒ8 }q*qjq*d 
| j¡}|dkrˆg | _|S ||d … g| _|d |… S d S )Nzbufsize must be an integerc                 s   s   | ]}t |ƒV  qd S r   )r   )rU   Úbufr   r   r   rW   š  rX   z+frame_buffer.recv_strict.<locals>.<genexpr>r   i @  rX   )rF   r   r`   Úsumrx   rw   ÚminrG   Úappendr   Újoin)r>   r’   ZshortageÚbytes_Zunifiedr   r   r   r   —  s    

zframe_buffer.recv_strict)rn   ro   rp   r…   rˆ   r   r   rt   r?   ry   r}   r„   r   r‚   r†   r‹   rŒ   r�   r   r‘   rG   r   r   r   r   r   r   1  s   þ$r   c                   @   sf   e Zd Zeeddœdd„Zeddœdd„Zeddœdd	„Zeeee	f dœd
d„Z
eedœdd„ZdS )r   N)Úfire_cont_framer@   r   c                 C   s   || _ || _d | _d | _d S r   )r™   r@   Ú	cont_dataÚrecving_frames)r>   r™   r@   r   r   r   r?   µ  s    zcontinuous_frame.__init__)r�   r   c                 C   s>   | j s|jtjkrtdƒ‚| j r:|jtjtjfv r:tdƒ‚d S )NzIllegal frame)r›   r9   r   rr   r	   rS   rs   ©r>   r�   r   r   r   rM   »  s    
þzcontinuous_frame.validatec                 C   sT   | j r| j d  |j7  < n(|jtjtjfv r6|j| _|j|jg| _ |jrPd | _d S )Nr   )rš   r:   r9   r   rS   rs   r›   r5   rœ   r   r   r   ÚaddÄ  s    zcontinuous_frame.addc                 C   s   |j p
| jS r   )r5   r™   rœ   r   r   r   Úis_fireÏ  s    zcontinuous_frame.is_firec                 C   s‚   | j }|d u rtdƒ‚d | _ |d |_| jsf|d urf|d tjkrf| jsft|jƒsftdt	|jƒ› �ƒ‚|d u rvtdƒ‚|d |fS )NzNo continuation data availabler   r   zcannot decode: )
rš   r	   r:   r™   r   rS   r@   r
   r   rQ   )r>   r�   r:   r   r   r   ÚextractÒ  s&    
ÿþýüûzcontinuous_frame.extract)rn   ro   rp   rt   r?   r   rM   r�   r   r   rž   ÚtuplerŸ   r   r   r   r   r   ´  s
   	r   )+rm   r;   rI   ÚsysÚ	threadingr   Útypingr   r   r   r   Ú_exceptionsr   r	   Z_utilsr
   Zwsaccel.xormaskr   rG   r   ÚImportErrorÚ	byteorderr   Ú__all__r   r   r   r    r!   r"   r#   r$   r%   r&   r'   ZSTATUS_SERVICE_RESTARTZSTATUS_TRY_AGAIN_LATERr(   r)   rN   r   r   r   r   r   r   r   Ú<module>   s^   	ô H 