
­­­­­­­­­­­­­­­­­­
<!DOCTYPE html>
<html>
U
    '7`
b                     @   sj  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 ddl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G dd de	ZdZedjZedjZ edj!Z"edj#Z$edj#Z%edj#Z&edj#Z'dZ(dZ)e*ddddgZ+G dd de+Z,e,ej-ddZ.e,ej/ddZ0G dd  d e1Z2G d!d" d"e1Z3ej4Z5d#d$ e6d%D Z7e8e9dd&d'd(Z:ere:Z;n0zdd)l<m=Z= e=Z;W n e>k
r   e:Z;Y nX e8ddd*d*gZ?e@d+ZAe@d,ZBd;eeC eDeeEeDf d.d/d0ZFd<eEeDeDeCd2d3d4ZGG d5d6 d6e	ZHG d7d8 d8ZIG d9d: d:ZJdS )=z%WebSocket protocol versions 13 and 8.    N)IntEnum)Struct)AnyCallableListOptionalTupleUnion   )BaseProtocol)NO_EXTENSIONS)	DataQueue)	WS_CLOSED_MESSAGEWS_CLOSING_MESSAGEWS_KEYWebSocketReaderWebSocketWriter	WSMessageWebSocketError	WSMsgTypeWSCloseCodec                   @   s8   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S )r     i  i  i  i  i  i  i  i  i  i  N)__name__
__module____qualname__ZOKZ
GOING_AWAYPROTOCOL_ERRORZUNSUPPORTED_DATAINVALID_TEXTZPOLICY_VIOLATIONMESSAGE_TOO_BIGZMANDATORY_EXTENSIONZINTERNAL_ERRORZSERVICE_RESTARTZTRY_AGAIN_LATER r   r   I/opt/alt/python38/lib64/python3.8/site-packages/aiohttp/http_websocket.pyr      s   r   c                 C   s   h | ]}t |qS r   )int).0ir   r   r   	<setcomp>-   s     r#   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   0   s"   r   s$   258EAFA5-E914-47DA-95CA-C5AB0DC85B11z!Hz!Qz!BBz!BBHz!BBQi @     _WSMessageBasetypedataextrac                   @   s.   e Zd Zejdeegef edddZdS )r   )loads)r?   returnc                C   s
   || j S )zAReturn parsed JSON data.

        .. versionadded:: 0.22
        )r=   )selfr?   r   r   r   jsonZ   s    zWSMessage.jsonN)r   r   r   rB   r?   r   r   r   r   r   r   r   Y   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messager@   c                    s   || _ t || d S N)rD   super__init__rA   rD   rE   	__class__r   r   rH   i   s    zWebSocketError.__init__r@   c                 C   s
   | j d S )Nr
   )argsrA   r   r   r   __str__m   s    zWebSocketError.__str__)	r   r   r   __doc__r    strrH   rO   __classcell__r   r   rJ   r   r   f   s   r   c                   @   s   e Zd ZdZdS )WSHandshakeErrorz#WebSocket protocol handshake error.N)r   r   r   rP   r   r   r   r   rS   q   s   rS   c                    s&   g | ] t  fd dtdD qS )c                 3   s   | ]}| A V  qd S rF   r   )r!   abr   r   	<genexpr>y   s     z<listcomp>.<genexpr>r(   )bytesrange)r!   r   rU   r   
<listcomp>y   s     rZ   r(   )maskr=   r@   c                 C   s   t |tst|t| dks&t| |rd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                 s   s   | ]}t | V  qd S rF   )
_XOR_TABLE)r!   nr   r   r   rW      s     z)_websocket_mask_python.<locals>.<genexpr>Nr
   r$      )
isinstance	bytearrayAssertionErrorlen	translate)r[   r=   rT   rV   cdr   r   r   _websocket_mask_python|   s    rg   )_websocket_mask_cython   z^(?:;\s*(?:(server_no_context_takeover)|(client_no_context_takeover)|(server_max_window_bits(?:=(\d+))?)|(client_max_window_bits(?:=(\d+))?)))*$zpermessage-deflate([^,]+)?F)extstrisserverr@   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
      r\   r%   T   zInvalid window sizer$   z#Extension for deflate not supported)_WS_EXT_RE_SPLITfinditergroup
_WS_EXT_REmatchr    rS   )rj   rk   compress
notakeoverextZdefextrr   r   r   r   ws_ext_parse   s>    





rv   rl   )rs   rk   server_notakeoverr@   c                 C   s^   | dk s| dkrt ddg}|s,|d | dk rF|dt|   |rT|d d|S )	Nr%   rl   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appendrQ   join)rs   rk   rw   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$   r_   r\   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_sizers   r@   c                 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_excra   _partialr|   r}   _state_opcode
_frame_fin_frame_opcode_frame_payload_tail	_has_mask_frame_mask_payload_length_payload_length_flag_compressed_decompressobj	_compress)rA   r   r   rs   r   r   r   rH      s"    zWebSocketReader.__init__rL   c                 C   s   | j   d S rF   )r   feed_eofrN   r   r   r   r     s    zWebSocketReader.feed_eofr=   r@   c              
   C   sZ   | j rd|fS z| |W S  tk
