o
    `g7F                     @   sF  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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)ej*j+Z,ej(j+Z-ej&j+Z.ej/j+Z0ej1j+Z2ej3j+Z4dZ5dZ6e7j8Z9e 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List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   W/var/www/html/propose/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d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__7   s   

zWebSocketDataQueue.__init__c                 C      | j S N)r,   r4   r   r   r   is_eofE      zWebSocketDataQueue.is_eofc                 C   r6   r7   )r.   r8   r   r   r   	exceptionH   r:   zWebSocketDataQueue.exceptionexcBaseException	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   K   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_waiterV   s   z"WebSocketDataQueue._release_waiterc                 C   s   d| _ |   d S r?   )r,   rC   r8   r   r   r   feed_eof]   s   zWebSocketDataQueue.feed_eofdatar   sizeint_c                 C   sN   |  j |7  _ | ||f |   | j | jkr#| jjs%| j  d S d S d S r7   )r(   r3   rC   r*   r)   _reading_pausedpause_readingr4   rE   rF   r   r   r   	feed_dataa   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   readh   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)   rH   resume_readingr.   r   rJ   r   r   r   rP   s   s   

z$WebSocketDataQueue._read_from_bufferr'   N)rE   r   rF   rG   r'   N)__name__
__module____qualname____doc__r   r   rM   AbstractEventLoopr5   boolr9   r   r=   r;   r   builtinsr   rC   rD   rK   r   rQ   rP   r   r   r   r   r#   1   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dfddZde	deeeee ee	e
f ee f  fddZdS )WebSocketReaderTqueuemax_msg_sizecompressr'   Nc                 C   sr   || _ || _d | _t | _t| _d | _d| _d | _	d| _
d| _d| _d| _d | _d| _d| _d | _d | _|| _d S )NFr"   r   )r\   _max_msg_size_exc	bytearray_partialREAD_HEADER_state_opcode
_frame_fin_frame_opcode_frame_payload_frame_payload_len_tail	_has_mask_frame_mask_payload_length_payload_length_flag_compressed_decompressobj	_compress)r4   r\   r]   r^   r   r   r   r5      s$   
zWebSocketReader.__init__c                 C   s   | j   d S r7   )r\   rD   r8   r   r   r   rD      s   zWebSocketReader.feed_eofrE   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   rE   r<   r   r   r   rK      s   
zWebSocketReader.feed_datac                 C   s  |  |D ]}|d }|d }|d }|d }|tk}|tks'|tks'|r|sO|s.|| _|  j|7  _| jrNt| j| jkrNtt	j
dt| j| jqt| j}|rh| jd u ratt	jd| j}d | _n|rstt	jd||r| 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u r|	}
nt|	}
|tkrz|
d}W n ty } ztt	jd|d }~ww | jttt|dft|
 q| jttt|
dft|
 q|tkrt|dkrgt |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t"j#||f}n|rytt	jd| d| d|ttt"j#ddf}| j|d q|t$krttt"j%|df}| j|t| q|t&krttt"j'|df}| j|t| qtt	jd|d S )Nr   r   r
   r    z 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 {}zutf-8zInvalid UTF-8 text message i  zInvalid close code: zInvalid close frame:  zUnexpected opcode=)(parse_frameOP_CODE_CONTINUATIONOP_CODE_TEXTOP_CODE_BINARYre   rb   r_   lenr   r   MESSAGE_TOO_BIGformatrY   PROTOCOL_ERRORclearrp   r   decompress_syncr   unconsumed_tailrr   rs   decodeUnicodeDecodeErrorINVALID_TEXTr\   rK   	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   rE   framefinopcodepayload
compressedis_continuationhas_partialassembled_payloadpayload_mergedlefttextr<   
close_codeclose_messagemsgr   r   r   rt      s   



	

	


 zWebSocketReader._feed_databufc                 C   s  g }| 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	du r|rdnd| _	n|rttjdt
|| _|| _t
|| _|| _t| _| jtkr| j}|dkr|| dk rn|| }||d  }|d7 }|d> |B | _n"|dkr|| dk rn|||d  }|d7 }t|d | _n|| _| jrtnt| _| jtkr|| d	k rn|||d	  | _|d	7 }t| _| jtkr|| }| j|kr7|}|  j|8  _n|| j }d| _| jr]t| jturQt| j| _|  j||| 7  _n||| | _|  j|| 7  _|}| jdkrvn8| jr| jdusJ t| jturt| j| _t| j| j || j| j| j| j	f d| _d| _t| _q||k r||d | _ |S 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 bytesNF~      )rj   r   rd   rc   rq   r   r   r   rf   ro   rY   rg   rk   rn   READ_PAYLOAD_LENGTHrm   r   READ_PAYLOAD_MASKREAD_PAYLOADrl   ri   rr   rh   ra   r   r2   )r4   r   frames	start_pos
buf_length
first_bytesecond_byter   rsv1rsv2rsv3r   has_masklengthlength_flagrE   	chunk_lenend_posr   r   r   r{   >  s   




  zWebSocketReader.parse_frame)TrS   )rT   rU   rV   r#   r   rY   r5   rD   r	   rs   ra   
memoryviewr   rK   rt   r   r   r{   r   r   r   r   r[      s0    



 "r[   )=rW   rM   rZ   collectionsr   typingr   r   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   CONTINUATIONvaluer|   r}   r~   r   r   r   r   r   r   rv   rw   tuple__new__r   rG   r#   r[   r   r   r   r   <module>   s<    $N