o
    í6Wjs&  ã                   @  s  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
d„ edƒD ƒ¡ e d dd„ e ¡ D ƒ¡¡Zd%dd„Zd&dd„Zd'dd„ZG dd „ d ƒZG d!d"„ d"ƒZG d#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                 C  s$   i | ]}|d krt |ƒd |¡“qS )é   z%{:02X})ÚchrÚformat©Ú.0Úc© r   ú_/home/esfera/Documents/content_generation/venv/lib/python3.10/site-packages/httpx/_multipart.pyÚ
<dictcomp>   s   $ r   é    ú|c                 C  s   g | ]}t  |¡‘qS r   )ÚreÚescaper   r   r   r   Ú
<listcomp>   s    r   ÚnameÚstrÚvalueÚreturnÚbytesc                 C  s*   d
dd„}t  ||¡}| › d|› d� ¡ S )z;
    Encode a name/value pair within a multipart form.
    Úmatchútyping.Match[str]r!   r   c                 S  s   t |  d¡ S )Nr   )Ú!_HTML5_FORM_ENCODING_REPLACEMENTSÚgroup)r#   r   r   r   Úreplacer&   s   z$_format_form_param.<locals>.replacerz="r   N)r#   r$   r!   r   )Ú_HTML5_FORM_ENCODING_REÚsubÚencode)r   r    r'   r   r   r   Ú_format_form_param!   s   
r+   Úfilenameú
str | Nonec                 C  s   | rt  | ¡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)r,   r   r   r   Ú_guess_content_type-   s   r0   Úcontent_typeúbytes | Nonec                 C  s^   | r|   d¡s	d S d| v r-|  d¡D ]}| ¡  ¡   d¡r,| ¡ tdƒd …  d¡  S qd S )Ns   multipart/form-dataó   ;s	   boundary=ó   ")Ú
startswithÚsplitÚstripÚlowerÚlen)r1   Úsectionr   r   r   Ú(get_multipart_boundary_from_content_type8   s   ÿr;   c                   @  sB   e Zd ZdZddd	„Zddd„Zddd„Zddd„Zd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                 C  s|   t |tƒstdt|ƒ› d|›�ƒ‚|d ur*t |ttttfƒs*tdt|ƒ› d|›�ƒ‚|| _t |tƒr7|| _	d S 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    r   r   r   Ú__init__K   s"   
ÿÿÿÿÿÿzDataField.__init__r"   c                 C  s.   t | dƒstd| jƒ}d d|dg¡| _| jS )NÚ_headersr   ó    ó    Content-Disposition: form-data; ó   

)Úhasattrr+   r   ÚjoinrG   )rE   r   r   r   r   Úrender_headersZ   s   
ÿzDataField.render_headersc                 C  s   t | dƒst| jƒ| _| jS )NÚ_data)rK   r   r    rN   ©rE   r   r   r   Úrender_datac   s   
zDataField.render_datarC   c                 C  s    |   ¡ }|  ¡ }t|ƒt|ƒ S ©N)rM   rP   r9   )rE   ÚheadersÚdatar   r   r   Ú
get_lengthi   s   zDataField.get_lengthútyping.Iterator[bytes]c                 c  s   � |   ¡ V  |  ¡ V  d S rQ   ©rM   rP   rO   r   r   r   Úrendern   s   €
zDataField.renderN)r   r   r    r=   r!   r>   ©r!   r"   )r!   rC   ©r!   rU   )	Ú__name__Ú
__module__Ú__qualname__Ú__doc__rF   rM   rP   rT   rW   r   r   r   r   r<   F   s    


	
r<   c                   @  sF   e Zd ZdZdZdd	d
„Zddd„Zddd„Zddd„Zddd„Z	dS )Ú	FileFieldzB
    A single file field item, within a multipart form field.
    i   r   r   r    r   r!   r>   c                 C  sâ   || _ i }d }t|tƒr*t|ƒdkr|\}}n t|ƒdkr#|\}}}n|\}}}}nttt|ddƒƒƒj }|}|d u r?t|ƒ}tdd„ |D ƒƒ}|d urR|sR||d< t|t	j
ƒr\tdƒ‚t|t	jƒrftd	ƒ‚|| _|| _|| _d S )
Né   é   r   Úuploadc                 s  s   � | ]	}d |  ¡ v V  qdS )zcontent-typeN)r8   )r   Úkeyr   r   r   Ú	<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.)r   r@   Útupler9   r   r   Úgetattrr0   ÚanyÚioÚStringIOrA   Ú
TextIOBaser,   ÚfilerR   )rE   r   r    rR   r1   r,   ÚfileobjÚhas_content_type_headerr   r   r   rF   z   s6   

