o
    si-)                     @  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 ejrSd d	lmZmZ 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_header)MultipartCallbacksQuerystringCallbacksc                   @  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/pca-backend/venv/lib/python3.10/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   srcbytes | bytearray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
   r2   c                   @  s   e Zd ZdddZdS )	MultiPartExceptionmessager!   r-   Nonec                 C  s
   || _ d S N)r4   selfr4   r   r   r   __init__/   s   
zMultiPartException.__init__N)r4   r!   r-   r5   )r   r   r   r9   r   r   r   r   r3   .   s    r3   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-   r5   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)r8   r;   r<   r   r   r   r9   4   s   
zFormParser.__init__c                 C     t jdf}| j| d S N    )r   r   r@   appendr7   r   r   r   on_field_start:      
zFormParser.on_field_startr%   bytesstartintendc                 C  "   t j||| f}| j| d S r6   )r   r   r@   rD   r8   r%   rH   rJ   r4   r   r   r   on_field_name>      zFormParser.on_field_namec                 C  rK   r6   )r   r   r@   rD   rL   r   r   r   on_field_dataB   rN   zFormParser.on_field_datac                 C  rA   rB   )r   r   r@   rD   r7   r   r   r   on_field_endF   rF   zFormParser.on_field_endc                 C  rA   rB   )r   r   r@   rD   r7   r   r   r   on_endJ   rF   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)rE   rM   rO   rP   rQ   rC   r.   )rE   rM   rO   rP   rQ   r?   QuerystringParserr<   writefinalizer)   r@   clearr   r   r   r   r   r   r/   rD   r   )r8   	callbacksparserr"   field_valueitemschunkr@   message_typemessage_bytesnamevaluer   r   r   parseN   sB   
	







zFormParser.parseN)r;   r	   r<   r=   r-   r5   r-   r5   r%   rG   rH   rI   rJ   rI   r-   r5   r-   r   )
r   r   r   r9   rE   rM   rO   rP   rQ   r_   r   r   r   r   r:   3   s    





r:   c                   @  s   e Zd 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_fieldsr;   r	   r<   r=   rd   int | floatre   r-   r5   c                C  sj   t d usJ d|| _|| _|| _|| _g | _d| _d| _d| _d| _	t
 | _d| _g | _g | _g | _d S )Nr>   r   rC   r    )r?   r;   r<   rd   re   rY   _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<   rd   re   r   r   r   r9   {   s   
zMultiPartParser.__init__c                 C  s   t  | _d S r6   )r   rk   r8   r   r   r   on_part_begin   s   zMultiPartParser.on_part_beginr%   rG   rH   rI   rJ   c                 C  st   ||| }| j jd u r/t| j jt| | jkr&tdt| jd  d| j j| d S | j	| j |f d S )NzPart exceeded maximum size of i   zKB.)
rk   r&   lenr%   max_part_sizer3   rI   extendrm   rD   )r8   r%   rH   rJ   r\   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 r6   )	rk   r&   rY   rD   r"   r2   r%   rl   rn   rp   r   r   r   on_part_end   s   zMultiPartParser.on_part_endc                 C     |  j ||| 7  _ d S r6   )ri   r8   r%   rH   rJ   r   r   r   on_header_field      zMultiPartParser.on_header_fieldc                 C  rw   r6   )rj   rx   r   r   r   on_header_value   rz   zMultiPartParser.on_header_valuec                 C  s@   | j  }|dkr| j| j_| jj|| jf d| _ d| _d S )Ns   content-dispositionrC   )ri   lowerrj   rk   r   r'   rD   )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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filenamer;   z-Too many fields. Maximum number of fields is )r   rk   r   r2   rl   r"   KeyErrorr3   rg   rd   r   max_file_sizero   rD   r
   r	   r'   r&   rh   re   )r8   dispositionoptionsr   tempfiler   r   r   on_headers_finished   s.   z#MultiPartParser.on_headers_finishedc                 C  s   d S r6   r   rp   r   r   r   rQ      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.)rq   ru   rv   ry   r{   r}   r   rQ   r   )r   r;   get
isinstancerG   r/   rl   r   r3   rq   ru   rv   ry   r{   r}   r   rQ   r?   MultipartParserr<   rS   rm   r&   rn   seekrU   ro   closerT   r   rY   )r8   _paramscharsetboundaryrV   rW   rZ   partr%   excr&   r   r   r   r_      sR   









zMultiPartParser.parseN)
r;   r	   r<   r=   rd   rf   re   rf   r-   r5   r`   ra   rb   )r   r   r   r   rs   r9   rq   ru   rv   ry   r{   r}   r   rQ   r_   r   r   r   r   rc   w   s    


	




rc   )r*   r+   r,   r!   r-   r!   )
__future__r   typingdataclassesr   r   enumr   r   r   urllib.parser   starlette.datastructuresr   r	   r
   r?   multipart.multipartr   ModuleNotFoundErrorTYPE_CHECKINGr   r   r   r   r2   	Exceptionr3   r:   rc   r   r   r   r   <module>   s.    
D