o
    f>hgI                     @   sR  U d Z ddlZddl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mZ dd	lmZ d
dlmZmZmZ d
dlmZmZmZmZmZ dd eD Zee	e  e d< d
Z!dZ"dZ#dZ$ej%Z&ej'Z(dZ)ej*j+Z,ej'j+Z-ej%j+Z.ej/j+Z0ej1j+Z2ej3j+Z4dZ5dZ6dZ7dZ8d
Z9e:j;Z<eZ=G dd dZ>G dd dZ?dS )z0Reader for WebSocket protocol versions 13 and 8.    N)deque)DequeFinalOptionalSetTupleUnion   )BaseProtocol)ZLibDecompressor)_EXC_SENTINELset_exception)	EofStream   )UNPACK_CLOSE_CODEUNPACK_LEN3websocket_mask)WS_DEFLATE_TRAILINGWebSocketErrorWSCloseCode	WSMessage	WSMsgTypec                 C   s   h | ]}t |qS  )int).0ir   r   O/var/www/html/venv/lib/python3.10/site-packages/aiohttp/_websocket/reader_py.py	<setcomp>   s    r   ALLOWED_CLOSE_CODES      )T    )Fr"   c                   @   s   e Zd ZdZdededejddfddZde	fd	d
Z
dee fddZefdedejddfddZdddZdddZd ddZdefddZdefddZdS )!WebSocketDataQueuezmWebSocketDataQueue resumes and pauses an underlying stream.

    It is a destination for WebSocket data.
    protocollimitloopreturnNc                C   sN   d| _ || _|d | _|| _d| _d | _d | _t | _| jj	| _
| jj| _d S )Nr   r	   F)_size	_protocol_limit_loop_eof_waiter
_exceptionr   _bufferpopleft_get_bufferappend_put_buffer)selfr$   r%   r&   r   r   r   __init__<   s   

zWebSocketDataQueue.__init__c                 C      | j S N)r,   r4   r   r   r   is_eofJ      zWebSocketDataQueue.is_eofc                 C   r6   r7   )r.   r8   r   r   r   	exceptionM   r:   zWebSocketDataQueue.exceptionexc	exc_causec                 C   s4   d| _ || _| j }d urd | _t||| d S d S NT)r,   r.   r-   r   )r4   r<   r=   waiterr   r   r   r   P   s   z WebSocketDataQueue.set_exceptionc                 C   s2   | j  }d u r	d S d | _ | s|d  d S d S r7   )r-   done
set_result)r4   r?   r   r   r   _release_waiter[   s   z"WebSocketDataQueue._release_waiterc                 C   s   d| _ |   d | _d S r>   )r,   rB   r.   r8   r   r   r   feed_eofb   s   
zWebSocketDataQueue.feed_eofdatar   size
cython_intc                 C   sN   |  j |7  _ | ||f |   | j | jkr#| jjs%| j  d S d S d S r7   )r(   r3   rB   r*   r)   _reading_pausedpause_readingr4   rD   rE   r   r   r   	feed_datag   s   zWebSocketDataQueue.feed_datac              	      sb   | j s-| js-| jrJ | j | _z| jI d H  W |  S  tjtjfy,   d | _ w |  S r7   )	r/   r,   r-   r+   create_futureasyncioCancelledErrorTimeoutError_read_from_bufferr8   r   r   r   readn   s   
zWebSocketDataQueue.readc                 C   sV   | j r!|  \}}|  j|8  _| j| jk r| jjr| j  |S | jd ur)| jtr7   )	r/   r1   r(   r*   r)   rG   resume_readingr.   r   rI   r   r   r   rO   y   s   

z$WebSocketDataQueue._read_from_bufferr'   N)rD   r   rE   rF   r'   N)__name__
__module____qualname____doc__r
   r   rL   AbstractEventLoopr5   boolr9   r   BaseExceptionr;   r   builtinsr   rB   rC   rJ   r   rP   rO   r   r   r   r   r#   6   s4    




r#   c                
   @   s   e Zd Z	ddedededdfddZdd	d
Zdee	e
ef deee	f fddZdedeeef dee	e
f deeef ddf
ddZde	ddfddZdS )WebSocketReaderTqueuemax_msg_sizecompressr'   Nc                 C   sr   || _ || _d | _t | _t| _t| _d| _	t| _
g | _d| _d| _d| _d | _d| _d| _t| _d | _|| _d S )NFr   r"   )r\   _max_msg_size_exc	bytearray_partialREAD_HEADER_stateOP_CODE_NOT_SET_opcode
_frame_fin_frame_opcode_payload_fragments_frame_payload_len_tail	_has_mask_frame_mask_payload_bytes_to_read_payload_len_flagCOMPRESSED_NOT_SET_compressed_decompressobj	_compress)r4   r\   r]   r^   r   r   r   r5      s$   
zWebSocketReader.__init__c                 C   s   | j   d S r7   )r\   rC   r8   r   r   r   rC      s   zWebSocketReader.feed_eofrD   c              
   C   sr   t |tur
