U
    )–€hi[  ã                   @   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   ú:/tmp/pip-unpacked-wheel-apvau60e/wsproto/frame_protocol.pyÚ	<genexpr>   s     z<listcomp>.<genexpr>é   )ÚbytesÚrange)r   r   r   r   Ú
<listcomp>   s     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      s     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.   r/   r   r,   r   r   r   r   r0   -   s   r0   é~   é   é}   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.   r/   Ú__doc__ÚCONTINUATIONÚTEXTÚBINARYÚCLOSEÚPINGÚPONGr?   rA   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.   r/   rB   Ú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   rI   c   s   		rI   rJ   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   rT   )r   rS   rT   ©Ú	__class__r   r   r   Ñ   s    zParseFailed.__init__)r-   r.   r/   rI   rL   Ústrr   Ú__classcell__r   r   rV   r   rR   Ð   s   ÿ þrR   c                   @   s&   e Zd ZU eed< eed< eed< dS )ÚRsvBitsÚrsv1Úrsv2Úrsv3N)r-   r.   r/   r?   Ú__annotations__r   r   r   r   rZ   Ø   s   
rZ   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.   r/   r?   r^   rZ   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 )ÚFramerb   ÚpayloadÚframe_finishedÚmessage_finishedN)r-   r.   r/   r:   r^   r   r   rX   r	   rd   r?   r   r   r   r   re   æ   s   
re   )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!   ri   r   r   r   Ú_truncate_utf8í   s
    ro   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   rq   r   r   r   r   þ   s    zBuffer.__init__)Ú	new_bytesr   c                 C   s   |  j |7  _ d S r   )rs   )r   rv   r   r   r   ru     s    zBuffer.feed)ri   r   c                 C   s6   |s
t ƒ S | j| j| j| … }|  jt|ƒ7  _|S r   )r'   rs   rt   r)   )r   ri   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)   rs   rt   rw   )r   ri   r   r   r   Úconsume_exactly  s    zBuffer.consume_exactlyr>   c                 C   s   | j d | j…= d| _d S rr   )rs   rt   r@   r   r   r   Úcommit  s    zBuffer.commitc                 C   s
   d| _ d S rr   )rt   r@   r   r   r   Úrollback  s    zBuffer.rollbackc                 C   s
   t | jƒS r   )r)   rs   r@   r   r   r   Ú__len__  s    zBuffer.__len__)N)r-   r.   r/   r   r   r   ru   rd   rw   rx   ry   rz   r{   r   r   r   r   rp   ý   s   rp   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   )rb   Údecoderr@   r   r   r   r   "  s    zMessageDecoder.__init__©Úframer   c              
   C   s
  |j  ¡ rt‚| j d kr6|j tjkr,tdƒ‚|j | _ n|j tjk	rPtd|j  ƒ‚|j tjkrhtdƒƒ | _|j	or|j
}| jd kr†|j}n\t|jttfƒsšt‚z| j |j|¡}W n2 tk
rà } ztt|ƒtjƒ‚W 5 d }~X Y nX t| j ||j	|ƒ}|�rd | _ d | _|S )Nzunexpected CONTINUATIONzexpected CONTINUATION, got %rrj   )rb   rA   ÚAssertionErrorr:   rC   rR   rD   r   r}   rg   rh   rf   Ú
isinstancer   r'   rm   ÚUnicodeDecodeErrorrX   rI   rO   re   )r   r   Úfinishedr!   Úexcr   r   r   Úprocess_frame&  s,    


"zMessageDecoder.process_frame)r-   r.   r/   r   re   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 rr   )	rˆ   r‰   rp   rs   Ú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   )rs   ru   r1   r   r   r   Úreceive_bytesV  s    zFrameDecoder.receive_bytesr>   c           	      C   st  | j s|  ¡ sd S | j d k	s t‚| jd k	s.t‚| jd k	s<t‚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 k	rö||7 }qö||7 }t| j||| j jƒ}|�rhd | _ d | _d | _ntj| _|S )Nr   úerror in extension)rŠ   Úparse_headerr€   rŒ   r‹   r)   rs   r�   rc   rŽ   rw   ry   r,   r‰   Zframe_inbound_payload_datar�   rI   rR   r'   Zframe_inbound_completer`   re   r:   rC   )	r   Zpayload_remainingrf   rƒ   Ú	extensionZpayload_ÚfinalÚresultr   r   r   r   Úprocess_bufferY  sJ    






