o
    ~#il                  	   @   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 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 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+e,e+j-e+j.e+j/hZ0ee)d< dZ1ee2 e)d< edj3Z4edj3Z5edj6Z7edj8Z9edj8Z:edj8Z;edj8Z<edj8Z=dZ>ee( e)d < d!Z?ee( e)d"< d#Z@ee( e)d$< G d%d& d&eZAeBCeAe+jDddfZEeBCeAe+jFddfZGG d'd( d(eHZIG d)d* d*eHZJejKZLeeM e)d+< ejNd,ee2 fd-d.ZOd/e2d0ePd,dfd1d2ZQe!r8eQZRnz
dd3lSmTZT eTZRW n eUyN   eQZRY nw e2g d4ZVee2 e)d5< eWd6ZXeeeM  e)d7< eWd8ZYeeeM  e)d9< dJd;eeM d<eZd,ee(eZf fd=d>Z[	:dKd@e(d<eZdAeZd,eMfdBdCZ\G dDdE dEe	Z]G dFdG dGZ^G dHdI dIZ_dS )Lz%WebSocket protocol versions 13 and 8.    N)IntEnum)partial)Struct)AnyCallableFinalList
NamedTupleOptionalPatternSetTupleUnioncast   )BaseProtocol)ClientConnectionResetError)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__OK
GOING_AWAYPROTOCOL_ERRORUNSUPPORTED_DATAABNORMAL_CLOSUREINVALID_TEXTPOLICY_VIOLATIONMESSAGE_TOO_BIGMANDATORY_EXTENSIONINTERNAL_ERRORSERVICE_RESTARTTRY_AGAIN_LATERBAD_GATEWAY r2   r2   ]/var/www/GraceOrthoHospital/venv_grace/lib/python3.10/site-packages/aiohttp/http_websocket.pyr    .   s    r    c                 C   s   h | ]}t |qS r2   )int).0ir2   r2   r3   	<setcomp>>   s    r7   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errorr2   r2   r2   r3   r   J   s$    r   MESSAGE_TYPES_WITH_CONTENTs$   258EAFA5-E914-47DA-95CA-C5AB0DC85B11r   z!Hz!Qz!BBz!BBHz!BBQz!Li @  MSG_SIZE   DEFAULT_LIMIT   MASK_LENc                   @   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)loadsrX   returnc                C   s
   || j S )zAReturn parsed JSON data.

        .. versionadded:: 0.22
        )rV   )selfrX   r2   r2   r3   json   s   
zWSMessage.jsonN)r"   r#   r$   r   __annotations__r   r
   strr[   rX   r   r2   r2   r2   r3   r   z   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messagerY   Nc                    s   || _ t || d S N)r^   super__init__rZ   r^   r_   	__class__r2   r3   rb      s   zWebSocketError.__init__c                 C   s   t t| jd S )Nr   )r   r]   argsrZ   r2   r2   r3   __str__   s   zWebSocketError.__str__)	r"   r#   r$   __doc__r4   r]   rb   rh   __classcell__r2   r2   rd   r3   r      s    r   c                   @   s   e Zd ZdZdS )WSHandshakeErrorz#WebSocket protocol handshake error.N)r"   r#   r$   ri   r2   r2   r2   r3   rk      s    rk   native_byteorderrY   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 r`   r2   )r5   abr2   r3   	<genexpr>       z(_xor_table.<locals>.<listcomp>.<genexpr>r=   )bytesrange)r5   r2   rn   r3   
