U
    g                     @   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rd dlZeedrd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ejeedddZedddZdedfe	e e
eef e	e ed	d
dZeedddZeedddZedddZedddZeddddZddddZd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   9/tmp/pip-unpacked-wheel-f3sx1i9r/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_timeoutr   c              
   C   sR  | j }| j}d}|tk	}| j}| }	|dt |r@|| zz`| j 	|}
t
|
trnt|
dkrntt||
 t|
}||7 }|d k	r||krqDW W dS  tjk
r   |rtdY W jdS  tk
r* } zBt|jd}|s
|j|kr
W Y W *dS td|j W 5 d }~X Y nX W 5 ||	 |rL|| j X d S )Nr   TzTimeout reading from socketFz!Error while reading from socket: )r   r   SENTINELr   r   r   r   
settimeoutr   recv
isinstancebyteslenr   SERVER_CLOSED_CONNECTION_ERRORwriter   r   r   NONBLOCKING_EXCEPTIONS#NONBLOCKING_EXCEPTION_ERROR_NUMBERSget	__class__errnoargs)r   r   r   r   sockr   markerZcustom_timeoutbufZcurrent_posdatadata_lengthexallowedr   r   r   _read_from_socket/   s>    



&
zSocketBuffer._read_from_socket)r   r   c                 C   s   t |  p| j|ddS )NF)r   r   )boolr   r6   )r   r   r   r   r   can_read^   s     zSocketBuffer.can_read)r   r   c                 C   sJ   |d }| j |}|t| }|r>| | || j |7 }|d d S )Nr   )r   readr&   r6   )r   r   r2   missingr   r   r   r:   c   s    
zSocketBuffer.readc                 C   s:   | j }| }|ts.|   || 7 }q|d d S )Nr9   )r   readlineendswithSYM_CRLFr6   )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_pos)r   r   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   s4   z| j   W n tk
r"   Y nX d | _ d | _d S r   )r   close	Exceptionr   r?   r   r   r   rF      s    zSocketBuffer.close)__name__
__module____qualname__r   intfloatr   r   r!   r   r   objectr7   r6   r8   r%   r:   r<   r@   rA   rE   rF   r   r   r   r   r
      s*     
/
r
   )r-   r   r   r   typingr   r   
exceptionsr   r   utilsr   BlockingIOErrorEWOULDBLOCKr*   sslhasattrr	   SSLWantWriteErrorSSLErrortuplekeysr)   r'   rM   r!   r>   r
   r   r   r   r   <module>   s$   



