o
    Rh,                     @  s.  d Z ddlmZ ddlZddlZddlZddlZddlmZm	Z	 ddl
mZ G dd d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G dd deZG dd deZG dd dZG dd dZG dd dZG dd dZeeeeedZedu red e	du red dS dS ) zq
Handlers for Content-Encoding.

See: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Encoding
    )annotationsN   )brotlizstd)DecodingErrorc                   @  s    e Zd Zd	ddZd
ddZdS )ContentDecoderdatabytesreturnc                 C     t  NNotImplementedErrorselfr    r   Q/home/air/sanwanet/backup_V2/venv/lib/python3.10/site-packages/httpx/_decoders.pydecode      zContentDecoder.decodec                 C  r   r   r   r   r   r   r   flush   r   zContentDecoder.flushNr   r	   r
   r	   r
   r	   )__name__
__module____qualname__r   r   r   r   r   r   r      s    
r   c                   @  s$   e Zd ZdZd
ddZdddZd	S )IdentityDecoderz 
    Handle unencoded data.
    r   r	   r
   c                 C  s   |S r   r   r   r   r   r   r         zIdentityDecoder.decodec                 C  s   dS N    r   r   r   r   r   r   "   r   zIdentityDecoder.flushNr   r   )r   r   r   __doc__r   r   r   r   r   r   r      s    
r   c                   @  .   e Zd ZdZdddZddd	Zdd
dZdS )DeflateDecoderzZ
    Handle 'deflate' decoding.

    See: https://stackoverflow.com/questions/1838699
    r
   Nonec                 C  s   d| _ t | _d S )NT)first_attemptzlibdecompressobjdecompressorr   r   r   r   __init__-   s   zDeflateDecoder.__init__r   r	   c              
   C  sn   | j }d| _ z| j|W S  tjy6 } z|r+ttj | _| |W  Y d }~S tt	||d }~ww NF)
r$   r'   
decompressr%   errorr&   	MAX_WBITSr   r   str)r   r   was_first_attemptexcr   r   r   r   1   s   zDeflateDecoder.decodec              
   C  6   z| j  W S  tjy } ztt||d }~ww r   r'   r   r%   r+   r   r-   r   r/   r   r   r   r   <      zDeflateDecoder.flushNr
   r#   r   r   r   r   r   r    r(   r   r   r   r   r   r   r"   &   s
    

r"   c                   @  r!   )GZipDecoderzW
    Handle 'gzip' decoding.

    See: https://stackoverflow.com/questions/1838699
    r
   r#   c                 C  s   t t jdB | _d S )N   )r%   r&   r,   r'   r   r   r   r   r(   J      zGZipDecoder.__init__r   r	   c              
   C  s8   z| j |W S  tjy } ztt||d }~ww r   )r'   r*   r%   r+   r   r-   r   r   r/   r   r   r   r   M   s   zGZipDecoder.decodec              
   C  r0   r   r1   r2   r   r   r   r   S   r3   zGZipDecoder.flushNr4   r   r   r5   r   r   r   r   r6   C   s
    

r6   c                   @  r!   )BrotliDecoderaT  
    Handle 'brotli' decoding.

    Requires `pip install brotlipy`. See: https://brotlipy.readthedocs.io/
        or   `pip install brotli`. See https://github.com/google/brotli
    Supports both 'brotlipy' and 'Brotli' packages since they share an import
    name. The top branches are for 'brotlipy' and bottom branches for 'Brotli'
    r
   r#   c                 C  sN   t d u r	tdd t  | _d| _|  t| jdr | jj| _d S | jj| _d S )NzUsing 'BrotliDecoder', but neither of the 'brotlicffi' or 'brotli' packages have been installed. Make sure to install httpx using `pip install httpx[brotli]`.Fr*   )	r   ImportErrorDecompressorr'   	seen_datahasattrr*   _decompressprocessr   r   r   r   r(   d   s   
zBrotliDecoder.__init__r   r	   c              
   C  sD   |sdS d| _ z| |W S  tjy! } ztt||d }~ww Nr   T)r=   r?   r   r+   r   r-   r9   r   r   r   r   v   s   zBrotliDecoder.decodec              
   C  sP   | j sdS zt| jdr| j  W dS  tjy' } ztt||d }~ww )Nr   finish)r=   r>   r'   rB   r   r+   r   r-   r2   r   r   r   r      s   
zBrotliDecoder.flushNr4   r   r   r5   r   r   r   r   r:   Z   s
    
	
	r:   c                   @  r!   )ZStandardDecoderz
    Handle 'zstd' RFC 8878 decoding.

    Requires `pip install zstandard`.
    Can be installed as a dependency of httpx using `pip install httpx[zstd]`.
    r
   r#   c                 C  s$   t d u r	tdd t   | _d S )NzXUsing 'ZStandardDecoder', ...Make sure to install httpx using `pip install httpx[zstd]`.)r   r;   ZstdDecompressorr&   r'   r   r   r   r   r(      s   zZStandardDecoder.__init__r   r	   c              
   C  s   t d usJ t }zA|| j| | jjr=| jjrG| jj}t  	 | _|| j| | jjrB| jjsW | S W | S W | S W | S  t j
