a
    nJhlh                     @   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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j0Z1edj0Z2edj0Z3edj0Z4dZ5ee% e&d< dZ6ee% e&d< G dd  d eZ7e7e(j8ddZ9e7e(j:ddZ;G d!d" d"e<Z=G d#d$ d$e<Z>ej?Z@eeA e&d%< ejBee* d&d'd(ZCe*eDdd)d*d+ZEereEZFn.zdd,lGmHZH eHZFW n eIy>   eEZFY n0 e*g d-ZJee* e&d.< eKd/ZLeeeA  e&d0< eKd1ZMeeeA  e&d2< dAeeA eNee%eNf d4d5d6ZOdBe%eNeNeAd8d9d:ZPG d;d< d<e	ZQG d=d> d>ZRG d?d@ d@ZSdS )Cz%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set_exception)	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)   H/var/www/shaz/venv/lib/python3.9/site-packages/aiohttp/http_websocket.pyr   ,   s   r   c                 C   s   h | ]}t |qS r)   )int).0ir)   r)   r*   	<setcomp><       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                   @   sL   e Zd ZU eed< eed< ee ed< ej	de
egef edddZdS )	r   typedataextra)loads)rM   returnc                C   s
   || j S )zAReturn parsed JSON data.

        .. versionadded:: 0.22
        )rK   )selfrM   r)   r)   r*   jsont   s    zWSMessage.jsonN)r    r!   r"   r   __annotations__r   r	   strrP   rM   r   r)   r)   r)   r*   r   n   s   
r   c                       s8   e Zd ZdZeedd fddZedddZ  ZS )	r   z WebSocket protocol parser error.NcodemessagerN   c                    s   || _ t || d S N)rT   super__init__rO   rT   rU   	__class__r)   r*   rX      s    zWebSocketError.__init__rN   c                 C   s   t t| jd S )Nr   )r   rR   argsrO   r)   r)   r*   __str__   s    zWebSocketError.__str__)	r    r!   r"   __doc__r+   rR   rX   r_   __classcell__r)   r)   rZ   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*   rb      s   rb   native_byteorderr\   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 rV   r)   )r,   abr)   r*   	<genexpr>   r/   z(_xor_table.<locals>.<listcomp>.<genexpr>r5   )bytesrange)r,   r)   re   r*   
<listcomp>   r/   z_xor_table.<locals>.<listcomp>r5   )ri   r)   r)   r)   r*   
_xor_table   s    rk   )maskrK   rN   c                    s   t |tsJ |t| dks&J | |rt   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 )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 rV   r)   )r,   nZ
_XOR_TABLEr)   r*   rg      r/   z)_websocket_mask_python.<locals>.<genexpr>Nr   r1      )
isinstance	bytearraylenrk   	translate)rl   rK   rd   rf   cdr)   ro   r*   _websocket_mask_python   s    rw   )_websocket_mask_cython)r   r      ry   _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isserverrN   c                 C   s   | sdS d}d}t | D ]}|d}|s4d} qt|}|rd}|r|drxt|d}|dksr|dk rxd}q|drd} qq|d	rt|d	}|dks|dk rtd
|drd} qq|std|d q||fS )N)r   Fr   Fr      rm   r2   T   zInvalid window sizer1   z#Extension for deflate not supported)r|   finditergroupr{   matchr+   rb   )r}   r~   compress
notakeoverextZdefextr   r)   r)   r*   ws_ext_parse   s>    





r   r   )r   r~   server_notakeoverrN   c                 C   s^   | dk s| dkrt ddg}|s,|d | dk rF|dt|   |rT|d d|S )	Nr2   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appendrR   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   r1   rp   rm   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ee eeddddZddddZe	e
ee	f d	d
dZe	e
ee	f d	ddZe	ee
eee eee f  dddZdS )r   TN)queuemax_msg_sizer   rN   c                 C   sp   || _ || _d | _t | _tj| _d | _d| _	d | _
t | _d| _d| _d | _d| _d| _d | _d | _|| _d S )NFr/   r   )r   _max_msg_size_excrr   _partialr   r   _state_opcode
_frame_fin_frame_opcode_frame_payload_tail	_has_mask_frame_mask_payload_length_payload_length_flag_compressed_decompressobj	_compress)rO   r   r   r   r)   r)   r*   rX     s"    zWebSocketReader.__init__r\   c                 C   s   | j   d S rV   )r   feed_eofr^   r)   r)   r*   r   2  s    zWebSocketReader.feed_eofrK   rN   c              
   C   sX   | j rd|fS z| |W S  tyR } z || _ t| j| W Y d }~dS d }~0 0 d S )NT)Tr/   )r   