ÿÿ
zFileField.__init__ú
int | Nonec                 C  sP   |   ¡ }t| jttfƒrt|ƒtt| jƒƒ S t| jƒ}|d u r"d S t|ƒ| S rQ   )rM   r@   rk   r   r"   r9   r   r   )rE   rR   Úfile_lengthr   r   r   rT   «   s   
zFileField.get_lengthr"   c                 C  s’   t | dƒsFdtd| jƒg}| jrtd| jƒ}| d|g¡ | j ¡ D ]\}}d|› d� ¡ | ¡ }}| ||g¡ q"| d¡ d	 	|¡| _
| j
S )
NrG   rI   r   r,   s   ; z
r?   rJ   rH   )rK   r+   r   r,   ÚextendrR   Úitemsr*   ÚappendrL   rG   )rE   Úpartsr,   Úheader_nameÚheader_valuerb   Úvalr   r   r   rM   º   s   

þ
zFileField.render_headersrU   c                 c  sŠ   � t | jttfƒrt| jƒV  d S t| jdƒr*z| j d¡ W n
 tjy)   Y nw | j 	| j
¡}|rCt|ƒV  | j 	| j
¡}|s3d S d S )NÚseekr   )r@   rk   r   r"   r   rK   rw   rh   ÚUnsupportedOperationÚreadÚ
CHUNK_SIZE©rE   Úchunkr   r   r   rP   Ë   s   €ÿ
þzFileField.render_datac                 c  s   � |   ¡ V  |  ¡ E d H  d S rQ   rV   rO   r   r   r   rW   Û   s   €
zFileField.renderN)r   r   r    r   r!   r>   ©r!   rn   rX   rY   )
rZ   r[   r\   r]   rz   rF   rT   rM   rP   rW   r   r   r   r   r^   s   s    

1

r^   c                   @  sZ   e Zd ZdZ	dddd„Zd dd„Zd!dd„Zd"dd„Zd#dd„Zd!dd„Z	d$dd„Z
dS )%ÚMultipartStreamzC
    Request content as streaming multipart encoded form data.
    NrS   r   Úfilesr	   Úboundaryr2   r!   r>   c                 C  sH   |d u rt  d¡ ¡  d¡}|| _d| d¡ | _t|  ||¡ƒ| _	d S )Né   Úasciiz multipart/form-data; boundary=%s)
ÚosÚurandomÚhexr*   r€   Údecoder1   ÚlistÚ_iter_fieldsÚfields)rE   rS   r   r€   r   r   r   rF   å   s   ÿzMultipartStream.__init__ú&typing.Iterator[FileField | DataField]c                 c  s‚   � |  ¡ D ]\}}t|ttfƒr|D ]	}t||d�V  qqt||d�V  qt|tjƒr/|  ¡ n|}|D ]\}}t||d�V  q3d S )N)r   r    )rq   r@   re   r‡   r<   ÚtypingÚMappingr^   )rE   rS   r   r   r    ÚitemÚ
file_itemsr   r   r   rˆ   ô   s   €ÿÿzMultipartStream._iter_fieldsrU   c                 c  s>   � | j D ]}d| j V  | ¡ E d H  dV  qd| j V  d S )Ns   --%s
s   
s   --%s--
)r‰   r€   rW   )rE   Úfieldr   r   r   Úiter_chunks  s   €
zMultipartStream.iter_chunksrn   c                 C  sd   t | jƒ}d}| jD ]}| ¡ }|du r dS |d| d 7 }||7 }|d7 }q
|d| d 7 }|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_   é   )r9   r€   r‰   rT   )rE   Úboundary_lengthÚlengthr�   Úfield_lengthr   r   r   Úget_content_length	  s   


z"MultipartStream.get_content_lengthúdict[str, str]c                 C  s.   |   ¡ }| j}|d u rd|dœS t|ƒ|dœS )NÚchunked)zTransfer-Encodingrd   )zContent-Lengthrd   )r•   r1   r   )rE   Úcontent_lengthr1   r   r   r   Úget_headers  s
   
zMultipartStream.get_headersc                 c  s   � |   ¡ D ]}|V  qd S rQ   ©r�   r{   r   r   r   Ú__iter__&  ó   €ÿzMultipartStream.__iter__útyping.AsyncIterator[bytes]c                 C s   �|   ¡ D ]}|V  qd S rQ   rš   r{   r   r   r   Ú	__aiter__*  rœ   zMultipartStream.__aiter__rQ   )rS   r   r   r	   r€   r2   r!   r>   )rS   r   r   r	   r!   rŠ   rY   r}   )r!   r–   )r!   r�   )rZ   r[   r\   r]   rF   rˆ   r�   r•   r™   r›   rž   r   r   r   r   r~   à   s    ü




r~   )r   r   r    r   r!   r"   )r,   r-   r!   r-   )r1   r2   r!   r2   )!Ú
__future__r   rh   r.   rƒ   r   r‹   Úpathlibr   Ú_typesr   r   r   r   r	   r
   Ú_utilsr   r   r   r%   ÚupdateÚrangeÚcompilerL   Úkeysr(   r+   r0   r;   r<   r^   r~   r   r   r   r   Ú<module>   s,     
ÿÿ


-m