o
    hs&                     @  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   d/var/www/html/construction_image-detection-poc/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