
    tc$(                        d Z ddlZddlZddlZddlZddlmZ ddlmZ  G d d          Z	 G d d	e	          Z
 G d
 de	          Z G d de	          Z G d de	          Z G d de	          Z G d d          Z G d d          Z G d d          Z G d d          Ze
eeedZee                    d           dS dS )zq
Handlers for Content-Encoding.

See: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Encoding
    N   )brotli)DecodingErrorc                   *    e Zd ZdedefdZdefdZdS )ContentDecoderdatareturnc                     t                      NNotImplementedErrorselfr   s     1/usr/lib/python3/dist-packages/httpx/_decoders.pydecodezContentDecoder.decode       !###    c                     t                      r   r   r   s    r   flushzContentDecoder.flush   r   r   N)__name__
__module____qualname__bytesr   r    r   r   r   r      sQ        $5 $U $ $ $ $$u $ $ $ $ $ $r   r   c                   .    e Zd ZdZdedefdZdefdZdS )IdentityDecoderz 
    Handle unencoded data.
    r   r	   c                     |S r   r   r   s     r   r   zIdentityDecoder.decode   s    r   c                     dS Nr   r   r   s    r   r   zIdentityDecoder.flush   s    sr   N)r   r   r   __doc__r   r   r   r   r   r   r   r      s[         5 U    u      r   r   c                   6    e Zd ZdZddZdedefdZdefdZdS )	DeflateDecoderzZ
    Handle 'deflate' decoding.

    See: https://stackoverflow.com/questions/1838699
    r	   Nc                 D    d| _         t          j                    | _        d S )NT)first_attemptzlibdecompressobjdecompressorr   s    r   __init__zDeflateDecoder.__init__*   s!    ! .00r   r   c                 <   | j         }d| _         	 | j                            |          S # t          j        $ rb}|r>t          j        t          j                   | _        |                     |          cY d }~S t          t          |                    |d }~ww xY w)NF)
r%   r(   
decompressr&   errorr'   	MAX_WBITSr   r   str)r   r   was_first_attemptexcs       r   r   zDeflateDecoder.decode.   s     ."	3$//555z 	3 	3 	3  )$($6$G$G!{{4((((((((C))s2		3s    * B:B3B9BBc                     	 | j                                         S # t          j        $ r"}t	          t          |                    |d }~ww xY wr   r(   r   r&   r,   r   r.   r   r0   s     r   r   zDeflateDecoder.flush9   S    	3$**,,,z 	3 	3 	3C))s2	3    AAAr	   Nr   r   r   r!   r)   r   r   r   r   r   r   r#   r#   #   so         1 1 1 1	35 	3U 	3 	3 	3 	33u 3 3 3 3 3 3r   r#   c                   6    e Zd ZdZddZdedefdZdefdZdS )	GZipDecoderzW
    Handle 'gzip' decoding.

    See: https://stackoverflow.com/questions/1838699
    r	   Nc                 R    t          j        t           j        dz            | _        d S )N   )r&   r'   r-   r(   r   s    r   r)   zGZipDecoder.__init__G   s"     .t~/BCCr   r   c                     	 | j                             |          S # t          j        $ r"}t	          t          |                    |d }~ww xY wr   )r(   r+   r&   r,   r   r.   r   r   r0   s      r   r   zGZipDecoder.decodeJ   sU    	3$//555z 	3 	3 	3C))s2	3s    AAAc                     	 | j                                         S # t          j        $ r"}t	          t          |                    |d }~ww xY wr   r2   r3   s     r   r   zGZipDecoder.flushP   r4   r5   r6   r7   r   r   r   r9   r9   @   ss         D D D D35 3U 3 3 3 33u 3 3 3 3 3 3r   r9   c                   6    e Zd ZdZddZdedefdZdefdZdS )	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	   Nc                     t           t          d          d t          j                    | _        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   s    r   r)   zBrotliDecoder.__init__a   s    >P  	 #/1194$l33 	9#0;D  $08Dr   r   c                     |sdS d| _         	 |                     |          S # t          j        $ r"}t	          t          |                    |d }~ww xY wNr   T)rD   rF   r   r,   r   r.   r=   s      r   r   zBrotliDecoder.decodes   sf     	3	3##D)))| 	3 	3 	3C))s2	3s   " AAAc                     | j         sdS 	 t          | j        d          r| j                                         dS # t          j        $ r"}t          t          |                    |d }~ww xY w)Nr   finish)rD   rE   r(   rK   r   r,   r   r.   r3   s     r   r   zBrotliDecoder.flush|   s~    ~ 	3
	3t((33 + !((***3| 	3 	3 	3C))s2	3s   .; A,
A''A,r6   r7   r   r   r   r@   r@   W   so         9 9 9 9$35 3U 3 3 3 33u 3 3 3 3 3 3r   r@   c                   T    e Zd ZdZdej        e         ddfdZdedefdZ	defdZ
dS )	MultiDecoderzE
    Handle the case where multiple encodings have been applied.
    childrenr	   Nc                 H    t          t          |                    | _        dS )zm
        'children' should be a sequence of decoders in the order in which
        each was applied.
        N)listreversedrN   )r   rN   s     r   r)   zMultiDecoder.__init__   s     Xh//00r   r   c                 D    | j         D ]}|                    |          }|S r   )rN   r   r   r   childs      r   r   zMultiDecoder.decode   s+    ] 	& 	&E<<%%DDr   c                 r    d}| j         D ],}|                    |          |                                z   }-|S r    )rN   r   r   rS   s      r   r   zMultiDecoder.flush   s=    ] 	6 	6E<<%%5DDr   )r   r   r   r!   typingSequencer   r)   r   r   r   r   r   r   rM   rM      s         1!@ 1T 1 1 1 15 U    
