o
    ßý°j».  ã                   @  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                   @  ó   e Zd ZdS )ÚEventN©Ú__name__Ú
__module__Ú__qualname__© r   r   úŒ/root/aizidognhua/tmp/workspace/projects/ec89d86c-575f-41c9-af57-ac45cbdbf775/venv/lib/python3.10/site-packages/werkzeug/sansio/multipart.pyr      ó    r   T)Úfrozenc                   @  ó   e Zd ZU ded< dS )ÚPreambleÚbytesÚdataN©r   r   r   Ú__annotations__r   r   r   r   r      ó   
 r   c                   @  ó   e Zd ZU ded< ded< dS )ÚFieldÚstrÚnamer   ÚheadersNr   r   r   r   r   r      ó   
 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                   @  r   )ÚDatar   r   ÚboolÚ	more_dataNr   r   r   r   r   r#   $   r    r#   c                   @  r   )ÚEpiloguer   r   Nr   r   r   r   r   r&   *   r   r&   c                   @  r
   )ÚNeedDataNr   r   r   r   r   r'   /   r   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                   @  sV   e Zd ZdZ	d ddœd!dd„Zd"dd„Zd#dd„Zd$dd„Zd%dd„Zd&dd„Z	dS )'ÚMultipartDecodera  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.

    .. versionchanged:: 3.1.4
        Handle chunks that split a``
`` sequence.
    N)Ú	max_partsÚboundaryr   Úmax_form_memory_sizeú
int | Noner1   ÚreturnÚNonec                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Úcompleter3   r1   r(   r)   Ústater2   ÚreÚcompileÚ
LINE_BREAKÚescapeÚ	MULTILINEÚpreamble_reÚboundary_reÚ_search_positionÚ_parts_decoded)Úselfr2   r3   r1   r   r   r   Ú__init__W   s(   ÿý	ÿý
zMultipartDecoder.__init__r   úbytes | Nonec                 C  sJ   |d u r	d| _ d S | jd urt| jƒt|ƒ | jkrtƒ ‚| j |¡ d S )NT)r9   r3   Úlenr8   r   Úextend)rD   r   r   r   r   Úreceive_data   s   

zMultipartDecoder.receive_datar   c                 C  s¨  t }| jtjkrS| j | j| j¡}|d urB| d¡ 	d¡r"t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 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rÍt!ƒ ‚nrtdt| jƒt ƒ| _nf| jtjkrþ| j"| jdd�\}}
}| jd |
…= t#||d�}|rýtj$| _nB| jtj$k�r#| j"| jd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%�rRt(|t)ƒ�rRt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_DATAr:   r(   r)   r@   Úsearchr8   rB   ÚgroupÚ
startswithr-   r*   r   rM   Úendr   ÚmaxrG   r2   ÚSEARCH_EXTRA_LENGTHÚBLANK_LINE_REÚ_parse_headersÚ
ValueErrorr	   ÚtÚcastr   Úgetr!   r   r,   rC   r1   r   Ú_parse_datar#   r+   r9   r&   r.   Ú
isinstancer'   )rD   ÚeventÚmatchr   r   Úheaders_endÚdispositionÚextrar   r"   Ú	del_indexr%   r   r   r   Ú
next_eventŒ   s€   

ÿÿ
ýþ€€€zMultipartDecoder.next_eventúbytes | bytearrayr   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   )rD   r   r   Úliner   Ú_Úvaluer   r   r   rV   á   s   €zMultipartDecoder._parse_headersrM   r$   útuple[bytes, int, bool]c                C  sà   |rt  |¡}t tjt |¡ ¡ }nd}| j d| j	 ¡dkr0|  
||d … ¡|  }}d}n5| j |¡}|d urT| d¡ d¡rGtj| _ntj| _| ¡ }| ¡ }n|  
||d … ¡|  }}|d u }t|||… ƒ||fS )Nr   rK   éÿÿÿÿTrJ   )ÚLINE_BREAK_REr^   rX   rY   ÚMatchr   rR   r8   Úfindr2   Ú_last_partial_boundary_indexrA   rO   rP   rQ   r(   r-   r:   r*   rM   )rD   r   rM   r^   Ú
data_startÚdata_endrb   r%   r   r   r   r[   î   s&   
ÿ

ÿzMultipartDecoder._parse_dataÚintc                 C  s”   t |ƒt d| j ƒ }z| d¡}W n ty   t |ƒ}Y n	w ||k r(t |ƒ}z| d¡}W n ty<   t |ƒ}Y n	w ||k rEt |ƒ}t||ƒS )Nó   
--ó   
ó   )rG   r2   ÚrindexrW   Úmin)rD   r   Úcomplete_boundary_indexÚlast_nlÚlast_crr   r   r   rw     s    ÿÿ
z-MultipartDecoder._last_partial_boundary_index©N)r2   r   r3   r4   r1   r4   r5   r6   )r   rF   r5   r6   )r5   r   )r   rd   r5   r   )r   rd   rM   r$   r5   rr   )r   rd   r5   rz   )
r   r   r   Ú__doc__rE   rI   rc   rV   r[   rw   r   r   r   r   r0   M   s    ýû
(

U
!r0   c                   @  s    e Zd Zddd„Zdd	d
„ZdS )ÚMultipartEncoderr2   r   r5   r6   c                 C  s   || _ tj| _d S rƒ   )r2   r(   r)   r:   )rD   r2   r   r   r   rE   (  s   zMultipartEncoder.__init__r]   r   c                 C  sh  t |tƒr| jtjkrtj| _|jS t |ttfƒrj| jtjtjtj	hv rjd| j
 d }|d|j ¡  7 }t |tƒrB|d|j ¡  7 }|d7 }t t|¡jD ]\}}| ¡ dkrc||› d|› d� ¡ 7 }qMtj| _|S t |tƒrˆ| jtjkrˆtj	| _t|jƒdkr…d|j S |j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› �ƒ‚)Nr{   s   
s)   Content-Disposition: form-data; name="%s"s   ; filename="%s"rL   z: z
r   s   --
zCannot generate z in state: )r\   r   r:   r(   r)   r*   r   r   r!   r+   r2   r   Úencoder"   rX   rY   r   Úlowerr,   r#   rG   r&   r.   rW   )rD   r]   r   r   rq   r   r   r   Ú
send_event,  s<   ý
€

zMultipartEncoder.send_eventN)r2   r   r5   r6   )r]   r   r5   r   )r   r   r   rE   rˆ   r   r   r   r   r…   '  s    
r…   )"Ú
__future__r   r;   ÚtypingrX   Údataclassesr   Úenumr   r   Údatastructuresr   Ú
exceptionsr   Úhttpr	   r   r   r   r!   r#   r&   r'   rN   r(   r=   r<   r?   rU   rt   rh   rT   r0   r…   r   r   r   r   Ú<module>   s>     [