U
    dd#                     @   s   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mZm	Z	m
Z
mZmZ ddlmZmZmZmZmZ eje eje dddZG d	d
 d
ZG dd dZG dd deeZdS )    N)Path   )AsyncByteStreamFileContent	FileTypesRequestDataRequestFilesSyncByteStream)format_form_paramguess_content_typepeek_filelike_lengthprimitive_value_to_strto_bytes)content_typereturnc                 C   s^   | r|  dsd S d| krZ| dD ]4}|   dr$| tdd  d  S q$d S )Ns   multipart/form-data   ;s	   boundary=   ")
startswithsplitstriplowerlen)r   section r   4/tmp/pip-unpacked-wheel-fkuvgui5/httpx/_multipart.py(get_multipart_boundary_from_content_type   s     r   c                   @   sp   e Zd ZdZeejeeee	df ddddZ
edddZedd	d
ZedddZeje dddZdS )	DataFieldzB
    A single form field item, within a multipart form field.
    Nnamevaluer   c                 C   sv   t |ts"tdt| d||d k	rTt |ttttfsTtdt| d||| _t |trh|nt|| _	d S )Nz)Invalid type for name. Expected str, got : z5Invalid type for value. Expected primitive type, got )

isinstancestr	TypeErrortypebytesintfloatr   r   r   )selfr   r   r   r   r   __init__+   s    
zDataField.__init__r   c                 C   s.   t | ds(td| j}dd|dg| _| jS )N_headersr           Content-Disposition: form-data;    

)hasattrr
   r   joinr+   )r(   r   r   r   r   render_headers;   s    
zDataField.render_headersc                 C   s   t | dst| j| _| jS )N_data)r/   r   r   r2   r(   r   r   r   render_dataD   s    
zDataField.render_datac                 C   s    |   }|  }t|t| S N)r1   r4   r   )r(   headersdatar   r   r   
get_lengthJ   s    zDataField.get_lengthc                 c   s   |   V  |  V  d S r5   r1   r4   r3   r   r   r   renderO   s    
zDataField.render)__name__
__module____qualname____doc__r"   typingUnionr%   r&   r'   r)   r1   r4   r8   Iteratorr:   r   r   r   r   r   &   s    	r   c                   @   sp   e Zd ZdZdZeeddddZej	e
 ddd	Zedd
dZeje dddZeje dddZdS )	FileFieldzB
    A single file field item, within a multipart form field.
    i   Nr   c                 C   s   || _ i }d }t|trTt|dkr.|\}}qnt|dkrF|\}}}qn|\}}}}nttt|ddj }|}|d kr~t|}tdd |D }|d k	r|s||d< dt|d	dkrt	d
t|t
jrt	d|| _|| _|| _d S )N      r   uploadc                 s   s   | ]}d |  kV  qdS )zcontent-typeN)r   ).0keyr   r   r   	<genexpr>v   s     z%FileField.__init__.<locals>.<genexpr>Content-TypebmodezDMultipart file uploads must be opened in binary mode, not text mode.z?Multipart file uploads require 'io.BytesIO', not 'io.StringIO'.)r   r!   tupler   r   r"   getattrr   anyr#   ioStringIOfilenamefiler6   )r(   r   r   r6   r   rQ   fileobjZhas_content_type_headerr   r   r   r)   [   s6    

zFileField.__init__r*   c                 C   sP   |   }t| jttfr.t|tt| j S t| j}|d krDd S t|| S r5   )r1   r!   rR   r"   r%   r   r   r   )r(   r6   Zfile_lengthr   r   r   r8      s    
zFileField.get_lengthc                 C   s   t | dsdtd| jg}| jr:td| j}|d|g | j D ]0\}}d| d |  }}|||g qD|d d		|| _
| j
S )
Nr+   r-   r   rQ   s   ; z
r    r.   r,   )r/   r
   r   rQ   extendr6   itemsencodeappendr0   r+   )r(   partsrQ   header_nameheader_valuerG   valr   r   r   r1      s    


zFileField.render_headersc                 c   s   t | jttfr t| jV  d S t| jdrTz| jd W n tjk
rR   Y nX | j	| j
}|rt|V  | j	| j
}qbd S )Nseekr   )r!   rR   r"   r%   r   r/   r\   rO   UnsupportedOperationread
CHUNK_SIZEr(   chunkr   r   r   r4      s    
zFileField.render_datac                 c   s   |   V  |  E d H  d S r5   r9   r3   r   r   r   r:      s    
zFileField.render)r;   r<   r=   r>   r_   r"   r   r)   r?   Optionalr&   r8   r%   r1   rA   r4   r:   r   r   r   r   rB   T   s   /rB   c                   @   s   e Zd ZdZdeeeje ddddZ	eeej
ejeef  dddZej
e d	d
dZeje d	ddZejeef d	ddZej
e d	ddZeje d	ddZdS )MultipartStreamzC
    Request content as streaming multipart encoded form data.
    N)r7   filesboundaryr   c                 C   sD   |d krt td}|| _d|d | _t| ||| _	d S )N   z multipart/form-data; boundary=%sascii)
binasciihexlifyosurandomre   decoder   list_iter_fieldsfields)r(   r7   rd   re   r   r   r   r)      s    zMultipartStream.__init__)r7   rd   r   c                 c   s   |  D ]>\}}t|ttfr8|D ]}t||dV  q"qt||dV  qt|tjr\|  n|}|D ]\}}t||dV  qdd S )N)r   r   )rU   r!   rL   rm   r   r?   MappingrB   )r(   r7   rd   r   r   itemZ
file_itemsr   r   r   rn      s    zMultipartStream._iter_fieldsr*   c                 c   s<   | j D ]$}d| j V  | E d H  dV  qd| j V  d S )Ns   --%s
s   
s   --%s--
)ro   re   r:   )r(   fieldr   r   r   iter_chunks   s
    
zMultipartStream.iter_chunksc                 C   sd   t | j}d}| jD ]:}| }|dkr. dS |d| d 7 }||7 }|d7 }q|d| d 7 }|S )z
        Return the length of the multipart encoded content, or `None` if
        any of the files have a length that cannot be determined upfront.
        r   NrC      )r   re   ro   r8   )r(   Zboundary_lengthlengthrr   Zfield_lengthr   r   r   get_content_length   s    


z"MultipartStream.get_content_lengthc                 C   s.   |   }| j}|d kr d|dS t||dS )Nchunked)zTransfer-EncodingrI   )zContent-LengthrI   )rv   r   r"   )r(   content_lengthr   r   r   r   get_headers   s
    
zMultipartStream.get_headersc                 c   s   |   D ]
}|V  qd S r5   rs   r`   r   r   r   __iter__  s    zMultipartStream.__iter__c                 C  s   |   D ]
}|V  qd S r5   rz   r`   r   r   r   	__aiter__	  s    zMultipartStream.__aiter__)N)r;   r<   r=   r>   r   r   r?   rb   r%   r)   rA   r@   rB   r   rn   rs   r&   rv   Dictr"   ry   r{   AsyncIteratorr|   r   r   r   r   rc      s"     rc   )rh   rO   rj   r?   pathlibr   _typesr   r   r   r   r   r	   _utilsr
   r   r   r   r   rb   r%   r   r   rB   rc   r   r   r   r   <module>   s    
.k