o
    h%+                     @  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 ejr@d dlZd dlmZmZmZ n0z"zd dlZd d	lmZ W n ey`   d dlZd d	lmZ Y nw W n eyo   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)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   i/var/www/html/construction_image-detection-poc/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__4   s   
zMultiPartException.__init__N)r4   r!   r-   r5   )r   r   r   r9   r   r   r   r   r3   3   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   9   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_nameC      zFormParser.on_field_namec                 C  rK   r6   )r   r   r@   rD   rL   r   r   r   on_field_dataG   rN   zFormParser.on_field_datac                 C  rA   rB   )r   r   r@   rD   r7   r   r   r   on_field_endK   rF   zFormParser.on_field_endc                 C  rA   rB   )r   r   r@   rD   r7   r   r   r   on_endO   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   parseS   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:   8   s    





r:   c                   @  s   e Zd ZdZ	 dZ	 d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_fieldsmax_part_sizer;   r	   r<   r=   rd   int | floatre   rf   rI   r-   r5   c                C  sp   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_errorrf   )r8   r;   r<   rd   re   rf   r   r   r   r9      s    	
zMultiPartParser.__init__c                 C  s   t  | _d S r6   )r   rl   r8   r   r   r   on_part_begin   s   zMultiPartParser.on_part_beginr%   rG   rH   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.)
rl   r&   lenr%   rf   r3   rI   extendrn   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   )	rl   r&   rY   rD   r"   r2   r%   rm   ro   rq   r   r   r   on_part_end   s   zMultiPartParser.on_part_endc                 C     |  j ||| 7  _ d S r6   )rj   r8   r%   rH   rJ   r   r   r   on_header_field      zMultiPartParser.on_header_fieldc                 C  rw   r6   )rk   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   )rj   lowerrk   rl   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   rl   r   r2   rm   r"   KeyErrorr3   rh   rd   r   spool_max_sizerp   rD   r
   r	   r'   r&   ri   re   )r8   dispositionoptionsr   tempfiler   r   r   on_headers_finished   s.   z#MultiPartParser.on_headers_finishedc                 C  s   d S r6   r   rq   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.)rr   ru   rv   ry   r{   r}   r   rQ   r   )r   r;   get
isinstancerG   r/   rm   r   r3   rr   ru   rv   ry   r{   r}   r   rQ   r?   MultipartParserr<   rS   rn   r&   ro   seekrU   rp   closerT   r   rY   )r8   _paramscharsetboundaryrV   rW   rZ   partr%   excr&   r   r   r   r_      sR   









zMultiPartParser.parseN)r;   r	   r<   r=   rd   rg   re   rg   rf   rI   r-   r5   r`   ra   rb   )r   r   r   r   rf   r9   rr   ru   rv   ry   r{   r}   r   rQ   r_   r   r   r   r   rc   |   s$    


	




rc   )r*   r+   r,   r!   r-   r!   ) 
__future__r   typingdataclassesr   r   enumr   r   r   urllib.parser   starlette.datastructuresr   r	   r
   TYPE_CHECKINGpython_multipartr?   python_multipart.multipartr   r   r   ModuleNotFoundErrormultipart.multipartr   r   r2   	Exceptionr3   r:   rc   r   r   r   r   <module>   s<    
D