a
    &ñ»ji[  ã                   @   s°  d Z ddlZddlZddlmZmZ ddlmZ ddlm	Z	m
Z
mZmZmZmZmZ erdddlmZ dd	„ ed
ƒD ƒZG dd„ dƒZG dd„ dƒZdZdZdZdZdZeZdZdZdZdZdZ dZ!dZ"G dd„ deƒZ#G dd„ deƒZ$e$j%e$j&e$j'fZ(dZ)dZ*dZ+dZ,d Z-d!Z.d"Z/d"Z0e 1d#d¡Z2G d$d%„ d%e3ƒZ4G d&d'„ d'eƒZ5G d(d)„ d)eƒZ6G d*d+„ d+eƒZ7e8e9e8d,œd-d.„Z:G d/d0„ d0ƒZ;G d1d2„ d2ƒZ<G d3d4„ d4ƒZ=G d5d6„ d6ƒZ>dS )7zY
wsproto/frame_protocol
~~~~~~~~~~~~~~~~~~~~~~

WebSocket frame protocol implementation.
é    N)ÚgetincrementaldecoderÚIncrementalDecoder)ÚIntEnum)Ú	GeneratorÚListÚ
NamedTupleÚOptionalÚTupleÚTYPE_CHECKINGÚUnioné   )Ú	Extensionc                    s&   g | ]‰ t ‡ fd d„tdƒD ƒƒ‘qS )c                 3   s   | ]}|ˆ A V  qd S ©N© )Ú.0Úa©Úbr   ú<E:\soccer\ml_env\Lib\site-packages\wsproto/frame_protocol.pyÚ	<genexpr>   ó    z<listcomp>.<genexpr>é   )ÚbytesÚrange)r   r   r   r   Ú
<listcomp>   r   r   r   c                   @   s,   e Zd Zeddœdd„Zeedœdd„ZdS )ÚXorMaskerSimpleN)Úmasking_keyÚreturnc                 C   s
   || _ d S r   )Ú_masking_key)Úselfr   r   r   r   Ú__init__   s    zXorMaskerSimple.__init__©Údatar   c                 C   sÒ   |rÎt |ƒ}dd„ | jD ƒ\}}}}|d d d…  |¡|d d d…< |dd d…  |¡|dd d…< |dd d…  |¡|dd d…< |dd d…  |¡|dd d…< t|ƒd }| j|d … | jd |…  | _t|ƒS |S )Nc                 s   s   | ]}t | V  qd S r   )Ú
_XOR_TABLE)r   Únr   r   r   r      r   z*XorMaskerSimple.process.<locals>.<genexpr>é   r   é   é   )Ú	bytearrayr   Ú	translateÚlenr   )r   r"   Z
data_arrayr   r   ÚcÚdZkey_rotationr   r   r   Úprocess   s    ÿzXorMaskerSimple.process)Ú__name__Ú
__module__Ú__qualname__r   r    r-   r   r   r   r   r      s   r   c                   @   s   e Zd Zeedœdd„ZdS )ÚXorMaskerNullr!   c                 C   s   |S r   r   ©r   r"   r   r   r   r-   .   s    zXorMaskerNull.processN)r.   r/   r0   r   r-   r   r   r   r   r1   -   s   r1   é~   é   é}   iÿÿ  l   ÿÿÿÿ é€   é@   é    é   é   c                   @   s6   e Zd ZdZdZdZdZdZdZdZ	e
dœd	d
„ZdS )ÚOpcodez7
    RFC 6455, Section 5.2 - Base Framing Protocol
    r   r   r&   é   é	   é
   ©r   c                 C   s   t | d@ ƒS )Nr<   )Úbool©r   r   r   r   Ú	iscontrol_   s    zOpcode.iscontrolN)r.   r/   r0   Ú__doc__ÚCONTINUATIONÚTEXTÚBINARYÚCLOSEÚPINGÚPONGr@   rB   r   r   r   r   r;   H   s   r;   c                   @   sH   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ZdZdS )ÚCloseReasonz8
    RFC 6455, Section 7.4.1 - Defined Status Codes
    éè  ié  iê  ië  ií  iî  iï  ið  iñ  iò  ió  iô  iõ  i÷  N)r.   r/   r0   rC   ÚNORMAL_CLOSUREZ
