a
    ^gk*                     @  sD  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 ejrd dlZd dlmZmZmZ n`zDzd dlZd d	lmZ W n& ey   d dlZd d	lmZ Y n0 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)MultipartCallbacksQuerystringCallbacksparse_options_header)r   c                   @  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   c/var/www/html/cobodadashboardai.evdpl.com/venv/lib/python3.9/site-packages/starlette/formparsers.pyr      s
   r   c                   @  sV   e Zd ZU dZded< dZded< ee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)default_factory	bytearraydatazUploadFile | Nonefilezlist[tuple[bytes, bytes]]item_headers)r   r   r   r   __annotations__r"   r   r$   r%   r&   listr'   r   r   r   r   r   #   s
   
r   zbytes | bytearrayr!   )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    r1   c                   @  s   e Zd ZdddddZdS )MultiPartExceptionr!   None)messager,   c                 C  s
   || _ d S N)r4   selfr4   r   r   r   __init__4   s    zMultiPartException.__init__N)r   r   r   r8   r   r   r   r   r2   3   s   r2   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]r3   )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)r7   r;   r<   r   r   r   r8   9   s    zFormParser.__init__r,   c                 C  s   t jdf}| j| d S N    )r   r   r?   appendr6   r   r   r   on_field_start?   s    
zFormParser.on_field_startbytesintr%   startendr,   c                 C  s"   t j||| f}| j| d S r5   )r   r   r?   rC   r7   r%   rH   rI   r4   r   r   r   on_field_nameC   s    zFormParser.on_field_namec                 C  s"   t j||| f}| j| d S r5   )r   r   r?   rC   rJ   r   r   r   on_field_dataG   s    zFormParser.on_field_datac                 C  s   t jdf}| j| d S rA   )r   r   r?   rC   r6   r   r   r   on_field_endK   s    
zFormParser.on_field_endc                 C  s   t jdf}| j| d S rA   )r   r   r?   rC   r6   r   r   r   on_endO   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)rD   rK   rL   rM   rN   rB   r-   )rD   rK   rL   rM   rN   r>   ZQuerystringParserr<   writefinalizer)   r?   clearr   r   r   r   r   r   r.   rC   r   )r7   	callbacksparserr"   Zfield_valueitemschunkr?   Zmessage_typemessage_bytesnamevaluer   r   r   parseS   s:    	








zFormParser.parseN)
r   r   r   r8   rD   rK   rL   rM   rN   rY   r   r   r   r   r9   8   s   r9   c                   @  s   e Zd ZdZdd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_fieldsmax_part_sizer	   r:   zint | floatrF   r3   )r;   r<   r[   r\   r]   r,   c                C  sp   t d usJ d|| _|| _|| _|| _g | _d| _d| _d| _d| _	t
 | _d| _g | _g | _g | _|| _d S )Nr=   r   rB   r    )r>   r;   r<   r[   r\   rT   _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_errorr]   )r7   r;   r<   r[   r\   r]   r   r   r   r8      s     	zMultiPartParser.__init__r@   c                 C  s   t  | _d S r5   )r   rb   r7   r   r   r   on_part_begin   s    zMultiPartParser.on_part_beginrE   rG   c                 C  sr   ||| }| j jd u r\t| j jt| | jkrLtdt| jd  d| j j| n| j	| j |f d S )NzPart exceeded maximum size of i   zKB.)
rb   r&   lenr%   r]   r2   rF   extendrd   rC   )r7   r%   rH   rI   rV   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 r5   )	rb   r&   rT   rC   r"   r1   r%   rc   re   rg   r   r   r   on_part_end   s    zMultiPartParser.on_part_endc                 C  s   |  j ||| 7  _ d S r5   )r`   r7   r%   rH   rI   r   r   r   on_header_field   s    zMultiPartParser.on_header_fieldc                 C  s   |  j ||| 7  _ d S r5   )ra   rm   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-dispositionrB   )r`   lowerra   rb   r   r'   rC   )r7   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   rb   r   r1   rc   r"   KeyErrorr2   r^   r[   r   max_file_sizerf   rC   r
   r	   r'   r&   r_   r\   )r7   Zdispositionoptionsrv   tempfiler   r   r   on_headers_finished   s,    z#MultiPartParser.on_headers_finishedc                 C  s   d S r5   r   rg   r   r   r   rN      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.)rh   rk   rl   rn   ro   rq   r{   rN   r   )r   r;   get
isinstancerE   r.   rc   rw   r2   rh   rk   rl   rn   ro   rq   r{   rN   r>   ZMultipartParserr<   rO   rd   r&   re   seekrQ   rf   closerP   r   rT   )r7   _paramscharsetboundaryrR   rS   rU   partr%   excr&   r   r   r   rY      sH    







zMultiPartParser.parseN)r   r   r   rx   r8   rh   rk   rl   rn   ro   rq   r{   rN   rY   r   r   r   r   rZ   |   s   	rZ   ) 
__future__r   typingdataclassesr   r   enumr   rz   r   urllib.parser   Zstarlette.datastructuresr   r	   r
   TYPE_CHECKINGZpython_multipartr>   Zpython_multipart.multipartr   r   r   ModuleNotFoundErrorZmultipart.multipartr   r   r1   	Exceptionr2   r9   rZ   r   r   r   r   <module>   s4   
D