Format: application/x-python-code
⬇ Download File (8.8 KB)
   1  o
   2  
   3  C'hs&�@sddlmZddlZddlZddlZddlZddlZddlmZddl	m
   4  Z
   5  mZmZm
   6  Z
   7  mZmZddlmZmZmZddd	�Ze�d
   8  d�ed�D��e�d
   9  �dd�e��D���Zd%dd�Zd&dd�Zd'dd�ZGdd �d �ZGd!d"�d"�ZGd#d$�d$ee
  10  �Z dS)(�)�annotationsN)�Path�)�AsyncByteStream�FileContent�	FileTypes�RequestData�RequestFiles�SyncByteStream)�peek_filelike_length�primitive_value_to_str�to_bytesz%22z\\)�"�\cCs$i|]}|dkrt|�d�|��qS)�z%{:02X})�chr�format��.0�c�r�FC:\Users\shubh\Videos\agent\nova\Lib\site-packages\httpx/_multipart.py�
  11  <dictcomp>s$r� �|cCsg|]}t�|��qSr)�re�escaperrrr�
  12  <listcomp>sr�name�str�value�return�bytescCs*d
  13  dd�}t�||�}|�d|�d���S)z;
  14      Encode a name/value pair within a multipart form.
  15      �match�typing.Match[str]r!rcSst|�d�S)Nr)�!_HTML5_FORM_ENCODING_REPLACEMENTS�group)r#rrr�replacer&sz$_format_form_param.<locals>.replacerz="rN)r#r$r!r)�_HTML5_FORM_ENCODING_RE�sub�encode)rr r'rrr�_format_form_param!s
  16  r+�filename�
  17  str | NonecCs|rt�|�dp
  18  dSdS)z�
  19      Guesses the mimetype based on a filename. Defaults to `application/octet-stream`.
  20  
  21      Returns `None` if `filename` is `None` or empty.
  22      rzapplication/octet-streamN)�	mimetypes�
  23  guess_type)r,rrr�_guess_content_type-sr0�content_type�bytes | NonecCs^|r|�d�s	dSd|vr-|�d�D]}|�����d�r,|��td�d��d�SqdS)Nsmultipart/form-data�;s	boundary=�")�
  24  startswith�split�strip�lower�len)r1�sectionrrr�(get_multipart_boundary_from_content_type8s�r;c@sBeZdZdZddd	�Zddd�Zdd
  25  d�Zddd�Zddd�ZdS)�	DataFieldzB
  26      A single form field item, within a multipart form field.
  27      rrr � str | bytes | int | float | Noner!�NonecCs|t|t�stdt|��d|����|dur*t|ttttf�s*tdt|��d|����||_t|t�r7||_	dSt|�|_	dS)Nz)Invalid type for name. Expected str, got �: z5Invalid type for value. Expected primitive type, got )
  28  �
  29  isinstancer�	TypeError�typer"�int�floatrrr )�selfrr rrr�__init__Ks"
  30  ������zDataField.__init__r"cCs.t|d�std|j�}d�d|dg�|_|jS)N�_headersr�� Content-Disposition: form-data; �
  31  
  32  )�hasattrr+r�joinrG)rErrrr�render_headersZs
  33  �zDataField.render_headerscCst|d�st|j�|_|jS)N�_data)rKr
  34  r rN�rErrr�render_datacs
  35  zDataField.render_datarCcCs |��}|��}t|�t|�S�N)rMrPr9)rE�headers�datarrr�
  36  get_lengthiszDataField.get_length�typing.Iterator[bytes]ccs�|��V|��VdSrQ�rMrPrOrrr�renderns�
  37  zDataField.renderN)rrr r=r!r>�r!r")r!rC�r!rU)	�__name__�
  38  __module__�__qualname__�__doc__rFrMrPrTrWrrrrr<Fs
  39  
  40  
  41  	
  42  r<c@sFeZdZdZdZdd	d
  43  �Zddd
  44  �Zddd�Zddd�Zddd�Z	dS)�	FileFieldzB
  45      A single file field item, within a multipart form field.
  46      irrr rr!r>cCs�||_i}d}t|t�r*t|�dkr|\}}n t|�dkr#|\}}}n|\}}}}n
  47  ttt|dd���j}|}|dur?t|�}tdd�|D��}|durR|sR||d<t|t	j
  48  �r\td��t|t	j�rftd	��||_
  49  ||_||_dS)
  50  N��rZuploadcss�|]	}d|��vVqdS)zcontent-typeN)r8)r�keyrrr�	<genexpr>�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.)rr@�tupler9rr�getattrr0�any�io�StringIOrA�
  51  TextIOBaser,�filerR)rErr rRr1r,�fileobjZhas_content_type_headerrrrrFzs6
  52  
  53  ��
  54  zFileField.__init__�
  55  int | NonecCsP|��}t|jttf�rt|�tt|j��St|j�}|dur"dSt|�|SrQ)rMr@rjrr"r9r
  56  r)rErRZfile_lengthrrrrT�s
  57  zFileField.get_lengthr"cCs�t|d�sFdtd|j�g}|jrtd|j�}|�d|g�|j��D]\}}d|�d���|��}}|�||g�q"|�d�d	�	|�|_
  58  |j
  59  S)
  60  NrGrIrr,s; z
  61  r?rJrH)rKr+rr,�extendrR�itemsr*�appendrLrG)rE�partsr,�header_name�header_valuera�valrrrrM�s
  62  
  63  �
  64  zFileField.render_headersrUccs��t|jttf�rt|j�VdSt|jd�r*z|j�d�Wn
  65  tjy)Ynw|j�	|j
  66  �}|rCt|�V|j�	|j
  67  �}|s3dSdS)N�seekr)r@rjrr"r
  68  rKrtrg�UnsupportedOperation�read�
  69  CHUNK_SIZE�rE�chunkrrrrP�s��
  70  �zFileField.render_dataccs�|��V|��EdHdSrQrVrOrrrrW�s�
  71  zFileField.renderN)rrr rr!r>�r!rlrXrY)
  72  rZr[r\r]rwrFrTrMrPrWrrrrr^ss
  73  
  74  1
  75  
  76  r^c@sZeZdZdZ	dddd�Zd dd�Zd!dd�Zd"dd�Zd#dd�Zd!dd�Z	d$dd�Z
  77  dS)%�MultipartStreamzC
  78      Request content as streaming multipart encoded form data.
  79      NrSr�filesr	�boundaryr2r!r>cCsH|durt�d����d�}||_d|�d�|_t|�||��|_	dS)N��asciiz multipart/form-data; boundary=%s)
  80  �os�urandom�hexr*r}�decoder1�list�_iter_fields�fields)rErSr|r}rrrrF�s�zMultipartStream.__init__�&typing.Iterator[FileField | DataField]ccs��|��D]\}}t|ttf�r|D]	}t||d�Vqqt||d�Vqt|tj�r/|��n|}|D]\}}t||d�Vq3dS)N)rr )rnr@rdr�r<�typing�Mappingr^)rErSr|rr �itemZ
  81  file_itemsrrrr��s���zMultipartStream._iter_fieldsrUccs>�|jD]}d|jV|��EdHdVqd|jVdS)Ns--%s
  82  s
  83  s--%s--
  84  )r�r}rW)rE�fieldrrr�iter_chunkss�
  85  zMultipartStream.iter_chunksrlcCsdt|j�}d}|jD]}|��}|durdS|d|d7}||7}|d7}q
  86  |d|d7}|S)z�
  87          Return the length of the multipart encoded content, or `None` if
  88          any of the files have a length that cannot be determined upfront.
  89          rNr_�)r9r}r�rT)rEZboundary_length�lengthr�Zfield_lengthrrr�get_content_length	s
  90  
  91  
  92  z"MultipartStream.get_content_length�dict[str, str]cCs.|��}|j}|durd|d�St|�|d�S)N�chunked)zTransfer-Encodingrc)zContent-Lengthrc)r�r1r)rE�content_lengthr1rrr�get_headerss
  93  
  94  zMultipartStream.get_headersccs�|��D]}|VqdSrQ�r�rxrrr�__iter__&���zMultipartStream.__iter__�typing.AsyncIterator[bytes]cCs�|��D]}|VqdSrQr�rxrrr�	__aiter__*r�zMultipartStream.__aiter__rQ)rSrr|r	r}r2r!r>)rSrr|r	r!r�rYrz)r!r�)r!r�)rZr[r\r]rFr�r�r�r�r�r�rrrrr{�s�
  95  
  96  
  97  
  98  
  99  r{)rrr rr!r")r,r-r!r-)r1r2r!r2)!�
 100  __future__rrgr.r�rr��pathlibr�_typesrrrrr	r
 101  �_utilsrrr
 102  r%�update�range�compilerL�keysr(r+r0r;r<r^r{rrrr�<module>s, 
 103  ��
 104  
 105  
 106  -m