a
    hN+                     @  sR  d dl mZ d dlm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 d dlmZmZmZ e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 )    )annotations)AsyncGenerator)	dataclassfield)Enum)SpooledTemporaryFile)TYPE_CHECKING)unquote_plus)FormDataHeaders
UploadFileN)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   Q/var/www/html/assistant/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    r3   c                   @  s   e Zd ZdddddZdS )MultiPartExceptionr#   None)messager.   c                 C  s
   || _ d S N)r6   selfr6   r   r   r   __init__5   s    zMultiPartException.__init__N)r   r   r   r:   r   r   r   r   r4   4   s   r4   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   AsyncGenerator[bytes, None]r5   )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)r9   r=   r>   r   r   r   r:   :   s    zFormParser.__init__r.   c                 C  s   t jdf}| j| d S N    )r   r   rA   appendr8   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 r7   )r   r   rA   rE   r9   r'   rJ   rK   r6   r   r   r   on_field_nameD   s    zFormParser.on_field_namec                 C  s"   t j||| f}| j| d S r7   )r   r   rA   rE   rL   r   r   r   on_field_dataH   s    zFormParser.on_field_datac                 C  s   t jdf}| j| d S rC   )r   r   rA   rE   r8   r   r   r   on_field_endL   s    
zFormParser.on_field_endc                 C  s   t jdf}| j| d S rC   )r   r   rA   rE   r8   r   r   r   on_endP   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)rF   rM   rN   rO   rP   rD   r/   )rF   rM   rN   rO   rP   r@   ZQuerystringParserr>   writefinalizer+   rA   clearr   r   r   r   r   r	   r0   rE   r
   )r9   	callbacksparserr$   Zfield_valueitemschunkrA   Zmessage_typemessage_bytesnamevaluer   r   r   parseT   s:    	








zFormParser.parseN)
r   r   r   r:   rF   rM   rN   rO   rP   r[   r   r   r   r   r;   9   s   r;   c                   @  s   e Zd 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 | floatrH   r5   )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   rD   r"   )r@   r=   r>   r]   r^   rV   _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_   )r9   r=   r>   r]   r^   r_   r   r   r   r:      s     	zMultiPartParser.__init__rB   c                 C  s   t  | _d S r7   )r    rd   r9   r   r   r   on_part_begin   s    zMultiPartParser.on_part_beginrG   rI   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.)
rd   r(   lenr'   r_   r4   rH   extendrf   rE   )r9   r'   rJ   rK   rX   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 r7   )	rd   r(   rV   rE   r$   r3   r'   re   rg   ri   r   r   r   on_part_end   s    zMultiPartParser.on_part_endc                 C  s   |  j ||| 7  _ d S r7   )rb   r9   r'   rJ   rK   r   r   r   on_header_field   s    zMultiPartParser.on_header_fieldc                 C  s   |  j ||| 7  _ d S r7   )rc   ro   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-dispositionrD   )rb   lowerrc   rd   r!   r)   rE   )r9   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   rd   r!   r3   re   r$   KeyErrorr4   r`   r]   r   spool_max_sizerh   rE   r   r   r)   r(   ra   r^   )r9   dispositionoptionsrx   tempfiler   r   r   on_headers_finished   s,    z#MultiPartParser.on_headers_finishedc                 C  s   d S r7   r   ri   r   r   r   rP      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.)rj   rm   rn   rp   rq   rs   r~   rP   r   )r   r=   get
isinstancerG   r0   re   ry   r4   rj   rm   rn   rp   rq   rs   r~   rP   r@   ZMultipartParserr>   rQ   rf   r(   rg   seekrS   rh   closerR   r
   rV   )r9   _paramscharsetboundaryrT   rU   rW   partr'   excr(   r   r   r   r[      sH    







zMultiPartParser.parseN)r   r   r   rz   r_   r:   rj   rm   rn   rp   rq   rs   r~   rP   r[   r   r   r   r   r\   }   s   	r\   )"
__future__r   collections.abcr   Zdataclassesr   r   enumr   r}   r   typingr   urllib.parser	   Zstarlette.datastructuresr
   r   r   Zpython_multipartr@   Zpython_multipart.multipartr   r   r   ModuleNotFoundErrorZmultipart.multipartr   r    r3   	Exceptionr4   r;   r\   r   r   r   r   <module>   s6   
D