U a/"@sddlZddlmZddlmZddlmZddlmZddlmZddlm Z ddlm Z d d l m Z d d l m Z d d lmZd d lmZd dlmZGdddZeddGdddeZeddGdddeZeddGdddeZeddGdddeZeddGdddeZGdddeZeZGdd d eZd!Zed"ejZ eeejZ!ed#eejZ"Gd$d%d%Z#Gd&d'd'Z$dS)(N) dataclass)auto)Enum)cast)List)Optional)Tuple) _to_bytes)_to_str)Headers)RequestEntityTooLarge)parse_options_headerc@s eZdZdS)EventN__name__ __module__ __qualname__rrZC:\Users\vtejo\AppData\Local\Temp\pip-unpacked-wheel-1tps7o9u\werkzeug\sansio\multipart.pyrsrT)frozenc@seZdZUeed<dS)PreambledataNrrrbytes__annotations__rrrrrs rc@seZdZUeed<eed<dS)FieldnameheadersNrrrstrrr rrrrrs rc@s&eZdZUeed<eed<eed<dS)FilerfilenamerNrrrrrr! s r!c@seZdZUeed<eed<dS)Datar more_dataN)rrrrrboolrrrrr#'s r#c@seZdZUeed<dS)EpiloguerNrrrrrr&-s r&c@s eZdZdS)NeedDataNrrrrrr'2sr'c@s*eZdZeZeZeZeZeZdS)StateN) rrrrPREAMBLEPARTDATAEPILOGUECOMPLETErrrrr(9s r(s (?: | | )s(?: | | )s%s[ ]c@sheZdZdZdeeeddddZedddZeedd d d Z e dd d Z ee d ddZ dS)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)boundarymax_form_memory_sizereturncCsjt|_d|_||_tj|_||_t dt t |t t ftj |_ t dt t |t t ftj |_dS)NFs%%s?--%s(--[^\S\n\r]*%s?|[^\S\n\r]*%s)s$%s--%s(--[^\S\n\r]*%s?|[^\S\n\r]*%s)) bytearraybuffercompleter0r(r)stater/recompile LINE_BREAKescape MULTILINE preamble_re boundary_re)selfr/r0rrr__init__Rs"  zMultipartDecoder.__init__)r1cCsjz|jd}Wntk r.t|j}YnXz|jd}Wntk r^t|j}YnXt||S)N  )r3rindex ValueErrorlenmin)r=Zlast_nlZlast_crrrr last_newlineuszMultipartDecoder.last_newline)rr1cCsJ|dkrd|_n6|jdk r:t|jt||jkr:tn |j|dS)NT)r4r0rCr3r extend)r=rrrr receive_dataszMultipartDecoder.receive_datac Csht}|jtjkr||j|j}|dk rx|ddr@tj |_ntj |_t |jd| }|jd| =t|d}n|jtj kr4t|j}|dk r@||jd| }|jd| =d|krtdt|d\}}tt|d}|d}|dk rt|||d}n t||d }tj|_n |jtjkr|jd|jd krl|} } d } nb|j|j}|dk r|ddrtj |_ntj |_| } | } n |} } |dk} t |jd| }|jd| =|s| s@t|| d }n:|jtj kr@|jr@tt |jd}|jdd=tj |_|jrdt!|t"rdtd |j|S)Ns--)rcontent-dispositionz"Missing Content-Disposition headerrr")r"rr)rrT)rr$z&Invalid form-data cannot parse beyond )# NEED_DATAr5r(r)r;searchr3group startswithr,r*rstartendr BLANK_LINE_RE_parse_headersrBrrr getr!rr+findr/rEr<r#r4r&r- isinstancer') r=eventmatchrr dispositionextrarr"Z data_lengthZ del_indexr$rrr next_eventsr               zMultipartDecoder.next_eventcCs`g}td|}|D]>}|dkrt|dd\}}|||fqt|S)N :rH)HEADER_CONTINUATION_REsub splitlinesstripr splitappendr )r=rrlinervaluerrrrRs   zMultipartDecoder._parse_headers)N)rrr__doc__rrintr>rErGrrZr rRrrrrr.Ks  #  Mr.c@s,eZdZeddddZeedddZdS)MultipartEncoderN)r/r1cCs||_tj|_dS)N)r/r(r)r5)r=r/rrrr>szMultipartEncoder.__init__)rVr1cCs8t|tr$|jtjkr$tj|_|jSt|ttfr|jtjtjtj hkrtj |_d|j d}|dt |j 7}t|tr|dt |j 7}|d7}tt|jD],\}}|dkr|t |d|d7}q|d7}|St|tr|jtj kr|jSt|trtj|_d|j d|jStd |d |jdS) Ns --s s)Content-Disposition: form-data; name="%s"s; filename="%s"rIz: z s-- zCannot generate z in state: )rUrr5r(r)r*rrr!r+r/r rr"rrlowerr#r&r-rB)r=rVrrrerrr send_events2   zMultipartEncoder.send_event)rrrrr>rrjrrrrrhsrh)%r6Z dataclassesrenumrrtypingrrrr _internalr r Zdatastructuresr exceptionsr httprrrrr!r#r&r'rKr(r8r7r:rQZ LINE_BREAK_REr^r.rhrrrrsB