
    osj\%              
         d dl mZ d dlZ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 ddd	Zej+                   ed
      D  ci c]  } | dk7  s	 e|       d| d c}         ej0                  dj3                  ej5                         D  cg c]  }  ej6                  |        c}             ZddZddZ	 	 	 	 ddZ G d d      Z  G d d      Z! G d dee
      Z"yc c} w c c} w )    )annotationsN)Path   )AsyncByteStreamFileContent	FileTypesRequestDataRequestFilesSyncByteStream)peek_filelike_lengthprimitive_value_to_strto_bytesz%22z\\)"\       %02X|c                b    dd}t         j                  ||      }|  d| dj                         S )z;
    Encode a name/value pair within a multipart form.
    c                2    t         | j                  d         S )Nr   )!_HTML5_FORM_ENCODING_REPLACEMENTSgroup)matchs    D/root/.hermes/venv/lib/python3.12/site-packages/httpx2/_multipart.pyreplacerz$_format_form_param.<locals>.replacer"   s    0Q@@    z="r   )r   ztyping.Match[str]returnstr)_HTML5_FORM_ENCODING_REsubencode)namevaluer   s      r   _format_form_paramr%      s8    
A $''%8EV2eWA%%''r   c                @    | rt        j                  |       d   xs dS y)z
    Guesses the mimetype based on a filename. Defaults to `application/octet-stream`.

    Returns `None` if `filename` is `None` or empty.
    r   zapplication/octet-streamN)	mimetypes
guess_type)filenames    r   _guess_content_typer*   )   s&     ##H-a0N4NNr   c                   | 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     r   (get_multipart_boundary_from_content_typer5   4   s     |667MN |#))$/ 	HG}}$$&11,?}}s<'8':;AA$GG	H r   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 )

isinstancer   	TypeErrortypebytesintfloatr#   r   r$   )selfr#   r$   s      r   __init__zDataField.__init__G   s    $$GT
|SUVZU]^__ZUC7O%PSTXY^T_S``bchbklmm	+5eU+C%
I_`eIf
r   c                    t        | d      s/t        d| j                        }dj                  d|dg      | _        | j                  S )N_headersr#   r       Content-Disposition: form-data;    

)hasattrr%   r#   joinrC   )r@   r#   s     r   render_headerszDataField.render_headersO   s?    tZ(%fdii8DHH&I4Q\%]^DM}}r   c                f    t        | d      st        | j                        | _        | j                  S )N_data)rF   r   r$   rJ   r@   s    r   render_datazDataField.render_dataV   s&    tW%!$**-DJzzr   c                p    | j                         }| j                         }t        |      t        |      z   S N)rH   rL   r2   )r@   headersdatas      r   
get_lengthzDataField.get_length\   s1    %%'!7|c$i''r   c              #  T   K   | j                          | j                          y wrN   rH   rL   rK   s    r   renderzDataField.rendera   s$     !!##  s   &(N)r#   r   r$   z str | bytes | int | float | Noner   Noner   r=   )r   r>   r   ztyping.Iterator[bytes])	__name__
__module____qualname____doc__rA   rH   rL   rQ   rT    r   r   r7   r7   B   s!    g(
!r   r7   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)r1   ).0keys     r   	<genexpr>z%FileField.__init__.<locals>.<genexpr>   s     %Wn		&C%W   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:   tupler2   r   r   getattrr*   anyioStringIOr;   
TextIOBaser)   filerO   )r@   r#   r$   rO   r3   r)   fileobjhas_content_type_headers           r   rA   zFileField.__init__m   s   	 #%#' eU#5zQ %*!'Uq27/'< <A8'<Cvx @ABGGHG.x8L"%%Ww%W"W#,C '3GN#gr{{+]^^gr}}-bcc 	r   c                   | j                         }t        | j                  t        t        f      r*t        |      t        t        | j                              z   S t        | j                        }|y t        |      |z   S rN   )rH   r:   ro   r   r=   r2   r   r   )r@   rO   file_lengths      r   rQ   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 )
NrC   rD   r#   r)   s   ; z
r9   rE   r   )rF   r%   r#   r)   extendrO   itemsr"   appendrG   rC   )r@   partsr)   header_nameheader_valuere   vals          r   rH   zFileField.render_headers   s    tZ(3"64995E }}-j$--HeX./-1\\-?-?-A ))\!+b188:L<O<O<QSc3Z() 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:   ro   r   r=   r   rF   r}   rl   UnsupportedOperationread
CHUNK_SIZEr@   chunks     r   rL   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rN   rS   rK   s    r   rT   zFileField.render   s'     !!####%%%s   &0.0N)r#   r   r$   r   r   rU   r   z
int | NonerV   rW   )
rX   rY   rZ   r[   r   rA   rQ   rH   rL   rT   r\   r   r   r^   r^   f   s(     J+Z*"4 &r   r^   c                  Z    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       | _        t        | j                  ||            | _	        y )N   asciizmultipart/form-data; boundary=)
osurandomhexr"   boundarydecoder3   list_iter_fieldsfields)r@   rP   filesr   s       r   rA   zMultipartStream.__init__   sd     zz"~))+227;H <X__W=U<VW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$   )rv   r:   ri   r   r7   typingMappingr^   )r@   rP   r   r#   r$   item
file_itemss          r   r   zMultipartStream._iter_fields   s     ::< 	8KD%%%/! ;D#T::;  T77	8 '1&GU[[]U
% 	4KD%U33	4s   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   rT   )r@   fields     r   iter_chunkszMultipartStream.iter_chunks   sR     [[ 	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   Nr`      )r2   r   r   rQ   )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-Encodingrh   )zContent-Lengthrh   )r   r3   r   )r@   content_lengthr3   s      r   get_headerszMultipartStream.get_headers
  s<    002((!)2LQQ"%n"5|TTr   c              #  @   K   | j                         E d {    y 7 wrN   r   rK   s    r   __iter__zMultipartStream.__iter__  s     ##%%%s   c               @   K   | j                         D ]  }| 	 y wrN   r   r   s     r   	__aiter__zMultipartStream.__aiter__  s#     %%' 	EK	rg   rN   )rP   r	   r   r
   r   bytes | Noner   rU   )rP   r	   r   r
   r   z&typing.Iterator[FileField | DataField]rW   r   )r   zdict[str, str])r   ztyping.AsyncIterator[bytes])rX   rY   rZ   r[   rA   r   r   r   r   r   r   r\   r   r   r   r      sV     "&	;; ; 	;
 
;
4,,U&r   r   )r#   r   r$   r   r   r=   )r)   
str | Noner   r   )r3   r   r   r   )#
__future__r   rl   r'   r   rer   pathlibr   _typesr   r   r   r	   r
   r   _utilsr   r   r   r   updaterangechrcompilerG   keysescaper    r%   r*   r5   r7   r^   r   )cs   0r   <module>r      s    " 	  	 	     +0v$> ! ! ( (uX)d!Z[_cZc#a&AaW+*=)d e$"**TYYFgFlFlFn/o			!/o%pq 	(!! !!Hf& f&RGno Gm *e/os   
C4 C4C9