o
    ђhN+                     @  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   N/var/www/html/govbot/env/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                   @  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AsyncGenerator[bytes, None]r/   r7   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)r:   r=   r>   r   r   r   r;   :   s   
zFormParser.__init__c                 C     t jdf}| j| d S N    )r   r   rB   appendr9   r   r   r   on_field_start@      
zFormParser.on_field_startr'   bytesstartintendc                 C  "   t j||| f}| j| d S r8   )r   r   rB   rF   r:   r'   rJ   rL   r6   r   r   r   on_field_nameD      zFormParser.on_field_namec                 C  rM   r8   )r   r   rB   rF   rN   r   r   r   on_field_dataH   rP   zFormParser.on_field_datac                 C  rC   rD   )r   r   rB   rF   r9   r   r   r   on_field_endL   rH   zFormParser.on_field_endc                 C  rC   rD   )r   r   rB   rF   r9   r   r   r   on_endP   rH   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)rG   rO   rQ   rR   rS   rE   r0   )rG   rO   rQ   rR   rS   rA   QuerystringParserr>   writefinalizer+   rB   clearr   r   r   r   r   r	   r1   rF   r
   )r:   	callbacksparserr$   field_valueitemschunkrB   message_typemessage_bytesnamevaluer   r   r   parseT   sB   
	







zFormParser.parseN)r=   r   r>   r?   r/   r7   r/   r7   r'   rI   rJ   rK   rL   rK   r/   r7   r/   r
   )
r   r   r   r;   rG   rO   rQ   rR   rS   ra   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 )-MultiPartParseri   i  )	max_files
max_fieldsmax_part_sizer=   r   r>   r?   rf   int | floatrg   rh   rK   r/   r7   c                C  sp   t d usJ d|| _|| _|| _|| _g | _d| _d| _d| _d| _	t
 | _d| _g | _g | _g | _|| _d S )Nr@   r   rE   r"   )rA   r=   r>   rf   rg   r[   _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_errorrh   )r:   r=   r>   rf   rg   rh   r   r   r   r;      s    	
zMultiPartParser.__init__c                 C  s   t  | _d S r8   )r    rn   r:   r   r   r   on_part_begin   s   zMultiPartParser.on_part_beginr'   rI   rJ   rL   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.)
rn   r(   lenr'   rh   r5   rK   extendrp   rF   )r:   r'   rJ   rL   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 r8   )	rn   r(   r[   rF   r$   r4   r'   ro   rq   rs   r   r   r   on_part_end   s   zMultiPartParser.on_part_endc                 C     |  j ||| 7  _ d S r8   )rl   r:   r'   rJ   rL   r   r   r   on_header_field      zMultiPartParser.on_header_fieldc                 C  ry   r8   )rm   rz   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-dispositionrE   )rl   lowerrm   rn   r!   r)   rF   )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 .)max_sizer   )raw)r(   sizefilenamer=   z-Too many fields. Maximum number of fields is )r   rn   r!   r4   ro   r$   KeyErrorr5   rj   rf   r   spool_max_sizerr   rF   r   r   r)   r(   rk   rg   )r:   dispositionoptionsr   tempfiler   r   r   on_headers_finished   s.   z#MultiPartParser.on_headers_finishedc                 C  s   d S r8   r   rs   r   r   r   rS      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-8r0   s   boundaryzMissing boundary in multipart.)rt   rw   rx   r{   r}   r   r   rS   r   )r   r=   get
isinstancerI   r1   ro   r   r5   rt   rw   rx   r{   r}   r   r   rS   rA   MultipartParserr>   rU   rp   r(   rq   seekrW   rr   closerV   r
   r[   )r:   _paramscharsetboundaryrX   rY   r\   partr'   excr(   r   r   r   ra      sR   









zMultiPartParser.parseN)r=   r   r>   r?   rf   ri   rg   ri   rh   rK   r/   r7   rb   rc   rd   )r   r   r   r   rh   r;   rt   rw   rx   r{   r}   r   r   rS   ra   r   r   r   r   re   }   s$    


	




re   )r,   r-   r.   r#   r/   r#   )"
__future__r   collections.abcr   dataclassesr   r   enumr   r   r   typingr   urllib.parser	   starlette.datastructuresr
   r   r   python_multipartrA   python_multipart.multipartr   r   r   ModuleNotFoundErrormultipart.multipartr   r    r4   	Exceptionr5   r<   re   r   r   r   r   <module>   s>    
D