U
    &%e(                     @   s   d dl Z d dlmZmZ d dlmZ d dlmZ d dlm	Z	 d dl
mZmZmZ zd dlZd dlmZ W n ek
r   dZdZY nX G dd	 d	eZeG d
d dZeeedddZG dd deZG dd dZG dd dZdS )    N)	dataclassfield)Enum)SpooledTemporaryFile)unquote_plus)FormDataHeaders
UploadFile)parse_options_headerc                   @   s    e Zd ZdZdZdZdZdZdS )FormMessage               N)__name__
__module____qualname__FIELD_START
FIELD_NAME
FIELD_DATA	FIELD_ENDEND r   r   T/var/www/html/Darija-Ai-API/env/lib/python3.8/site-packages/starlette/formparsers.pyr      s
   r   c                   @   sl   e Zd ZU dZeje ed< dZe	ed< dZ
eed< dZeje ed< eedZejejeef  ed	< dS )
MultipartPartNcontent_disposition 
field_name    datafile)default_factoryitem_headers)r   r   r   r   typingOptionalbytes__annotations__r   strr    r!   r	   r   listr#   ListTupler   r   r   r   r      s
   
r   )srccodecreturnc              	   C   s4   z|  |W S  ttfk
r.   |  d Y S X d S )Nlatin-1)decodeUnicodeDecodeErrorLookupError)r,   r-   r   r   r   _user_safe_decode"   s    r3   c                   @   s   e Zd ZeddddZdS )MultiPartExceptionN)messager.   c                 C   s
   || _ d S N)r5   selfr5   r   r   r   __init__*   s    zMultiPartException.__init__)r   r   r   r(   r9   r   r   r   r   r4   )   s   r4   c                   @   s   e Zd Zeejedf ddddZddddZee	e	ddd	d
Z
ee	e	ddddZddddZddddZedddZdS )
FormParserN)headersstreamr.   c                 C   s&   t d k	std|| _|| _g | _d S )NEThe `python-multipart` library must be installed to use form parsing.)	multipartAssertionErrorr;   r<   messages)r8   r;   r<   r   r   r   r9   /   s    zFormParser.__init__r.   c                 C   s   t jdf}| j| d S Nr   )r   r   r@   appendr7   r   r   r   on_field_start9   s    
zFormParser.on_field_startr    startendr.   c                 C   s"   t j||| f}| j| d S r6   )r   r   r@   rC   r8   r    rF   rG   r5   r   r   r   on_field_name=   s    zFormParser.on_field_namec                 C   s"   t j||| f}| j| d S r6   )r   r   r@   rC   rH   r   r   r   on_field_dataA   s    zFormParser.on_field_datac                 C   s   t jdf}| j| d S rB   )r   r   r@   rC   r7   r   r   r   on_field_endE   s    
zFormParser.on_field_endc                 C   s   t jdf}| j| d S rB   )r   r   r@   rC   r7   r   r   r   on_endI   s    
zFormParser.on_endc                    s   | j | j| j| j| jd}t|}d}d}g }| j2 z3 d H W }|rR|| n|	  t
| j}| j  |D ]x\}}	|tjkrd}d}qr|tjkr||	7 }qr|tjkr||	7 }qr|tjkrrt|d}
t|d}||
|f qrq66 t|S )N)rD   rI   rJ   rK   rL   r   r/   )rD   rI   rJ   rK   rL   r>   ZQuerystringParserr<   writefinalizer)   r@   clearr   r   r   r   r   r   r0   rC   r   )r8   	callbacksparserr   Zfield_valueitemschunkr@   Zmessage_typemessage_bytesnamevaluer   r   r   parseM   s:    	