zFrameDecoder.process_bufferc           	      C   s¶  | j  d¡}|d kr"| j  ¡  dS t|d t@ ƒ}tt|d t@ ƒt|d t@ ƒt|d t@ ƒƒ}|d t	@ }zt
|ƒ}W n$ tk
rž   td|d›�ƒ‚Y nX | ¡ r´|s´tdƒ‚t|d t@ ƒ}|d t@ }|  ||¡}|d krò| j  ¡  dS |  |||¡ |�r| j�rtdƒ‚|�s,| j�s,td	ƒ‚|�rb| j  d
¡}|d k�rV| 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)rs   rx   rz   r?   ÚFIN_MASKrZ   Ú	RSV1_MASKÚ	RSV2_MASKÚ	RSV3_MASKÚOPCODE_MASKr:   Ú
ValueErrorrR   rA   Ú	MASK_MASKÚPAYLOAD_LEN_MASKÚparse_extended_payload_lengthÚextension_processingrˆ   r   rŒ   r0   ry   r_   rŠ   rb   r‹   r�   rŽ   )	r   r!   r`   ra   rb   Zhas_maskZpayload_len_shortrc   r   r   r   r   r’   ‹  sV    
ý




zFrameDecoder.parse_header)rb   rc   r   c                 C   sª   |  ¡ r|tkrtdƒ‚|tkrX| j d¡}|d kr8d S t d|¡\}|tkr¦tdƒ‚nN|tkr¦| j d¡}|d k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)
rA   ÚMAX_PAYLOAD_NORMALrR   ÚPAYLOAD_LENGTH_TWO_BYTErs   rx   ÚstructÚunpackÚPAYLOAD_LENGTH_EIGHT_BYTEÚMAX_PAYLOAD_TWO_BYTE)r   rb   rc   r!   r   r   r   rŸ   À  s.    ÿÿz*FrameDecoder.parse_extended_payload_length)rb   ra   rc   r   c                 C   s€   dddg}| j D ]F}| | |||¡}t|tƒr8td|ƒ‚t|ƒD ]\}}|r@d||< q@qt||ƒD ]\}	}
|
rb|	sbtdƒ‚qbd S )NFr‘   TzReserved bit set unexpectedly)r‰   Zframe_inbound_headerr�   rI   rR   Ú	enumerateÚzip)r   rb   ra   rc   Zrsv_usedr“   r•   ÚbitÚusedÚexpectedÚfoundr   r   r   r    Þ  s    



z!FrameDecoder.extension_processing)N)r-   r.   r/   r?   r   r   r   r   r�   re   r–   r’   r:   rd   rŸ   rZ   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   ©Zenabled©r   Úextr   r   r   r   ñ  s      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t‚|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k
rŒ   Y nX |tkržtdƒ‚t|tƒs¸|tkr¸tdƒ‚z|dd …  d	¡}W n8 tk
�r } ztd
t|ƒ tjƒ‚W 5 d }~X Y nX ||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 coderj   zError decoding CLOSE reason: )rf   r�   r   r'   r€   rI   rM   r)   rR   r¦   r§   ÚMIN_CLOSE_REASONÚMAX_CLOSE_REASONrœ   ÚLOCAL_ONLY_CLOSE_REASONSÚMAX_PROTOCOL_CLOSE_REASONrm   r‚   rX   rO   re   rb   rg   rh   )r   r   r!   rT   Úreasonr„   r   r   r   Ú_process_closeú  s4    

þzFrameProtocol._process_closer>   c                 c   sj   dd„ | j D ƒ| _ d}|sf| j ¡ }|d k	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   !  s      z1FrameProtocol._parse_more_gen.<locals>.<listcomp>FT)
r‰   r´   r–   rb   rA   rµ   r…   r:   rF   r¿   )r   Úclosedr   r   r   r   r¶     s    


zFrameProtocol._parse_more_genr    c                 C   s   | j  |¡ d S r   )r´   r�   r1   r   r   r   r�   0  s    zFrameProtocol.receive_bytesc                 c   s$   | j D ]}|d kr q q|V  qd S r   )r·   )r   Úeventr   r   r   Úreceived_frames3  s    
zFrameProtocol.received_frames)rT   r¾   r   c                 C   s€   t ƒ }|tjkrd }|d kr(|r(tdƒ‚|tkr6tj}|d k	rr|t t d|¡ƒ7 }|d k	rr|t| 	d¡t
d ƒ7 }|  tj|¡S )Nz&cannot specify a reason without a coder¡   rj   r%   )r'   rI   rM   Ú	TypeErrorr¼   rK   r¦   Úpackro   rn   r¤   Ú_serialize_framer:   rF   )r   rT   r¾   rf   r   r   r   Úclose:  s    
 ÿzFrameProtocol.closeó    )rf   r   c                 C   s   |   tj|¡S r   )rÅ   r:   rG   ©r   rf   r   r   r   ÚpingK  s    zFrameProtocol.pingc                 C   s   |   tj|¡S r   )rÅ   r:   rH   rÈ   r   r   r   ÚpongN  s    zFrameProtocol.pongT)rf   r`   r   c                 C   s€   t |tttfƒrtj}n$t |tƒr4tj}| d¡}nt	dƒ‚| j
