o
    0c/"                     @   s  d dl 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 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 d	dlmZ d	dlmZ G dd dZeddG dd deZeddG dd deZeddG dd deZeddG dd deZeddG dd deZG dd deZe ZG dd  d eZd!Ze d"e jZ e ee jZ!e d#e e jZ"G d$d% d%Z#G d&d' d'Z$dS )(    N)	dataclass)auto)Enum)cast)List)Optional)Tuple   )	_to_bytes)_to_str)Headers)RequestEntityTooLarge)parse_options_headerc                   @      e Zd ZdS )EventN__name__
__module____qualname__ r   r   O/var/www/html/gps/gps/lib/python3.10/site-packages/werkzeug/sansio/multipart.pyr          r   T)frozenc                   @      e Zd ZU eed< dS )PreambledataNr   r   r   bytes__annotations__r   r   r   r   r         
 r   c                   @      e Zd ZU eed< eed< dS )FieldnameheadersNr   r   r   strr   r   r   r   r   r   r!         
 r!   c                   @   s&   e Zd ZU eed< eed< eed< dS )Filer"   filenamer#   Nr$   r   r   r   r   r'       s   
 r'   c                   @   r    )Datar   	more_dataN)r   r   r   r   r   boolr   r   r   r   r)   '   r&   r)   c                   @   r   )Epiloguer   Nr   r   r   r   r   r,   -   r   r,   c                   @   r   )NeedDataNr   r   r   r   r   r-   2   r   r-   c                   @   s*   e Zd Ze Ze Ze Ze Ze ZdS )StateN)	r   r   r   r   PREAMBLEPARTDATAEPILOGUECOMPLETEr   r   r   r   r.   9   s    
r.   s
   (?:
|
|)s   (?:

||

)s   %s[ 	]c                   @   sr   e Zd ZdZ	ddedee ddfddZdefdd	Zd
ee ddfddZ	de
fddZd
edefddZdS )MultipartDecoderzDecodes a multipart message as bytes into Python events.

    The part data is returned as available to allow the caller to save
    the data from memory to disk, if desired.
    Nboundarymax_form_memory_sizereturnc                 C   sj   t  | _d| _|| _tj| _|| _t	dt
t|t
t
f tj| _t	dt
t|t
t
f tj| _d S )NFs%   %s?--%s(--[^\S\n\r]*%s?|[^\S\n\r]*%s)s$   %s--%s(--[^\S\n\r]*%s?|[^\S\n\r]*%s))	bytearraybuffercompleter6   r.   r/   stater5   recompile
LINE_BREAKescape	MULTILINEpreamble_reboundary_re)selfr5   r6   r   r   r   __init__R   s"   	
zMultipartDecoder.__init__c                 C   sf   z| j d}W n ty   t| j }Y nw z| j d}W n ty-   t| j }Y nw t||S )N   
   )r9   rindex
ValueErrorlenmin)rC   last_nllast_crr   r   r   last_newlineu   s   
zMultipartDecoder.last_newliner   c                 C   sJ   |d u r	d| _ d S | jd urt| jt| | jkrt | j| d S )NT)r:   r6   rI   r9   r   extend)rC   r   r   r   r   receive_data   s   
zMultipartDecoder.receive_datac                 C   sR  t }| jtjkr=| j| j}|d ur<|ddr tj	| _ntj
| _t| jd |  }| jd | = t|d}n| jtj
krt| j}|d ur| | jd |  }| jd | = d|vritdt|d \}}tt|d}|d}|d urt|||d}nt||d	}tj| _n| jtjkr| jd| j d
kr|   }	}
d}n/| j| j}|d ur|ddrtj	| _ntj
| _| }	| }
n|   }	}
|d u }t| jd |	 }| jd |
= |s|st||d}n| jtj	kr| jrtt| jd}| jd d = tj | _| jr't!|t"r'td| j |S )N   s   --)r   content-dispositionz"Missing Content-Disposition headerr"   r(   )r(   r#   r"   )r#   r"   T)r   r*   z&Invalid form-data cannot parse beyond )#	NEED_DATAr;   r.   r/   rA   searchr9   group
startswithr2   r0   r   startendr   BLANK_LINE_RE_parse_headersrH   r   r   r%   getr'   r!   r1   findr5   rM   rB   r)   r:   r,   r3   
isinstancer-   )rC   eventmatchr   r#   dispositionextrar"   r(   data_length	del_indexr*   r   r   r   
next_event   sx   




zMultipartDecoder.next_eventc                 C   s`   g }t d|}| D ]}| dkr+t| dd\}}|| | f qt|S )N        :rP   )HEADER_CONTINUATION_REsub
splitlinesstripr   splitappendr   )rC   r   r#   liner"   valuer   r   r   rZ      s   zMultipartDecoder._parse_headersN)r   r   r   __doc__r   r   intrD   rM   rO   r   rd   r   rZ   r   r   r   r   r4   K   s    	
#Mr4   c                   @   s0   e Zd ZdeddfddZdedefddZdS )	MultipartEncoderr5   r7   Nc                 C   s   || _ tj| _d S rp   )r5   r.   r/   r;   )rC   r5   r   r   r   rD      s   zMultipartEncoder.__init__r^   c                 C   s2  t |tr| jtjkrtj| _|jS t |ttfrm| jtjtjtj	hv rmtj	| _d| j
 d }|dt|j 7 }t |trF|dt|j 7 }|d7 }tt|jD ]\}}| dkrf|t| d| d7 }qP|d7 }|S t |tr{| jtj	kr{|jS t |trtj| _d| j
 d |j S td	| d
| j )Ns   
--s   
s)   Content-Disposition: form-data; name="%s"s   ; filename="%s"rQ   z: z
s   --
zCannot generate z in state: )r]   r   r;   r.   r/   r0   r   r!   r'   r1   r5   r
   r"   r(   r   r#   lowerr)   r,   r3   rH   )rC   r^   r   r"   ro   r   r   r   
send_event   s4   

zMultipartEncoder.send_event)r   r   r   r   rD   r   ru   r   r   r   r   rs      s    rs   )%r<   dataclassesr   enumr   r   typingr   r   r   r   	_internalr
   r   datastructuresr   
exceptionsr   httpr   r   r   r!   r'   r)   r,   r-   rS   r.   r>   r=   r@   rY   LINE_BREAK_RErh   r4   rs   r   r   r   r   <module>   sD    
 