o
    &gw+                     @   s   d dl mZ d dlmZmZ ddlmZmZmZ ddlm	Z	 ddl
mZmZ ddlmZ d	d
gZG dd deZG dd deZdS )    )	getLogger)AnyUnion   )ConnectionErrorInvalidResponseResponseError)
EncodableT   )_AsyncRESPBase	_RESPBase)SERVER_CLOSED_CONNECTION_ERRORs
   invalidate
invalidatec                       sT   e Zd ZdZ fddZdd ZdddZdd	d
Zdd Zdd Z	dd Z
  ZS )_RESP3ParserzRESP3 protocol implementationc                       t  | | j| _d | _d S Nsuper__init__handle_pubsub_push_responsepubsub_push_handler_funcinvalidation_push_handler_funcselfsocket_read_size	__class__ S/root/parts/websockify/install/lib/python3.10/site-packages/redis/_parsers/resp3.pyr         
z_RESP3Parser.__init__c                 C   s   t d}|dt|  |S Npush_responsezPush response: r   infostrr   responseloggerr   r   r   r      s   z(_RESP3Parser.handle_pubsub_push_responseFc                 C   sX   | j r| j  nd }z	| j||d}W n ty$   | j r#| j |  w | j   |S )Ndisable_decodingpush_request)_bufferget_pos_read_responseBaseExceptionrewindpurge)r   r)   r*   posresultr   r   r   read_response   s   

z_RESP3Parser.read_responsec           
         s  j  }|stt|d d |dd  }}|dv r=|dkr(j t|}|jddd}|}t|tr;||S |dkrBn|dkrHd S |d	v rPt|S |d
krXt	|S |dkr`|dkS |dkrmj t|}n|dkr~j t|dd  }ns|dkr fddt
t|D }n`|dkr fddt
t|D }nM|dkri }t
t|D ]}j d}	j d||	< q|}n,|dkr fddt
t|D }| }sj dS |S td|t|tr du rj|}|S )Nr
      -   !r6   utf-8replaceerrors   +   _   :   (   ,   #   t   $   =      *c                       g | ]}j  d qS r)   r-   .0_r)   r   r   r   
<listcomp>T       
z/_RESP3Parser._read_response.<locals>.<listcomp>   ~c                    rG   rH   rJ   rK   rN   r   r   rO   \   rP      %rI   r(      >c                    s   g | ]	}j  d qS )r(   rJ   rK   r)   r*   r   r   r   rO   n   s    Protocol Error: F)r+   readliner   r   readintdecodeparse_error
isinstancefloatranger-   handle_push_responser   bytesencoder
r   r)   r*   rawbyter&   error	resp_dictrM   keyr   rT   r   r-   '   st   





z_RESP3Parser._read_responsec                 C   s*   |d t vr| |S | jr| |S d S Nr   _INVALIDATION_MESSAGEr   r   r   r&   r)   r*   r   r   r   r^      s
   

z!_RESP3Parser.handle_push_responsec                 C   
   || _ d S r   r   r   r   r   r   r   set_pubsub_push_handler      
z$_RESP3Parser.set_pubsub_push_handlerc                 C   rk   r   r   r   r   r   r   r   set_invalidation_push_handler   ro   z*_RESP3Parser.set_invalidation_push_handlerFF)__name__
__module____qualname____doc__r   r   r3   r-   r^   rn   rr   __classcell__r   r   r   r   r      s    

]r   c                
       sv   e Zd Z fddZdd Z	ddedefdd	Z	ddeded
eee	df fddZ
dd Zdd Zdd Z  ZS )_AsyncRESP3Parserc                    r   r   r   r   r   r   r   r      r   z_AsyncRESP3Parser.__init__c                    s    t d}|dt|  |S r    r"   r%   r   r   r   r      s   z-_AsyncRESP3Parser.handle_pubsub_push_responseFr)   r*   c                    sN   | j r|  jd| j 7  _| j   d| _| j||dI d H }|   |S )N    r   r(   )_chunksr+   joinclear_posr-   _clear)r   r)   r*   r&   r   r   r   r3      s   
z_AsyncRESP3Parser.read_responsereturnNc           
         sX  j rjstt I d H }|d d |dd  }}|dv rJ|dkr1t|I d H }|jddd}|}t	|trH
  ||S |dkrOn|dkrUd S |d	v r]t|S |d
kret|S |dkrm|dkS |dkr|t|I d H }n|dkrt|I d H dd  }n|dkr fddtt|D I d H }nt|dkr fddtt|D I d H }n^|dkri }tt|D ]}j dI d H }	j dI d H ||	< q|}n7|dkr fddtt|D I d H }| I d H }sj dI d H S |S td|t	|tr* du r*j|}|S )Nr
   r4   r6   r7   r8   r9   r;   r<   r=   r@   rA   rB   rC   rD   rE   rF   c                        g | ]}j  d I dH qS rI   NrJ   rK   rN   r   r   rO      
    z4_AsyncRESP3Parser._read_response.<locals>.<listcomp>rQ   c                    r   r   rJ   rK   rN   r   r   rO      r   rR   rI   r(   rS   c                    s"   g | ]}j  d I dH qS )r(   NrJ   rK   rT   r   r   rO      s    
rU   F)_streamr`   r   r   	_readline_readrX   rY   rZ   r[   r   r\   r]   r-   r^   r   r_   ra   r   rT   r   r-      sx   






z _AsyncRESP3Parser._read_responsec                    s8   |d t vr| |I d H S | jr| |I d H S d S rg   rh   rj   r   r   r   r^     s   z&_AsyncRESP3Parser.handle_push_responsec                 C   rk   r   rl   rm   r   r   r   rn     ro   z)_AsyncRESP3Parser.set_pubsub_push_handlerc                 C   rk   r   rp   rq   r   r   r   rr     ro   z/_AsyncRESP3Parser.set_invalidation_push_handlerrs   )rt   ru   rv   r   r   boolr3   r   r	   r   r-   r^   rn   rr   rx   r   r   r   r   ry      s(    

ery   N)loggingr   typingr   r   
exceptionsr   r   r   r	   baser   r   socketr   ri   r   ry   r   r   r   r   <module>   s     