
    g"                        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Z G d d	      Z G d
 d      Z G d dee      Zy)    )annotationsN)Path   )AsyncByteStreamFileContent	FileTypesRequestDataRequestFilesSyncByteStream)format_form_paramguess_content_typepeek_filelike_lengthprimitive_value_to_strto_bytesc                   | r| j                  d      sy d| v rp| j                  d      D ]\  }|j                         j                         j                  d      s1|j                         t	        d      d  j                  d      c S  y )Ns   multipart/form-data   ;s	   boundary=   ")
startswithsplitstriplowerlen)content_typesections     E/var/www/openai/venv/lib/python3.12/site-packages/httpx/_multipart.py(get_multipart_boundary_from_content_typer      s}     |667MN |#))$/G}}$$&11,?}}s<'8':;AA$GG 0     c                  8    e Zd ZdZddZd	dZd	dZd
dZddZy)	DataFieldzB
    A single form field item, within a multipart form field.
    c                .   t        |t              st        dt        |       d|      |:t        |t        t        t
        t        f      st        dt        |       d|      || _        t        |t              r|| _	        y t        |      | _	        y )Nz)Invalid type for name. Expected str, got : z5Invalid type for value. Expected primitive type, got )

isinstancestr	TypeErrortypebytesintfloatnamer   value)selfr)   r*   s      r   __init__zDataField.__init__,   s    $$;DJ<r$R  ZUC7O%PU}Bui1  	u-E 	
3I%3P 	
r   c                    t        | d      s/t        d| j                        }dj                  d|dg      | _        | j                  S )N_headersr)   r       Content-Disposition: form-data;    

)hasattrr   r)   joinr.   )r+   r)   s     r   render_headerszDataField.render_headers;   sB    tZ($VTYY7DHH4dKHDM }}r   c                f    t        | d      st        | j                        | _        | j                  S )N_data)r1   r   r*   r5   r+   s    r   render_datazDataField.render_dataD   s&    tW%!$**-DJzzr   c                p    | j                         }| j                         }t        |      t        |      z   S N)r3   r7   r   )r+   headersdatas      r   
get_lengthzDataField.get_lengthJ   s1    %%'!7|c$i''r   c              #  T   K   | j                          | j                          y wr9   r3   r7   r6   s    r   renderzDataField.renderO   s$     !!##  s   &(N)r)   r#   r*   z str | bytes | int | float | NonereturnNoner@   r&   )r@   r'   r@   ztyping.Iterator[bytes])	__name__
__module____qualname____doc__r,   r3   r7   r<   r?    r   r   r   r   '   s     
(
!r   r   c                  <    e Zd ZdZdZd	dZd
dZddZddZddZ	y)	FileFieldzB
    A single file field item, within a multipart form field.
    i   c           	         || _         i }d }t        |t              r1t        |      dk(  r|\  }}nHt        |      dk(  r|\  }}}n3|\  }}}}n+t	        t        t        |dd                  j                   }|}|t        |      }t        d |D              }||s||d<   t        |t        j                        rt        d      t        |t        j                        rt        d      || _        || _        || _        y )	N      r)   uploadc              3  @   K   | ]  }d |j                         v   yw)zcontent-typeN)r   ).0keys     r   	<genexpr>z%FileField.__init__.<locals>.<genexpr>x   s     %Wwn		&Cw   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filer:   )r+   r)   r*   r:   r   r[   fileobjhas_content_type_headers           r   r,   zFileField.__init__[   s   	 #%#' eU#5zQ %*!'Uq27/'< <A8'<Cvx @ABGGHG-h7L"%%Ww%W"W#,C '3GN#gr{{+Q  gr}}-V  !	r   c                   | j                         }t        | j                  t        t        f      r*t        |      t        t        | j                              z   S t        | j                        }|y t        |      |z   S r9   )r3   r"   r\   r#   r&   r   r   r   )r+   r:   file_lengths      r   r<   zFileField.get_length   sg    %%'dii#u.w<#htyy&9":::*4995 7|k))r   c                   t        | d      sdt        d| j                        g}| j                  r)t        d| j                        }|j	                  d|g       | j
                  j                         D ]<  \  }}d| dj                         |j                         }}|j	                  ||g       > |j                  d       d	j                  |      | _
        | j                  S )
