o
    `f                     @   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 ee jiZerHd dlZeedrCdeej< deej< ndeej< ee ZdZe Zd	ZG d
d dZdS )    N)SEEK_END)OptionalUnion   )ConnectionErrorTimeoutError)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edefddZdedefddZ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   N/home/ubuntu/webapp/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?	 | j |}
t	|
t
r8t|
dkr8tt||
 t|
}||7 }|d urN||krNq"W W ||	 |r_|| j dS dS  tjy   |rntdY W ||	 |r|| j dS dS  ty } z-t|jd}|s|j|krW Y d }~W ||	 |r|| j dS dS td|j d }~ww ||	 |r|| j w w )Nr   TzTimeout reading from socketFz!Error while reading from socket: )r   r   SENTINELr   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/   s^   






zSocketBuffer._read_from_socketc                 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   sJ   |d }| j |}|t| }|r| | || j |7 }|d d S )Nr   )r   readr&   r8   )r   r   r4   missingr   r   r   r<   c   s   
zSocketBuffer.readc                 C   sB   | j }| }|ts|   || 7 }|tr|d d S )Nr;   )r   readlineendswithSYM_CRLFr8   )r   r2   r4   r   r   r   r>   n   s   

zSocketBuffer.readlinec                 C   s
   | j  S )z+
        Get current read position
        )r   r   r   r   r   r   get_posx   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   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    


/

r
   )r-   r   r   r   typingr   r   
exceptionsr   r   utilsr   BlockingIOErrorEWOULDBLOCKr*   sslhasattrr	   SSLWantWriteErrorSSLErrortuplekeysr)   r'   rP   r!   r@   r
   r   r   r   r   <module>   s&    



