U
    dd                     @   sV  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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  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$ee%e&e
e& ee& f ee	e%e%f eeef f dddZ'eee	e%e%f e!f dddZ(eeee& ee	e%e%f ef dddZ)e%ee	e%e%f e!f dddZ*e%ee	e%e%f e!f ddd Z+eee	e%e%f e!f d!d"d#Z,d*ee ee ee ee ee& ee	e%e%f eeef f d$d%d&Z-d+ee ee% ee% ee ee	e%e%f eeef f d'd(d)Z.dS ),    N)dumps)
AnyAsyncIterableAsyncIteratorDictIterableIteratorMappingOptionalTupleUnion)	urlencode   )StreamClosedStreamConsumed)MultipartStream)AsyncByteStreamRequestContentRequestDataRequestFilesResponseContentSyncByteStream)peek_filelike_lengthprimitive_value_to_strc                   @   s@   e Zd ZeddddZee dddZee ddd	ZdS )

ByteStreamN)streamreturnc                 C   s
   || _ d S N_streamselfr    r"   2/tmp/pip-unpacked-wheel-fkuvgui5/httpx/_content.py__init__    s    zByteStream.__init__r   c                 c   s   | j V  d S r   r   r!   r"   r"   r#   __iter__#   s    zByteStream.__iter__c                 C  s   | j V  d S r   r   r&   r"   r"   r#   	__aiter__&   s    zByteStream.__aiter__)	__name__
__module____qualname__bytesr$   r   r'   r   r(   r"   r"   r"   r#   r      s   r   c                   @   s4   e Zd ZdZee dddZee dddZdS )	IteratorByteStream   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%   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"   r"   r#   r-   *   s   r-   c                   @   s4   e Zd ZdZee dddZee dddZdS )	AsyncIteratorByteStreamr.   r/   c                 C   s   || _ d| _t|| _d S r0   )r   r1   r2   
isasyncgenr4   r    r"   r"   r#   r$   F   s    z AsyncIteratorByteStream.__init__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"   r"   r#   r;   C   s   r;   c                   @   s4   e Zd ZdZee dddZee 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%   c                 C   s
   t  d S r   r   r&   r"   r"   r#   r'   c   s    zUnattachedStream.__iter__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"   r"   r#   r>   \   s   r>   )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   )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`   )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   )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   )jsonr   c                 C   s4   t | d}tt|}d}||d}|t|fS )NrC   zapplication/jsonrX   )
json_dumpsrH   rG   rI   r   )rj   rM   rN   r_   rO   r"   r"   r#   encode_json   s
    
rl   )rB   rQ   ra   rj   rb   r   c                 C   sv   |dk	r*t |ts*d}t|t t|S | dk	r:t| S |rNt|pFi ||S |rZt|S |dk	rjt|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.r@   )
rF   r	   warningswarnDeprecationWarningrP   rd   r`   rl   r   )rB   rQ   ra   rj   rb   messager"   r"   r#   encode_request   s    rq   )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   rl   r   )rB   re   rh   rj   r"   r"   r#   encode_response   s    
rr   )NNNNN)NNNN)/r2   rm   rj   r   rk   typingr   r   r   r   r   r   r	   r
   r   r   urllib.parser   _exceptionsr   r   Z
_multipartr   _typesr   r   r   r   r   r   _utilsr   r   r   r-   r;   r>   rG   r,   rP   r`   rd   rg   ri   rl   rq   rr   r"   r"   r"   r#   <module>   sd   0      	     $    