
    hs&                       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                    d
  ed          D                         ej        d                    d e                                D                                 Zd dZd!dZd"dZ G d d          Z G d d          Z G d dee
          Z dS )#    )annotationsN)Path   )AsyncByteStreamFileContent	FileTypesRequestDataRequestFilesSyncByteStream)peek_filelike_lengthprimitive_value_to_strto_bytesz%22z\\)"\c                `    i | ]+}|d k    t          |          d                    |          ,S )   z%{:02X})chrformat.0cs     R/var/www/html/prod/cognitive/venv/lib/python3.11/site-packages/httpx/_multipart.py
<dictcomp>r      s3    GGGQQ$YYSVVYa  YYY        |c                6    g | ]}t          j        |          S  )reescaper   s     r   
<listcomp>r!      s     NNNry||NNNr   namestrvaluereturnbytesc                t    dd}t                               ||          }|  d| d                                S )	z;
    Encode a name/value pair within a multipart form.
    matchtyping.Match[str]r%   r#   c                B    t           |                     d                   S )Nr   )!_HTML5_FORM_ENCODING_REPLACEMENTSgroup)r(   s    r   replacerz$_format_form_param.<locals>.replacer&   s    0Q@@r   z="r   )r(   r)   r%   r#   )_HTML5_FORM_ENCODING_REsubencode)r"   r$   r-   s      r   _format_form_paramr1   !   sT    
