o
    ]i^                     @  s  d Z ddlmZ ddl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 er8ddlmZ d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=d3d4Z8G d5d6 d6Z9G d7d8 d8Z:G d9d: d:Z;G d;d< d<Z<dS )>zY
wsproto/frame_protocol
~~~~~~~~~~~~~~~~~~~~~~

WebSocket frame protocol implementation.
    )annotationsN)IncrementalDecodergetincrementaldecoder)IntEnum)TYPE_CHECKING
NamedTuple)	Generator   )	Extensionc                   s&   g | ] t  fd dtdD qS )c                 3  s    | ]}| A V  qd S N ).0abr   [/var/www/html/stock_analysis/be/venv/lib/python3.10/site-packages/wsproto/frame_protocol.py	<genexpr>       z<listcomp>.<genexpr>   )bytesrange)r   r   r   r   
<listcomp>   s   & r   r   c                   @  s    e Zd ZdddZdd	d
ZdS )XorMaskerSimplemasking_keybytearray | bytesreturnNonec                 C  s
   || _ d S r   )_masking_key)selfr   r   r   r   __init__      
zXorMaskerSimple.__init__data	bytearrayc                 C  s   t |}|rg|}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 |  | _|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	         )r"   r   	translatelen)r   r!   
data_arrayr   r   cdkey_rotationr   r   r   process   s   zXorMaskerSimple.processN)r   r   r   r   r!   r"   r   r"   )__name__
__module____qualname__r   r.   r   r   r   r   r      s    
r   c                   @  s   e Zd ZdddZdS )XorMaskerNullr!   r"   r   c                 C  s   |S r   r   r   r!   r   r   r   r.   3   s   zXorMaskerNull.processNr/   )r0   r1   r2   r.   r   r   r   r   r3   2   s    r3   ~      }   i  l       @             c                   @  s2   e Zd ZdZdZdZdZdZdZdZ	dd
dZ
dS )Opcodez7
    RFC 6455, Section 5.2 - Base Framing Protocol
    r   r	   r&      	   
   r   boolc                 C  s   t | d@ S )Nr>   )rA   r   r   r   r   	iscontrold   s   zOpcode.iscontrolNr   rA   )r0   r1   r2   __doc__CONTINUATIONTEXTBINARYCLOSEPINGPONGrC   r   r   r   r   r=   M   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)r0   r1   r2   rE   NORMAL_CLOSURE
GOING_AWAYPROTOCOL_ERRORUNSUPPORTED_DATANO_STATUS_RCVDABNORMAL_CLOSUREINVALID_FRAME_PAYLOAD_DATAPOLICY_VIOLATIONMESSAGE_TOO_BIGMANDATORY_EXTINTERNAL_ERRORSERVICE_RESTARTTRY_AGAIN_LATERTLS_HANDSHAKE_FAILEDr   r   r   r   rL   h   s     		rL   rM   i  i  i  i  i  z!Ic                      s$   e Zd Zejfd	 fddZ  ZS )
ParseFailedmsgstrcoderL   r   r   c                   s   t  | || _d S r   )superr   r_   )r   r]   r_   	__class__r   r   r      s   
zParseFailed.__init__)r]   r^   r_   rL   r   r   )r0   r1   r2   rL   rP   r   __classcell__r   r   ra   r   r\      s    r\   c                   @  s&   e Zd ZU ded< ded< ded< dS )RsvBitsrA   rsv1rsv2rsv3Nr0   r1   r2   __annotations__r   r   r   r   rd      s   
 rd   c                   @  s6   e Zd ZU ded< ded< ded< ded< d	ed
< dS )HeaderrA   finrd   rsvr=   opcodeintpayload_lenbytes | Noner   Nrh   r   r   r   r   rj      s   
 rj   c                   @  s.   e Zd ZU ded< ded< ded< ded< dS )	Framer=   rm   zbytes | str | tuple[int, str]payloadrA   frame_finishedmessage_finishedNrh   r   r   r   r   rq      s
   
 rq   r!   r   nbytesrn   r   c                 C  s0   t | |kr| S | d | } | jddddS )Nutf-8ignore)errors)r)   decodeencode)r!   ru   r   r   r   _truncate_utf8   s   r{   c                   @  sT   e Zd ZddddZdd
dZdddZdddZdddZdddZd ddZ	dS )!BufferNinitial_bytesrp   r   r   c                 C  s$   t  | _d| _|r| | d S d S Nr   )r"   buffer
bytes_usedfeed)r   r}   r   r   r   r     s
   zBuffer.__init__	new_bytesr   c                 C  s   |  j |7  _ d S r   )r   )r   r   r   r   r   r     s   zBuffer.feedru   rn   r"   c                 C  s6   |st  S | j| j| j|  }|  jt|7  _|S r   )r"   r   r   r)   )r   ru   r!   r   r   r   consume_at_most  s
   zBuffer.consume_at_mostbytearray | Nonec                 C  s"   t | j| j |k rd S | |S r   )r)   r   r   r   )r   ru   r   r   r   consume_exactly  s   