GOING_AWAYÚPROTOCOL_ERRORZUNSUPPORTED_DATAÚNO_STATUS_RCVDÚABNORMAL_CLOSUREÚINVALID_FRAME_PAYLOAD_DATAZPOLICY_VIOLATIONZMESSAGE_TOO_BIGZMANDATORY_EXTÚINTERNAL_ERRORZSERVICE_RESTARTZTRY_AGAIN_LATERÚTLS_HANDSHAKE_FAILEDr   r   r   r   rJ   c   s   		rJ   rK   i·  i¸  iŸ  i   i‡  z!Ic                       s,   e Zd Zejfeeddœ‡ fdd„Z‡  ZS )ÚParseFailedN)ÚmsgÚcoder   c                    s   t ƒ  |¡ || _d S r   )Úsuperr    rU   )r   rT   rU   ©Ú	__class__r   r   r    Ñ   s    zParseFailed.__init__)r.   r/   r0   rJ   rM   Ústrr    Ú__classcell__r   r   rW   r   rS   Ð   s
   ÿþrS   c                   @   s&   e Zd ZU eed< eed< eed< dS )ÚRsvBitsÚrsv1Úrsv2Úrsv3N)r.   r/   r0   r@   Ú__annotations__r   r   r   r   r[   Ø   s   
r[   c                   @   s:   e Zd ZU eed< eed< eed< eed< ee	 ed< dS )ÚHeaderÚfinÚrsvÚopcodeÚpayload_lenr   N)
r.   r/   r0   r@   r_   r[   r;   Úintr   r   r   r   r   r   r`   Þ   s
   
r`   c                   @   s@   e Zd ZU eed< eeeee	ef f ed< e
ed< e
ed< dS )ÚFramerc   ÚpayloadÚframe_finishedÚmessage_finishedN)r.   r/   r0   r;   r_   r   r   rY   r	   re   r@   r   r   r   r   rf   æ   s   
rf   )r"   Únbytesr   c                 C   s4   t | ƒ|kr| S | d |… } | jddd� d¡} | S )Núutf-8Úignore)Úerrors)r*   ÚdecodeÚencode)r"   rj   r   r   r   Ú_truncate_utf8í   s
    rp   c                   @   s€   e Zd Zdee ddœdd„Zeddœdd„Zeedœd	d
„Zeee dœdd„Z	ddœdd„Z
ddœdd„Zedœdd„ZdS )ÚBufferN)Úinitial_bytesr   c                 C   s    t ƒ | _d| _|r|  |¡ d S ©Nr   )r(   ÚbufferÚ
bytes_usedÚfeed)r   rr   r   r   r   r    þ   s    zBuffer.__init__)Ú	new_bytesr   c                 C   s   |  j |7  _ d S r   )rt   )r   rw   r   r   r   rv     s    zBuffer.feed)rj   r   c                 C   s6   |s
t ƒ S | j| j| j| … }|  jt|ƒ7  _|S r   )r(   rt   ru   r*   )r   rj   r"   r   r   r   Úconsume_at_most  s
    zBuffer.consume_at_mostc                 C   s"   t | jƒ| j |k rd S |  |¡S r   )r*   rt   ru   rx   )r   rj   r   r   r   Úconsume_exactly  s    zBuffer.consume_exactlyr?   c                 C   s   | j d | j…= d| _d S rs   )rt   ru   rA   r   r   r   Úcommit  s    zBuffer.commitc                 C   s
   d| _ d S rs   )ru   rA   r   r   r   Úrollback  s    zBuffer.rollbackc                 C   s
   t | jƒS r   )r*   rt   rA   r   r   r   Ú__len__  s    zBuffer.__len__)N)r.   r/   r0   r   r   r    rv   re   rx   ry   rz   r{   r|   r   r   r   r   rq   ý   s   rq   c                   @   s*   e Zd Zddœdd„Zeedœdd„ZdS )ÚMessageDecoderNr?   c                 C   s   d | _ d | _d S r   )rc   ÚdecoderrA   r   r   r   r    "  s    zMessageDecoder.__init__©Úframer   c              
   C   s  |j  ¡ rJ ‚| j d u r6|j tju r,tdƒ‚|j | _ n|j tjurPtd|j  ƒ‚|j tju rhtdƒƒ | _|jor|j	}| jd u r†|j
}n^t|j
ttfƒsšJ ‚z| j |j
|¡}W n4 tyâ } ztt|ƒtjƒ‚W Y d }~n
d }~0 0 t| j ||j|ƒ}|�rd | _ d | _|S )Nzunexpected CONTINUATIONzexpected CONTINUATION, got %rrk   )rc   rB   r;   rD   rS   rE   r   r~   rh   ri   rg   Ú
isinstancer   r(   rn   ÚUnicodeDecodeErrorrY   rJ   rP   rf   )r   r€   Úfinishedr"   Úexcr   r   r   Úprocess_frame&  s,    


