U
    /v¶hu-  ã                   @  sp  d dl mZ d dlZ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 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 )$é    )ÚannotationsN)Ú	dataclass)Úauto)ÚEnumé   )ÚHeaders)ÚRequestEntityTooLarge)Úparse_options_headerc                   @  s   e Zd ZdS )ÚEventN©Ú__name__Ú
__module__Ú__qualname__© r   r   ú=/tmp/pip-unpacked-wheel-c3xdgso7/werkzeug/sansio/multipart.pyr
      s   r
   T)Úfrozenc                   @  s   e Zd ZU ded< dS )ÚPreambleÚbytesÚdataN©r   r   r   Ú__annotations__r   r   r   r   r      s   
r   c                   @  s   e Zd ZU ded< ded< dS )ÚFieldÚstrÚnamer   ÚheadersNr   r   r   r   r   r      s   
r   c                   @  s&   e Zd ZU ded< ded< ded< dS )ÚFiler   r   Úfilenamer   r   Nr   r   r   r   r   r      s   
r   c                   @  s   e Zd ZU ded< ded< dS )ÚDatar   r   ÚboolÚ	more_dataNr   r   r   r   r   r   $   s   
r   c                   @  s   e Zd ZU ded< dS )ÚEpiloguer   r   Nr   r   r   r   r   r    *   s   
r    c                   @  s   e Zd ZdS )ÚNeedDataNr   r   r   r   r   r!   /   s   r!   c                   @  s0   e Zd Zeƒ Zeƒ Zeƒ Zeƒ Zeƒ Zeƒ Z	dS )ÚStateN)
r   r   r   r   ÚPREAMBLEÚPARTÚDATAÚ
DATA_STARTÚEPILOGUEÚCOMPLETEr   r   r   r   r"   6   s   r"   s
   (?:
|
|)s   (?:

||

)s   %s[ 	]é   c                   @  s|   e Zd ZdZdddœdddddœdd	„Zdd
dœdd„Zdddœdd„Zddœdd„Zdddœdd„Zddd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)Ú	max_partsr   z
int | NoneÚNone)ÚboundaryÚmax_form_memory_sizer+   Úreturnc                C  s|   t ƒ | _d| _|| _|| _tj| _|| _t	 
dtt	 |¡ttf t	j¡| _t	 
dtt	 |¡ttf t	j¡| _d| _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Úcompleter.   r+   r"   r#   Ústater-   ÚreÚcompileÚ
LINE_BREAKÚescapeÚ	MULTILINEÚpreamble_reÚboundary_reÚ_search_positionÚ_parts_decoded)Úselfr-   r.   r+   r   r   r   Ú__init__T   s(    ÿý	ÿýzMultipartDecoder.__init__Úint)r   r/   c                 C  sb   z|  d¡}W n tk
r*   t|ƒ}Y nX z|  d¡}W n tk
rV   t|ƒ}Y nX t||ƒS )Nó   
ó   )ÚrindexÚ
ValueErrorÚlenÚmin)r=   r   Zlast_nlZlast_crr   r   r   Úlast_newline|   s    zMultipartDecoder.last_newlinezbytes | Nonec                 C  sJ   |d krd| _ n6| jd k	r:t| jƒt|ƒ | jkr:tƒ ‚n| j |¡ d S )NT)r2   r.   rD   r1   r   Úextend)r=   r   r   r   r   Úreceive_dataˆ   s    ÿþzMultipartDecoder.receive_datar
   )r/   c                 C  sº  t }| jtjkr¨| j | j| j¡}|d k	r„| d¡ 	d¡rDtj
