a
    c	gJ(                     @  s   d dl mZ 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y   dZdZY n0 G d	d
 d
eZeG dd dZddddddZG dd deZG dd dZG dd dZdS )    )annotationsN)	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   X/var/www/html/llm_bihealth/app/venv/lib/python3.9/site-packages/starlette/formparsers.pyr      s
   r   c                   @  sP   e Zd ZU dZded< dZded< dZded	< dZd
ed< ee	dZ
ded< dS )MultipartPartNzbytes | Nonecontent_disposition str
field_name    bytesdatazUploadFile | Nonefile)default_factoryzlist[tuple[bytes, bytes]]item_headers)r   r   r   r   __annotations__r    r#   r$   r   listr&   r   r   r   r   r      s
   
r   r"   r   )srccodecreturnc              	   C  s2   z|  |W S  ttfy,   |  d Y S 0 d S )Nlatin-1)decodeUnicodeDecodeErrorLookupError)r)   r*   r   r   r   _user_safe_decode$   s    r0   c                   @  s   e Zd ZdddddZdS )MultiPartExceptionr   None)messager+   c                 C  s
   || _ d S N)r3   selfr3   r   r   r   __init__,   s    zMultiPartException.__init__N)r   r   r   r7   r   r   r   r   r1   +   s   r1   c                   @  s~   e Zd ZddddddZdddd	Zd
ddddddZd
ddddddZddddZddddZddddZ	dS )
FormParserr	   "typing.AsyncGenerator[bytes, None]r2   )headersstreamr+   c                 C  s&   t d usJ d|| _|| _g | _d S )NEThe `python-multipart` library must be installed to use form parsing.)	multipartr:   r;   messages)r6   r:   r;   r   r   r   r7   1   s    zFormParser.__init__r+   c                 C  s   t jdf}| j| d S Nr!   )r   r   r>   appendr5   r   r   r   on_field_start;   s    
zFormParser.on_field_startr"   intr#   startendr+   c                 C  s"   t j||| f}| j| d S r4   )r   r   r>   rA   r6   r#   rE   rF   r3   r   r   r   on_field_name?   s    zFormParser.on_field_namec                 C  s"   t j||| f}| j| d S r4   )r   r   r>   rA   rG   r   r   r   on_field_dataC   s    zFormParser.on_field_datac                 C  s   t jdf}| j| d S r@   )r   r   r>   rA   r5   r   r   r   on_field_endG   s    
zFormParser.on_field_endc                 C  s   t jdf}| j| d S r@   )r   r   r>   rA   r5   r   r   r   on_endK   s    
zFormParser.on_endr   c                   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)rB   rH   rI   rJ   rK   r!   r,   )rB   rH   rI   rJ   rK   r=   ZQuerystringParserr;   writefinalizer(   r>   clearr   r   r   r   r   r   r-   rA   r   )r6   	callbacksparserr    Zfield_valueitemschunkr>   Zmessage_typemessage_bytesnamevaluer   r   r   parseO   s:    	








zFormParser.parseN)
r   r   r   r7   rB   rH   rI   rJ   rK   rV   r   r   r   r   r8   0   s   
r8   c                   @  s   e Zd ZdZdddddddddd	d
ZddddZdddddddZddddZdddddddZd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 )#MultiPartParseri   i  )	max_files
max_fieldsr	   r9   zint | floatr2   )r:   r;   rX   rY   r+   c                C  sj   t d usJ d|| _|| _|| _|| _g | _d| _d| _d| _d| _	t
 | _d| _g | _g | _g | _d S )Nr<   r   r!   r   )r=   r:   r;   rX   rY   rQ   _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)r6   r:   r;   rX   rY   r   r   r   r7   {   s$    	zMultiPartParser.__init__r?   c                 C  s   t  | _d S r4   )r   r^   r6   r   r   r   on_part_begin   s    zMultiPartParser.on_part_beginr"   rC   rD   c                 C  s@   ||| }| j jd u r*| j  j|7  _n| j| j |f d S r4   )r^   r$   r#   r`   rA   )r6   r#   rE   rF   rS   r   r   r   on_part_data   s    zMultiPartParser.on_part_datac                 C  sX   | j jd u r.| j| j jt| j j| jf n&| j| j  | j| j j| j jf d S r4   )	r^   r$   rQ   rA   r    r0   r#   r_   ra   rc   r   r   r   on_part_end   s    zMultiPartParser.on_part_endc                 C  s   |  j ||| 7  _ d S r4   )r\   r6   r#   rE   rF   r   r   r   on_header_field   s    zMultiPartParser.on_header_fieldc                 C  s   |  j ||| 7  _ d S r4   )r]   rg   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]   r^   r   r&   rA   )r6   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yB   tdY n0 d|v r|  jd7  _| j| j	krxt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   r^   r   r0   r_   r    KeyErrorr1   rZ   rX   r   max_file_sizerb   rA   r
   r	   r&   r$   r[   rY   )r6   dispositionoptionsrp   tempfiler   r   r   on_headers_finished   s@    

z#MultiPartParser.on_headers_finishedc                 C  s   d S r4   r   rc   r   r   r   rK      s    zMultiPartParser.on_endr   c              
     sr  t | jd \}}|dd}t|tr2|d}|| _z|d }W n ty^   tdY n0 | j	| j
| j| j| j| j| j| jd}t||}z| j2 z~3 d H W }|| | jD ]$\}}	|jsJ |j|	I d H  q| jD ] }|jsJ |jdI d H  q| j  | j  q6 W n@ ty^ }
 z&| jD ]}|  q6|
W Y d }
~
n
d }
~
0 0 |  t| jS )	NzContent-Types   charsetzutf-8r,   s   boundaryzMissing boundary in multipart.)rd   re   rf   rh   ri   rk   rv   rK   r   )r   r:   get
isinstancer"   r-   r_   rq   r1   rd   re   rf   rh   ri   rk   rv   rK   r=   ZMultipartParserr;   rL   r`   r$   ra   seekrN   rb   closerM   r   rQ   )r6   _paramscharsetboundaryrO   rP   rR   partr#   excr$   r   r   r   rV      sH    







zMultiPartParser.parseN)r   r   r   rr   r7   rd   re   rf   rh   ri   rk   rv   rK   rV   r   r   r   r   rW   x   s   
#rW   )
__future__r   typingZdataclassesr   r   enumr   ru   r   urllib.parser   Zstarlette.datastructuresr   r	   r
   r=   Zmultipart.multipartr   ModuleNotFoundErrorr   r   r0   	Exceptionr1   r8   rW   r   r   r   r   <module>   s&   
H