HEX
Server: Apache/2.4.52 (Ubuntu)
System: Linux spn-python 5.15.0-89-generic #99-Ubuntu SMP Mon Oct 30 20:42:41 UTC 2023 x86_64
User: arjun (1000)
PHP: 8.1.2-1ubuntu2.20
Disabled: NONE
Upload Files
File: //usr/local/lib/python3.10/dist-packages/httpx/__pycache__/_multipart.cpython-310.pyc
o

���gs&�@sddlmZddlZddlZddlZddlZddlZddlmZddl	m
Z
mZmZm
Z
mZmZddlmZmZmZddd	�Ze�d
d�ed�D��e�d
�dd�e��D���Zd%dd�Zd&dd�Zd'dd�ZGdd �d �ZGd!d"�d"�ZGd#d$�d$ee
�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�;/usr/local/lib/python3.10/dist-packages/httpx/_multipart.py�
<dictcomp>s$r� �|cCsg|]}t�|��qSr)�re�escaperrrr�
<listcomp>sr�name�str�value�return�bytescCs*d
dd�}t�||�}|�d|�d���S)z;
    Encode a name/value pair within a multipart form.
    �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
r+�filename�
str | NonecCs|rt�|�dp
dSdS)z�
    Guesses the mimetype based on a filename. Defaults to `application/octet-stream`.

    Returns `None` if `filename` is `None` or empty.
    rzapplication/octet-streamN)�	mimetypes�
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=�")�
startswith�split�strip�lower�len)r1�sectionrrr�(get_multipart_boundary_from_content_type8s�r;c@sBeZdZdZddd	�Zddd�Zdd
d�Zddd�Zddd�ZdS)�	DataFieldzB
    A single form field item, within a multipart form field.
    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 )
�
isinstancer�	TypeError�typer"�int�floatrrr )�selfrr rrr�__init__Ks"
������zDataField.__init__r"cCs.t|d�std|j�}d�d|dg�|_|jS)N�_headersr�� Content-Disposition: form-data; �

)�hasattrr+r�joinrG)rErrrr�render_headersZs
�zDataField.render_headerscCst|d�st|j�|_|jS)N�_data)rKr
r rN�rErrr�render_datacs
zDataField.render_datarCcCs |��}|��}t|�t|�S�N)rMrPr9)rE�headers�datarrr�
get_lengthiszDataField.get_length�typing.Iterator[bytes]ccs�|��V|��VdSrQ�rMrPrOrrr�renderns�
zDataField.renderN)rrr r=r!r>�r!r")r!rC�r!rU)	�__name__�
__module__�__qualname__�__doc__rFrMrPrTrWrrrrr<Fs


	
r<c@sFeZdZdZdZdd	d
�Zddd
�Zddd�Zddd�Zddd�Z	dS)�	FileFieldzB
    A single file field item, within a multipart form field.
    irrr rr!r>cCs�||_i}d}t|t�r*t|�dkr|\}}n t|�dkr#|\}}}n|\}}}}n
ttt|dd���j}|}|dur?t|�}tdd�|D��}|durR|sR||d<t|t	j
�r\td��t|t	j�rftd	��||_
||_||_dS)
N��r�uploadcss�|]	}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�
TextIOBaser,�filerR)rErr rRr1r,�fileobj�has_content_type_headerrrrrFzs6

��
zFileField.__init__�
int | NonecCsP|��}t|jttf�rt|�tt|j��St|j�}|dur"dSt|�|SrQ)rMr@rkrr"r9r
r)rErR�file_lengthrrrrT�s
zFileField.get_lengthr"cCs�t|d�sFdtd|j�g}|jrtd|j�}|�d|g�|j��D]\}}d|�d���|��}}|�||g�q"|�d�d	�	|�|_
|j
S)
NrGrIrr,s; z
r?rJrH)rKr+rr,�extendrR�itemsr*�appendrLrG)rE�partsr,�header_name�header_valuerb�valrrrrM�s

�
zFileField.render_headersrUccs��t|jttf�rt|j�VdSt|jd�r*z|j�d�Wn
tjy)Ynw|j�	|j
�}|rCt|�V|j�	|j
�}|s3dSdS)N�seekr)r@rkrr"r
rKrwrh�UnsupportedOperation�read�
CHUNK_SIZE�rE�chunkrrrrP�s��
�zFileField.render_dataccs�|��V|��EdHdSrQrVrOrrrrW�s�
zFileField.renderN)rrr rr!r>�r!rnrXrY)
rZr[r\r]rzrFrTrMrPrWrrrrr^ss

1

r^c@sZeZdZdZ	dddd�Zd dd�Zd!dd�Zd"dd�Zd#dd�Zd!dd�Z	d$dd�Z
dS)%�MultipartStreamzC
    Request content as streaming multipart encoded form data.
    NrSr�filesr	�boundaryr2r!r>cCsH|durt�d����d�}||_d|�d�|_t|�||��|_	dS)N��asciiz multipart/form-data; boundary=%s)
�os�urandom�hexr*r��decoder1�list�_iter_fields�fields)rErSrr�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 )rqr@rer�r<�typing�Mappingr^)rErSrrr �item�
file_itemsrrrr��s���zMultipartStream._iter_fieldsrUccs>�|jD]}d|jV|��EdHdVqd|jVdS)Ns--%s
s
s--%s--
)r�r�rW)rE�fieldrrr�iter_chunkss�
zMultipartStream.iter_chunksrncCsdt|j�}d}|jD]}|��}|durdS|d|d7}||7}|d7}q
|d|d7}|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.
        rNr_�)r9r�r�rT)rE�boundary_length�lengthr��field_lengthrrr�get_content_length	s


z"MultipartStream.get_content_length�dict[str, str]cCs.|��}|j}|durd|d�St|�|d�S)N�chunked)zTransfer-Encodingrd)zContent-Lengthrd)r�r1r)rE�content_lengthr1rrr�get_headerss

zMultipartStream.get_headersccs�|��D]}|VqdSrQ�r�r{rrr�__iter__&���zMultipartStream.__iter__�typing.AsyncIterator[bytes]cCs�|��D]}|VqdSrQr�r{rrr�	__aiter__*r�zMultipartStream.__aiter__rQ)rSrrr	r�r2r!r>)rSrrr	r!r�rYr})r!r�)r!r�)rZr[r\r]rFr�r�r�r�r�r�rrrrr~�s�




r~)rrr rr!r")r,r-r!r-)r1r2r!r2)!�
__future__rrhr.r�rr��pathlibr�_typesrrrrr	r
�_utilsrrr
r%�update�range�compilerL�keysr(r+r0r;r<r^r~rrrr�<module>s, 
��


-m