zBuffer.consume_exactlyc                 C  s   | j d | j= d| _d S r~   )r   r   rB   r   r   r   commit  s   
zBuffer.commitc                 C  s
   d| _ d S r~   )r   rB   r   r   r   rollback  r    zBuffer.rollbackc                 C  s
   t | jS r   )r)   r   rB   r   r   r   __len__!  r    zBuffer.__len__r   )r}   rp   r   r   )r   r   r   r   )ru   rn   r   r"   )ru   rn   r   r   r   r   )r   rn   )
r0   r1   r2   r   r   r   r   r   r   r   r   r   r   r   r|     s    




r|   c                   @  s    e Zd Zd
ddZdddZd	S )MessageDecoderr   r   c                 C  s   d | _ d | _d S r   )rm   decoderrB   r   r   r   r   &  s   
zMessageDecoder.__init__framerq   c              
   C  s  |j  rJ | j d u r|j tju rd}t||j | _ n|j tjur-d|j }t||j tju r9td | _|jo>|j	}| jd u rH|j
}n)t|j
ttfsRJ z
| j|j
|}W n typ } ztt|tjd }~ww t| j ||j|}|rd | _ d | _|S )Nzunexpected CONTINUATIONzexpected CONTINUATION, got rv   )rm   rC   r=   rF   r\   rG   r   r   rs   rt   rr   
isinstancer   r"   ry   UnicodeDecodeErrorr^   rL   rT   rq   )r   r   r]   finishedr!   excr   r   r   process_frame*  s4   


zMessageDecoder.process_frameNr   r   rq   r   rq   )r0   r1   r2   r   r   r   r   r   r   r   %  s    
r   c                   @  sL   e Zd Z	dddd	Zd ddZd!ddZd"ddZd#ddZd$ddZdS )%FrameDecoderNclientrA   
extensionslist[Extension] | Noner   r   c                 C  s:   || _ |pg | _t | _d | _d | _d | _d| _d| _d S r~   )	r   r   r|   r   headereffective_opcodemaskerpayload_requiredpayload_consumedr   r   r   r   r   r   r   N  s   

zFrameDecoder.__init__r!   r   c                 C     | j | d S r   )r   r   r4   r   r   r   receive_bytes\     zFrameDecoder.receive_bytesFrame | Nonec           
      C  s  | 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|trsd}t||t|}q]|rt }| jD ]}|| | j j}t|trd}t|||d ur||7 }q||7 }t| jt||| j j}	|rd | _ d | _d | _|	S tj| _|	S )Nr   error in extension)r   parse_headerr   r   r)   r   r   ro   r   r   r   r.   r   frame_inbound_payload_datar   r   rL   r\   r"   frame_inbound_completerk   rq   r=   rF   )
