
    tc#                         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 dej        e         dej        e         fdZ G d	 d
          Z G d d          Z G 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                 ^   | r|                      d          sd S d| v r|                     d          D ]y}|                                                                                     d          r>|                                t	          d          d                              d          c S zd S )Ns   multipart/form-data   ;s	   boundary=   ")
startswithsplitstriplowerlen)r   sections     2/usr/lib/python3/dist-packages/httpx/_multipart.py(get_multipart_boundary_from_content_typer      s      |667MNN t |#))$// 	H 	HG}}$$&&11,?? H}}s<'8'8':':;AA$GGGGGH4    c            	           e Zd ZdZdedej        eeee	df         ddfdZ
defdZdefdZdefd	Zdej        e         fd
ZdS )	DataFieldzB
    A single form field item, within a multipart form field.
    namevalueNr   c                 p   t          |t                    s"t          dt          |           d|          |Jt          |t          t          t
          t          f          s"t          dt          |           d|          || _        t          |t                    r|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!   s      r   __init__zDataField.__init__+   s     $$$ 	RDJJRR$RR   ZUC7O%P%P`U``W\``   	u--PEE3I%3P3P 	


r   c                     t          | d          s2t          d| j                  }d                    d|dg          | _        | j        S )N_headersr    r       Content-Disposition: form-data;    

)hasattrr   r    joinr.   )r+   r    s     r   render_headerszDataField.render_headers;   sN    tZ(( 	$VTY77DHH4dKH DM }r   c                 b    t          | d          st          | j                  | _        | j        S )N_data)r1   r   r!   r5   r+   s    r   render_datazDataField.render_dataD   s-    tW%% 	.!$*--DJzr   c                     |                                  }|                                 }t          |          t          |          z   S N)r3   r7   r   )r+   headersdatas      r   
get_lengthzDataField.get_lengthJ   s;    %%''!!7||c$ii''r   c              #   b   K   |                                  V  |                                 V  d S r9   r3   r7   r6   s    r   renderzDataField.renderO   s<      !!#####       r   )__name__
__module____qualname____doc__r%   typingUnionr(   r)   r*   r,   r3   r7   r<   Iteratorr?    r   r   r   r   &   s         

 &S%eT-I J
	
 
 
 
     U    (C ( ( ( (
!. ! ! ! ! ! !r   r   c                       e Zd ZdZdZdededdfdZdej	        e
         fdZdefd	Zdej        e         fd
Zdej        e         fdZdS )	FileFieldzB
    A single file field item, within a multipart form field.
    i   r    r!   r   Nc           	      F   || _         i }d }t          |t                    r;t          |          dk    r|\  }}nTt          |          dk    r|\  }}}n:|\  }}}}n2t	          t          t          |dd                              j         }|}|t          |          }t          d |D                       }||s||d<   dt          |dd          vrt          d	          t          |t          j                  rt          d
          || _        || _        || _        d S )N      r    uploadc              3   B   K   | ]}d |                                 v V  dS )zcontent-typeN)r   ).0keys     r   	<genexpr>z%FileField.__init__.<locals>.<genexpr>v   s/      %W%Wn		&C%W%W%W%W%W%Wr   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filer:   )r+   r    r!   r:   r   rZ   fileobjhas_content_type_headers           r   r,   zFileField.__init__[   sW   	 *,-1
 eU## 	5zzQ$)!''Uq27/'<< <A8'<Cvx @ @AABBGHG-h77L"%%W%Ww%W%W%W"W"W#,C# '3GN#ggvs3333V   gr{++ 	Q   !	r   c                 "   |                                  }t          | j        t          t          f          r1t          |          t          t          | j                            z   S t          | j                  }|d S t          |          |z   S r9   )r3   r$   r[   r%   r(   r   r   r   )r+   r:   file_lengths      r   r<   zFileField.get_length   s{    %%''di#u.. 	;w<<#hty&9&9":":::*4955 47||k))r   c                    t          | d          sdt          d| j                  g}| j        r,t          d| j                  }|                    d|g           | j                                        D ]H\  }}d| d                                |                                }}|                    ||g           I|                    d           d		                    |          | _
        | j
        S )
