o
    ;h                     @   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   H/var/www/html/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   markerZcustom_timeoutbufZcurrent_posdataZ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   r5   )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&   r5   )r   r   r2   missingr   r   r   r9   c   s   
zSocketBuffer.readc                 C   sB   | j }| }|ts|   || 7 }|tr|d d S )Nr8   )r   readlineendswithSYM_CRLFr5   )r   r1   r2   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   Z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   r>   r   r   r   rE      s   
zSocketBuffer.close)r   N)__name__
__module____qualname__r   intfloatr   r   r!   r   r   objectr6   r5   r7   r%   r9   r;   r?   r@   rD   rE   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'   rL   r!   r=   r
   r   r   r   r   <module>   s&    



