B
    Ǉb/"                 @   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   m/var/www/downstreamdata.science/rtclock/rtclock-venv/lib/python3.7/site-packages/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   N)r   r   r   r   r   r   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   N)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	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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 d}W n tk
r.   t| j }Y nX y| j d}W n tk
r^   t| j }Y nX t||S )N   
   )r0   rindex
ValueErrorlenmin)r:   Zlast_nl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| d S )NT)r1   r-   r@   r0   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   zcontent-dispositionz"Missing Content-Disposition headerr   r   )r   r   r   )r   r   T)r   r!   z&Invalid form-data cannot parse beyond )#	NEED_DATAr2   r%   r&   r8   searchr0   group
startswithr)   r'   r   startendr   BLANK_LINE_RE_parse_headersr?   r   r   r   getr   r   r(   findr,   rC   r9   r    r1   r#   r*   
isinstancer$   )r:   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 d|}xJ| D ]>}| dkrt| dd\}}|| | f qW t|S )N        :rF   )HEADER_CONTINUATION_REsub
splitlinesstripr   splitappendr   )r:   r   r   liner   valuer   r   r   rO      s    zMultipartDecoder._parse_headers)N)r   r   r   __doc__r   r   intr;   rC   rE   r   rW   r   rO   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&   r2   )r:   r,   r   r   r   r;      s    zMultipartEncoder.__init__)rS   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 ],\}}| dkr|t| d| d7 }qW |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"zcontent-dispositionz: z
s   --
zCannot generate z in state: )rR   r   r2   r%   r&   r'   r   r   r   r(   r,   r
   r   r   r   r   lowerr    r#   r*   r?   )r:   rS   r   r   rb   r   r   r   
send_event   s0    

zMultipartEncoder.send_event)r   r   r   r   r;   r   rg   r   r   r   r   re      s   re   )%r3   dataclassesr   enumr   r   typingr   r   r   r   	_internalr
   r   Zdatastructuresr   
exceptionsr   httpr   r   r   r   r   r    r#   r$   rH   r%   r5   r4   r7   rN   ZLINE_BREAK_REr[   r+   re   r   r   r   r   <module>   sB   
 