d krN|| _
n| j
|k	rbtdƒ‚ntj}|rrd | _
|  |||¡S )Nrj   zMust provide bytes or textz!Data type mismatch inside message)r�   r   r'   Ú
memoryviewr:   rE   rX   rD   rn   rœ   r¸   rÃ   rC   rÅ   )r   rf   r`   rb   r   r   r   Ú	send_dataQ  s    



zFrameProtocol.send_data)r`   ra   rb   r   c                 C   sJ   t |ƒd> }t |jƒd> t |jƒd>  t |jƒd>  }t |ƒ}||B |B S )Né   é   é   r$   )rd   r[   r\   r]   )r   r`   ra   rb   Zfin_bitsZrsv_bitsZopcode_bitsr   r   r   Ú_make_fin_rsv_opcodeh  s    *z"FrameProtocol._make_fin_rsv_opcode)rb   rf   r`   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 k	rÜ| ¡ r®tdƒ‚|rÈ|tt d|
¡ƒ7 }n|tt d|
¡ƒ7 }| j
�rt d¡}t|ƒ}|| | |¡ S || S )NFTr5   z"payload too long for control framer¢   r¡   r$   )rZ   Úreversedr‰   Zframe_outboundrÐ   r)   r¤   r©   r¥   r¨   rˆ   r'   rA   rœ   r¦   rÄ   ÚosÚurandomr   r,   )r   rb   rf   r`   ra   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.   r/   r?   r   r   re   r¿   r   r   r¶   r   r�   rÂ   rd   rX   rÆ   rÉ   rÊ   r   r'   rÌ   rZ   r:   rÐ   rÅ   r   r   r   r   r°   î  s0   !   ÿ þ   ÿ  þr°   )?rB   rÒ   r¦   Úcodecsr   r   Úenumr   Útypingr   r   r   r   r	   r
   r   r‰   r   r   r"   r   r0   r¥   r¨   r¤   r©   ZMAX_PAYLOAD_EIGHT_BYTEZMAX_FRAME_PAYLOADr�   rž   r—   r˜   r™   rš   r›   r:   rI   rM   rN   rQ   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Ú	ExceptionrR   rZ   r_   re   r   rd   ro   rp   r|   r†   r°   r   r   r   r   Ú<module>   s`   $Yý$& (