o
    \Oc&                     @   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"d$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   ;D:\Flask\env\Lib\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   sp   t  | _d| _|| _tj| _|| _t	dt
t|t
t
f tj| _t	dt
t|t
t
f tj| _d| _d S )NFs%   %s?--%s(--[^\S\n\r]*%s?|[^\S\n\r]*%s)s$   %s--%s(--[^\S\n\r]*%s?|[^\S\n\r]*%s)r   )	bytearraybuffercompleter7   r.   r/   stater6   recompile
LINE_BREAKescape	MULTILINEpreamble_reboundary_re_search_position)selfr6   r7   r   r   r   __init__V   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   
   )r:   rindex
ValueErrorlenmin)rE   Zlast_nllast_crr   r   r   last_newlinez   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;   r7   rK   r:   r   extend)rE   r   r   r   r   receive_data   s   
zMultipartDecoder.receive_datac                 C   s  t }| jtjkrS| j| j| j}|d urB|d	dr"tj
| _ntj| _t| jd |  }| jd | = t|d}d| _ntdt| jt| j t | _n| jtjkrt| j| j}|d ur| | jd |  }| jd | = d|vrtdt|d \}}tt|d}|d}|d urt|||d	}nt||d
}tj| _d| _ntdt| jt | _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|s!t!||d}n| jtj
kr?| j"r?t#t| jd}| jd d = tj$| _| j"rQt%|t&rQtd| j |S )N   s   --)r   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/   rB   searchr:   rD   group
startswithr2   r0   r   startendr   maxrK   r6   SEARCH_EXTRA_LENGTHBLANK_LINE_RE_parse_headersrJ   r   r   r%   getr'   r!   r1   findrN   rC   r)   r;   r,   r3   
isinstancer-   )rE   eventmatchr   r#   Zdispositionextrar"   r(   Zdata_lengthZ	del_indexr*   r   r   r   
next_event   s   




zMultipartDecoder.next_eventc                 C   s`   g }t d|}| D ]}| dkr+t| dd\}}|| | f qt|S )N        :rQ   )HEADER_CONTINUATION_REsub
splitlinesstripr   splitappendr   )rE   r   r#   liner"   valuer   r   r   r]      s   zMultipartDecoder._parse_headersN)r   r   r   __doc__r   r   intrF   rN   rP   r   rd   r   r]   r   r   r   r   r5   O   s    	
$[r5   c                   @   s0   e Zd ZdeddfddZdedefddZdS )	MultipartEncoderr6   r8   Nc                 C   s   || _ tj| _d S rp   )r6   r.   r/   r<   )rE   r6   r   r   r   rF      s   zMultipartEncoder.__init__ra   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"rR   z: z
s   --
zCannot generate z in state: )r`   r   r<   r.   r/   r0   r   r!   r'   r1   r6   r
   r"   r(   r   r#   lowerr)   r,   r3   rJ   )rE   ra   r   r"   ro   r   r   r   
send_event   s4   

zMultipartEncoder.send_event)r   r   r   r   rF   r   ru   r   r   r   r   rs      s    rs   )&r=   dataclassesr   enumr   r   typingr   r   r   r   	_internalr
   r   Zdatastructuresr   
exceptionsr   httpr   r   r   r!   r'   r)   r,   r-   rT   r.   r?   r>   rA   r\   ZLINE_BREAK_RErh   r[   r5   rs   r   r   r   r   <module>   sF    
 *