u      r   rM   c                       e Zd ZdZd	dej        e         ddfdZdedej	        e         fdZ
dej	        e         fdZdS )
ByteChunkerz>
    Handles returning byte content in fixed-size chunks.
    N
chunk_sizer	   c                 D    t          j                    | _        || _        d S r   )ioBytesIO_buffer_chunk_sizer   rZ   s     r   r)   zByteChunker.__init__   s    z||%r   contentc                      j         |r|gng S  j                            |            j                                         j         k    r j                                         fdt          dt                     j                   D             }t          |d                    j         k    r5 j                            d            j                                         |S  j                            d            j                            |d                     j                                         |d d         S g S )Nc                 4    g | ]}||j         z            S r   r_   .0ir   values     r   
<listcomp>z&ByteChunker.decode.<locals>.<listcomp>   ;        a!d.../  r   r   	r_   r^   writetellgetvaluerangelenseektruncater   ra   chunksrh   s   `  @r   r   zByteChunker.decode   sE   # '/G99R/7###<$"222L))++E    q#e**d.>??  F 6":$"222!!!$$$%%'''!!!$$$""6":...%%'''crc{"Ir   c                     | j                                         }| j                             d           | j                                          |r|gng S Nr   r^   ro   rr   rs   r   rh   s     r   r   zByteChunker.flush   P    %%''!'wwR'r   r   )r   r   r   r!   rV   Optionalintr)   r   Listr   r   r   r   r   rY   rY      s         & &6?3#7 &4 & & & &e E(:    .(v{5) ( ( ( ( ( (r   rY   c                       e Zd ZdZd	dej        e         ddfdZdedej	        e         fdZ
dej	        e         fdZdS )
TextChunkerz>
    Handles returning text content in fixed-size chunks.
    NrZ   r	   c                 D    t          j                    | _        || _        d S r   )r\   StringIOr^   r_   r`   s     r   r)   zTextChunker.__init__   s    {}}%r   ra   c                      j         |gS  j                            |            j                                         j         k    r j                                         fdt          dt                     j                   D             }t          |d                    j         k    r5 j                            d            j                                         |S  j                            d            j                            |d                     j                                         |d d         S g S )Nc                 4    g | ]}||j         z            S r   rd   re   s     r   ri   z&TextChunker.decode.<locals>.<listcomp>   rj   r   r   rk   rl   rt   s   `  @r   r   zTextChunker.decode   s<   #97###<$"222L))++E    q#e**d.>??  F 6":$"222!!!$$$%%'''!!!$$$""6":...%%'''crc{"Ir   c                     | j                                         }| j                             d           | j                                          |r|gng S rw   rx   ry   s     r   r   zTextChunker.flush   rz   r   r   )r   r   r   r!   rV   r{   r|   r)   r.   r}   r   r   r   r   r   r   r      s         & &6?3#7 &4 & & & &c fk#&6    .(v{3' ( ( ( ( ( (r   r   c                   <    e Zd ZdZd
defdZdedefdZdefdZd	S )TextDecoderz8
    Handles incrementally decoding bytes into text
    utf-8encodingc                 L     t          j        |          d          | _        d S )Nreplace)errors)codecsgetincrementaldecoderdecoder)r   r   s     r   r)   zTextDecoder.__init__   s%    =v3H==YOOOr   r   r	   c                 6    | j                             |          S r   r   r   r   s     r   r   zTextDecoder.decode   s    |""4(((r   c                 8    | j                             dd          S rI   r   r   s    r   r   zTextDecoder.flush   s    |""3---r   N)r   )	r   r   r   r!   r.   r)   r   r   r   r   r   r   r   r      s         P P P P P P)5 )S ) ) ) ).s . . . . . .r   r   c                   b    e Zd ZdZddZdedej        e         fdZdej        e         fdZ	dS )	LineDecoderz
    Handles incrementally reading lines from text.

    Uses universal line decoding, supporting any of `