A A A A $''%88Ee%%'''r   filename
str | Nonec                B    | rt          j        |           d         pdS dS )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)r2   s    r   _guess_content_typer7   -   s.      O#H--a0N4NN4r   content_typebytes | Nonec                ^   | 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)r8   sections     r   (get_multipart_boundary_from_content_typerC   8   s      |667MNN t |#))$// 	H 	HG}}$$&&11,?? H}}s<'8'8':':;AA$GGGGGH4r   c                  :    e Zd ZdZddZdd
ZddZddZddZdS )	DataFieldzB
    A single form field item, within a multipart form field.
    r"   r#   r$    str | bytes | int | float | Noner%   Nonec                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 )

isinstancer#   	TypeErrortyper&   intfloatr"   r   r$   )selfr"   r$   s      r   __init__zDataField.__init__K   s    $$$ 	RDJJRR$RR   ZUC7O%P%P1U1 1',1 1   	u--PEE3I%3P3P 	


r   r&   c                    t          | d          s2t          d| j                  }d                    d|dg          | _        | j        S )N_headersr"   r       Content-Disposition: form-data;    

)hasattrr1   r"   joinrR   )rO   r"   s     r   render_headerszDataField.render_headersZ   sN    tZ(( 	%fdi88DHH4dKH DM }r   c                b    t          | d          st          | j                  | _        | j        S )N_data)rU   r   r$   rY   rO   s    r   render_datazDataField.render_datac   s-    tW%% 	.!$*--DJzr   rM   c                    |                                  }|                                 }t          |          t          |          z   S N)rW   r[   rA   )rO   headersdatas      r   
get_lengthzDataField.get_lengthi   s;    %%''!!7||c$ii''r   typing.Iterator[bytes]c              #  b   K   |                                  V  |                                 V  d S r]   rW   r[   rZ   s    r   renderzDataField.rendern   s<      !!#####       r   N)r"   r#   r$   rF   r%   rG   r%   r&   )r%   rM   r%   ra   )	__name__
__module____qualname____doc__rP   rW   r[   r`   rd   r   r   r   rE   rE   F   s         
 
 
 
      ( ( ( (
! ! ! ! ! !r   rE   c                  >    e Zd ZdZdZdd	ZddZddZddZddZ	dS )	FileFieldzB
    A single file field item, within a multipart form field.
    i   r"   r#   r$   r   r%   rG   c           	     T   || _         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<   t          |t          j
                  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@   )r   keys     r   	<genexpr>z%FileField.__init__.<locals>.<genexpr>   s/      %W%Wn		&C%W%W%W%W%W%Wr   Content-Typez?Multipart file uploads require 'io.BytesIO', not 'io.StringIO'.zDMultipart file uploads must be opened in binary mode, not text mode.)r"   rJ   tuplerA   r   r#   getattrr7   anyioStringIOrK   
TextIOBaser2   filer^   )rO   r"   r$   r^   r8   r2   fileobjhas_content_type_headers           r   rP   zFileField.__init__z   sV   	 #%#' eU## 	5zzQ %*!''Uq27/'<< <A8'<Cvx @ @AABBGHG.x88L"%%W%Ww%W%W%W"W"W#,C# '3GN#gr{++ 	Q   gr}-- 	V   !	r   
int | Nonec                "   |                                  }t          | j        t          t          f          r1t          |          t          t          | j                            z   S t          | j                  }|d S t          |          |z   S r]   )rW   rJ   r{   r#   r&   rA   r   r   )rO   r^   file_lengths      r   r`   zFileField.get_length   s{    %%''di#u.. 	;w<<#hty&9&9":":::*4955 47||k))r   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 )
NrR   rS   r"   r2   s   ; z
rI   rT   r   )rU   r1   r"   r2   extendr^   itemsr0   appendrV   rR   )rO   partsr2   header_nameheader_valuerr   vals          r   rW   zFileField.render_headers   s    tZ(( 	,3"64955E } 0-j$-HHeX.///-1\-?-?-A-A ) ))\1+11188::L<O<O<Q<QSc3Z((((LL%%%HHUOODM}r   ra   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   )rJ   r{   r#   r&   r   rU   r   rx   UnsupportedOperationread
CHUNK_SIZErO   chunks     r   r[   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 r]   rc   rZ   s    r   rd   zFileField.render   sH      !!#######%%%%%%%%%%%r   N)r"   r#   r$   r   r%   rG   r%   r~   re   rf   )
rg   rh   ri   rj   r   rP   r`   rW   r[   rd   r   r   r   rl   rl   s   s          J/ / / /b* * * *   "4 4 4 4 & & & & & &r   rl   c                  N    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
dS )MultipartStreamzC
    Request content as streaming multipart encoded form data.
    Nr_   r	   filesr
   boundaryr9   r%   rG   c                   |9t          j        d                                                              d          }|| _        d|                    d          z  | _        t          |                     ||                    | _	        d S )N   asciiz multipart/form-data; boundary=%s)
osurandomhexr0   r   decoder8   list_iter_fieldsfields)rO   r_   r   r   s       r   rP   zMultipartStream.__init__   s     z"~~))++227;;H >B
 B
 
 4,,T599::r   &typing.Iterator[FileField | DataField]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$   )r   rJ   ru   r   rE   typingMappingrl   )rO   r_   r   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   ra   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   r   rd   )rO   fields     r   iter_chunkszMultipartStream.iter_chunks  sn      [ 	 	E----||~~%%%%%%%MMMMdm++++++r   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   Nrn      )rA   r   r   r`   )rO   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   dict[str, str]c                j    |                                  }| j        }|d|dS t          |          |dS )Nchunked)zTransfer-Encodingrt   )zContent-Lengthrt   )r   r8   r#   )rO   content_lengthr8   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 r]   r   r   s     r   __iter__zMultipartStream.__iter__&  s6      %%'' 	 	EKKKK	 	r   typing.AsyncIterator[bytes]c               B   K   |                                  D ]}|W V  d S r]   r   r   s     r   	__aiter__zMultipartStream.__aiter__*  s8      %%'' 	 	EKKKKK	 	r   r]   )r_   r	   r   r
   r   r9   r%   rG   )r_   r	   r   r
   r%   r   rf   r   )r%   r   )r%   r   )rg   rh   ri   rj   rP   r   r   r   r   r   r   r   r   r   r   r      s          "&	; ; ; ; ;4 4 4 4, , , ,   ,U U U U        r   r   )r"   r#   r$   r#   r%   r&   )r2   r3   r%   r3   )r8   r9   r%   r9   )!
__future__r   rx   r5   r   r   r   pathlibr   _typesr   r   r   r	   r
   r   _utilsr   r   r   r+   updaterangecompilerV   keysr.   r1   r7   rC   rE   rl   r   r   r   r   <module>r      s3   " " " " " " 				     				 				                                +0v$>$> ! ! ( (GG%%//GGG   %"*IINN%F%K%K%M%MNNNOO  
	( 	( 	( 	(      *! *! *! *! *! *! *! *!Zj& j& j& j& j& j& j& j&ZL L L L Lno L L L L Lr   