o
    Zh\h                  	   @   s  U d Z ddlZddlZddlZ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 ddlmZmZmZmZmZmZmZmZmZmZmZ ddlmZ ddlmZmZ dd	lmZ dd
lm Z  dZ!G dd de	Z"dd e"D Z#eee$  e%d< dZ&G dd de	Z'dZ(ee) e%d< edj*Z+edj*Z,edj-Z.edj/Z0edj/Z1edj/Z2edj/Z3dZ4ee$ e%d< dZ5ee$ e%d< G dd  d eZ6e6e'j7ddZ8e6e'j9ddZ:G d!d" d"e;Z<G d#d$ d$e;Z=ej>Z?ee@ e%d%< ejAd&ee) fd'd(ZBd)e)d*eCd&dfd+d,ZDer	eDZEnz
dd-lFmGZG eGZEW n eHy   eDZEY nw e)g d.ZIee) e%d/< eJd0ZKeee@  e%d1< eJd2ZLeee@  e%d3< dDd5ee@ d6eMd&ee$eMf fd7d8ZN	4dEd:e$d6eMd;eMd&e@fd<d=ZOG d>d? d?e	ZPG d@dA dAZQG dBdC dCZRdS )Fz%WebSocket protocol versions 13 and 8.    N)IntEnum)Struct)AnyCallableFinalList
NamedTupleOptionalPatternSetTupleUnioncast   )BaseProtocol)ZLibCompressorZLibDecompressor)NO_EXTENSIONS)	DataQueue)	WS_CLOSED_MESSAGEWS_CLOSING_MESSAGEWS_KEYWebSocketReaderWebSocketWriter	WSMessageWebSocketError	WSMsgTypeWSCloseCodec                   @   s@   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S )r     i  i  i  i  i  i  i  i  i  i  i  i  N)__name__
__module____qualname__OKZ
GOING_AWAYPROTOCOL_ERRORZUNSUPPORTED_DATAZABNORMAL_CLOSUREINVALID_TEXTZPOLICY_VIOLATIONMESSAGE_TOO_BIGZMANDATORY_EXTENSIONINTERNAL_ERRORZSERVICE_RESTARTZTRY_AGAIN_LATERBAD_GATEWAY r(   r(   M/var/www/html/lang_env/lib/python3.10/site-packages/aiohttp/http_websocket.pyr   ,   s    r   c                 C   s   h | ]}t |qS r(   )int).0ir(   r(   r)   	<setcomp><   s    r-   ALLOWED_CLOSE_CODESi   c                   @   sP   e Zd ZdZdZdZdZdZdZdZ	dZ
d	ZeZeZeZeZeZe	Ze
ZeZd
S )r   r   r      	   
         i  i  N)r   r    r!   CONTINUATIONTEXTBINARYPINGPONGCLOSECLOSINGCLOSEDERRORtextbinarypingpongcloseclosingclosederrorr(   r(   r(   r)   r   H   s$    r   s$   258EAFA5-E914-47DA-95CA-C5AB0DC85B11r   z!Hz!Qz!BBz!BBHz!BBQi @  MSG_SIZE   DEFAULT_LIMITc                   @   sN   e Zd ZU eed< eed< ee ed< ej	dde
egef defddZd	S )
r   typedataextra)loadsrK   returnc                C   s
   || j S )zAReturn parsed JSON data.

        .. versionadded:: 0.22
        )rI   )selfrK   r(   r(   r)   jsont   s   
zWSMessage.jsonN)r   r    r!   r   __annotations__r   r	   strrN   rK   r   r(   r(   r(   r)   r   n   s
   
 (r   c                       s<   e Zd ZdZdededdf fddZdefdd	Z  ZS )
r   z WebSocket protocol parser error.codemessagerL   Nc                    s   || _ t || d S N)rQ   super__init__rM   rQ   rR   	__class__r(   r)   rU      s   zWebSocketError.__init__c                 C   s   t t| jd S )Nr   )r   rP   argsrM   r(   r(   r)   __str__   s   zWebSocketError.__str__)	r   r    r!   __doc__r*   rP   rU   r[   __classcell__r(   r(   rW   r)   r      s    r   c                   @   s   e Zd ZdZdS )WSHandshakeErrorz#WebSocket protocol handshake error.N)r   r    r!   r\   r(   r(   r(   r)   r^      s    r^   native_byteorderrL   c                   C   s   dd t dD S )Nc                    s&   g | ] t  fd dtdD qS )c                 3   s    | ]}| A V  qd S rS   r(   )r+   abr(   r)   	<genexpr>       z(_xor_table.<locals>.<listcomp>.<genexpr>r3   )bytesrange)r+   r(   ra   r)   
<listcomp>   s   & z_xor_table.<locals>.<listcomp>r3   )rf   r(   r(   r(   r)   
_xor_table   s   rh   maskrI   c                    s   t |ts	J |t| dksJ | |rct   f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dd< dS dS )aw  Websocket masking function.

    `mask` is a `bytes` object of length 4; `data` is a `bytearray`
    object of any length. The contents of `data` are masked with `mask`,
    as specified in section 5.3 of RFC 6455.

    Note that this function mutates the `data` argument.

    This pure-python implementation may be replaced by an optimized
    version when available.

       c                 3   s    | ]} | V  qd S rS   r(   )r+   nZ