Nr.   r/   r)   r[   s   ; z
r!   r0   r   )r1   r   r)   r[   extendr:   itemsencodeappendr2   r.   )r+   partsr[   header_nameheader_valuerQ   vals          r   r3   zFileField.render_headers   s    tZ(3!&$))4E }},ZGeX./-1\\-?-?-A)\!+b188:L<O<O<QSc3Z( .B LL%HHUODM}}r   c              #    K   t        | j                  t        t        f      rt	        | j                         y t        | j                  d      r	 | j                  j                  d       | j                  j                  | j                        }|r6t	        |       | j                  j                  | j                        }|r5y y # t        j                  $ r Y sw xY ww)Nseekr   )r"   r\   r#   r&   r   r1   rk   rX   UnsupportedOperationread
CHUNK_SIZEr+   chunks     r   r7   zFileField.render_data   s     dii#u.499%%499f%		q! 		t/5/!IINN4??3E 	 ** s1   AC$C -AC$	C$C!C$ C!!C$c              #  d   K   | j                          | j                         E d {    y 7 wr9   r>   r6   s    r   r?   zFileField.render   s'     !!####%%%s   &0.0N)r)   r#   r*   r   r@   rA   r@   z
int | NonerB   rC   )
rD   rE   rF   rG   rn   r,   r<   r3   r7   r?   rH   r   r   rJ   rJ   T   s(     J/b*"4 &r   rJ   c                  f    e Zd ZdZ	 d
	 	 	 	 	 	 	 ddZ	 	 	 	 	 	 ddZddZddZddZddZ	dd	Z
y)MultipartStreamzC
    Request content as streaming multipart encoded form data.
    Nc                    |2t        j                  d      j                         j                  d      }|| _        d|j                  d      z  | _        t        | j                  ||            | _	        y )N   asciiz multipart/form-data; boundary=%s)
osurandomhexrd   boundarydecoder   list_iter_fieldsfields)r+   r;   filesr{   s       r   r,   zMultipartStream.__init__   si     zz"~))+227;H >B
 
 4,,T59:r   c              #  >  K   |j                         D ]A  \  }}t        |t        t        f      r|D ]  }t	        ||        3t	        ||       C t        |t
        j                        r|j                         n|}|D ]  \  }}t        ||        y w)N)r)   r*   )rc   r"   rU   r}   r   typingMappingrJ   )r+   r;   r   r)   r*   item
file_itemss          r   r~   zMultipartStream._iter_fields   s       ::<KD%%%/!D#T:: "  T77 ( '1&GU[[]U
%KD%U33 &s   BBc              #     K   | j                   D ]/  }d| j                  z   |j                         E d {    d 1 d| j                  z   y 7 w)Ns   --%s
s   
s   --%s--
)r   r{   r?   )r+   fields     r   iter_chunkszMultipartStream.iter_chunks   sM     [[E--||~%%M ! dmm++ &s   4AAAc                    t        | j                        }d}| j                  D ]+  }|j                         }| y|d|z   dz   z  }||z  }|dz  }- |d|z   dz   z  }|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   NrL      )r   r{   r   r<   )r+   boundary_lengthlengthr   field_lengths        r   get_content_lengthz"MultipartStream.get_content_length   s~    
 dmm,[[E ++-L#a/)A--Fl"FaKF ! 	!o%))r   c                d    | j                         }| j                  }|d|dS t        |      |dS )Nchunked)zTransfer-EncodingrT   )zContent-LengthrT   )r   r   r#   )r+   content_lengthr   s      r   get_headerszMultipartStream.get_headers   s<    002((!)2LQQ"%n"5|TTr   c              #  >   K   | j                         D ]  }|  y wr9   r   ro   s     r   __iter__zMultipartStream.__iter__  s     %%'EK (s   c               @   K   | j                         D ]  }| 	 y wr9   r   ro   s     r   	__aiter__zMultipartStream.__aiter__  s     %%'EK (rS   r9   )r;   r	   r   r
   r{   bytes | Noner@   rA   )r;   r	   r   r
   r@   z&typing.Iterator[FileField | DataField]rC   rr   )r@   zdict[str, str])r@   ztyping.AsyncIterator[bytes])rD   rE   rF   rG   r,   r~   r   r   r   r   r   rH   r   r   rt   rt      sn     "&	;; ; 	;
 
;44(44	/4,,Ur   rt   )r   r   r@   r   )
__future__r   rX   rx   r   pathlibr   _typesr   r   r   r	   r
   r   _utilsr   r   r   r   r   r   r   rJ   rt   rH   r   r   <module>r      se    " 	 	    *! *!Zj& j&ZLno Lr   