`, ``, or `
`
    as line endings, normalizing to `
`.
    r	   Nc                     d| _         d S )N )bufferr   s    r   r)   zLineDecoder.__init__
  s    r   textc                    g }|r| j         r| j         d         dk    rx|                    d          r7|                    | j         d d         dz              d| _         |dd          }n,|                    | j         d d         dz              d| _         |r.t          |          }t	          |          D ]}||         }|dz   |k    rd n
||dz            }|dk    r>|                    | j         |d |dz            z              d| _         ||dz   d          } n|dk    rD|dk    r>|                    | j         |d |         z   dz              d| _         ||dz   d          } n^|dk    r@|>|                    | j         |d |         z   dz              d| _         ||dz   d          } n|| xj         |z  c_         d} n|.|S )Nrk   
r   r      )r   
startswithappendrq   rp   )r   r   lines	num_charsidxchar	next_chars          r   r   zLineDecoder.decode  s    	!DK 	!DKOt$;$;t$$ 
! T["-4555 ABBx T["-4555  	D		IY''  Cy$'!Gy$8$8DDd37m	4<<LLtIcAgI!>???"$DKa		?DET\\i4&7&7LLtDSDz!9D!@AAA"$DKa		?DET\\i&;LLtDSDz!9D!@AAA"$DKa		?DE&KK4'KKDE ')  	2 r   c                     | j                             d          r| j         d d         dz   g}n| j         r	| j         g}ng }d| _         |S )Nr   rk   r   r   )r   endswith)r   r   s     r   r   zLineDecoder.flush8  s\    ;%% 	 ["%,-EE[ 	[MEEEr   r6   )
r   r   r   r!   r)   r.   rV   r}   r   r   r   r   r   r   r     s~            )3 )6;s#3 ) ) ) )V
v{3' 
 
 
 
 
 
r   r   )identitygzipdeflatebrr   )r!   r   r\   rV   r&   _compatr   _exceptionsr   r   r   r#   r9   r@   rM   rY   r   r   r   SUPPORTED_DECODERSpopr   r   r   <module>r      sB   
  				         & & & & & &$ $ $ $ $ $ $ $	 	 	 	 	n 	 	 	3 3 3 3 3^ 3 3 3:3 3 3 3 3. 3 3 3.23 23 23 23 23N 23 23 23j    >   2$( $( $( $( $( $( $( $(N$( $( $( $( $( $( $( $(N. . . . . . . .@ @ @ @ @ @ @ @H  
	   
>4      >r   