y_ } ztt||d }~ww r   )r   ioBytesIOwriter'   r*   eofunused_datarD   r&   	ZstdErrorr   r-   getvalue)r   r   outputrI   r/   r   r   r   r      s(   zZStandardDecoder.decodec                 C  s"   | j  }| j jstdt|S )NzZstandard data is incomplete)r'   r   rH   r   r	   )r   retr   r   r   r      s   
zZStandardDecoder.flushNr4   r   r   r5   r   r   r   r   rC      s
    

	rC   c                   @  s.   e Zd ZdZdddZdd
dZdddZdS )MultiDecoderzE
    Handle the case where multiple encodings have been applied.
    childrentyping.Sequence[ContentDecoder]r
   r#   c                 C  s   t t|| _dS )zm
        'children' should be a sequence of decoders in the order in which
        each was applied.
        N)listreversedrO   )r   rO   r   r   r   r(      s   zMultiDecoder.__init__r   r	   c                 C  s   | j D ]}||}q|S r   )rO   r   r   r   childr   r   r   r      s   
zMultiDecoder.decodec                 C  s&   d}| j D ]}|||  }q|S r   )rO   r   r   rS   r   r   r   r      s   
zMultiDecoder.flushN)rO   rP   r
   r#   r   r   r5   r   r   r   r   rN      s
    

rN   c                   @  0   e Zd ZdZddddZdddZdddZdS )ByteChunkerz>
    Handles returning byte content in fixed-size chunks.
    N
chunk_size
int | Noner
   r#   c                 C     t  | _|| _d S r   )rE   rF   _buffer_chunk_sizer   rW   r   r   r   r(         

zByteChunker.__init__contentr	   list[bytes]c                       j d u r|r
|gS g S  j|  j  j kr_ j  fddtdt j D }t|d  j krF jd  j  |S  jd  j|d   j  |d d S g S )Nc                      g | ]}|| j   qS r   r[   .0ir   valuer   r   
<listcomp>       z&ByteChunker.decode.<locals>.<listcomp>r   	r[   rZ   rG   tellrK   rangelenseektruncater   r^   chunksr   rf   r   r      "   



zByteChunker.decodec                 C  .   | j  }| j d | j   |r|gS g S Nr   rZ   rK   ro   rp   rf   r   r   r   r         

zByteChunker.flushr   rW   rX   r
   r#   )r^   r	   r
   r_   )r
   r_   r5   r   r   r   r   rV      
    
rV   c                   @  rU   )TextChunkerz>
    Handles returning text content in fixed-size chunks.
    NrW   rX   r
   r#   c                 C  rY   r   )rE   StringIOrZ   r[   r\   r   r   r   r(      r]   zTextChunker.__init__r^   r-   	list[str]c                   r`   )Nc                   ra   r   rb   rc   rf   r   r   rh     ri   z&TextChunker.decode.<locals>.<listcomp>r   rj   rk   rq   r   rf   r   r      rs   zTextChunker.decodec                 C  rt   ru   rv   rf   r   r   r   r     rw   zTextChunker.flushr   rx   )r^   r-   r
   r|   r
   r|   r5   r   r   r   r   rz      ry   rz   c                   @  s0   e Zd ZdZddddZdddZdddZdS )TextDecoderz8
    Handles incrementally decoding bytes into text
    utf-8encodingr-   r
   r#   c                 C  s   t |dd| _d S )Nreplace)errors)codecsgetincrementaldecoderdecoder)r   r   r   r   r   r(   !  r8   zTextDecoder.__init__r   r	   c                 C  s   | j |S r   r   r   r   r   r   r   r   $  s   zTextDecoder.decodec                 C  s   | j ddS rA   r   r   r   r   r   r   '  s   zTextDecoder.flushN)r   )r   r-   r
   r#   )r   r	   r
   r-   )r
   r-   r5   r   r   r   r   r~     s
    
r~   c                   @  s.   e Zd ZdZdddZdd	d
ZdddZdS )LineDecoderz
    Handles incrementally reading lines from text.

    Has the same behaviour as the stdllib splitlines,
    but handling the input iteratively.
    r
   r#   c                 C  s   g | _ d| _d S r)   )buffertrailing_crr   r   r   r   r(   3  s   
zLineDecoder.__init__textr-   r|   c                 C  s   d}| j rd| }d| _ |drd| _ |d d }|sg S |d |v }| }t|dkr:|s:| j|d  g S | jrQd| j|d  g|dd   }g | _|sY| g| _|S )	Nu   
  FTrj   r   r    )r   endswith
splitlinesrn   r   appendjoinpop)r   r   NEWLINE_CHARStrailing_newlinelinesr   r   r   r   7  s(   
"zLineDecoder.decodec                 C  s.   | j s| jsg S d| j g}g | _ d| _|S )Nr   F)r   r   r   )r   r   r   r   r   r   ]  s   zLineDecoder.flushNr4   )r   r-   r
   r|   r}   r5   r   r   r   r   r   +  s
    

&r   )identitygzipdeflatebrr   r   r   )r    
__future__r   r   rE   typingr%   _compatr   r   _exceptionsr   r   r   r"   r6   r:   rC   rN   rV   rz   r~   r   SUPPORTED_DECODERSr   r   r   r   r   <module>   s<    5&''=	