<listcomp>   s   & z_xor_table.<locals>.<listcomp>r=   )rs   r2   r2   r2   r3   
_xor_table   s   ru   maskrV   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.

    rS   c                 3   s    | ]} | V  qd S r`   r2   )r5   n
_XOR_TABLEr2   r3   rp      rq   z)_websocket_mask_python.<locals>.<genexpr>Nr   r9      )
isinstance	bytearraylenru   	translate)rv   rV   rm   ro   cdr2   rx   r3   _websocket_mask_python   s   "r   )_websocket_mask_cython)r   r      r   _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      rS   r:   T   zInvalid window sizer9   z#Extension for deflate not supported)r   finditergroupr   matchr4   rk   )r   r   compress
notakeoverextdefextr   r2   r2   r3   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 )	Nr:   r   zCCompress wbits must between 9 and 15, zlib does not support wbits=8zpermessage-deflateclient_max_window_bitszserver_max_window_bits=server_no_context_takeoverz; )
ValueErrorappendr]   join)r   r   r   
enabledextr2   r2   r3   
ws_ext_gen  s   


r   c                   @   s   e Zd ZdZdZdZdZdS )WSParserStater   r9   rz   rS   N)r"   r#   r$   READ_HEADERREAD_PAYLOAD_LENGTHREAD_PAYLOAD_MASKREAD_PAYLOADr2   r2   r2   r3   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d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   rY   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_excr|   _partialr   r   _state_opcode
_frame_fin_frame_opcode_frame_payload_tail	_has_mask_frame_mask_payload_length_payload_length_flag_compressed_decompressobj	_compress)rZ   r   r   r   r2   r2   r3   rb   *  s"   
zWebSocketReader.__init__c                 C   s   | j   d S r`   )r   feed_eofrg   r2   r2   r3   r   B  s   zWebSocketReader.feed_eofrV   c              
   C   sX   | j rd|fS z| | W dS  ty+ } z|| _ t| j| W Y d }~dS d }~ww )NT)Tr   )Fr   )r   
_feed_data	Exceptionr   r   )rZ   rV   excr2   r2   r3   	feed_dataE  s   zWebSocketReader.feed_datac                 C   st  |  |D ]\}}}}|tv r|tjk}|s>|s|| _|  j|7  _| jr=t| j| jkr=tt	j
dt| j| jqt| j}|rW| jd u rPtt	jd| j}d | _n|rbtt	jd||ro| j| }| j  n|}| jrt|| jkrtt	j
dt|| j|r| jstdd| _| j|t | j}	| jjrt| jj}
tt	j
d| j|
 | jnt|}	|tjkrz|	d}W n ty } ztt	jd|d }~ww tttj|d	f}| j|t|	 qtttj|	d	f}| j|t|	 q|tjkr{t|d
krWt |d d
 d }|dk r,|t!vr,tt	jd| z|d
d  d}W n tyK } ztt	jd|d }~ww tttj||f}n|ritt	jd| d| d|tttjdd	f}| j|d q|tj"krtttj"|d	f}| j|t| q|tj#krtttj#|d	f}| j|t| qtt	jd|d S )Nz Message size {} exceeds limit {}z*Continuation frame for non started messagez<The opcode in non-fin frame is expected to be zero, got {!r}T)suppress_deflate_headerz-Decompressed message size {} exceeds limit {}utf-8zInvalid UTF-8 text message r9   r   i  zInvalid close code: zInvalid close frame:  zUnexpected opcode=)$parse_framerO   r   r>   r   r   r   r}   r   r    r,   formatboolr'   clearr   r   decompress_syncr   unconsumed_tailrr   r?   decodeUnicodeDecodeErrorr*   tuple__new__r   r   r   r@   rC   UNPACK_CLOSE_CODEr8   rA   rB   )rZ   rV   finopcodepayload
compressedis_continuationhas_partialassembled_payloadpayload_mergedleftrG   r   msg
close_codeclose_messager2   r2   r3   r   R  s   





	
	
zWebSocketReader._feed_databufc                 C   s(  g }| j r| j | d}| _ d}t|}	 | jtju r|| dk r#nh|||d  }|d7 }|\}}|d? d@ }|d? d@ }	|d? d@ }
|d	? d@ }|d
@ }|
sX|sX|	r^| js^ttjd|dkrl|dkrlt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| _| jtju r| j}|dkr|| dk rn|||d  }|d7 }t|d | _n"|dkr|| dk rn|||d  }|d7 }t|d | _n|| _| jrtjntj| _| jtju r&|| d	k rnv|||d	  | _|d	7 }tj| _| jtju r| j}| j}|| }||krL|| | _|||d 7 }|}nd| _|||||  7 }|| }| jdkrdn'| jrv| jduspJ t| j| || j	| j|| j
f t | _tj| _q||d | _ |S )z&Return the next frame from the socket.r   r   Tr9      r   r      rS   r   z*Received frame with non-zero reserved bitsz!Received fragmented control frame   }   z5Control frame payload cannot be larger than 125 bytesNF~   r<   )r   r}   r   r   r   r   r   r    r'   r   r   r   r   r   r   r   UNPACK_LEN2r   UNPACK_LEN3r   r   r   r   _websocket_maskr   r|   )rZ   r   frames	start_pos
buf_lengthrV   
first_bytesecond_byter   rsv1rsv2rsv3r   has_masklengthlength_flagr   	chunk_lenr2   r2   r3   r     s   




