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   úG/var/www/html/env/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 | |¡ z™z?	 | 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r­W Y d }~W | |	¡ |r«| | j¡ dS dS td|j› �ƒ‚d }~ww | |	¡ |rÈ| | j¡ w w )Nr   TzTimeout reading from socketFéÿÿÿÿz!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&    