Nr.   r/   r    rZ   s   ; z
r#   r0   r   )r1   r   r    rZ   extendr:   itemsencodeappendr2   r.   )r+   partsrZ   header_nameheader_valuerP   vals          r   r3   zFileField.render_headers   s    tZ(( 	,3!&$)44E } 0,ZGGeX.///-1\-?-?-A-A ) ))\1+11188::L<O<O<Q<QSc3Z((((LL%%%HHUOODM}r   c              #     K   t          | j        t          t          f          rt	          | j                  V  d S t          | j        d          r1	 | j                            d           n# t          j        $ r Y nw xY w| j        	                    | j
                  }|r4t	          |          V  | j        	                    | j
                  }|2d S d S )Nseekr   )r$   r[   r%   r(   r   r1   rj   rX   UnsupportedOperationread
CHUNK_SIZEr+   chunks     r   r7   zFileField.render_data   s      di#u.. 	49%%%%%F49f%% 		q!!!!*    	t// 	45//!!!INN4?33E  	4 	4 	4 	4 	4s   A- -A?>A?c              #   j   K   |                                  V  |                                 E d {V  d S r9   r>   r6   s    r   r?   zFileField.render   sH      !!#######%%%%%%%%%%%r   )r@   rA   rB   rC   rm   r%   r   r,   rD   Optionalr)   r<   r(   r3   rF   r7   r?   rG   r   r   rI   rI   T   s          J-S - -t - - - -^*FOC0 * * * *    "4V_U3 4 4 4 4 &. & & & & & &r   rI   c            	       6   e Zd ZdZ	 ddededej        e         ddfdZ	dededej
        ej        eef                  fdZdej
        e         fd	Zdej        e         fd
Zdej        eef         fdZdej
        e         fdZdej        e         fdZdS )MultipartStreamzC
    Request content as streaming multipart encoded form data.
    Nr;   filesboundaryr   c                     |&t          j        t          j        d                    }|| _        d|                    d          z  | _        t          |                     ||                    | _	        d S )N   z multipart/form-data; boundary=%sascii)
binasciihexlifyosurandomru   decoder   list_iter_fieldsfields)r+   r;   rt   ru   s       r   r,   zMultipartStream.__init__   sp     '
277H >B
 B
 
 4,,T599::r   c              #   d  K   |                                 D ]M\  }}t          |t          t          f          r|D ]}t	          ||          V  :t	          ||          V  Nt          |t
          j                  r|                                 n|}|D ]\  }}t          ||          V  d S )N)r    r!   )rb   r$   rU   r~   r   rD   MappingrI   )r+   r;   rt   r    r!   item
file_itemss          r   r   zMultipartStream._iter_fields   s        ::<< 	8 	8KD%%%// 8! ; ;D#T:::::::;  T7777777&0&G&GRU[[]]]U
% 	4 	4KD%U3333333	4 	4r   c              #      K   | j         D ],}d| j        z  V  |                                E d {V  dV  -d| j        z  V  d S )Ns   --%s
s   
s   --%s--
)r   ru   r?   )r+   fields     r   iter_chunkszMultipartStream.iter_chunks   sn      [ 	 	E----||~~%%%%%%%MMMMdm++++++r   c                     t          | j                  }d}| j        D ]0}|                                }| dS |d|z   dz   z  }||z  }|dz  }1|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   NrK      )r   ru   r   r<   )r+   boundary_lengthlengthr   field_lengths        r   get_content_lengthz"MultipartStream.get_content_length   s    
 dm,,[ 	 	E ++--L#tta/)A--Fl"FaKFF!o%))r   c                 j    |                                  }| j        }|d|dS t          |          |dS )Nchunked)zTransfer-EncodingrR   )zContent-LengthrR   )r   r   r%   )r+   content_lengthr   s      r   get_headerszMultipartStream.get_headers   sE    0022(!)2LQQQ"%n"5"5|TTTr   c              #   @   K   |                                  D ]}|V  d S r9   r   rn   s     r   __iter__zMultipartStream.__iter__  s6      %%'' 	 	EKKKK	 	r   c                B   K   |                                  D ]}|W V  d S r9   r   rn   s     r   	__aiter__zMultipartStream.__aiter__	  s8      %%'' 	 	EKKKKK	 	r   r9   )r@   rA   rB   rC   r   r	   rD   rq   r(   r,   rF   rE   rI   r   r   r   r)   r   Dictr%   r   r   AsyncIteratorr   rG   r   r   rs   rs      s\         ,0	; ;; ; /%(	;
 
; ; ; ;44(44	i&:;	<4 4 4 4,V_U3 , , , ,FOC$8    ,UV[c2 U U U U&/%0    !5e!<      r   rs   )ry   rX   r{   rD   pathlibr   _typesr   r   r   r   r	   r
   _utilsr   r   r   r   r   rq   r(   r   r   rI   rs   rG   r   r   <module>r      s    				 				                                   /%(_U   +! +! +! +! +! +! +! +!\h& h& h& h& h& h& h& h&VL L L L Lno L L L L Lr   