o
    Þ­j´,  ã                   @  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 rŠe d¡ e	du r•e 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   úL/var/www/html/CropPilot/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 )NzžUsing '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&''=û	
ÿ