U
    g                     @  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-ql4n0x43/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rt | tst| }|d kr|ddi}ndt|i}|t	| fS t | t
rd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>          $    