3
e/"                 @   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 jd"e jZ e jee jZ!e j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-build-3irwxpxt/Werkzeug/werkzeug/sansio/multipart.pyr      s   r   T)frozenc               @   s   e Zd ZU edS )PreambleN)r   r   r   bytesdatar   r   r   r   r      s   
r   c               @   s   e Zd ZU eedS )FieldN)r   r   r   strnamer   headersr   r   r   r   r      s   
r   c               @   s   e Zd ZU eeedS )FileN)r   r   r   r   r   filenamer   r   r   r   r   r   r       s   
r   c               @   s   e Zd ZU eedS )DataN)r   r   r   r   r   bool	more_datar   r   r   r   r   '   s   
r   c               @   s   e Zd ZU edS )EpilogueN)r   r   r   r   r   r   r   r   r   r"   -   s   
r"   c               @   s   e Zd ZdS )NeedDataN)r   r   r   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j	dt
tj|t
t
f tj| _tj	dt
tj|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completer,   r$   r%   stater+   recompile
LINE_BREAKescape	MULTILINEpreamble_reboundary_re)selfr+   r,   r   r   r   __init__R   s    
zMultipartDecoder.__init__)r-   c             C   sj   y| j jd}W n tk
r.   t| j }Y nX y| j jd}W n tk
r^   t| j }Y nX t||S )N   
   )r/   rindex
ValueErrorlenmin)r9   Zlast_nlZlast_crr   r   r   last_newlineu   s    zMultipartDecoder.last_newline)r   r-   c             C   sJ   |d krd| _ n6| jd k	r:t| jt| | jkr:t n| jj| d S )NT)r0   r,   r?   r/   r   extend)r9   r   r   r   r   receive_data   s    
zMultipartDecoder.receive_datac             C   sj  t }| jtjkr|| jj| j}|d k	rx|jdjdr@tj	| _ntj
| _t| jd |j  }| jd |j = t|d}n| jtj
kr4tj| j}|d k	rB| j| jd |j  }| jd |j = d|krtdt|d \}}tt|jd}|jd}|d k	rt|||d}nt||d	}tj| _n| jtjkr| jjd| j dkrl| j  }	}
d
}nb| jj| j}|d k	r|jdjdrtj	| _ntj
| _|j }	|j }
n| j  }	}
|d k}t| jd |	 }| jd |
= |s| rBt||d}n:| jtj	krB| jrBtt| jd}| jd d = tj | _| jrft!|t"rftd| j |S )N   s   --)r   zcontent-dispositionz"Missing Content-Disposition headerr   r   )r   r   r   )r   r   T)r   r!   z&Invalid form-data cannot parse beyond )#	NEED_DATAr1   r$   r%   r7   searchr/   group
startswithr(   r&   r   startendr   BLANK_LINE_RE_parse_headersr>   r   r   r   getr   r   r'   findr+   rA   r8   r   r0   r"   r)   
isinstancer#   )r9   eventmatchr   r   dispositionextrar   r   Zdata_lengthZ	del_indexr!   r   r   r   
next_event   sl    







zMultipartDecoder.next_eventc             C   sd   g }t jd|}xJ|j D ]>}|j dkrt|j jdd\}}|j|j |j f qW t|S )N        :rD   )HEADER_CONTINUATION_REsub
splitlinesstripr   splitappendr   )r9   r   r   liner   valuer   r   r   rM      s    zMultipartDecoder._parse_headers)N)r   r   r   __doc__r   r   intr:   rA   rC   r   rU   r   rM   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+   r-   c             C   s   || _ tj| _d S )N)r+   r$   r%   r1   )r9   r+   r   r   r   r:      s    zMultipartEncoder.__init__)rQ   r-   c             C   s>  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 }x<tt|jD ],\}}|j dkr|t| d| d7 }qW |d7 }|S t |to| 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"zcontent-dispositionz: z
s   --
zCannot generate z in state: )rP   r   r1   r$   r%   r&   r   r   r   r'   r+   r
   r   r   r   r   lowerr   r"   r)   r>   )r9   rQ   r   r   r`   r   r   r   
send_event   s0    

zMultipartEncoder.send_event)r   r   r   r   r:   r   re   r   r   r   r   rc      s   rc   )%r2   Zdataclassesr   enumr   r   typingr   r   r   r   Z	_internalr
   r   Zdatastructuresr   
exceptionsr   httpr   r   r   r   r   r   r"   r#   rF   r$   r4   r3   r6   rL   ZLINE_BREAK_RErY   r*   rc   r   r   r   r   <module>   sB   
 