a
    -=ic&                     @   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"d$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   j/home/droni/.local/share/virtualenvs/DPS-5Je3_V2c/lib/python3.9/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   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   sp   t  | _d| _|| _tj| _|| _t	dt
t|t
t
f tj| _t	dt
t|t
t
f tj| _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completer1   r(   r)   stater0   recompile
LINE_BREAKescape	MULTILINEpreamble_reboundary_re_search_position)selfr0   r1   r   r   r   __init__V   s$    	zMultipartDecoder.__init__)r2   c                 C   sf   z| j d}W n ty,   t| j }Y n0 z| j d}W n tyZ   t| j }Y n0 t||S )N   
   )r4   rindex
ValueErrorlenmin)r?   Zlast_nllast_crr   r   r   last_newlinez   s    zMultipartDecoder.last_newline)r   r2   c                 C   sJ   |d u rd| _ n6| jd ur:t| jt| | jkr:t n| j| d S )NT)r5   r1   rE   r4   r   extend)r?   r   r   r   r   receive_data   s    zMultipartDecoder.receive_datac                 C   s  t }| jtjkr| j| j| j}|d u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rt| j| j}|d urj| | jd |  }| jd | = d|vr
tdt|d \}}tt|d}|d}|d urNt|||d	}nt||d
}tj| _d| _ntdt| jt | _n| jtjkrV| jd| j dkr|   }	}
d}nb| j | j}|d ur
|d	drtj
| _ntj| _| }	| }
n|   }	}
|d u }t| jd |	 }| jd |
= |sH|st!||d}n:| jtj
kr| j"rt#t| jd}| jd d = tj$| _| j"rt%|t&rtd| j |S )N   s   --)r   r   content-dispositionz"Missing Content-Disposition headerr   r"   )r"   r   r   )r   r   T)r   r$   z&Invalid form-data cannot parse beyond )'	NEED_DATAr6   r(   r)   r<   searchr4   r>   group
startswithr,   r*   r   startendr   maxrE   r0   SEARCH_EXTRA_LENGTHBLANK_LINE_RE_parse_headersrD   r   r   r    getr!   r   r+   findrH   r=   r#   r5   r&   r-   
isinstancer'   )r?   eventmatchr   r   Zdispositionextrar   r"   Zdata_lengthZ	del_indexr$   r   r   r   
next_event   s~    









zMultipartDecoder.next_eventc                 C   s`   g }t d|}| D ]>}| dkrt| dd\}}|| | f qt|S )N        :rK   )HEADER_CONTINUATION_REsub
splitlinesstripr   splitappendr   )r?   r   r   liner   valuer   r   r   rW      s    zMultipartDecoder._parse_headers)N)r   r   r   __doc__r   r   intr@   rH   rJ   r   r^   r   rW   r   r   r   r   r/   O   s   	 $[r/   c                   @   s,   e Zd ZeddddZeedddZdS )MultipartEncoderN)r0   r2   c                 C   s   || _ tj| _d S )N)r0   r(   r)   r6   )r?   r0   r   r   r   r@      s    zMultipartEncoder.__init__)r[   r2   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v 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"rL   z: z
s   --
zCannot generate z in state: )rZ   r   r6   r(   r)   r*   r   r   r!   r+   r0   r
   r   r"   r   r   lowerr#   r&   r-   rD   )r?   r[   r   r   ri   r   r   r   
send_event   s2    
zMultipartEncoder.send_event)r   r   r   r   r@   r   rn   r   r   r   r   rl      s   rl   )&r7   dataclassesr   enumr   r   typingr   r   r   r   	_internalr
   r   Zdatastructuresr   
exceptionsr   httpr   r   r   r   r!   r#   r&   r'   rN   r(   r9   r8   r;   rV   ZLINE_BREAK_RErb   rU   r/   rl   r   r   r   r   <module>   sD   
 *