o
     g
^                     @   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r2d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Z7d,e8d-e9d.e8fd/d0Z:G d1d2 d2Z;G d3d4 d4Z<G d5d6 d6Z=G d7d8 d8Z>dS )9zY
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   WC:\Users\micha\Documents\internet-seite\env\lib\site-packages\wsproto\frame_protocol.py	<genexpr>       z<listcomp>.<genexpr>   )bytesrange)r   r   r   r   
<listcomp>   s   & r   r   c                   @   s0   e Zd ZdeddfddZdedefddZdS )	XorMaskerSimplemasking_keyreturnNc                 C   s
   || _ d S r   )_masking_key)selfr   r   r   r   __init__      
zXorMaskerSimple.__init__datac                 C   s   |rgt |}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dedefddZdS )XorMaskerNullr"   r   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	de
f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?   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/   r0   rB   NORMAL_CLOSUREZ
GOING_AWAYPROTOCOL_ERRORZUNSUPPORTED_DATANO_STATUS_RCVDABNORMAL_CLOSUREINVALID_FRAME_PAYLOAD_DATAPOLICY_VIOLATION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                       s0   e Zd Zejfdededdf fddZ  ZS )ParseFailedmsgcoder   Nc                    s   t  | || _d S r   )superr    rV   )r   rU   rV   	__class__r   r   r       s   
zParseFailed.__init__)r.   r/   r0   rI   rL   strr    __classcell__r   r   rX   r   rT      s    rT   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   ra      s   
 ra   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 )Framerd   payloadframe_finishedmessage_finishedN)r.   r/   r0   r;   r`   r   r   rZ   r	   rf   r?   r   r   r   r   rg      s
   
 rg   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"   rk   r   r   r   _truncate_utf8   s
   rq   c                   @   s   e Zd Zddee ddfddZdeddfddZd	edefd
dZd	edee fddZ	dddZ
dddZdefddZdS )BufferNinitial_bytesr   c                 C   s$   t  | _d| _|r| | d S d S Nr   )r(   buffer
bytes_usedfeed)r   rs   r   r   r   r       s
   zBuffer.__init__	new_bytesc                 C   s   |  j |7  _ d S r   )ru   )r   rx   r   r   r   rw     s   zBuffer.feedrk   c                 C   s6   |st  S | j| j| j|  }|  jt|7  _|S r   )r(   ru   rv   r*   )r   rk   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*   ru   rv   ry   )r   rk   r   r   r   consume_exactly  s   
zBuffer.consume_exactlyc                 C   s   | j d | j= d| _d S rt   )ru   rv   r@   r   r   r   commit  s   
zBuffer.commitc                 C   s
   d| _ d S rt   )rv   r@   r   r   r   rollback  r!   zBuffer.rollbackc                 C   s
   t | jS r   )r*   ru   r@   r   r   r   __len__  r!   zBuffer.__len__r   r   N)r.   r/   r0   r   r   r    rw   rf   ry   rz   r{   r|   r}   r   r   r   r   rr      s    

rr   c                   @   s(   e Zd ZdddZdedefddZdS )	MessageDecoderr   Nc                 C   s   d | _ d | _d S r   )rd   decoderr@   r   r   r   r    "  s   
zMessageDecoder.__init__framec              
   C   s   |j  rJ | j d u r|j tju rtd|j | _ n|j tjur(td|j  |j tju r4td | _|jo9|j	}| jd u rC|j
}n)t|j
ttfsMJ z
| j|j
|}W n tyk } ztt|tjd }~ww t| j ||j|}|r}d | _ d | _|S )Nzunexpected CONTINUATIONzexpected CONTINUATION, got %rrl   )rd   rA   r;   rC   rT   rD   r   r   ri   rj   rh   
isinstancer   r(   ro   UnicodeDecodeErrorrZ   rI   rO   rg   )r   r   finishedr"   excr   r   r   process_frame&  s0   


zMessageDecoder.process_framer~   )r.   r/   r0   r    rg   r   r   r   r   r   r   !  s    
r   c                   @   s   e Zd Z	ddedeed  ddfddZdeddfd	d
Zdee	 fddZ
defddZdededee fddZdedededdfddZdS )FrameDecoderNclient
extensionsr   r   c                 C   s:   || _ |pg | _t | _d | _d | _d | _d| _d| _d S rt   )	r   r   rr   ru   headereffective_opcodemaskerpayload_requiredpayload_consumedr   r   r   r   r   r   r    H  s   

zFrameDecoder.__init__r"   c                 C      | j | d S r   )ru   rw   r2   r   r   r   receive_bytesV     zFrameDecoder.receive_bytesc           	      C   sp  | j s	|  s	d S | j d usJ | jd usJ | jd usJ t| j| jk r(d 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rotd||}q]|rt }| jD ]}|| | j j}t|trtd||d ur||7 }qz||7 }t| j||| j j}|rd | _ d | _d | _|S tj| _|S )Nr   error in extension)r   parse_headerr   r   r*   ru   r   re   r   ry   r{   r-   r   frame_inbound_payload_datar   rI   rT   r(   frame_inbound_completerb   rg   r;   rC   )	r   Zpayload_remainingrh   r   	extensionZpayload_finalresultr   r   r   r   process_bufferY  sN   






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yL   td|dw | rW|sWtdt|d t@ }|d t@ }| ||}|d u rv| j   dS | ||| |r| jrtd|s| jstd	|r| j d
}|d u r| 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)ru   rz   r|   r?   FIN_MASKr\   	RSV1_MASK	RSV2_MASK	RSV3_MASKOPCODE_MASKr;   
ValueErrorrT   rA   	MASK_MASKPAYLOAD_LEN_MASKparse_extended_payload_lengthextension_processingr   r   r   r1   r{   ra   r   rd   r   r   r   )	r   r"   rb   rc   rd   Zhas_maskZpayload_len_shortre   r   r   r   r   r     sX   






zFrameDecoder.parse_headerrd   re   c                 C   s   |  r|tkrtd|tkr-| jd}|d u rd S td|\}|tkr+td|S |tkrT| jd}|d u r=d S td|\}|t	krLtd|d? rTt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_NORMALrT   PAYLOAD_LENGTH_TWO_BYTEru   rz   structunpackPAYLOAD_LENGTH_EIGHT_BYTEMAX_PAYLOAD_TWO_BYTE)r   rd   re   r"   r   r   r   r     s0   z*FrameDecoder.parse_extended_payload_lengthrc   c                 C   s~   g d}| j D ]#}|| |||}t|trtd|t|D ]
\}}|r)d||< qqt||D ]\}	}
|
r<|	s<tdq0d S )N)FFFr   TzReserved bit set unexpectedly)r   frame_inbound_headerr   rI   rT   	enumeratezip)r   rd   rc   re   Zrsv_usedr   r   bitusedexpectedfoundr   r   r   r     s   


z!FrameDecoder.extension_processingr   )r.   r/   r0   r?   r   r   r    r   r   rg   r   r   r;   rf   r   r\   r   r   r   r   r   r   G  s8    

25
r   c                	   @   s"  e Zd Zdeded ddfddZdedefd	d
Zdee	e ddf fddZ
deddfddZdeeddf fddZd&de	e de	e defddZd'dedefddZd'dedefddZ	d(deeeef dedefddZded ed!edefd"d#Z	d(d!edededefd$d%ZdS ))FrameProtocolr   r   r   r   Nc                 C   sB   || _ dd |D | _t| j | j| _t | _|  | _d | _d S )Nc                 S      g | ]}|  r|qS r   enabledr   extr   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}nlt|dkrtdt	d|d d \}|t
k s1|tkr5tdzt|}W n	 tyD   Y nw |tv rMtdt|tsZ|tkrZtdz|dd  d	}W n ty{ } z
td
t| tjd }~ww ||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 coderl   zError decoding CLOSE reason: )rh   r   r   r(   rI   rM   r*   rT   r   r   MIN_CLOSE_REASONMAX_CLOSE_REASONr   LOCAL_ONLY_CLOSE_REASONSMAX_PROTOCOL_CLOSE_REASONro   r   rZ   rO   rg   rd   ri   rj   )r   r   r"   rV   reasonr   r   r   r   _process_close  s:   
zFrameProtocol._process_closec                 c   sr    dd | j D | _ d}|s7| j }|d ur0|j s#| j|}n|jtjkr0| 	|}d}|V  |rd S d S )Nc                 S   r   r   r   r   r   r   r   r   !  r   z1FrameProtocol._parse_more_gen.<locals>.<listcomp>FT)
r   r   r   rd   rA   r   r   r;   rF   r   )r   closedr   r   r   r   r     s   


zFrameProtocol._parse_more_genr"   c                 C   r   r   )r   r   r2   r   r   r   r   0  r   zFrameProtocol.receive_bytesc                 c   s&    | j D ]}|d u r d S |V  qd S r   )r   )r   eventr   r   r   received_frames3  s   
zFrameProtocol.received_framesrV   r   c                 C   s   t  }|tju r
d }|d u r|rtd|tv rtj}|d ur9|t td|7 }|d ur9|t|	dt
d 7 }| tj|S )Nz&cannot specify a reason without a coder   rl   r&   )r(   rI   rM   	TypeErrorr   rK   r   packrq   rp   r   _serialize_framer;   rF   )r   rV   r   rh   r   r   r   close:  s   
zFrameProtocol.close    rh   c                 C      |  tj|S r   )r   r;   rG   r   rh   r   r   r   pingK     zFrameProtocol.pingc                 C   r   r   )r   r;   rH   r   r   r   r   pongN  r   zFrameProtocol.pongTrb   c                 C   s~   t |tttfrtj}nt |trtj}|d}nt	d| j
d u r'|| _
n| j
|ur0tdtj}|r8d | _
| |||S )Nrl   zMust provide bytes or textz!Data type mismatch inside message)r   r   r(   
memoryviewr;   rE   rZ   rD   rp   r   r   r   rC   r   )r   rh   rb   rd   r   r   r   	send_dataQ  s   


zFrameProtocol.send_datarc   rd   c                 C   sJ   t |d> }t |jd> t |jd>  t |jd>  }t |}||B |B S )N         r%   )rf   r]   r^   r_   )r   rb   rc   rd   Zfin_bitsZrsv_bitsZopcode_bitsr   r   r   _make_fin_rsv_opcodeh  s   *z"FrameProtocol._make_fin_rsv_opcodec                 C   s  t ddd}t| jD ]}|| ||||\}}q| |||}t|}d}|tkr/|}	d }
n|tkr8t}	|}
nt	}	|}
d}| j
rE|	dO }	t||	g}|
d urn| rWtd|rd|ttd|
7 }n
|ttd|
7 }| j
rtd}t|}|| || S || S )NFTr6   z"payload too long for control framer   r   r%   )r\   reversedr   frame_outboundr   r*   r   r   r   r   r   r(   rA   r   r   r   osurandomr   r-   )r   rd   rh   rb   rc   r   Zfin_rsv_opcodepayload_lengthZquad_payloadZfirst_payloadZsecond_payloadr   r   r   r   r   r   r   o  s:   
zFrameProtocol._serialize_frame)NN)r   )r   T)r.   r/   r0   r?   r   r    rg   r   r   r   r   r   r   r   rf   rZ   r   r   r   r   r(   r   r\   r;   r   r   r   r   r   r   r     s8    ! 
r   )?rB   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;   rI   rM   rN   rS   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	ExceptionrT   r\   ra   rg   r   rf   rq   rr   r   r   r   r   r   r   r   <module>   sb    $Y$& (