t|}| jd urd|fS z| | W tS  ty8 } z|| _t| j| tW  Y d }~S d }~ww r>   )	typebytesr`   
_feed_data	Exceptionr   r\   EMPTY_FRAME_ERROREMPTY_FRAME)r4   rD   r<   r   r   r   rJ      s   
zWebSocketReader.feed_datafinopcodepayload
compressedc              
   C   sj  |t tthv r|s5|tkr|| _|  j|7  _| jr3t| j| jkr3ttj	dt| j d| j d S t
| j}|tkrP| jtkrIttjd| j}t| _n|r[ttjd||rh| j| }| j  n|}| jrt|| jkrttj	dt| d| j |r| jstdd| _| j|t | jr| jd n| j}| jrt|| jkrttj	d| j nt|tu r|}nt|}|t krz|d	}W n ty }	 zttjd
|	d }	~	ww | jttt|dft| d S | jttt|dft| d S |tkrzt|dkrVt|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|rhttjd| d| d|ttt j!ddf}| j|d d S |t"krttt j#|df}| j|t| d S |t$krttt j%|df}| j|t| d S ttjd|)NzMessage size z exceeds limit z*Continuation frame for non started messagez8The opcode in non-fin frame is expected to be zero, got T)suppress_deflate_headerr   z(Decompressed message exceeds size limit zutf-8zInvalid UTF-8 text message r	   r   i  zInvalid close code: zInvalid close frame:  zUnexpected opcode=)&OP_CODE_TEXTOP_CODE_BINARYOP_CODE_CONTINUATIONrf   rb   r_   lenr   r   MESSAGE_TOO_BIGrX   re   PROTOCOL_ERRORclearrr   r   decompress_syncr   rt   ru   decodeUnicodeDecodeErrorINVALID_TEXTr\   rJ   	TUPLE_NEWr   WS_MSG_TYPE_TEXTWS_MSG_TYPE_BINARYOP_CODE_CLOSEr   r   r   CLOSEOP_CODE_PINGPINGOP_CODE_PONGPONG)r4   rz   r{   r|   r}   has_partialassembled_payloadpayload_mergedtextr<   
close_codeclose_messagemsgr   r   r   _handle_frame   s   



	


zWebSocketReader._handle_framec                 C   s  | j r| j | d}| _ d}t|}|}	 | jtkr|| dk r"n|| }||d  }|d7 }|d? d@ }|d? d@ }|d? d@ }	|d	? d@ }
|d
@ }|	sU|
sU|r[| js[ttjd|dkri|dkrittjd|d? d@ }|d@ }|dkr|dkrttjd| js| j	t
kr|rtnt| _	n|rttjdt|| _|| _t|| _|| _t| _| jtkr| j}|dkr|| dk rn|| }||d  }|d7 }|d> |B | _n|dkr|| dk rnt||d | _|d7 }n|| _| jrtnt| _| jtkr|| d	k rn|||d	  | _|d	7 }t| _| jtkr|| }| j|kr1|}|  j|8  _n|| j }d| _| j}|  j|| 7  _|}|}| jdkrZ| j|||  nt|r| j|||  | jr| jdussJ td| j}t| j| |}nd| j}| j  n,| jr| jdusJ ||| }t|turt|}t| j| |}n||| }| | j| j|| j	 d| _t| _q||k r||| | _ dS d| _ dS )z&Return the next frame from the socket.r"   r   Tr	   r            r       z*Received frame with non-zero reserved bitsz!Received fragmented control frame   }   z5Control frame payload cannot be larger than 125 bytes~      N) rk   r   rd   rc   rs   r   r   r   rg   rq   rp   COMPRESSED_TRUECOMPRESSED_FALSErX   rh   rl   ro   READ_PAYLOAD_LENGTHrn   r   READ_PAYLOAD_MASKREAD_PAYLOADrm   rj   ri   r2   ra   joinr   r   rt   r   )r4   rD   	start_posdata_len	data_cstr
first_bytesecond_byterz   rsv1rsv2rsv3r{   has_masklengthlen_flag	chunk_len	f_end_poshad_fragmentsf_start_pospayload_bytearrayr|   r   r   r   rv   B  s   





  &zWebSocketReader._feed_data)TrR   )rS   rT   rU   r#   r   rX   r5   rC   r   ru   ra   
memoryviewr   rJ   rF   r   rv   r   r   r   r   r[      s<    







 r[   )@rV   rL   rZ   collectionsr   typingr   r   r   r   r   r   base_protocolr
   compression_utilsr   helpersr   r   streamsr   r   r   r   modelsr   r   r   r   r   r   r   __annotations__rc   r   r   r   BINARYr   TEXTr   re   CONTINUATIONvaluer   r   r   r   r   r   r   r   r   rx   ry   rp   r   r   tuple__new__r   rF   r#   r[   r   r   r   r   <module>   sD     O