zFormParser.parse)r   r   r   r   r$   AsyncGeneratorr&   r9   rD   intrI   rJ   rK   rL   r   rW   r   r   r   r   r:   .   s    
r:   c                   @   s   e Zd ZdZdddeejedf eje	e
f eje	e
f ddddZddd	d
Zee	e	ddddZddddZee	e	ddddZee	e	ddddZddddZddddZddddZedddZdS )MultiPartParseri   i  )	max_files
max_fieldsN)r;   r<   r[   r\   r.   c                C   sj   t d k	std|| _|| _|| _|| _g | _d| _d| _d| _	d| _
t | _d| _g | _g | _g | _d S )Nr=   r   r   r   )r>   r?   r;   r<   r[   r\   rR   _current_files_current_fields_current_partial_header_name_current_partial_header_valuer   _current_part_charset_file_parts_to_write_file_parts_to_finish_files_to_close_on_error)r8   r;   r<   r[   r\   r   r   r   r9   y   s$    	zMultiPartParser.__init__rA   c                 C   s   t  | _d S r6   )r   ra   r8   r   r   r   on_part_begin   s    zMultiPartParser.on_part_beginrE   c                 C   s@   ||| }| j jd kr*| j  j|7  _n| j| j |f d S r6   )ra   r!   r    rc   rC   )r8   r    rF   rG   rT   r   r   r   on_part_data   s    zMultiPartParser.on_part_datac                 C   sX   | j jd kr.| j| j jt| j j| jf n&| j| j  | j| j j| j jf d S r6   )	ra   r!   rR   rC   r   r3   r    rb   rd   rf   r   r   r   on_part_end   s    zMultiPartParser.on_part_endc                 C   s   |  j ||| 7  _ d S r6   )r_   r8   r    rF   rG   r   r   r   on_header_field   s    zMultiPartParser.on_header_fieldc                 C   s   |  j ||| 7  _ d S r6   )r`   rj   r   r   r   on_header_value   s    zMultiPartParser.on_header_valuec                 C   s@   | j  }|dkr| j| j_| jj|| jf d| _ d| _d S )Ns   content-dispositionr   )r_   lowerr`   ra   r   r#   rC   )r8   r   r   r   r   on_header_end   s    

zMultiPartParser.on_header_endc                 C   s   t | jj\}}zt|d | j| j_W n tk
rD   tdY nX d|kr|  jd7  _| j| j	krztd| j	 dt|d | j}t
| jd}| j| t|d|t| jjd	d
| j_n4|  jd7  _| j| jkrtd| j dd | j_d S )Ns   namez=The Content-Disposition header field "name" must be provided.s   filenamer   z+Too many files. Maximum number of files is .)max_sizer   )raw)r!   sizefilenamer;   z-Too many fields. Maximum number of fields is )r
   ra   r   r3   rb   r   KeyErrorr4   r]   r[   r   max_file_sizere   rC   r	   r   r#   r!   r^   r\   )r8   Zdispositionoptionsrs   tempfiler   r   r   on_headers_finished   sB     
z#MultiPartParser.on_headers_finishedc                 C   s   d S r6   r   rf   r   r   r   rL      s    zMultiPartParser.on_endc              
      st  t | jd \}}|dd}t|tkr4|d}|| _z|d }W n tk
rb   tdY nX | j	| j
| j| j| j| j| j| jd}t||}z| j2 z~3 d H W }|| | jD ]$\}}	|jst|j|	I d H  q| jD ] }|jst|jdI d H  q| j  | j  q6 W n> tk
r` }
 z| jD ]}|  q<|
W 5 d }
~
X Y nX |  t| jS )	NzContent-Types   charsetzutf-8r/   s   boundaryzMissing boundary in multipart.)rg   rh   ri   rk   rl   rn   rx   rL   r   ) r
   r;   gettyper&   r0   rb   rt   r4   rg   rh   ri   rk   rl   rn   rx   rL   r>   ZMultipartParserr<   rM   rc   r!   r?   rd   seekrO   re   closerN   r   rR   )r8   _paramscharsetboundaryrP   rQ   rS   partr    excr!   r   r   r   rW      sH    






zMultiPartParser.parse)r   r   r   ru   r   r$   rX   r&   UnionrY   floatr9   rg   rh   ri   rk   rl   rn   rx   rL   r   rW   r   r   r   r   rZ   v   s&   
#rZ   )r$   dataclassesr   r   enumr   rw   r   urllib.parser   Zstarlette.datastructuresr   r   r	   r>   Zmultipart.multipartr
   ModuleNotFoundErrorr   r   r&   r(   r3   	Exceptionr4   r:   rZ   r   r   r   r   <module>   s$   
H