o
    ii|+                     @  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   ]/var/www/scraper.webshop2u.hu/html/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                   @  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|}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)rG   rO   rQ   rR   rS   r0   )rG   rO   rQ   rR   rS   rA   QuerystringParserr&   r>   writefinalizer+   rB   clearr   r   r   extendr   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   rb   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?   rg   int | floatrh   ri   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>   rg   rh   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_errorri   )r:   r=   r>   rg   rh   ri   r   r   r   r;      s    	
zMultiPartParser.__init__c                 C  s   t  | _d S r8   )r    ro   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.)
ro   r(   lenr'   ri   r5   rK   rX   rq   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   )	ro   r(   r\   rF   r$   r4   r'   rp   rr   rt   r   r   r   on_part_end   s   zMultiPartParser.on_part_endc                 C     |  j ||| 7  _ d S r8   )rm   r:   r'   rJ   rL   r   r   r   on_header_field      zMultiPartParser.on_header_fieldc                 C  ry   r8   )rn   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   )rm   lowerrn   ro   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   ro   r!   r4   rp   r$   KeyErrorr5   rk   rg   r   spool_max_sizers   rF   r   r   r)   r(   rl   rh   )r:   dispositionoptionsr   tempfiler   r   r   on_headers_finished   s.   z#MultiPartParser.on_headers_finishedc                 C  s   d S r8   r   rt   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||}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y }
 z| jD ]}|  q|
d }
~
ww t| jS )	NzContent-Types   charsetzutf-8r0   s   boundaryzMissing boundary in multipart.)ru   rw   rx   r{   r}   r   r   rS   r   )r   r=   get
isinstancerI   r1   rp   r   r5   ru   rw   rx   r{   r}   r   r   rS   rA   MultipartParserr>   rU   rq   r(   rr   seekrW   rV   rs   closer
   r\   )r:   _paramscharsetboundaryrY   rZ   r]   partr'   excr(   r   r   r   rb      sR   









zMultiPartParser.parseN)r=   r   r>   r?   rg   rj   rh   rj   ri   rK   r/   r7   rc   rd   re   )r   r   r   r   ri   r;   ru   rw   rx   r{   r}   r   r   rS   rb   r   r   r   r   rf   }   s$    


	




rf   )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<   rf   r   r   r   r   <module>   s>    
D