U
    Ha/"                     @   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                   @   s   e Zd ZdS )EventN__name__
__module____qualname__ r   r   =/tmp/pip-unpacked-wheel-ub1y1qyw/werkzeug/sansio/multipart.pyr      s   r   T)frozenc                   @   s   e Zd ZU eed< dS )PreambledataNr   r   r   bytes__annotations__r   r   r   r   r      s   
r   c                   @   s   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      s   
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                   @   s   e Zd ZU eed< eed< dS )Datar   	more_dataN)r   r   r   r   r   boolr   r   r   r   r#   '   s   
r#   c                   @   s   e Zd ZU eed< dS )Epiloguer   Nr   r   r   r   r   r&   -   s   
r&   c                   @   s   e Zd ZdS )NeedDataNr   r   r   r   r   r'   2   s   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                   @   sh   e Zd ZdZdeee ddddZedddZee dd	d
dZ	e
dddZeed	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completer0   r(   r)   stater/   recompile
LINE_BREAKescape	MULTILINEpreamble_reboundary_re)selfr/   r0   r   r   r   __init__R   s"    	zMultipartDecoder.__init__)r1   c                 C   sj   z| j d}W n tk
r.   t| j }Y nX z| j d}W n tk
r^   t| j }Y nX t||S )N   
   )r3   rindex
ValueErrorlenmin)r=   Zlast_nlZlast_crr   r   r   last_newlineu   s    zMultipartDecoder.last_newline)r   r1   c                 C   sJ   |d krd| _ n6| jd k	r:t| jt| | jkr:t n| j| d S )NT)r4   r0   rC   r3   r   extend)r=   r   r   r   r   receive_data   s    zMultipartDecoder.receive_datac                 C   sh  t }| jtjkr|| j| j}|d k	rx|ddr@tj	| _ntj
| _t| jd |  }| jd | = t|d}n| jtj
kr4t| j}|d k	r@| | jd |  }| jd | = d|krtdt|d \}}tt|d}|d}|d k	rt|||d}nt||d	}tj| _n| jtjkr| jd| j d
krl|   }	}
d}nb| j| j}|d k	r|ddrtj	| _ntj
| _| }	| }
n|   }	}
|d k}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rdt!|t"rdt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_DATAr5   r(   r)   r;   searchr3   group
startswithr,   r*   r   startendr   BLANK_LINE_RE_parse_headersrB   r   r   r    getr!   r   r+   findr/   rE   r<   r#   r4   r&   r-   
isinstancer'   )r=   eventmatchr   r   dispositionextrar   r"   Zdata_lengthZ	del_indexr$   r   r   r   
next_event   sr    






zMultipartDecoder.next_eventc                 C   s`   g }t d|}| D ]>}| dkrt| dd\}}|| | f qt|S )N        :rH   )HEADER_CONTINUATION_REsub
splitlinesstripr   splitappendr   )r=   r   r   liner   valuer   r   r   rR      s    zMultipartDecoder._parse_headers)N)r   r   r   __doc__r   r   intr>   rE   rG   r   rZ   r   rR   r   r   r   r   r.   K   s   	 #Mr.   c                   @   s,   e Zd ZeddddZeedddZdS )MultipartEncoderN)r/   r1   c                 C   s   || _ tj| _d S )N)r/   r(   r)   r5   )r=   r/   r   r   r   r>      s    zMultipartEncoder.__init__)rV   r1   c                 C   s8  t |tr$| jtjkr$tj| _|jS t |ttfr| jtjtjtj	hkrtj	| _d| j
 d }|dt|j 7 }t |tr|dt|j 7 }|d7 }tt|jD ],\}}| dkr|t| d| d7 }q|d7 }|S t |tr| jtj	kr|jS t |trtj| _d| j
 d |j S td	| d
| j d S )Ns   
--s   
s)   Content-Disposition: form-data; name="%s"s   ; filename="%s"rI   z: z
s   --
zCannot generate z in state: )rU   r   r5   r(   r)   r*   r   r   r!   r+   r/   r
   r   r"   r   r   lowerr#   r&   r-   rB   )r=   rV   r   r   re   r   r   r   
send_event   s2    
zMultipartEncoder.send_event)r   r   r   r   r>   r   rj   r   r   r   r   rh      s   rh   )%r6   Zdataclassesr   enumr   r   typingr   r   r   r   	_internalr
   r   Zdatastructuresr   
exceptionsr   httpr   r   r   r   r!   r#   r&   r'   rK   r(   r8   r7   r:   rQ   ZLINE_BREAK_REr^   r.   rh   r   r   r   r   <module>   sB   
 