_XOR_TABLEr(   r)   rc      rd   z)_websocket_mask_python.<locals>.<genexpr>Nr   r/      )
isinstance	bytearraylenrh   	translate)ri   rI   r`   rb   cdr(   rl   r)   _websocket_mask_python   s   "rt   )_websocket_mask_cython)r   r      rv   _WS_DEFLATE_TRAILINGz^(?:;\s*(?:(server_no_context_takeover)|(client_no_context_takeover)|(server_max_window_bits(?:=(\d+))?)|(client_max_window_bits(?:=(\d+))?)))*$
_WS_EXT_REzpermessage-deflate([^,]+)?_WS_EXT_RE_SPLITFextstrisserverc                 C   s   | sdS d}d}t | D ]m}|d}|sd} ||fS t|}|rod}|rK|dr?t|d}|dks<|dk r?d}q|drFd} ||fS |d	rct|d	}|dks_|dk rctd
|drjd} ||fS |sztd|d q||fS )N)r   Fr   Fr      rj   r0   T   zInvalid window sizer/   z#Extension for deflate not supported)ry   finditergrouprx   matchr*   r^   )rz   r{   compress
notakeoverextZdefextr   r(   r(   r)   ws_ext_parse   sF   
%




r   r|   r   server_notakeoverc                 C   s^   | dk s| dkrt ddg}|s|d | dk r#|dt|   |r*|d d|S )	Nr0   r|   zCCompress wbits must between 9 and 15, zlib does not support wbits=8zpermessage-deflateZclient_max_window_bitszserver_max_window_bits=Zserver_no_context_takeoverz; )
ValueErrorappendrP   join)r   r{   r   Z
enabledextr(   r(   r)   
ws_ext_gen   s   


r   c                   @   s   e Zd ZdZdZdZdZdS )WSParserStater   r/   rm   rj   N)r   r    r!   READ_HEADERREAD_PAYLOAD_LENGTHREAD_PAYLOAD_MASKREAD_PAYLOADr(   r(   r(   r)   r     s
    r   c                
   @   s   e Zd Z	ddee dededdfddZdd	d
Zde	de
ee	f fddZde	de
ee	f fddZde	dee
eee eee f  fddZdS )r   Tqueuemax_msg_sizer   rL   Nc                 C   sp   || _ || _d | _t | _tj| _d | _d| _	d | _
t | _d| _d| _d | _d| _d| _d | _d | _|| _d S )NF    r   )r   _max_msg_size_excro   _partialr   r   _state_opcode
_frame_fin_frame_opcode_frame_payload_tail	_has_mask_frame_mask_payload_length_payload_length_flag_compressed_decompressobj	_compress)rM   r   r   r   r(   r(   r)   rU     s"   
zWebSocketReader.__init__c                 C   s   | j   d S rS   )r   feed_eofrZ   r(   r(   r)   r   2  s   zWebSocketReader.feed_eofrI   c              
   C   sT   | j rd|fS z| |W S  ty) } z|| _ | j| W Y d }~dS d }~ww )NT)Tr   )r   
_feed_data	Exceptionr   set_exception)rM   rI   excr(   r(   r)   	feed_data5  s   zWebSocketReader.feed_datac                 C   sb  |  |D ]\}}}}|r| jstdd| _|tjkrt|dkrdt|d d d }|dk r=|tvr=tt	j
d| z|dd  d}W n ty[ } ztt	jd|d }~ww ttj||}	n|rutt	j
d	| d
| d
|ttjdd}	| j|	d q|tjkr| jttj|dt| q|tjkr| jttj|dt| q|tjtjfvr| jd u rtt	j
d||s|tjkr|| _| j| | jrt| j| jkrtt	jdt| j| jq| jr|tjkrtt	j
d||tjkr| jd usJ | j}d | _| j| | jr2t| j| jkr2tt	jdt| j| j|rf| jd us=J | jt | j| j| j}
| jjret| jj}tt	jd| j| | jnt| j}
| j   |tjkrz|
d}| jttj|dt| W q ty } ztt	jd|d }~ww | jttj|
dt|
 qdS )NT)Zsuppress_deflate_headerr/   r   i  zInvalid close code: utf-8zInvalid UTF-8 text messagezInvalid close frame:   zUnexpected opcode=z Message size {} exceeds limit {}z<The opcode in non-fin frame is expected to be zero, got {!r}z-Decompressed message size {} exceeds limit {})Fr   )!parse_framer   r   r   r9   rp   UNPACK_CLOSE_CODEr.   r   r   r#   decodeUnicodeDecodeErrorr$   r   r   r   r7   r8   r5   r6   r   r4   r   extendr   r%   formatrw   Zdecompress_syncunconsumed_tailre   clear)rM   rI   finopcodepayload
compressedZ
close_codeZclose_messager   msgZpayload_mergedleftr=   r(   r(   r)   r   @  s   





	
	

	

zWebSocketReader._feed_databufc                 C   sf  g }| j r| j | d}| _ d}t|}	 | jtjkr|| dkr|||d  }|d7 }|\}}|d? d@ }|d? d@ }	|d? d@ }
|d	? d@ }|d
@ }|
sV|sV|	r\| js\ttjd|dkrj|dkrjttjd|d? d@ }|d@ }|dkr|dkrttjd| j	s| j
du r|	rdnd| _
n|	rttjdt|| _	|| _t|| _|| _tj| _nn| jtjkr!| j}|dkr|| dkr|||d  }|d7 }t|d }|| _| jrtjntj| _n=n|dkr|| dkr|||d  }|d7 }t|d }|| _| jrtjntj| _nn|| _| jrtjntj| _| jtjkrB|| d	krA|||d	  | _|d	7 }tj| _nnh| jtjkr| j}| j}|| }||kri|| | _|||d  |}nd| _|||||   || }| jdkr| jr| jdusJ t| j| || j	| j|| j
f t | _tj| _nnq||d | _ |S )z&Return the next frame from the socket.r   r   Tr/      r   r}      rj   r|   z*Received frame with non-zero reserved bitsz!Received fragmented control frame   }   z5Control frame payload cannot be larger than 125 bytesNF~   r2   )r   rp   r   r   r   r   r   r   r#   r   r   boolr   r   r   r   UNPACK_LEN2r   r   r   UNPACK_LEN3r   r   r   _websocket_maskr   ro   )rM   r   frames	start_posZ
buf_lengthrI   Z
first_byteZsecond_byter   Zrsv1Zrsv2Zrsv3r   Zhas_masklengthr   Z	chunk_lenr(   r(   r)   r     s   









  zWebSocketReader.parse_frame)T)rL   N)r   r    r!   r   r   r*   r   rU   r   re   r   r   r   r   r	   ro   r   r(   r(   r(   r)   r     s&    

|r   c                   @   s  e Zd Zdee ddddedejde	de
dejd	e
d
e	ddfddZ	d$dede
d	ee
 ddfddZd	e
defddZdeddfddZd%deeef ddfddZd%deeef ddfddZ		d&deeef de	d	ee
 ddfddZd'd!e
deeef ddfd"d#ZdS )(r   Fr   )use_masklimitrandomr   r   protocol	transportr   r   r   r   r   rL   Nc                C   sB   || _ || _|| _|j| _|| _|| _d| _|| _d| _d | _	d S )NFr   )
r   r   r   	randranger   r   _closing_limit_output_size_compressobj)rM   r   r   r   r   r   r   r   r(   r(   r)   rU   Y  s   
zWebSocketWriter.__init__rR   r   c                    s  | j r|tj@ stdd}|s| jrR|dk rR|r | |}n| js*| | j| _| j}||I dH }||| jr>t	j
nt	j7 }|trN|dd }|dB }t|}| j}|r^d}nd}|dk rptd|B |B ||B }	n|d	k rtd|B |B d|B |}	ntd|B |B d
|B |}	|r| dd}
|
dd}t|}t|| | |	| |  |  jt|	t| | 7  _n!|tkr| |	 | | n| |	|  |  jt|	| 7  _| j| jkrd| _| j I dH  dS dS )<Send a frame over the websocket with message as its payload.!Cannot write to closing transportr   r2   N@      r   rF   r   l    rj   big)r   r   r9   ConnectionResetErrorr   _make_compress_objr   flushr   zlibZ_FULL_FLUSHZ_SYNC_FLUSHendswithrw   rp   r   	PACK_LEN1	PACK_LEN2	PACK_LEN3r   to_bytesro   r   _writer   rE   r   r   _drain_helper)rM   rR   r   r   ZrsvcompressobjZ
msg_lengthr   Zmask_bitheaderZmask_intri   r(   r(   r)   _send_frameo  sV   

 
zWebSocketWriter._send_framec                 C   s   t tj| tdS )N)levelwbitsZmax_sync_chunk_size)r   r   Z_BEST_SPEEDWEBSOCKET_MAX_SYNC_CHUNK_SIZE)rM   r   r(   r(   r)   r     s
   z"WebSocketWriter._make_compress_objrI   c                 C   s,   | j d u s
| j  rtd| j | d S )Nr   )r   
is_closingr   write)rM   rI   r(   r(   r)   r     s   zWebSocketWriter._writer   c                    .   t |tr|d}| |tjI dH  dS )zSend pong message.r   N)rn   rP   encoder   r   r8   rM   rR   r(   r(   r)   r@        

zWebSocketWriter.pongc                    r   )zSend ping message.r   N)rn   rP   r   r   r   r7   r   r(   r(   r)   r?     r   zWebSocketWriter.pingr>   c                    sN   t |tr|d}|r| |tj|I dH  dS | |tj|I dH  dS )r   r   N)rn   rP   r   r   r   r6   r5   )rM   rR   r>   r   r(   r(   r)   send  s   

zWebSocketWriter.sendr   rQ   c                    sJ   t |tr|d}z| jt|| tjdI dH  W d| _dS d| _w )z<Close the websocket, sending the specified code and message.r   )r   NT)rn   rP   r   r   PACK_CLOSE_CODEr   r9   r   rV   r(   r(   r)   rA     s   

zWebSocketWriter.closerS   )r   )FN)r   r   )r   r    r!   rG   r   Randomr   asyncio	Transportr   r*   rU   re   r	   r   r   r   r   r   rP   r@   r?   r   rA   r(   r(   r(   r)   r   X  sb    	


F	

$r   )F)r|   FF)Sr\   r   	functoolsrN   r   resysr   enumr   structr   typingr   r   r   r   r   r	   r
   r   r   r   r   Zbase_protocolr   Zcompression_utilsr   r   helpersr   streamsr   __all__r   r.   r*   rO   r   r   r   re   unpack_fromr   r   unpackr   packr   r   r   r   rE   rG   r   r;   r   r:   r   r   r   r^   	byteorderr_   rP   	lru_cacherh   ro   rt   r   Z
_websocketru   ImportErrorrw   compilerx   ry   r   r   r   r   r   r   r(   r(   r(   r)   <module>   s    4	






$4
  A