U
    nËjá  ã                   @  s„  d dl mZ d dlZd dlZd dlmZ d dlmZm	Z	m
Z
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	lmZmZmZmZmZmZ dd
lmZmZ dgZG dd„ deeƒZ G dd„ deƒZ!G dd„ deƒZ"G dd„ deeƒZ#dddœdd„Z$dddœdd„Z%ddddd œd!d"„Z&d#dd$œd%d&„Z'd#dd'œd(d)„Z(d*dd+œd,d-„Z)d:d.d/d0d1ddd2œd3d4„Z*d;d5d6d6d1dd7œd8d9„Z+dS )<é    )ÚannotationsN)Údumps)ÚAnyÚAsyncIterableÚAsyncIteratorÚIterableÚIteratorÚMapping)Ú	urlencodeé   )ÚStreamClosedÚStreamConsumed)ÚMultipartStream)ÚAsyncByteStreamÚRequestContentÚRequestDataÚRequestFilesÚResponseContentÚSyncByteStream)Úpeek_filelike_lengthÚprimitive_value_to_strÚ
ByteStreamc                   @  s8   e Zd Zdddœdd„Zddœdd	„Zd
dœdd„ZdS )r   ÚbytesÚNone©ÚstreamÚreturnc                 C  s
   || _ d S ©N©Ú_stream©Úselfr   © r"   ú2/tmp/pip-unpacked-wheel-7ig9zwdf/httpx/_content.pyÚ__init__    s    zByteStream.__init__úIterator[bytes]©r   c                 c  s   | j V  d S r   r   ©r!   r"   r"   r#   Ú__iter__#   s    zByteStream.__iter__úAsyncIterator[bytes]c                 C s   | j V  d S r   r   r'   r"   r"   r#   Ú	__aiter__&   s    zByteStream.__aiter__N)Ú__name__Ú
__module__Ú__qualname__r$   r(   r*   r"   r"   r"   r#   r      s   c                   @  s.   e Zd ZdZdddœdd„Zddœd	d
„ZdS )ÚIteratorByteStreamé   zIterable[bytes]r   r   c                 C  s   || _ d| _t |¡| _d S ©NF)r   Ú_is_stream_consumedÚinspectÚisgeneratorÚ_is_generatorr    r"   r"   r#   r$   -   s    zIteratorByteStream.__init__r%   r&   c                 c  sd   | j r| jrtƒ ‚d| _ t| jdƒrN| j | j¡}|r`|V  | j | j¡}q2n| jD ]
}|V  qTd S )NTÚread)r1   r4   r   Úhasattrr   r5   Ú
CHUNK_SIZE©r!   ÚchunkÚpartr"   r"   r#   r(   2   s    
zIteratorByteStream.__iter__N)r+   r,   r-   r7   r$   r(   r"   r"   r"   r#   r.   *   s   r.   c                   @  s.   e Zd ZdZdddœdd„Zddœd	d
„ZdS )ÚAsyncIteratorByteStreamr/   zAsyncIterable[bytes]r   r   c                 C  s   || _ d| _t |¡| _d S r0   )r   r1   r2   Ú
isasyncgenr4   r    r"   r"   r#   r$   F   s    z AsyncIteratorByteStream.__init__r)   r&   c                 C sz   | j r| jrtƒ ‚d| _ t| jdƒrZ| j | j¡I d H }|rv|V  | j | j¡I d H }q8n| j2 z3 d H W }|V  q`6 d S )NTÚaread)r1   r4   r   r6   r   r=   r7   r8   r"   r"   r#   r*   K   s    z!AsyncIteratorByteStream.__aiter__N)r+   r,   r-   r7   r$   r*   r"   r"   r"   r#   r;   C   s   r;   c                   @  s,   e Zd ZdZddœdd„Zddœdd„Zd	S )
ÚUnattachedStreamz¿
    If a request or response is serialized using pickle, then it is no longer
    attached to a stream for I/O purposes. Any stream operations should result
    in `httpx.StreamClosed`.
    r%   r&   c                 C  s
   t ƒ ‚d S r   ©r   r'   r"   r"   r#   r(   c   s    zUnattachedStream.__iter__r)   c                 C s   t ƒ ‚dV  d S )Nó    r?   r'   r"   r"   r#   r*   f   s    zUnattachedStream.__aiter__N)r+   r,   r-   Ú__doc__r(   r*   r"   r"   r"   r#   r>   \   s   r>   z4str | bytes | Iterable[bytes] | AsyncIterable[bytes]z7tuple[dict[str, str], SyncByteStream | AsyncByteStream])Úcontentr   c                 C  sÈ   t | ttfƒrNt | tƒr"|  d¡n| }t|ƒ}|r>dt|ƒini }|t|ƒfS t | tƒr”t | tƒs”t| ƒ}|d kr|ddi}ndt|ƒi}|t	| ƒfS t | t