| _ntj| _t| jd | ¡ … ƒ}| jd | ¡ …= t|d�}d| _n tdt| jƒt| jƒ t ƒ| _�nê| jtjk�rÂt | j| j¡}|d k	�rª|  | jd | ¡ … ¡}| ¡ | ¡  d }| jd |…= d|k�rtdƒ‚t|d ƒ\}}t t| d¡¡}| d	¡}	|	d k	�r`t|	||d
�}nt||d�}tj| _d| _|  jd7  _| j d k	�rÀ| j| j k�rÀt!ƒ ‚ntdt| jƒt ƒ| _nÐ| jtjk�r| j"| jdd�\}}
}| jd |
…= t#||d�}|�r’tj$| _n„| jtj$k�rX| j"| jdd�\}}
}| jd |
…= |�sJ|�s’t#||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é   ó   --)r   r   r   úcontent-dispositionz"Missing Content-Disposition headerr   r   )r   r   r   )r   r   T)Ústart)r   r   Fz&Invalid form-data cannot parse beyond )*Ú	NEED_DATAr3   r"   r#   r9   Úsearchr1   r;   ÚgroupÚ
startswithr'   r$   r   rL   Úendr   ÚmaxrD   r-   ÚSEARCH_EXTRA_LENGTHÚBLANK_LINE_REÚ_parse_headersrC   r	   ÚtÚcastr   Úgetr   r   r&   r<   r+   r   Ú_parse_datar   r%   r2   r    r(   Ú
isinstancer!   )r=   ÚeventÚmatchr   r   Zheaders_endÚdispositionÚextrar   r   Ú	del_indexr   r   r   r   Ú
next_event•   s|    

 ÿ


ÿ

ýþ
zMultipartDecoder.next_eventr   c                 C  s`   g }t  d|¡}| ¡ D ]>}| ¡ }|dkr| ¡  d¡\}}}| | ¡ | ¡ f¡ qt|ƒS )Nó    ó    ú:)ÚHEADER_CONTINUATION_REÚsubÚ
splitlinesÚstripÚdecodeÚ	partitionÚappendr   )r=   r   r   Úliner   Ú_Úvaluer   r   r   rU   ë   s    zMultipartDecoder._parse_headersr   ztuple[bytes, int, bool])r   rL   r/   c          	      C  s  |r&t  |¡}t tjt |¡ ¡ }nd}d| j }| j 	|¡dkrˆ|  
||d … ¡|  }}t|ƒ| td| ƒkr‚t|ƒ }}d}nj| j |¡}|d k	rÐ| d¡ d¡r¶tj| _ntj| _| ¡ }| ¡ }n|  
||d … ¡|  }}|d k}t|||… ƒ||fS )Nr   rJ   éÿÿÿÿr@   TrI   )ÚLINE_BREAK_REr\   rV   rW   ÚMatchr   rQ   r-   r1   ÚfindrF   rD   r:   rN   rO   rP   r"   r'   r3   r$   rL   )	r=   r   rL   r\   Z
data_startr-   Zdata_endr_   r   r   r   r   rY   ø   s(    



zMultipartDecoder._parse_data)N)
r   r   r   Ú__doc__r>   rF   rH   r`   rU   rY   r   r   r   r   r*   M   s   	 ýû(Vr*   c                   @  s,   e Zd Zdddœdd„Zdddœdd	„Zd
S )ÚMultipartEncoderr   r,   )r-   r/   c                 C  s   || _ tj| _d S )N)r-   r"   r#   r3   )r=   r-   r   r   r   r>      s    zMultipartEncoder.__init__r
   )r[   r/   c                 C  sz  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Ôd| j
 d }|d|j ¡  7 }t |tƒr„|d|j ¡  7 }|d7 }t t|¡jD ],\}}| ¡ dkrš||› d|› d� ¡ 7 }qštj| _|S t |tƒ�r| jtjk�rtj	| _t|jƒdk�rd|j S |jS n^t |tƒ�r8| jtj	k�r8|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"rK   z: z
r   s   --
zCannot generate z in state: )rZ   r   r3   r"   r#   r$   r   r   r   r%   r-   r   Úencoder   rV   rW   r   Úlowerr&   r   rD   r    r(   rC   )r=   r[   r   r   rm   r   r   r   Ú
send_event$  s:    ý

zMultipartEncoder.send_eventN)r   r   r   r>   rv   r   r   r   r   rs     s   rs   )"Ú
__future__r   r4   ÚtypingrV   Údataclassesr   Úenumr   r   Zdatastructuresr   Ú
exceptionsr   Úhttpr	   r
   r   r   r   r   r    r!   rM   r"   r6   r5   r8   rT   ro   rd   rS   r*   rs   r   r   r   r   Ú<module>   s<    S