a
    |f #                     @   s   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| v 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   JD:\Projects\storyit_web\backend\venv\Lib\site-packages\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 u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_dataC   s    
zDataField.render_datac                 C   s    |   }|  }t|t| S N)r1   r4   r   )r(   headersdatar   r   r   
get_lengthI   s    zDataField.get_lengthc                 c   s   |   V  |  V  d S r5   r1   r4   r3   r   r   r   renderN   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 u r~t|}tdd |D }|d ur|s||d< t|t	j
rtdt|t	jrtd	|| _|| _|| _d S )
N      r   uploadc                 s   s   | ]}d |  v V  qdS )zcontent-typeN)r   ).0keyr   r   r   	<genexpr>u   r,   z%FileField.__init__.<locals>.<genexpr>Content-Typez?Multipart file uploads require 'io.BytesIO', not 'io.StringIO'.zDMultipart file uploads must be opened in binary mode, not text mode.)r   r!   tupler   r   r"   getattrr   anyioStringIOr#   
TextIOBasefilenamefiler6   )r(   r   r   r6   r   rP   fileobjZhas_content_type_headerr   r   r   r)   Z   s6    

zFileField.__init__r*   c                 C   sP   |   }t| jttfr.t|tt| j S t| j}|d u rDd S t|| S r5   )r1   r!   rQ   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   rP   s   ; z
r    r.   r,   )r/   r
   r   rP   extendr6   itemsencodeappendr0   r+   )r(   partsrP   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rRz| jd W n tjyP   Y n0 | j	| j
}|r~t|V  | j	| j
}q`d S )Nseekr   )r!   rQ   r"   r%   r   r/   r[   rM   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   S   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   sH   |d u rt d d}|| _d|d | _t| ||| _	d S )N   asciiz multipart/form-data; boundary=%s)
osurandomhexrU   rd   decoder   list_iter_fieldsfields)r(   r7   rc   rd   r   r   r   r)      s    zMultipartStream.__init__)r7   rc   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   )rT   r!   rJ   rk   r   r?   MappingrB   )r(   r7   rc   r   r   itemZ
file_itemsr   r   r   rl      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--
)rm   rd   r:   )r(   fieldr   r   r   iter_chunks   s
    
zMultipartStream.iter_chunksc                 C   sd   t | j}d}| jD ]:}| }|du 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   rd   rm   r8   )r(   Zboundary_lengthlengthrp   Zfield_lengthr   r   r   get_content_length   s    


z"MultipartStream.get_content_lengthc                 C   s.   |   }| j}|d u r d|dS t||dS )Nchunked)zTransfer-EncodingrI   )zContent-LengthrI   )rt   r   r"   )r(   content_lengthr   r   r   r   get_headers   s
    
zMultipartStream.get_headersc                 c   s   |   D ]
}|V  qd S r5   rq   r_   r   r   r   __iter__  s    zMultipartStream.__iter__c                 C  s   |   D ]
}|V  qd S r5   rx   r_   r   r   r   	__aiter__  s    zMultipartStream.__aiter__)N)r;   r<   r=   r>   r   r   r?   ra   r%   r)   rA   r@   rB   r   rl   rq   r&   rt   Dictr"   rw   ry   AsyncIteratorrz   r   r   r   r   rb      s     rb   )rM   rg   r?   pathlibr   _typesr   r   r   r   r   r	   Z_utilsr
   r   r   r   r   ra   r%   r   r   rB   rb   r   r   r   r   <module>   s    
.k