ƒr²ddi}|t| ƒfS tdt| ƒ›�ƒ‚d S )Núutf-8úContent-LengthzTransfer-EncodingÚchunkedzUnexpected type for 'content', )Ú
isinstancer   ÚstrÚencodeÚlenr   r   Údictr   r.   r   r;   Ú	TypeErrorÚtype)rB   ÚbodyÚcontent_lengthÚheadersZcontent_length_or_noner"   r"   r#   Úencode_contentk   s    

rP   r   z!tuple[dict[str, str], ByteStream])Údatar   c                   sˆ   g }|   ¡ D ]B\‰ }t|ttfƒr<| ‡ fdd„|D ƒ¡ q| ˆ t|ƒf¡ qt|dd� d¡}t	t
|ƒƒ}d}||dœ}|t|ƒfS )Nc                   s   g | ]}ˆ t |ƒf‘qS r"   )r   )Ú.0Úitem©Úkeyr"   r#   Ú
<listcomp>Ž   s     z*encode_urlencoded_data.<locals>.<listcomp>T)ÚdoseqrC   z!application/x-www-form-urlencoded©rD   zContent-Type)ÚitemsrF   ÚlistÚtupleÚextendÚappendr   r
   rH   rG   rI   r   )rQ   Z
plain_dataÚvaluerM   rN   Úcontent_typerO   r"   rT   r#   Úencode_urlencoded_dataˆ   s    
r`   r   zbytes | Nonez&tuple[dict[str, str], MultipartStream])rQ   ÚfilesÚboundaryr   c                 C  s   t | ||d�}| ¡ }||fS )N)rQ   ra   rb   )r   Zget_headers)rQ   ra   rb   Ú	multipartrO   r"   r"   r#   Úencode_multipart_data˜   s    rd   rG   )Útextr   c                 C  s0   |   d¡}tt|ƒƒ}d}||dœ}|t|ƒfS )NrC   ztext/plain; charset=utf-8rX   ©rH   rG   rI   r   )re   rM   rN   r_   rO   r"   r"   r#   Úencode_text    s
    

rg   )Úhtmlr   c                 C  s0   |   d¡}tt|ƒƒ}d}||dœ}|t|ƒfS )NrC   ztext/html; charset=utf-8rX   rf   )rh   rM   rN   r_   rO   r"   r"   r#   Úencode_html¨   s
    

ri   r   )Újsonr   c                 C  s<   t | dddd� d¡}tt|ƒƒ}d}||dœ}|t|ƒfS )NF)ú,ú:)Úensure_asciiÚ
separatorsÚ	allow_nanrC   zapplication/jsonrX   )Ú
json_dumpsrH   rG   rI   r   )rj   rM   rN   r_   rO   r"   r"   r#   Úencode_json°   s       ÿþ
rq   zRequestContent | NonezRequestData | NonezRequestFiles | Nonez
Any | None)rB   rQ   ra   rj   rb   r   c                 C  sz   |dk	r.t |tƒs.d}tj|tdd� t|ƒS | dk	r>t| ƒS |rRt|pJi ||ƒS |r^t|ƒS |dk	rnt|ƒS i t	dƒfS )z€
    Handles encoding the given `content`, `data`, `files`, and `json`,
    returning a two-tuple of (<headers>, <stream>).
    Nz5Use 'content=<...>' to upload raw bytes/text content.é   )Ú
stacklevelr@   )
rF   r	   ÚwarningsÚwarnÚDeprecationWarningrP   rd   r`   rq   r   )rB   rQ   ra   rj   rb   Úmessager"   r"   r#   Úencode_requestº   s    rx   zResponseContent | Nonez
str | None)rB   re   rh   rj   r   c                 C  sL   | dk	rt | ƒS |dk	r t|ƒS |dk	r0t|ƒS |dk	r@t|ƒS i tdƒfS )zc
    Handles encoding the given `content`, returning a two-tuple of
    (<headers>, <stream>).
    Nr@   )rP   rg   ri   rq   r   )rB   re   rh   rj   r"   r"   r#   Úencode_responseÝ   s    
ry   )NNNNN)NNNN),Ú
__future__r   r2   rt   rj   r   rp   Útypingr   r   r   r   r   r	   Úurllib.parser
   Ú_exceptionsr   r   Z
_multipartr   Ú_typesr   r   r   r   r   r   Ú_utilsr   r   Ú__all__r   r.   r;   r>   rP   r`   rd   rg   ri   rq   rx   ry   r"   r"   r"   r#   Ú<module>   s>          û$    ü