o
    "`^h"                     @  s   d dl m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 dd
dZG dd dZG dd dZG dd deeZdS )    )annotationsN)Path   )AsyncByteStreamFileContent	FileTypesRequestDataRequestFilesSyncByteStream)format_form_paramguess_content_typepeek_filelike_lengthprimitive_value_to_strto_bytescontent_typebytes | None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   N/home/air/shanriGPT/back/venv/lib/python3.10/site-packages/httpx/_multipart.py(get_multipart_boundary_from_content_type   s   r   c                   @  sB   e Zd ZdZddd	ZdddZdddZdddZdddZdS )	DataFieldzB
    A single form field item, within a multipart form field.
    namestrvalue str | bytes | int | float | Noner   Nonec                 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 )

isinstancer    	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)r1   r   r!   r4   r+   r   r   r   render_dataD   s   
zDataField.render_datar)   c                 C  s    |   }|  }t|t| S N)r3   r6   r   )r+   headersdatar   r   r   
get_lengthJ   s   zDataField.get_lengthtyping.Iterator[bytes]c                 c  s    |   V  |  V  d S r7   r3   r6   r5   r   r   r   renderO   s   
zDataField.renderN)r   r    r!   r"   r   r#   r   r(   )r   r)   r   r;   )	__name__
__module____qualname____doc__r,   r3   r6   r:   r=   r   r   r   r   r   '   s    


	
r   c                   @  sF   e Zd ZdZdZdd	d
ZdddZdddZdddZdddZ	dS )	FileFieldzB
    A single file field item, within a multipart form field.
    i   r   r    r!   r   r   r#   c                 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>x   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filer8   )r+   r   r!   r8   r   rR   fileobjhas_content_type_headerr   r   r   r,   [   s6   


zFileField.__init__
int | Nonec                 C  sP   |   }t| jttfrt|tt| j S t| j}|d u r"d S t|| S r7   )r3   r%   rS   r    r(   r   r   r   )r+   r8   file_lengthr   r   r   r:      s   
zFileField.get_lengthr(   c                 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   rR   s   ; z
r$   r0   r.   )r1   r   r   rR   extendr8   itemsencodeappendr2   r-   )r+   partsrR   header_nameheader_valuerI   valr   r   r   r3      s   


zFileField.render_headersr;   c                 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%   rS   r    r(   r   r1   r`   rO   UnsupportedOperationread
CHUNK_SIZEr+   chunkr   r   r   r6      s   
zFileField.render_datac                 c  s    |   V  |  E d H  d S r7   r<   r5   r   r   r   r=      s   
zFileField.renderN)r   r    r!   r   r   r#   r   rV   r>   r?   )
r@   rA   rB   rC   rc   r,   r:   r3   r6   r=   r   r   r   r   rD   T   s    

1

rD   c                   @  sZ   e Zd ZdZ	ddddZd ddZd!ddZd"ddZd#ddZd!ddZ	d$ddZ
dS )%MultipartStreamzC
    Request content as streaming multipart encoded form data.
    Nr9   r   filesr	   boundaryr   r   r#   c                 C  sH   |d u rt d d}|| _d|d | _t| ||| _	d S )N   asciiz multipart/form-data; boundary=%s)
osurandomhexrZ   ri   decoder   list_iter_fieldsfields)r+   r9   rh   ri   r   r   r   r,      s   zMultipartStream.__init__&typing.Iterator[FileField | DataField]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!   )rY   r%   rL   rp   r   typingMappingrD   )r+   r9   rh   r   r!   item
file_itemsr   r   r   rq      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--
)rr   ri   r=   )r+   fieldr   r   r   iter_chunks   s   
zMultipartStream.iter_chunksrV   c                 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   NrE      )r   ri   rr   r:   )r+   boundary_lengthlengthrx   field_lengthr   r   r   get_content_length   s   


z"MultipartStream.get_content_lengthdict[str, str]c                 C  s.   |   }| j}|d u rd|dS t||dS )Nchunked)zTransfer-EncodingrK   )zContent-LengthrK   )r~   r   r    )r+   content_lengthr   r   r   r   get_headers   s
   
zMultipartStream.get_headersc                 c  s    |   D ]}|V  qd S r7   ry   rd   r   r   r   __iter__     zMultipartStream.__iter__typing.AsyncIterator[bytes]c                 C s   |   D ]}|V  qd S r7   r   rd   r   r   r   	__aiter__  r   zMultipartStream.__aiter__r7   )r9   r   rh   r	   ri   r   r   r#   )r9   r   rh   r	   r   rs   r?   rf   )r   r   )r   r   )r@   rA   rB   rC   r,   rq   ry   r~   r   r   r   r   r   r   r   rg      s    




rg   )r   r   r   r   )
__future__r   rO   rl   rt   pathlibr   _typesr   r   r   r   r	   r
   _utilsr   r   r   r   r   r   r   rD   rg   r   r   r   r   <module>   s     
	-m