|zWebSocketReader.parse_frame)T)rY   N)r"   r#   r$   r   r   r4   r   rb   r   rr   r   r   r   r   r
   r|   r   r2   r2   r2   r3   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"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   rY   Nc                C   sH   || _ || _|| _t|jd| _|| _|| _d| _|| _	d| _
d | _d S )N    Fr   )r   r   r   r   getrandbitsget_random_bitsr   r   _closing_limit_output_size_compressobj)rZ   r   r   r   r   r   r   r   r2   r2   r3   rb   _  s   
zWebSocketWriter.__init__r_   r   c                    s  | j r|tj@ stdd}|s| jrP|dk rPd}|r"| |}n| js,| | j| _| j}||I dH }||| jr@t	j
nt	j7 }|trP|dd }t|}| j}|r[dnd}d|B |B }	|dk rqt|	||B }
d	}n|d
k rt|	d|B |}
d}n
t|	d|B |}
d}| j rtd|rt|  }t|}t|| | j|
| |  |  jt7  _n|tkr| j|
 | j| n| j|
|  |  j|| 7  _| j| jkrd| _| j I dH  dS dS )<Send a frame over the websocket with message as its payload.z!Cannot write to closing transportr   r<   @   N   r   r9   rQ   rS   r   r;   ) r   r   rC   r   r   _make_compress_objr   flushr   zlibZ_FULL_FLUSHZ_SYNC_FLUSHendswithr   r}   r   	PACK_LEN1	PACK_LEN2	PACK_LEN3r   
is_closingPACK_RANDBITSr   r|   r   writer   rT   rP   r   r   _drain_helper)rZ   r_   r   r   rsvcompressobj
msg_lengthr   mask_bitr   header
header_lenrv   r2   r2   r3   _send_frameu  s\   

	

zWebSocketWriter._send_framec                 C   s   t tj| tdS )N)levelwbitsmax_sync_chunk_size)r   r   Z_BEST_SPEEDWEBSOCKET_MAX_SYNC_CHUNK_SIZE)rZ   r   r2   r2   r3   r     s
   z"WebSocketWriter._make_compress_objr   c                    .   t |tr|d}| |tjI dH  dS )zSend pong message.r   N)r{   r]   encoder  r   rB   rZ   r_   r2   r2   r3   rJ        

zWebSocketWriter.pongc                    r  )zSend ping message.r   N)r{   r]   r  r  r   rA   r  r2   r2   r3   rI     r  zWebSocketWriter.pingrH   c                    sN   t |tr|d}|r| |tj|I dH  dS | |tj|I dH  dS )r   r   N)r{   r]   r  r  r   r@   r?   )rZ   r_   rH   r   r2   r2   r3   send  s   

zWebSocketWriter.sendr!   r^   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)r{   r]   r  r  PACK_CLOSE_CODEr   rC   r   rc   r2   r2   r3   rK     s   

zWebSocketWriter.closer`   )r   )FN)r!   r   )r"   r#   r$   rR   r   Randomr   asyncio	Transportr   r4   rb   rr   r
   r  r   r   r   r]   rJ   rI   r  rK   r2   r2   r2   r3   r   ^  s`    	


\	

$r   )F)r   FF)`ri   r  	functoolsr[   r   resysr   enumr   r   structr   typingr   r   r   r   r	   r
   r   r   r   r   r   base_protocolr   client_exceptionsr   compression_utilsr   r   helpersr   r   streamsr   __all__r    r8   r4   r\   r  r   	frozensetr@   r?   r>   rO   r   rr   unpack_fromr   r   unpackr   packr   r   r   r  r  rP   rR   rT   r   r   r   rE   r   rD   r   r   r   rk   	byteorderrl   r]   	lru_cacheru   r|   r   r   
_websocketr   ImportErrorr   compiler   r   r   r   r   r   r   r   r2   r2   r2   r3   <module>   s    4	







$4
  7