rT } z|| _ | j| W Y dS d }~X Y nX d S )NT)Tr   )r   
_feed_data	Exceptionr   set_exception)rA   r=   excr   r   r   	feed_data  s    zWebSocketReader.feed_datac                 C   s  |  |D ]v\}}}}|r4| js4tjtj d| _|tjkrt|dkrt|d d d }|dk r|t	krt
tjd| z|dd  d}W n0 tk
r } zt
tjd|W 5 d }~X Y nX ttj||}	n2|rt
tjd| d	| d	|nttjdd
}	| j|	d q
|tjkrF| jttj|d
t| q
|tjkrp| jttj|d
t| q
|tjtjfkr| jd k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rL| jd k	s@t| j}d | _| j| | jrt| j| jkrt
tjdt| j| j|r| jt | j | j| j}
| jj!rt| jj!}t
tjd| j| | jn
t"| j}
| j#  |tjkrfz*|
d}| jttj|d
t| W n2 tk
rb } zt
tjd|W 5 d }~X Y nX q
| jttj|
d
t|
 q
dS )N)wbitsr$   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   zlibdecompressobj	MAX_WBITSr   r.   rc   UNPACK_CLOSE_CODEALLOWED_CLOSE_CODESr   r   r   decodeUnicodeDecodeErrorr   r   r   r   r,   r-   r*   r+   r   r)   r   extendr   r   formatrb   _WS_DEFLATE_TRAILING
decompressunconsumed_tailrX   clear)rA   r=   finopcodepayload
compressedZ
close_codeZclose_messager   msgZpayload_mergedleftr2   r   r   r   r   #  s    
     	 	 
 


  zWebSocketReader._feed_data)bufr@   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k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k	s8tt| j| || j	| j|| j
f t | _tj| _q(qtq(||d | _ |S )z&Return the next frame from the socket.r   r   r$      r
   rm      r\   rl   z*Received frame with non-zero reserved bitsz!Received fragmented control frame   }   z5Control frame payload cannot be larger than 125 bytesNTF~   r'   )r   rc   r   r|   r}   r   r   r   r   r   r   boolr   r   r   r~   UNPACK_LEN2r   r   r   UNPACK_LEN3r   r   r   rb   _websocket_maskry   ra   )rA   r   framesZ	start_posZ
buf_lengthr=   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   rH   r   rX   r   r   r   r   r   ra   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e
e	ddddZdee
ee
 ddd	d
ZeddddZdeddddZdeddddZdeeef e	ee
 ddddZde
eddddZdS ) r   Fr   )use_masklimitrandomrs   rt   N)protocol	transportr   r   r   rs   rt   r@   c                C   sB   || _ || _|| _|j| _|| _|| _d| _|| _d| _d | _	d S )NFr   )
r   r   r   	randrangers   rt   _closing_limit_output_size_compressobj)rA   r   r   r   r   r   rs   rt   r   r   r   rH   ;  s    zWebSocketWriter.__init__)rE   r   rs   r@   c                    s  | j r|tj@ stdd}|s&| jr|dk r|rFtjtj| d}n"| jsbtjtj| j d| _| j}||}||	| j
rtjntj }|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|
 t| 7  _nLt|tkr| |	 | | n| |	|  |  jt|	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   r'   )levelr   N@      r   r:   r   l    r\   big)r   r   r.   ConnectionResetErrorrs   r   compressobjZ_BEST_SPEEDr   flushrt   Z_FULL_FLUSHZ_SYNC_FLUSHendswithr   rc   r   	PACK_LEN1	PACK_LEN2	PACK_LEN3r   to_bytesra   r   _writer   MSG_SIZEr   r   Z_drain_helper)rA   rE   r   rs   Zrsvr   Z
msg_lengthr   Zmask_bitheaderr[   r   r   r   _send_frameQ  sX     



$
zWebSocketWriter._send_framer   c                 C   s,   | j d ks| j  rtd| j | d S )Nr   )r   Z
is_closingr   write)rA   r=   r   r   r   r     s    zWebSocketWriter._writer   )rE   r@   c                    s,   t |tr|d}| |tjI dH  dS )zSend pong message.r   N)r`   rQ   encoder   r   r-   rA   rE   r   r   r   r5     s    

zWebSocketWriter.pongc                    s,   t |tr|d}| |tjI dH  dS )zSend ping message.r   N)r`   rQ   r   r   r   r,   r   r   r   r   r4     s    

zWebSocketWriter.ping)rE   r3   rs   r@   c                    sJ   t |tr|d}|r0| |tj|I dH  n| |tj|I dH  dS )r   r   N)r`   rQ   r   r   r   r+   r*   )rA   rE   r3   rs   r   r   r   send  s
    

zWebSocketWriter.sendr   rC   c                    sD   t |tr|d}z"| jt|| tjdI dH  W 5 d| _X dS )z<Close the websocket, sending the specified code and message.r   T)r   N)r`   rQ   r   r   r   PACK_CLOSE_CODEr   r.   rI   r   r   r   r6     s    


 zWebSocketWriter.close)N)r   )r   )FN)r   r   )r   r   r   DEFAULT_LIMITr   Randomr   asyncioZ	Transportr   r    r   rH   rX   r   r   r   r5   r4   r	   rQ   r   r6   r   r   r   r   r   :  sD      A	  
r   )F)rl   FF)KrP   r   collectionsrB   r   resysr   enumr   structr   typingr   r   r   r   r   r	   Zbase_protocolr   Zhelpersr   Zstreamsr   __all__r   r   r   r   unpack_fromr   r   unpackr   packr   r   r   r   r   r   
namedtupler;   r   r0   r   r/   r   r   r   rS   	byteorderZnative_byteorderrY   r]   rX   ra   rg   r   Z
_websocketrh   ImportErrorr   compilerq   rn   rQ   r   r    rv   r{   r|   r   r   r   r   r   r   <module>   s~    






	

 4         @