&zMessageDecoder.process_frame)r.   r/   r0   r    rf   r…   r   r   r   r   r}   !  s   r}   c                   @   s‚   e Zd Zdeeed  ddœdd„Zeddœdd„Zee	 d	œd
d„Z
ed	œdd„Zeeee dœdd„Zeeeddœdd„ZdS )ÚFrameDecoderNr   ©ÚclientÚ
extensionsr   c                 C   s:   || _ |pg | _tƒ | _d | _d | _d | _d| _d| _d S rs   )	rˆ   r‰   rq   rt   ÚheaderÚeffective_opcodeÚmaskerÚpayload_requiredÚpayload_consumed©r   rˆ   r‰   r   r   r   r    H  s    
zFrameDecoder.__init__r!   c                 C   s   | j  |¡ d S r   )rt   rv   r2   r   r   r   Úreceive_bytesV  s    zFrameDecoder.receive_bytesr?   c           	      C   st  | j s|  ¡ sd S | j d us J ‚| jd us.J ‚| jd us<J ‚t| jƒ| jk rPd S | j j| j }| j 	|¡}|s~| j jdkr~d S | j 
¡  |  jt|ƒ7  _| j| j jk}| j |¡}| jD ](}| | |¡}t|tƒrÞtd|ƒ‚|}qº|�r:tƒ }| jD ]:}| | | j j¡}t|tƒ�r td|ƒ‚|d urö||7 }qö||7 }t| j||| j jƒ}|�rhd | _ d | _d | _ntj| _|S )Nr   úerror in extension)rŠ   Úparse_headerrŒ   r‹   r*   rt   r�   rd   rŽ   rx   rz   r-   r‰   Zframe_inbound_payload_datar�   rJ   rS   r(   Zframe_inbound_completera   rf   r;   rD   )	r   Zpayload_remainingrg   rƒ   Ú	extensionZpayload_ÚfinalÚresultr€   r   r   r   Úprocess_bufferY  sJ    






zFrameDecoder.process_bufferc           	      C   s´  | j  d¡}|d u r"| j  ¡  dS t|d t@ ƒ}tt|d t@ ƒt|d t@ ƒt|d t@ ƒƒ}|d t	@ }zt
|ƒ}W n" tyœ   td|d›�ƒ‚Y n0 | ¡ r²|s²tdƒ‚t|d t@ ƒ}|d t@ }|  ||¡}|d u rð| j  ¡  dS |  |||¡ |�r| j�rtdƒ‚|�s*| j�s*td	ƒ‚|�r`| j  d
¡}|d u �rT| j  ¡  dS t|ƒ| _ntƒ | _| j  ¡  t||||d ƒ| _| jj| _| jj ¡ �r¤|| _nd| _d| _dS )Nr&   Fr   zInvalid opcode z#xz)Invalid attempt to fragment control framer   z'client received unexpected masked framez)server received unexpected unmasked framer%   T)rt   ry   r{   r@   ÚFIN_MASKr[   Ú	RSV1_MASKÚ	RSV2_MASKÚ	RSV3_MASKÚOPCODE_MASKr;   Ú
ValueErrorrS   rB   Ú	MASK_MASKÚPAYLOAD_LEN_MASKÚparse_extended_payload_lengthÚextension_processingrˆ   r   rŒ   r1   rz   r`   rŠ   rc   r‹   r�   rŽ   )	r   r"   ra   rb   rc   Zhas_maskZpayload_len_shortrd   r   r   r   r   r’   ‹  sV    
ý




zFrameDecoder.parse_header)rc   rd   r   c                 C   sª   |  ¡ r|tkrtdƒ‚|tkrX| j d¡}|d u r8d S t d|¡\}|tkr¦tdƒ‚nN|tkr¦| j d¡}|d u rxd S t d|¡\}|t	kr–tdƒ‚|d? r¦td	ƒ‚|S )
Nz$Control frame with payload len > 125r&   ú!Hz6Payload length used 2 bytes when 1 would have sufficedr<   ú!Qz6Payload length used 8 bytes when 2 would have sufficedé?   z'8-byte payload length with non-zero MSB)
rB   ÚMAX_PAYLOAD_NORMALrS   ÚPAYLOAD_LENGTH_TWO_BYTErt   ry   ÚstructÚunpackÚPAYLOAD_LENGTH_EIGHT_BYTEÚMAX_PAYLOAD_TWO_BYTE)r   rc   rd   r"   r   r   r   rŸ   À  s.    ÿÿz*FrameDecoder.parse_extended_payload_length)rc   rb   rd   r   c                 C   s~   g d¢}| j D ]F}| | |||¡}t|tƒr6td|ƒ‚t|ƒD ]\}}|r>d||< q>qt||ƒD ]\}	}
|
r`|	s`tdƒ‚q`d S )N)FFFr‘   TzReserved bit set unexpectedly)r‰   Zframe_inbound_headerr�   rJ   rS   Ú	enumerateÚzip)r   rc   rb   rd   Zrsv_usedr“   r•   ÚbitÚusedÚexpectedÚfoundr   r   r   r    Þ  s    


