3
¥Yði/"  ã               @   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-8om4l6ph/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 )ÚMultipartDecoderz³Decodes 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rØt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ƒ�r t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rÞt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 }q¢W |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   
 