o
    0ãPjX  ã                   @   sv   d dl mZ d dlZG dd„ deƒZG dd„ deƒZG dd„ deƒZG d	d
„ d
eƒZdefdd„ZG dd„ deƒZ	dS )é    )ÚProtocolNc                   @   ó   e Zd ZdZdS )ÚDecodeRatioErrorzBOutput-to-input amplification ratio exceeded the configured limit.N©Ú__name__Ú
__module__Ú__qualname__Ú__doc__© r
   r
   ú1/usr/lib/python3/dist-packages/httplib2/decode.pyr      ó    r   c                   @   r   )ÚDecodeLimitErrorz,Total output length exceeded the hard limit.Nr   r
   r
   r
   r   r   	   r   r   c                   @   sV   e Zd Zedefdd„ƒZdedefdd„Zdefdd„Zdd
ede	defdd„Z
dS )ÚDecoderProtocolÚreturnc                 C   ó   d S ©Nr
   ©Úselfr
   r
   r   Úneeds_input   s   zDecoderProtocol.needs_inputÚbc                 C   r   r   r
   ©r   r   r
   r
   r   Údecode   ó   zDecoderProtocol.decodec                 C   r   r   r
   r   r
   r
   r   Úflush   r   zDecoderProtocol.flushé   ÚdataÚ
chunk_sizec                 C   sb   t ƒ }|dkrt|ƒ}tdt|ƒ|ƒD ]}|||| … }| |  |¡¡ q| |  ¡ ¡ t|ƒS )Nr   )Ú	bytearrayÚlenÚrangeÚextendr   r   Úbytes)r   r   r   ÚoutÚiÚchunkr
   r
   r   Úconsume_bytes   s   zDecoderProtocol.consume_bytesN)r   )r   r   r   ÚpropertyÚboolr   r!   r   r   Úintr%   r
   r
   r
   r   r      s    r   c                   @   sh   e Zd ZdZdZdZdZdZdZefde	fdd	„Z
ed
efdd„ƒZded
efdd„Zd
efdd„ZdS )ÚZlibDecodera#  
    Thin wrapper around zlib.Decompressor conforming to the Decoder interface.

    Note: zlib pushes all available decompressed data immediately upon receiving
    input. It never holds back output requiring `decode(b"")` to extract it.
    Thus, `needs_input` naturally remains True.
    )Ú_decoderiñÿÿÿé   é   é/   Úwbitsc                 C   s   t  |¡| _d S r   )ÚzlibÚdecompressobjr*   )r   r.   r
   r
   r   Ú__init__3   s   zZlibDecoder.__init__r   c                 C   s   | j d u r	tdƒ‚| j j S ©Nzused after flush())r*   ÚRuntimeErrorÚeofr   r
   r
   r   r   6   s   

zZlibDecoder.needs_inputr   c                 C   s   | j d u r	tdƒ‚| j  |¡S r2   )r*   r3   Ú
decompressr   r
   r
   r   r   <   s   
zZlibDecoder.decodec                 C   s&   | j d u r	tdƒ‚| j  ¡ }d | _ |S r2   )r*   r3   r   )r   Úresultr
   r
   r   r   A   s
   

zZlibDecoder.flushN)r   r   r   r	   Ú	__slots__ÚWBITS_DEFLATEÚ
WBITS_ZLIBÚ
WBITS_GZIPÚWBITS_AUTO_GZIP_ZLIBr(   r1   r&   r'   r   r!   r   r   r
   r
   r
   r   r)   #   s    r)   r   c                   C   s
   t t jƒS r   )r)   r8   r
   r
   r
   r   ÚDeflateDecoderI   s   
r<   c                   @   sŠ   e Zd ZdZ				ddededed	ed
eddfdd„Zddd„Ze	de
fdd„ƒZdedefdd„Zdefdd„Zdedefdd„ZdS )ÚLimitDecoder)	r*   Ú_ratioÚ_chunk_sizeÚ_safe_limitÚ_hard_limitÚ_consumed_lengthÚ_output_lengthÚ_input_bufferÚ_flushedéd   r   é    ì       
 ÚdecoderÚratior   Ú
safe_limitÚ
hard_limitr   Nc                 C   sœ   |dk rt d|› d�ƒ‚|dk rt d|› d�ƒ‚|dk r$t d|› d�ƒ‚|dk r0t d|› d�ƒ‚|| _|| _|| _|| _|| _d| _d| _tƒ | _	d| _
d S )Nr   zLimitDecoder() ratio=z expected >= 0zLimitDecoder() chunk_size=zLimitDecoder() safe_limit=F)Ú
ValueErrorr*   r>   r?   r@   rA   rB   rC   r   rD   rE   )r   rI   rJ   r   rK   rL   r
   r
   r   r1   Z   s"   
zLimitDecoder.__init__c              	   C   s²   | j dkr| j| j krtd| j› d| j › �ƒ‚| jdkr$| j| jk r$d S | jdkrU| j| j| j krW| jdkr=| j| j ntdƒ}td|d›d| j› d| j› d	| j› �ƒ‚d S d S )
Nr   zOutput length z exceeds hard limit ÚinfzAmplification ratio z.1fz (ú/z) exceeds limit )rA   rC   r   r@   r>   rB   Úfloatr   )r   Úactual_ratior
   r
   r   Ú_check_limitsu   s   ÿÿþzLimitDecoder._check_limitsc                 C   s   | j jS r   )r*   r   r   r
   r
   r   r   �   s   zLimitDecoder.needs_inputr   c                 C   s    | j rtdƒ‚|  |¡}t|ƒS )Nzdecode() called after flush())rE   r3   Ú_pumpr!   )r   r   Úoutputr
   r
   r   r   …   s   
zLimitDecoder.decodec                 C   sT   | j rtdƒ‚d| _ |  d¡}| j ¡ }| |¡ |  jt|ƒ7  _|  ¡  t	|ƒS )Nzflush() called more than onceTó    )
rE   r3   rS   r*   r   r    rC   r   rR   r!   )r   rT   r   r
   r
   r   r   ‹   s   


zLimitDecoder.flushc                 C   sÈ   | j  |¡ tƒ }	 | jjs)| j d¡}|r)| |¡ |  jt|ƒ7  _|  ¡  q	| j rat	| j d | j
… ƒ}| j d | j
…= | j |¡}|  jt|ƒ7  _|r`| |¡ |  jt|ƒ7  _|  ¡  q		 |S )NTrU   )rD   r    r   r*   r   r   rC   r   rR   r!   r?   rB   )r   r   rT   r   r$   r
   r
   r   rS   ™   s,   

zLimitDecoder._pump)rF   r   rG   rH   )r   N)r   r   r   r7   r   rP   r(   r1   rR   r&   r'   r   r!   r   r   r   rS   r
   r
   r
   r   r=   M   s2    úþýüûú
ù
r=   )
Útypingr   r/   Ú	Exceptionr   r   r   r)   r<   r=   r
   r
   r
   r   Ú<module>   s    &