z!FrameDecoder.extension_processing)N)r.   r/   r0   r@   r   r   r    r   r�   rf   r–   r’   r;   re   rŸ   r[   r    r   r   r   r   r†   G  s    ÿþ26þþr†   c                   @   sþ   e Zd Zeed ddœdd„Zeedœdd„Zee	e ddf d	œd
d„Z
eddœdd„Zeeddf d	œdd„Zd$e	e e	e edœdd„Zd%eedœdd„Zd&eedœdd„Zd'eeeef eedœdd„Zeeeedœdd „Zd(eeeed!œd"d#„ZdS ))ÚFrameProtocolr   Nr‡   c                 C   sB   || _ dd„ |D ƒ| _t| j | jƒ| _tƒ | _|  ¡ | _d | _d S )Nc                 S   s   g | ]}|  ¡ r|‘qS r   ©Úenabled©r   Úextr   r   r   r   ñ  r   z*FrameProtocol.__init__.<locals>.<listcomp>)	rˆ   r‰   r†   Ú_frame_decoderr}   Ú_message_decoderÚ_parse_more_genÚ_parse_moreÚ_outbound_opcoder�   r   r   r   r    ï  s    
zFrameProtocol.__init__r   c              
   C   s$  |j }t|ttfƒsJ ‚|s(tjdf}nèt|ƒdkr>tdƒ‚nÒt 	d|d d… ¡\}|t
k sd|tkrltdƒ‚zt|ƒ}W n tyŠ   Y n0 |tv rœtdƒ‚t|tƒs¶|tkr¶tdƒ‚z|dd …  d	¡}W n: t�y } z td
t|ƒ tjƒ‚W Y d }~n
d }~0 0 ||f}t|j||j|jƒS )NÚ r   zCLOSE with 1 byte payloadr¡   r&   zCLOSE with invalid codez#remote CLOSE with local-only reasonz CLOSE with unknown reserved coderk   zError decoding CLOSE reason: )rg   r�   r   r(   rJ   rN   r*   rS   r¦   r§   ÚMIN_CLOSE_REASONÚMAX_CLOSE_REASONrœ   ÚLOCAL_ONLY_CLOSE_REASONSÚMAX_PROTOCOL_CLOSE_REASONrn   r‚   rY   rP   rf   rc   rh   ri   )r   r€   r"   rU   Úreasonr„   r   r   r   Ú_process_closeú  s4    

þzFrameProtocol._process_closer?   c                 c   sj   dd„ | j D ƒ| _ d}|sf| j ¡ }|d ur^|j ¡ sD| j |¡}n|jtjkr^|  	|¡}d}|V  qd S )Nc                 S   s   g | ]}|  ¡ r|‘qS r   r±   r³   r   r   r   r   !  r   z1FrameProtocol._parse_more_gen.<locals>.<listcomp>FT)
r‰   rµ   r–   rc   rB   r¶   r…   r;   rG   rÀ   )r   Úclosedr€   r   r   r   r·     s    


