o
    h #                     @   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 deje deje f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 r-| dD ]}|   dr,| tdd  d  S qd S )Ns   multipart/form-data   ;s	   boundary=   ")
startswithsplitstriplowerlen)r   section r   F/var/www/html/ai/venv/lib/python3.10/site-packages/httpx/_multipart.py(get_multipart_boundary_from_content_type   s   r   c                	   @   st   e Zd ZdZdedejeeee	df ddfddZ
defdd	Zdefd
dZdefddZdeje fddZdS )	DataFieldzB
    A single form field item, within a multipart form field.
    namevalueNr   c                 C   s|   t |tstdt| d||d ur*t |ttttfs*tdt| d||| _t |tr7|| _	d S 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__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   r0   r'   r   r   r   render_dataC   s   
zDataField.render_datac                 C   s    |   }|  }t|t| S N)r/   r2   r   )r'   headersdatar   r   r   
get_lengthI   s   zDataField.get_lengthc                 c   s    |   V  |  V  d S r3   r/   r2   r1   r   r   r   renderN   s   
zDataField.render)__name__
__module____qualname____doc__r!   typingUnionr$   r%   r&   r(   r/   r2   r6   Iteratorr8   r   r   r   r   r   %   s    
	r   c                   @   st   e Zd ZdZdZdededdfddZdej	e
 fd	d
ZdefddZdeje fddZdeje fddZdS )	FileFieldzB
    A single file field item, within a multipart form field.
    i   r   r   r   Nc                 C   s   || _ i }d }t|tr*t|dkr|\}}n t|dkr#|\}}}n|\}}}}nttt|ddj }|}|d u r?t|}tdd |D }|d urR|sR||d< t|t	j
r\tdt|t	jrftd	|| _|| _|| _d S )
N      r   uploadc                 s   s    | ]	}d |  v V  qdS )zcontent-typeN)r   ).0keyr   r   r   	<genexpr>u   s    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filer4   )r'   r   r   r4   r   rN   fileobjhas_content_type_headerr   r   r   r(   Z   s6   


zFileField.__init__c                 C   sP   |   }t| jttfrt|tt| j S t| j}|d u r"d S t|| S r3   )r/   r    rO   r!   r$   r   r   r   )r'   r4   file_lengthr   r   r   r6      s   
zFileField.get_lengthc                 C   s   t | dsFdtd| jg}| jrtd| j}|d|g | j D ]\}}d| d | }}|||g q"|d d		|| _
| j
S )
Nr)   r+   r   rN   s   ; z
r   r,   r*   )r-   r
   r   rN   extendr4   itemsencodeappendr.   r)   )r'   partsrN   header_nameheader_valuerE   valr   r   r   r/      s   


zFileField.render_headersc                 c   s    t | jttfrt| jV  d S t| jdr*z| jd W n
 tjy)   Y nw | j	| j
}|rCt|V  | j	| j
}|s3d S d S )Nseekr   )r    rO   r!   r$   r   r-   r[   rK   UnsupportedOperationread
CHUNK_SIZEr'   chunkr   r   r   r2      s   
zFileField.render_datac                 c   s    |   V  |  E d H  d S r3   r7   r1   r   r   r   r8      s   
zFileField.render)r9   r:   r;   r<   r^   r!   r   r(   r=   Optionalr%   r6   r$   r/   r?   r2   r8   r   r   r   r   r@   S   s    /r@   c                	   @   s   e Zd ZdZ	ddededeje ddfddZ	dededej
ejeef  fd	d
Zdej
e fddZdeje fddZdejeef fddZdej
e fddZdeje fddZdS )MultipartStreamzC
    Request content as streaming multipart encoded form data.
    Nr5   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'   r5   rc   rd   r   r   r   r(      s   zMultipartStream.__init__c                 c   s    |  D ]\}}t|ttfr|D ]	}t||dV  qqt||dV  qt|tjr/|  n|}|D ]\}}t||dV  q3d S )N)r   r   )rT   r    rH   rk   r   r=   Mappingr@   )r'   r5   rc   r   r   item
file_itemsr   r   r   rl      s   zMultipartStream._iter_fieldsc                 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   r8   )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   NrA      )r   rd   rm   r6   )r'   boundary_lengthlengthrq   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-EncodingrG   )zContent-LengthrG   )rw   r   r!   )r'   content_lengthr   r   r   r   get_headers   s
   
zMultipartStream.get_headersc                 c   s    |   D ]}|V  qd S r3   rr   r_   r   r   r   __iter__     zMultipartStream.__iter__c                 C  s   |   D ]}|V  qd S r3   r{   r_   r   r   r   	__aiter__  r}   zMultipartStream.__aiter__r3   )r9   r:   r;   r<   r   r   r=   ra   r$   r(   r?   r>   r@   r   rl   rr   r%   rw   Dictr!   rz   r|   AsyncIteratorr~   r   r   r   r   rb      s0    

rb   )rK   rg   r=   pathlibr   _typesr   r   r   r   r   r	   _utilsr
   r   r   r   r   ra   r$   r   r   r@   rb   r   r   r   r   <module>   s     	
.k