r   payload_remainingrr   r   	extensionpayload_r]   finalresultr   r   r   r   process_buffer_  sP   







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yN   d|d}t|w | r[|s[d}t|t|d t@ }|d t@ }| ||}|d u rz| j   dS | ||| |r| jrd}t||s| jsd	}t||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)r   r   r   rA   FIN_MASKrd   	RSV1_MASK	RSV2_MASK	RSV3_MASKOPCODE_MASKr=   
ValueErrorr\   rC   	MASK_MASKPAYLOAD_LEN_MASKparse_extended_payload_lengthextension_processingr   r   r   r3   r   rj   r   rm   r   r   r   )
r   r!   rk   rl   rm   r]   has_maskpayload_len_shortro   r   r   r   r   r     s`   






zFrameDecoder.parse_headerrm   r=   ro   rn   
int | Nonec                 C  s   |  r|tkrd}t||tkr1| jd}|d u rd S td|\}|tkr/d}t||S |tkr\| jd}|d u rAd S td|\}|t	krRd}t||d? r\d	}t||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)
rC   MAX_PAYLOAD_NORMALr\   PAYLOAD_LENGTH_TWO_BYTEr   r   structunpackPAYLOAD_LENGTH_EIGHT_BYTEMAX_PAYLOAD_TWO_BYTE)r   rm   ro   r]   r!   r   r   r   r     s8   z*FrameDecoder.parse_extended_payload_lengthrl   rd   c                 C  s   g d}| j D ]%}|| |||}t|trd}t||t|D ]
\}}	|	r+d||< q!qt||D ]\}
}|r@|
s@d}t|q2d S )N)FFFr   TzReserved bit set unexpectedly)r   frame_inbound_headerr   rL   r\   	enumeratezip)r   rm   rl   ro   rsv_usedr   r   r]   bitusedexpectedfoundr   r   r   r     s"   


z!FrameDecoder.extension_processingr   )r   rA   r   r   r   r   r!   r   r   r   )r   r   rD   )rm   r=   ro   rn   r   r   )rm   r=   rl   rd   ro   rn   r   r   )	r0   r1   r2   r   r   r   r   r   r   r   r   r   r   r   M  s    


3
9"r   c                   @  s   e Zd Zd4ddZd5ddZd6ddZd7ddZd8ddZd9d:ddZd;d<d!d"Z	d;d<d#d$Z
	%d=d>d(d)Zd?d/d0Z	%d=d@d2d3ZdS )AFrameProtocolr   rA   r   list[Extension]r   r   c                 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   rq   c              
   C  s6  |j }t|ttfsJ |stjdf}n}t|dkr d}t|t	d|d d \}|t
k s3|tkr9d}t|tt t|}W d    n1 sMw   Y  |tv r\d}t|t|tsk|tkrkd}t|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 coderv   zError decoding CLOSE reason: )rr   r   r   r"   rL   rR   r)   r\   r   r   MIN_CLOSE_REASONMAX_CLOSE_REASON
contextlibsuppressr   LOCAL_ONLY_CLOSE_REASONSMAX_PROTOCOL_CLOSE_REASONry   r   r^   rT   rq   rm   rs   rt   )r   r   r!   r]   r_   reasonr   r   r   r   _process_close  s>   

zFrameProtocol._process_close#Generator[Frame | None, None, None]c                 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   4  r   z1FrameProtocol._parse_more_gen.<locals>.<listcomp>FT)
r   r   r   rm   rC   r   r   r=   rI   r   )r   closedr   r   r   r   r   .  s   


zFrameProtocol._parse_more_genr!   r   c                 C  r   r   )r   r   r4   r   r   r   r   C  r   zFrameProtocol.receive_bytesGenerator[Frame, None, None]c                 c  s&    | j D ]}|d u r d S |V  qd S r   )r   )r   eventr   r   r   received_framesF  s   
zFrameProtocol.received_framesNr_   r   r   
str | Noner"   c                 C  s   t  }|tju r
d }|d u r|rd}t||tv rtj}|d ur;|t td|7 }|d ur;|t|	dt
d 7 }| tj|S )Nz&cannot specify a reason without a coder   rv   r&   )r"   rL   rR   	TypeErrorr   rN   r   packr{   rz   r   _serialize_framer=   rI   )r   r_   r   rr   r]   r   r   r   closeM  s   
zFrameProtocol.close    rr   c                 C     |  tj|S r   )r   r=   rJ   r   rr   r   r   r   ping_     zFrameProtocol.pingc                 C  r   r   )r   r=   rK   r   r   r   r   pongb  r   zFrameProtocol.pongTbytes | bytearray | strrk   c                 C  s   t |tttfrtj}nt |trtj}|d}nd}t	|| j
d u r)|| _
n| j
|ur4d}t	|tj}|r<d | _
| |||S )Nrv   zMust provide bytes or textz!Data type mismatch inside message)r   r   r"   
memoryviewr=   rH   r^   rG   rz   r   r   rF   r   )r   rr   rk   rm   r]   r   r   r   	send_datae  s    


zFrameProtocol.send_datarl   rd   rm   r=   rn   c                 C  sJ   t |d> }t |jd> t |jd>  t |jd>  }t |}||B |B S )N         r%   )rn   re   rf   rg   )r   rk   rl   rm   fin_bitsrsv_bitsopcode_bitsr   r   r   _make_fin_rsv_opcode~  s   *z"FrameProtocol._make_fin_rsv_opcodebytes | bytearrayc                 C  s.  t |}tddd}t| jD ]}|| ||t||\}}q| |||}t|}d}|tkr5|}	d }
n|t	kr>t
}	|}
nt}	|}
d}| jrK|	dO }	t ||	g}|
d urv| r_d}t||rl|t td|
7 }n
|t td|
7 }| jrt td}t|}t || |t | S t || S )NFTr8   z"payload too long for control framer   r   r%   )r"   rd   reversedr   frame_outboundr   r   r)   r   r   r   r   r   rC   r   r   r   osurandomr   r.   )r   rm   rr   rk   rl   r   fin_rsv_opcodepayload_lengthquad_payloadfirst_payloadsecond_payloadr   r]   r   r   r   r   r   r     s>   zFrameProtocol._serialize_frame)r   rA   r   r   r   r   r   )r   r   r   )r   r   )NN)r_   r   r   r   r   r"   )r   )rr   r   r   r"   )r   T)rr   r   rk   rA   r   r"   )rk   rA   rl   rd   rm   r=   r   rn   )rm   r=   rr   r   rk   rA   r   r"   )r0   r1   r2   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r     s    


#


r   )r!   r   ru   rn   r   r   )=rE   
__future__r   r   r   r   codecsr   r   enumr   typingr   r   collections.abcr   r   r
   r   r#   r   r3   r   r   r   r   MAX_PAYLOAD_EIGHT_BYTEMAX_FRAME_PAYLOADr   r   r   r   r   r   r   r=   rL   rR   rS   r[   r   r   MIN_PROTOCOL_CLOSE_REASONr   MIN_LIBRARY_CLOSE_REASONMAX_LIBRARY_CLOSE_REASONMIN_PRIVATE_CLOSE_REASONMAX_PRIVATE_CLOSE_REASONr   r   	NULL_MASK	Exceptionr\   rd   rj   rq   r{   r|   r   r   r   r   r   r   r   <module>   sh    Y
$( 3