_feed_data	Exceptionr   r   )rO   rK   excr)   r)   r*   	feed_data5  s    zWebSocketReader.feed_datac                 C   s  |  |D ]\}}}}|r.| js.tdd| _|tjkrt|dkrt|d d d }|dk r||tvr|tt	j
d| z|dd  d}W n2 ty } ztt	jd|W Y d }~n
d }~0 0 ttj||}	n2|rtt	j
d	| d
| d
|nttjdd}	| j|	d q
|tjkrB| jttj|dt| q
|tjkrl| jttj|dt| q
|tjtjfvr| jd u rtt	j
d|q
|s|tjkr|| _| j| | jrt| j| jkrtt	jdt| j| jq
| jr |tjkr tt	j
d||tjkrH| jd us<J | j}d | _| j| | jrt| j| jkrtt	jdt| j| j|r| jd usJ | jt | j| j| j}
| jjrt| jj}tt	jd| j| | jn
t| j}
| j   |tjkrtz*|
d}| jttj|dt| W n4 typ } ztt	jd|W Y d }~n
d }~0 0 q
| jttj|
dt|
 q
dS )NT)Zsuppress_deflate_headerr1   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   r;   rs   UNPACK_CLOSE_CODEr0   r   r   r$   decodeUnicodeDecodeErrorr%   r   r   r   r9   r:   r7   r8   r   r6   r   extendr   r&   formatrz   Zdecompress_syncunconsumed_tailrh   clear)rO   rK   finopcodepayload
compressedZ
close_codeZclose_messager   msgZpayload_mergedleftr?   r)   r)   r*   r   @  s    
		



