U
    {f"                     @  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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bytes | None)content_typereturnc                 C  s^   | r|  dsd S d| krZ| dD ]4}|   dr$| tdd  d  S q$d S )Ns   multipart/form-data   ;s	   boundary=   ")
startswithsplitstriplowerlen)r   section r   O/var/www/html/Darija-Ai-API/env/lib/python3.8/site-packages/httpx/_multipart.py(get_multipart_boundary_from_content_type   s     r   c                   @  sZ   e Zd ZdZddddddZdd	d
dZdd	ddZdd	ddZdd	ddZdS )	DataFieldzB
    A single form field item, within a multipart form field.
    strz str | bytes | int | float | NoneNonenamevaluer   c                 C  sv   t |ts"tdt| d||d k	rTt |ttttfsTtdt| d||| _t |trh|n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(   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)r2   r   r#   r5   r+   r   r   r   render_dataD   s    
zDataField.render_datar)   c                 C  s    |   }|  }t|t| S N)r4   r7   r   )r+   headersdatar   r   r   
get_lengthJ   s    zDataField.get_lengthtyping.Iterator[bytes]c                 c  s   |   V  |  V  d S r8   r4   r7   r6   r   r   r   renderO   s    
zDataField.renderN)	__name__
__module____qualname____doc__r,   r4   r7   r;   r>   r   r   r   r   r   '   s   	r   c                   @  s^   e Zd ZdZdZddddddZd	d
ddZdd
ddZdd
ddZdd
ddZ	dS )	FileFieldzB
    A single file field item, within a multipart form field.
    i   r   r   r    r!   c                 C  s   || _ i }d }t|trTt|dkr.|\}}qnt|dkrF|\}}}qn|\}}}}nttt|ddj }|}|d kr~t|}tdd |D }|d k	r|s||d< t|t	j
rtdt|t	jrtd	|| _|| _|| _d S )
N      r"   uploadc                 s  s   | ]}d |  k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filer9   )r+   r"   r#   r9   r   rQ   fileobjZhas_content_type_headerr   r   r   r,   [   s6    

zFileField.__init__
int | Noner-   c                 C  sP   |   }t| jttfr.t|tt| j S t| j}|d krDd S t|| S r8   )r4   r%   rR   r   r(   r   r   r   )r+   r9   Zfile_lengthr   r   r   r;      s    
zFileField.get_lengthr(   c                 C  s   t | dsdtd| jg}| jr:td| j}|d|g | j D ]0\}}d| d |  }}|||g qD|d d		|| _
| j
S )
Nr.   r0   r"   rQ   s   ; z
r$   r1   r/   )r2   r   r"   rQ   extendr9   itemsencodeappendr3   r.   )r+   partsrQ   header_nameheader_valuerH   valr   r   r   r4      s    


zFileField.render_headersr<   c                 c  s   t | jttfr t| jV  d S t| jdrTz| jd W n tjk
rR   Y nX | j	| j
}|rt|V  | j	| j
}qbd S )Nseekr   )r%   rR   r   r(   r   r2   r]   rN   UnsupportedOperationread
CHUNK_SIZEr+   chunkr   r   r   r7      s    
zFileField.render_datac                 c  s   |   V  |  E d H  d S r8   r=   r6   r   r   r   r>      s    
zFileField.renderN)
r?   r@   rA   rB   r`   r,   r;   r4   r7   r>   r   r   r   r   rC   T   s   1rC   c                   @  s~   e Zd ZdZdddddddd	Zddd
dddZddddZddddZddddZddddZ	ddddZ
dS )MultipartStreamzC
    Request content as streaming multipart encoded form data.
    Nr   r	   r   r    )r:   filesboundaryr   c                 C  sH   |d krt d d}|| _d|d | _t| ||| _	d S )N   asciiz multipart/form-data; boundary=%s)
osurandomhexrW   re   decoder   list_iter_fieldsfields)r+   r:   rd   re   r   r   r   r,      s    zMultipartStream.__init__z&typing.Iterator[FileField | DataField])r:   rd   r   c                 c  s   |  D ]>\}}t|ttfr8|D ]}t||dV  q"qt||dV  qt|tjr\|  n|}|D ]\}}t||dV  qdd S )N)r"   r#   )rV   r%   rK   rl   r   typingMappingrC   )r+   r:   rd   r"   r#   itemZ
file_itemsr   r   r   rm      s    zMultipartStream._iter_fieldsr<   r-   c                 c  s<   | j D ]$}d| j V  | E d H  dV  qd| j V  d S )Ns   --%s
s   
s   --%s--
)rn   re   r>   )r+   fieldr   r   r   iter_chunks   s
    
zMultipartStream.iter_chunksrT   c                 C  sd   t | j}d}| jD ]:}| }|dk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   NrD      )r   re   rn   r;   )r+   Zboundary_lengthlengthrr   Zfield_lengthr   r   r   get_content_length   s    


z"MultipartStream.get_content_lengthzdict[str, str]c                 C  s.   |   }| j}|d kr d|dS t||dS )Nchunked)zTransfer-EncodingrJ   )zContent-LengthrJ   )rv   r   r   )r+   content_lengthr   r   r   r   get_headers   s
    
zMultipartStream.get_headersc                 c  s   |   D ]
}|V  qd S r8   rs   ra   r   r   r   __iter__  s    zMultipartStream.__iter__ztyping.AsyncIterator[bytes]c                 C s   |   D ]
}|V  qd S r8   rz   ra   r   r   r   	__aiter__  s    zMultipartStream.__aiter__)N)r?   r@   rA   rB   r,   rm   rs   rv   ry   r{   r|   r   r   r   r   rc      s    rc   )
__future__r   rN   rh   ro   pathlibr   _typesr   r   r   r   r	   r
   _utilsr   r   r   r   r   r   r   rC   rc   r   r   r   r   <module>   s    	-m