a
    0hu-                     @  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   G/var/www/auris/lib/python3.9/site-packages/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 )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)	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  s^   z| d}W n ty(   t|}Y n0 z| d}W n tyR   t|}Y n0 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 u rd| _ n6| jd u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 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r| | jd |  }| |  d }| jd |= d|vrtdt|d \}}tt|d}|d	}	|	d ur`t|	||d
}nt||d}tj| _d| _|  jd7  _| j d ur| j| j krt! ntdt| jt | _n| jtjkr| j"| jdd\}}
}| jd |
= t#||d}|rtj$| _n| jtj$krX| j"| jdd\}}
}| jd |
= |sJ|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      --)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   sz    







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rt| }}d}nj| j|}|d ur|ddrtj| _ntj| _| }| }n| 
||d  |  }}|d u }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v rd| j
 d }|d|j  7 }t |tr|d|j  7 }|d7 }tt|jD ],\}}| dkr|| d| d 7 }qt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   Z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