o
    Þ­jµ"  ã                   @  s¨   d dl m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mZm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)Úformat_form_paramÚguess_content_typeÚpeek_filelike_lengthÚprimitive_value_to_strÚto_bytesÚcontent_typeúbytes | NoneÚreturnc                 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)r   Úsection© r   úM/var/www/html/CropPilot/venv/lib/python3.10/site-packages/httpx/_multipart.pyÚ(get_multipart_boundary_from_content_type   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.
    ÚnameÚstrÚvalueú 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ÚtypeÚbytesÚintÚfloatr   r   r!   )Úselfr   r!   r   r   r   Ú__init__,   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   Újoinr-   )r+   r   r   r   r   Úrender_headers;   s   
ÿzDataField.render_headersc                 C  s   t | dƒst| jƒ| _| jS )NÚ_data)r1   r   r!   r4   ©r+   r   r   r   Úrender_dataD   s   
zDataField.render_datar)   c                 C  s    |   ¡ }|  ¡ }t|ƒt|ƒ S ©N)r3   r6   r   )r+   ÚheadersÚdatar   r   r   Ú
get_lengthJ   s   zDataField.get_lengthútyping.Iterator[bytes]c                 c  s   � |   ¡ V  |  ¡ V  d S r7   ©r3   r6   r5   r   r   r   ÚrenderO   s   €
zDataField.renderN)r   r    r!   r"   r   r#   ©r   r(   )r   r)   ©r   r;   )	Ú__name__Ú
__module__Ú__qualname__Ú__doc__r,   r3   r6   r:   r=   r   r   r   r   r   '   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)r   )Ú.0Úkeyr   r   r   Ú	<genexpr>x   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%   Útupler   r   r    Úgetattrr   ÚanyÚioÚStringIOr&   Ú
TextIOBaseÚfilenameÚfiler8   )r+   r   r!   r8   r   rR   ÚfileobjÚhas_content_type_headerr   r   r   r,   [   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 r7   )r3   r%   rS   r    r(   r   r   r   )r+   r8   Úfile_lengthr   r   r   r:   Œ   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 )
Nr-   r/   r   rR   s   ; z
r$   r0   r.   )r1   r   r   rR   Úextendr8   ÚitemsÚencodeÚappendr2   r-   )r+   ÚpartsrR   Úheader_nameÚheader_valuerI   Úvalr   r   r   r3   ›   s   

þ
zFileField.render_headersr;   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%   rS   r    r(   r   r1   r`   rO   ÚUnsupportedOperationÚreadÚ
CHUNK_SIZE©r+   Úchunkr   r   r   r6   ¬   s   €ÿ
þzFileField.render_datac                 c  s   � |   ¡ V  |  ¡ E d H  d S r7   r<   r5   r   r   r   r=   ¼   s   €
zFileField.renderN)r   r    r!   r   r   r#   ©r   rV   r>   r?   )
r@   rA   rB   rC   rc   r,   r:   r3   r6   r=   r   r   r   r   rD   T   s    

1

rD   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.
    Nr9   r   Úfilesr	   Úboundaryr   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ÚhexrZ   ri   Údecoder   ÚlistÚ_iter_fieldsÚfields)r+   r9   rh   ri   r   r   r   r,   Æ   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!   )rY   r%   rL   rp   r   ÚtypingÚMappingrD   )r+   r9   rh   r   r!   ÚitemÚ
file_itemsr   r   r   rq   Õ   s   €ÿÿzMultipartStream._iter_fieldsr;   c                 c  s>   � | j D ]}d| j V  | ¡ E d H  dV  qd| j V  d S )Ns   --%s
s   
s   --%s--
)rr   ri   r=   )r+   Úfieldr   r   r   Úiter_chunksã   s   €
zMultipartStream.iter_chunksrV   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   NrE   é   )r   ri   rr   r:   )r+   Úboundary_lengthÚlengthrx   Ú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-EncodingrK   )zContent-LengthrK   )r~   r   r    )r+   Úcontent_lengthr   r   r   r   Úget_headers   s
   
zMultipartStream.get_headersc                 c  s   � |   ¡ D ]}|V  qd S r7   ©ry   rd   r   r   r   Ú__iter__  ó   €ÿzMultipartStream.__iter__útyping.AsyncIterator[bytes]c                 C s   �|   ¡ D ]}|V  qd S r7   rƒ   rd   r   r   r   Ú	__aiter__  r…   zMultipartStream.__aiter__r7   )r9   r   rh   r	   ri   r   r   r#   )r9   r   rh   r	   r   rs   r?   rf   )r   r   )r   r†   )r@   rA   rB   rC   r,   rq   ry   r~   r‚   r„   r‡   r   r   r   r   rg   Á   s    ü




rg   )r   r   r   r   )Ú
__future__r   rO   rl   rt   Úpathlibr   Ú_typesr   r   r   r   r	   r
   Ú_utilsr   r   r   r   r   r   r   rD   rg   r   r   r   r   Ú<module>   s     
	-m