zFrameProtocol._parse_more_genr!   c                 C   s   | j  |¡ d S r   )rµ   r�   r2   r   r   r   r�   0  s    zFrameProtocol.receive_bytesc                 c   s$   | j D ]}|d u r q q|V  qd S r   )r¸   )r   Úeventr   r   r   Úreceived_frames3  s    
zFrameProtocol.received_frames)rU   r¿   r   c                 C   s€   t ƒ }|tju rd }|d u r(|r(tdƒ‚|tv r6tj}|d urr|t t d|¡ƒ7 }|d urr|t| 	d¡t
d ƒ7 }|  tj|¡S )Nz&cannot specify a reason without a coder¡   rk   r&   )r(   rJ   rN   Ú	TypeErrorr½   rL   r¦   Úpackrp   ro   r¤   Ú_serialize_framer;   rG   )r   rU   r¿   rg   r   r   r   Úclose:  s    
ÿzFrameProtocol.closer   )rg   r   c                 C   s   |   tj|¡S r   )rÆ   r;   rH   ©r   rg   r   r   r   ÚpingK  s    zFrameProtocol.pingc                 C   s   |   tj|¡S r   )rÆ   r;   rI   rÈ   r   r   r   ÚpongN  s    zFrameProtocol.pongT)rg   ra   r   c                 C   s€   t |tttfƒrtj}n$t |tƒr4tj}| d¡}nt	dƒ‚| j
d u rN|| _
n| j
|urbtdƒ‚ntj}|rrd | _
|  |||¡S )Nrk   zMust provide bytes or textz!Data type mismatch inside message)r�   r   r(   Ú
memoryviewr;   rF   rY   rE   ro   rœ   r¹   rÄ   rD   rÆ   )r   rg   ra   rc   r   r   r   Ú	send_dataQ  s    



zFrameProtocol.send_data)ra   rb   rc   r   c                 C   sJ   t |ƒd> }t |jƒd> t |jƒd>  t |jƒd>  }t |ƒ}||B |B S )Né   é   é   r%   )re   r\   r]   r^   )r   ra   rb   rc   Zfin_bitsZrsv_bitsZopcode_bitsr   r   r   Ú_make_fin_rsv_opcodeh  s    *z"FrameProtocol._make_fin_rsv_opcode)rc   rg   ra   r   c                 C   s  t dddƒ}t| jƒD ]}| | ||||¡\}}q|  |||¡}t|ƒ}d}|tkr^|}	d }
n|tkrpt}	|}
nt	}	|}
d}| j
rŠ|	dO }	t||	gƒ}|
d urÜ| ¡ r®tdƒ‚|rÈ|tt d|
¡ƒ7 }n|tt d|
¡ƒ7 }| j
�rt d¡}t|ƒ}|| | |¡ S || S )NFTr6   z"payload too long for control framer¢   r¡   r%   )r[   Úreversedr‰   Zframe_outboundrÐ   r*   r¤   r©   r¥   r¨   rˆ   r(   rB   rœ   r¦   rÅ   ÚosÚurandomr   r-   )r   rc   rg   ra   rb   r“   Zfin_rsv_opcodeZpayload_lengthZquad_payloadZfirst_payloadZsecond_payloadrŠ   r   rŒ   r   r   r   rÆ   o  s:    
zFrameProtocol._serialize_frame)NN)r   )r   )r   T)r   T)r.   r/   r0   r@   r   r    rf   rÀ   r   r   r·   r   r�   rÃ   re   rY   rÇ   rÉ   rÊ   r   r(   rÌ   r[   r;   rÐ   rÆ   r   r   r   r   r°   î  s&   ! ÿþ ÿþr°   )?rC   rÒ   r¦   Úcodecsr   r   Úenumr   Útypingr   r   r   r   r	   r
   r   r‰   r   r   r#   r   r1   r¥   r¨   r¤   r©   ZMAX_PAYLOAD_EIGHT_BYTEZMAX_FRAME_PAYLOADr�   rž   r—   r˜   r™   rš   r›   r;   rJ   rN   rO   rR   r½   r»   ZMIN_PROTOCOL_CLOSE_REASONr¾   ZMIN_LIBRARY_CLOSE_REASONZMAX_LIBRARY_CLOSE_REASONZMIN_PRIVATE_CLOSE_REASONZMAX_PRIVATE_CLOSE_REASONr¼   rÅ   Z	NULL_MASKÚ	ExceptionrS   r[   r`   rf   r   re   rp   rq   r}   r†   r°   r   r   r   r   Ú<module>   s`   $Yý$& (