o
    m=8j//                     @  sJ  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rGd 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yg   d d	lZd dlmZ Y nw W n eyv   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 )    )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   \/home/nk/hobo-godmode/plappi-mvp/.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
   r4   c                   @  s   e Zd ZdddZdS )	MultiPartExceptionmessager#   r/   Nonec                 C  s
   || _ d S N)r6   selfr6   r   r   r   __init__5   s   
zMultiPartException.__init__N)r6   r#   r/   r7   )r   r   r   r;   r   r   r   r   r5   4   s    r5   c                   @  sZ   e 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!S )&
FormParser     )
max_fieldsmax_part_sizeheadersr   streamAsyncGenerator[bytes, None]r?   int | floatr@   intr/   r7   c                C  s>   t d usJ d|| _|| _|| _|| _g | _d| _d| _d S )NEThe `python-multipart` library must be installed to use form parsing.r   )	multipartrA   rB   r?   r@   messages_current_field_size_current_fields)r:   rA   rB   r?   r@   r   r   r   r;   :   s   
zFormParser.__init__c                 C  s    d| _ tjdf}| j| d S )Nr       )rI   r   r   rH   appendr9   r   r   r   on_field_startK   s   
zFormParser.on_field_startr'   bytesstartendc                 C  Z   |  j || 7  _ | j | jkrtdt| jd  dtj||| f}| j| d S NzField exceeded maximum size of    KB.)rI   r@   r5   rE   r   r   rH   rL   r:   r'   rO   rP   r6   r   r   r   on_field_nameP   
   zFormParser.on_field_namec                 C  rQ   rR   )rI   r@   r5   rE   r   r   rH   rL   rU   r   r   r   on_field_dataW   rW   zFormParser.on_field_datac                 C  sF   |  j d7  _ | j | jkrtd| j dtjdf}| j| d S )Nr   -Too many fields. Maximum number of fields is .rK   )rJ   r?   r5   r   r   rH   rL   r9   r   r   r   on_field_end^   s
   
zFormParser.on_field_endc                 C  s   t jdf}| j| d S )NrK   )r   r   rH   rL   r9   r   r   r   on_ende   s   
zFormParser.on_endr
   c                   s  | j | j| j| j| jd}t|}t }t }g }| j2 z_3 d H W }|r,|	| n|
  t| j}| j  |D ]@\}}	|tjkrLt }t }q<|tjkrW||	 q<|tjkrb||	 q<|tjkr|t|d}
t|d}||
|f q<q6 t|S )N)rM   rV   rX   r[   r\   r0   )rM   rV   rX   r[   r\   rG   QuerystringParserr&   rB   writefinalizer+   rH   clearr   r   r   extendr   r   r	   r1   rL   r
   )r:   	callbacksparserr$   field_valueitemschunkrH   message_typemessage_bytesnamevaluer   r   r   parsei   sB   
	





zFormParser.parseN)
rA   r   rB   rC   r?   rD   r@   rE   r/   r7   r/   r7   r'   rN   rO   rE   rP   rE   r/   r7   r/   r
   )
r   r   r   r;   rM   rV   rX   r[   r\   rk   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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 )-MultiPartParserr>   r=   )	max_filesr?   r@   rA   r   rB   rC   rp   rD   r?   r@   rE   r/   r7   c                C  sp   t d usJ d|| _|| _|| _|| _g | _d| _d| _d| _d| _	t
 | _d| _g | _g | _g | _|| _d S )NrF   r   rK   r"   )rG   rA   rB   rp   r?   re   _current_filesrJ   _current_partial_header_name_current_partial_header_valuer    _current_part_charset_file_parts_to_write_file_parts_to_finish_files_to_close_on_errorr@   )r:   rA   rB   rp   r?   r@   r   r   r   r;      s    	
zMultiPartParser.__init__c                 C  s   t  | _d S r8   )r    rt   r:   r   r   r   on_part_begin   s   zMultiPartParser.on_part_beginr'   rN   rO   rP   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 rS   rT   )
rt   r(   lenr'   r@   r5   rE   ra   rv   rL   )r:   r'   rO   rP   rh   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 r8   )	rt   r(   re   rL   r$   r4   r'   ru   rw   ry   r   r   r   on_part_end   s   zMultiPartParser.on_part_endc                 C     |  j ||| 7  _ d S r8   )rr   r:   r'   rO   rP   r   r   r   on_header_field      zMultiPartParser.on_header_fieldc                 C  r~   r8   )rs   r   r   r   r   on_header_value   r   zMultiPartParser.on_header_valuec                 C  s@   | j  }|dkr| j| j_| jj|| jf d| _ d| _d S )Ns   content-dispositionrK   )rr   lowerrs   rt   r!   r)   rL   )r:   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 rZ   )max_sizer   )raw)r(   sizefilenamerA   rY   )r   rt   r!   r4   ru   r$   KeyErrorr5   rq   rp   r   spool_max_sizerx   rL   r   r   r)   r(   rJ   r?   )r:   dispositionoptionsr   tempfiler   r   r   on_headers_finished   s.   z#MultiPartParser.on_headers_finishedc                 C  s   d S r8   r   ry   r   r   r   r\      s   zMultiPartParser.on_endr
   c              
     sd  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||}zJ| 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tfy }
 z| jD ]}|  q|
d }
~
ww t| jS )	NzContent-Types   charsetzutf-8r0   s   boundaryzMissing boundary in multipart.)rz   r|   r}   r   r   r   r   r\   r   ) r   rA   get
isinstancerN   r1   ru   r   r5   rz   r|   r}   r   r   r   r   r\   rG   MultipartParserrB   r^   rv   r(   rw   seekr`   r_   OSErrorrx   closer
   re   )r:   _paramscharsetboundaryrb   rc   rf   partr'   excr(   r   r   r   rk      sR   









zMultiPartParser.parseN)rA   r   rB   rC   rp   rD   r?   rD   r@   rE   r/   r7   rl   rm   rn   )r   r   r   r   r@   r;   rz   r|   r}   r   r   r   r   r\   rk   r   r   r   r   ro      s$    


	




ro   )r,   r-   r.   r#   r/   r#   )"
__future__r   collections.abcr   dataclassesr   r   enumr   r   r   typingr   urllib.parser	   starlette.datastructuresr
   r   r   python_multipartrG   python_multipart.multipartr   r   r   ModuleNotFoundErrormultipart.multipartr   r    r4   	Exceptionr5   r<   ro   r   r   r   r   <module>   s>    
Y