o
    tfJ(                     @  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yG   dZdZY nw G d	d
 d
eZeG dd dZ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   ^/var/www/html/software/conda/envs/catlas/lib/python3.10/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   srcr"   codecr   returnc              	   C  s.   z|  |W S  ttfy   |  d Y S w )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ZdS )	MultiPartExceptionmessager   r+   Nonec                 C  s
   || _ d S N)r2   selfr2   r   r   r   __init__,   s   
zMultiPartException.__init__N)r2   r   r+   r3   )r   r   r   r7   r   r   r   r   r1   +   s    r1   c                   @  sR   e Zd ZdddZdd	d
ZdddZdddZdddZdddZdddZ	dS ) 
FormParserheadersr	   stream"typing.AsyncGenerator[bytes, None]r+   r3   c                 C  s&   t d usJ d|| _|| _g | _d S )NEThe `python-multipart` library must be installed to use form parsing.)	multipartr9   r:   messages)r6   r9   r:   r   r   r   r7   1   s   

zFormParser.__init__c                 C     t jdf}| j| d S Nr!   )r   r   r>   appendr5   r   r   r   on_field_start;      
zFormParser.on_field_startr#   r"   startintendc                 C  "   t j||| f}| j| d S r4   )r   r   r>   rA   r6   r#   rD   rF   r2   r   r   r   on_field_name?      zFormParser.on_field_namec                 C  rG   r4   )r   r   r>   rA   rH   r   r   r   on_field_dataC   rJ   zFormParser.on_field_datac                 C  r?   r@   )r   r   r>   rA   r5   r   r   r   on_field_endG   rC   zFormParser.on_field_endc                 C  r?   r@   )r   r   r>   rA   r5   r   r   r   on_endK   rC   zFormParser.on_endr   c                   s   | j | j| j| j| jd}t|}d}d}g }| j2 z[3 d H W }|r*|| n|	  t
| j}| j  |D ]<\}}	|tjkrHd}d}q:|tjkrR||	7 }q:|tjkr\||	7 }q:|tjkrvt|d}
t|d}||
|f q:q6 t|S )N)rB   rI   rK   rL   rM   r!   r,   )rB   rI   rK   rL   rM   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   sB   
	







zFormParser.parseN)r9   r	   r:   r;   r+   r3   r+   r3   r#   r"   rD   rE   rF   rE   r+   r3   r+   r   )
r   r   r   r7   rB   rI   rK   rL   rM   rX   r   r   r   r   r8   0   s    






r8   c                   @  s|   e Zd ZdZdddd(ddZd)ddZd*ddZd)ddZd*ddZd*ddZ	d)ddZ
d)d d!Zd)d"d#Zd+d%d&Zd'S ),MultiPartParseri   i  )	max_files
max_fieldsr9   r	   r:   r;   r]   int | floatr^   r+   r3   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=   r9   r:   r]   r^   rS   _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   r9   r:   r]   r^   r   r   r   r7   {   s"   
	
zMultiPartParser.__init__c                 C  s   t  | _d S r4   )r   rd   r6   r   r   r   on_part_begin   s   zMultiPartParser.on_part_beginr#   r"   rD   rE   rF   c                 C  sB   ||| }| j jd u r| j  j|7  _d S | j| j |f d S r4   )rd   r$   r#   rf   rA   )r6   r#   rD   rF   rU   r   r   r   on_part_data   s   zMultiPartParser.on_part_datac                 C  sZ   | j jd u r| j| j jt| j j| jf d S | j| j  | j| j j| j jf d S r4   )	rd   r$   rS   rA   r    r0   r#   re   rg   ri   r   r   r   on_part_end   s   zMultiPartParser.on_part_endc                 C     |  j ||| 7  _ d S r4   )rb   r6   r#   rD   rF   r   r   r   on_header_field      zMultiPartParser.on_header_fieldc                 C  rm   r4   )rc   rn   r   r   r   on_header_value   rp   zMultiPartParser.on_header_valuec                 C  s@   | j  }|dkr| j| j_| jj|| jf d| _ d| _d S )Ns   content-dispositionr!   )rb   lowerrc   rd   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y   tdw d|v r_|  jd7  _| j| j	kr:td| j	 dt|d | j}t
| jd}| j| t|d|t| jjd	d
| j_d S |  jd7  _| j| jkrut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filenamer9   z-Too many fields. Maximum number of fields is )r   rd   r   r0   re   r    KeyErrorr1   r`   r]   r   max_file_sizerh   rA   r
   r	   r&   r$   ra   r^   )r6   Zdispositionoptionsrx   tempfiler   r   r   on_headers_finished   sB   
z#MultiPartParser.on_headers_finishedc                 C  s   d S r4   r   ri   r   r   r   rM      s   zMultiPartParser.on_endr   c              
     s`  t | jd \}}|dd}t|tr|d}|| _z|d }W n ty.   tdw | j	| j
| j| j| j| j| j| jd}t||}zF| j2 z?3 d H W }|| | jD ]\}}	|jscJ |j|	I d H  qZ| jD ]}|jswJ |jdI d H  qp| j  | j  qL6 W n ty }
 z| jD ]}|  q|
d }
~
ww |  t| jS )	NzContent-Types   charsetzutf-8r,   s   boundaryzMissing boundary in multipart.)rj   rk   rl   ro   rq   rs   r}   rM   r   )r   r9   get
isinstancer"   r-   re   ry   r1   rj   rk   rl   ro   rq   rs   r}   rM   r=   ZMultipartParserr:   rN   rf   r$   rg   seekrP   rh   closerO   r   rS   )r6   _paramscharsetboundaryrQ   rR   rT   partr#   excr$   r   r   r   rX      sR   









zMultiPartParser.parseN)
r9   r	   r:   r;   r]   r_   r^   r_   r+   r3   rY   rZ   r[   )r   r   r   rz   r7   rj   rk   rl   ro   rq   rs   r}   rM   rX   r   r   r   r   r\   x   s    








#r\   )r)   r"   r*   r   r+   r   )
__future__r   typingdataclassesr   r   enumr   r|   r   urllib.parser   Zstarlette.datastructuresr   r	   r
   r=   Zmultipart.multipartr   ModuleNotFoundErrorr   r   r0   	Exceptionr1   r8   r\   r   r   r   r   <module>   s*    
H