o
    Lj                     @   s   d dl Z d dlZd dl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mZ ee jiZerJd dlZeedrEdeej< deej< ndeej< ee ZdZd	ZG d
d dZdS )    N)SEEK_END)OptionalUnion   )ConnectionErrorTimeoutError)SENTINELSSL_AVAILABLESSLWantReadErrorzConnection closed by server.s   
c                	   @   s   e Zd ZdejdedefddZdefddZd	ed
fde	e de
eef de	e defddZd dedefddZefdede
eef defddZefde
eef defddZdefddZdedd	fddZd!ddZd!ddZd	S )"SocketBuffersocketsocket_read_sizesocket_timeoutc                 C   s    || _ || _|| _t | _d S N)_sockr   r   ioBytesIO_buffer)selfr   r   r    r   S/home/djax/ivt_ai_plugin/venv/lib/python3.10/site-packages/redis/_parsers/socket.py__init__   s   zSocketBuffer.__init__returnc                 C   s,   | j  }| j dt}| j | || S )z3
        Remaining unread length of buffer
        r   )r   tellseekr   )r   posendr   r   r   unread_bytes%   s   
zSocketBuffer.unread_bytesNTlengthtimeoutraise_on_timeoutc              
   C   s  | j }| j}d}|tu}| j}| }	|dt |r || zz>	 ||}
t	|
t
r7t|
dkr7tt||
 t|
}||7 }|d urM||krMq"W W ||	 |r^|| j dS dS  tjy   |rmtdY W ||	 |r~|| j dS dS  ty } z5t|jd}|j|kr|sW Y d }~W ||	 |r|| j dS dS |dkrtdtd|j d }~ww ||	 |r|| j w w )Nr   TzTimeout reading from socketFz!Error while reading from socket: )r   r   r   r   r   r   r   
settimeoutrecv
isinstancebyteslenr   SERVER_CLOSED_CONNECTION_ERRORwriter   r   r   r   NONBLOCKING_EXCEPTIONS#NONBLOCKING_EXCEPTION_ERROR_NUMBERSget	__class__errnoargs)r   r   r   r    sockr   markercustom_timeoutbufcurrent_posdatadata_lengthexallowedr   r   r   _read_from_socket.   sd   







zSocketBuffer._read_from_socketr   c                 C   s   t |  p| j|ddS )NF)r   r    )boolr   r8   )r   r   r   r   r   can_read`   s   zSocketBuffer.can_readc                 C   sN   |d }| j |}|t| }|r!| j||d || j |7 }|d d S )Nr   )r   r   )r   readr&   r8   )r   r   r   r4   missingr   r   r   r<   e   s   zSocketBuffer.readc                 C   sF   | j }| }|ts| j|d || 7 }|tr|d d S )N)r   r;   )r   readlineendswithSYM_CRLFr8   )r   r   r2   r4   r   r   r   r>   p   s   

zSocketBuffer.readlinec                 C   s
   | j  S )z+
        Get current read position
        )r   r   r   r   r   r   get_posz   s   
zSocketBuffer.get_posr   c                 C   s   | j | dS )zO
        Rewind the buffer to a specific position, to re-start reading
        N)r   r   )r   r   r   r   r   rewind   s   zSocketBuffer.rewindc                 C   sX   |   }|dkr
dS |dkr| j }|| d |d|< | j| | jd dS )zH
        After a successful read, purge the read part of buffer
        r   N)r   r   	getbuffertruncater   )r   unreadviewr   r   r   purge   s   
zSocketBuffer.purgec                 C   s2   z| j   W n	 ty   Y nw d | _ d | _d S r   )r   close	Exceptionr   rA   r   r   r   rI      s   
zSocketBuffer.close)r   )r   N)__name__
__module____qualname__r   intfloatr   r   r   r   r   objectr9   r8   r:   r%   r<   r>   rB   rC   rH   rI   r   r   r   r   r      s8    


2"

r   )r-   r   r   r   typingr   r   
exceptionsr   r   utilsr   r	   BlockingIOErrorEWOULDBLOCKr*   sslhasattrr
   SSLWantWriteErrorSSLErrortuplekeysr)   r'   r@   r   r   r   r   r   <module>   s$    