zWebSocketReader._feed_data)bufrN   c                 C   s  g }| j r| j | d }| _ d}t|}| jtjkrp|| dkrt|||d  }|d7 }|\}}|d? d@ }|d? d@ }	|d? d@ }
|d? d@ }|d	@ }|
s|s|	r| jsttjd
|dkr|dkrttjd|d? d@ }|d@ }|dkr
|dkr
ttjd| j	s| j
du r0|	r(dnd| _
n|	rBttjd
t|| _	|| _t|| _|| _tj| _nqt| jtjkr`| j}|dkr|| dkrt|||d  }|d7 }t|d }|| _| jrtjntj| _nqtn||dkrD|| dkrt|||d  }|d7 }t|d }|| _| jr4tjntj| _nqtn|| _| jrXtjntj| _| jtjkr|| dkrt|||d  | _|d7 }tj| _nqt| jtjkr(| j}| j}|| }||kr|| | _|||d  |}n$d| _|||||   || }| jdkrt| jrD| jdus8J t| j| || j	| j|| j
f t | _tj| _q(qtq(||d | _ |S )z&Return the next frame from the socket.r/   r   r1      r   r      rm   r   z*Received frame with non-zero reserved bitsz!Received fragmented control frame   }   z5Control frame payload cannot be larger than 125 bytesNTF~   r4   )r   rs   r   r   r   r   r   r   r$   r   r   boolr   r   r   r   UNPACK_LEN2r   r   r   UNPACK_LEN3r   r   r   _websocket_maskr   rr   )rO   r   frames	start_posZ
buf_lengthrK   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)r    r!   r"   r   r   r+   r   rX   r   rh   r   r   r   r   r	   rr   r   r)   r)   r)   r*   r     s    
}r   c                
   @   s   e Zd Zdee dddeeje	e
eje
e	ddddZdee
ee
 ddd	d
Ze
edddZeddddZdeeef ddddZd eeef ddddZd!eeef e	ee
 ddddZd"e
eeef ddddZdS )#r   Fr   )use_masklimitrandomr   r   N)protocol	transportr   r   r   r   r   rN   c                C   sB   || _ || _|| _|j| _|| _|| _d| _|| _d| _d | _	d S )NFr   )
r   r   r   	randranger   r   _closing_limit_output_size_compressobj)rO   r   r   r   r   r   r   r   r)   r)   r*   rX   Y  s    zWebSocketWriter.__init__)rU   r   r   rN   c                    s  | j r|tj@ stdd}|s&| jr|dk r|r>| |}n| jsR| | j| _| j}||I dH }||| jrzt	j
nt	j7 }|tr|dd }|dB }t|}| j}|rd}nd}|dk rtd|B |B ||B }	n<|d	k rtd|B |B d|B |}	ntd|B |B d
|B |}	|r|| dd}
|
dd}t|}t|| | |	| |  |  jt|	t| | 7  _nD|tkr| |	 | | n| |	|  |  jt|	| 7  _| j| jkrd| _| j I dH  dS )<Send a frame over the websocket with message as its payload.!Cannot write to closing transportr   r4   N@      r   rH   r   l    rm   big)r   r   r;   ConnectionResetErrorr   _make_compress_objr   flushr   zlibZ_FULL_FLUSHZ_SYNC_FLUSHendswithrz   rs   r   	PACK_LEN1	PACK_LEN2	PACK_LEN3r   to_bytesrr   r   _writer   rG   r   r   Z_drain_helper)rO   rU   r   r   ZrsvcompressobjZ
msg_lengthr   Zmask_bitheaderZmask_intrl   r)   r)   r*   _send_frameo  sR    


 

zWebSocketWriter._send_frame)r   rN   c                 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)rO   r   r)   r)   r*   r     s
    z"WebSocketWriter._make_compress_objr   c                 C   s,   | j d u s| j  rtd| j | d S )Nr   )r   Z
is_closingr   write)rO   rK   r)   r)   r*   r     s    zWebSocketWriter._writer/   )rU   rN   c                    s,   t |tr|d}| |tjI dH  dS )zSend pong message.r   N)rq   rR   encoder   r   r:   rO   rU   r)   r)   r*   rB     s    

zWebSocketWriter.pongc                    s,   t |tr|d}| |tjI dH  dS )zSend ping message.r   N)rq   rR   r   r   r   r9   r   r)   r)   r*   rA     s    

zWebSocketWriter.ping)rU   r@   r   rN   c                    sJ   t |tr|d}|r0| |tj|I dH  n| |tj|I dH  dS )r   r   N)rq   rR   r   r   r   r8   r7   )rO   rU   r@   r   r)   r)   r*   send  s
    

zWebSocketWriter.sendr   rS   c                    sJ   t |tr|d}z(| jt|| tjdI dH  W d| _nd| _0 dS )z<Close the websocket, sending the specified code and message.r   )r   NT)rq   rR   r   r   PACK_CLOSE_CODEr   r;   r   rY   r)   r)   r*   rC     s    

zWebSocketWriter.close)N)r/   )r/   )FN)r   r/   )r    r!   r"   rI   r   Randomr   asyncio	Transportr   r+   rX   rh   r	   r   r   r   r   r   rR   rB   rA   r   rC   r)   r)   r)   r*   r   X  sB    
F	  
r   )F)r   FF)Tr`   r   	functoolsrP   r   resysr   enumr   structr   typingr   r   r   r   r   r	   r
   r   r   r   r   Zbase_protocolr   Zcompression_utilsr   r   Zhelpersr   r   streamsr   __all__r   r0   r+   rQ   r   r   r   rh   unpack_fromr   r   unpackr   packr   r   r   r   rG   rI   r   r=   r   r<   r   r   r   rb   	byteorderrc   rR   	lru_cacherk   rr   rw   r   Z
_websocketrx   ImportErrorrz   compiler{   r|   r   r   r   r   r   r   r)   r)   r)   r*   <module>   sz   4	







 4   A