
    ~lDh%+                       d dl mZ d dlZd dlmZmZ d dlmZ d dlm	Z	 d dl
mZ d dlmZmZmZ ej        rd dlZd dlmZmZmZ n2	 	 d dlZd d	lmZ n# e$ r d dlZd d	lmZ Y nw xY wn# e$ r dZdZY nw xY w G d
 de          Ze G d d                      ZddZ G d de          Z G d d          Z G d d          ZdS )    )annotationsN)	dataclassfield)Enum)SpooledTemporaryFile)unquote_plus)FormDataHeaders
UploadFile)MultipartCallbacksQuerystringCallbacksparse_options_header)r   c                  "    e Zd ZdZdZdZdZdZdS )FormMessage               N)__name__
__module____qualname__FIELD_START
FIELD_NAME
FIELD_DATA	FIELD_ENDEND     V/users/jtampere/www/backend/venv/lib/python3.11/site-packages/starlette/formparsers.pyr   r      s'        KJJI
CCCr   r   c                  ~    e Zd ZU dZded<   dZded<    ee          Zded	<   dZ	d
ed<    ee
          Zded<   dS )MultipartPartNzbytes | Nonecontent_disposition str
field_name)default_factory	bytearraydatazUploadFile | Nonefilezlist[tuple[bytes, bytes]]item_headers)r   r   r   r#   __annotations__r&   r   r(   r)   r*   listr+   r   r   r    r"   r"   #   s         (,,,,,JeI666D6666"D"""".3eD.I.I.ILIIIIIIr   r"   srcbytes | bytearraycodecr%   returnc                    	 |                      |          S # t          t          f$ r |                      d          cY S w xY w)Nlatin-1)decodeUnicodeDecodeErrorLookupError)r.   r0   s     r    _user_safe_decoder7   ,   sQ    %zz%   , % % %zz)$$$$$%s    &A A c                      e Zd ZddZdS )MultiPartExceptionmessager%   r1   Nonec                    || _         d S N)r:   selfr:   s     r    __init__zMultiPartException.__init__4   s    r   N)r:   r%   r1   r;   )r   r   r   r@   r   r   r    r9   r9   3   s(             r   r9   c                  F    e Zd ZddZddZddZddZddZddZddZ	dS )
FormParserheadersr
   stream"typing.AsyncGenerator[bytes, None]r1   r;   c                R    t           
J d            || _        || _        g | _        d S )NEThe `python-multipart` library must be installed to use form parsing.)	multipartrC   rD   messages)r?   rC   rD   s      r    r@   zFormParser.__init__9   s0    $$&m$$$9;r   c                V    t           j        df}| j                            |           d S Nr   )r   r   rI   appendr>   s     r    on_field_startzFormParser.on_field_start?   s+    *C0W%%%%%r   r)   bytesstartintendc                f    t           j        |||         f}| j                            |           d S r=   )r   r   rI   rL   r?   r)   rO   rQ   r:   s        r    on_field_namezFormParser.on_field_nameC   3    )4c	?;W%%%%%r   c                f    t           j        |||         f}| j                            |           d S r=   )r   r   rI   rL   rS   s        r    on_field_datazFormParser.on_field_dataG   rU   r   c                V    t           j        df}| j                            |           d S rK   )r   r   rI   rL   r>   s     r    on_field_endzFormParser.on_field_endK   s+    (#.W%%%%%r   c                V    t           j        df}| j                            |           d S rK   )r   r   rI   rL   r>   s     r    on_endzFormParser.on_endO   s*    ?C(W%%%%%r   r	   c                  K   | j         | j        | j        | j        | j        d}t          j        |          }d}d}g }| j        2 3 d {V }|r|                    |           n|	                                 t          | j                  }| j                                         |D ]\  }}	|t          j        k    rd}d}|t          j        k    r||	z  }0|t          j        k    r||	z  }F|t          j        k    r[t%          |                    d                    }
t%          |                    d                    }|                    |
|f           6 t+          |          S )N)rM   rT   rW   rY   r[   r   r3   )rM   rT   rW   rY   r[   rH   QuerystringParserrD   writefinalizer-   rI   clearr   r   r   r   r   r   r4   rL   r	   )r?   	callbacksparserr&   field_valueitemschunkrI   message_typemessage_bytesnamevalues               r    parsezFormParser.parseS   s      #1!/!/ -k+
 +
	 ,Y77
46  ; 	0 	0 	0 	0 	0 	0 	0% "U####!!!DM**HM!!!/7 0 0+m;#:::!$J"%KK![%;;;-/JJ![%;;;=0KK![%:::'
(9(9)(D(DEED(););I)F)FGGELL$///0 '( s   EN)rC   r
   rD   rE   r1   r;   r1   r;   r)   rN   rO   rP   rQ   rP   r1   r;   r1   r	   )
r   r   r   r@   rM   rT   rW   rY   r[   rj   r   r   r    rB   rB   8   s        < < < <& & & && & & && & & && & & && & & && & & & & &r   rB   c                  t    e Zd ZdZ	 dZ	 ddddddZd dZd!dZd dZd!dZ	d!dZ
d dZd dZd dZd"dZdS )#MultiPartParseri   i  )	max_files
max_fieldsmax_part_sizerC   r
   rD   rE   rp   int | floatrq   rr   rP   r1   r;   c                  t           
J d            || _        || _        || _        || _        g | _        d| _        d| _        d| _        d| _	        t                      | _        d| _        g | _        g | _        g | _        || _        d S )NrG   r   r   r$   )rH   rC   rD   rp   rq   rd   _current_files_current_fields_current_partial_header_name_current_partial_header_valuer"   _current_part_charset_file_parts_to_write_file_parts_to_finish_files_to_close_on_errorrr   )r?   rC   rD   rp   rq   rr   s         r    r@   zMultiPartParser.__init__   s     $$&m$$$"$9;
 36)47**__GI!:<"KM%*r   c                ,    t                      | _        d S r=   )r"   ry   r?   s    r    on_part_beginzMultiPartParser.on_part_begin   s    *__r   r)   rN   rO   rQ   c                j   |||         }| j         j        {t          | j         j                  t          |          z   | j        k    r(t          dt          | j        dz             d          | j         j                            |           d S | j        	                    | j         |f           d S )NzPart exceeded maximum size of i   zKB.)
ry   r*   lenr)   rr   r9   rP   extendr{   rL   )r?   r)   rO   rQ   rg   s        r    on_part_datazMultiPartParser.on_part_data   s    U3Y"*4%*++c-.@.@@4CUUU()m#dN`cgNgJhJh)m)m)mnnn#**=99999%,,d.@--PQQQQQr   c                F   | j         j        E| j                            | j         j        t          | j         j        | j                  f           d S | j                            | j                    | j                            | j         j        | j         j        f           d S r=   )	ry   r*   rd   rL   r&   r7   r)   rz   r|   r   s    r    on_part_endzMultiPartParser.on_part_end   s    "*J&1%d&8&=t}MM     &--d.@AAA Jt1<d>P>UVWWWWWr   c                6    | xj         |||         z  c_         d S r=   )rw   r?   r)   rO   rQ   s       r    on_header_fieldzMultiPartParser.on_header_field   s$    ))T%)_<))))r   c                6    | xj         |||         z  c_         d S r=   )rx   r   s       r    on_header_valuezMultiPartParser.on_header_value   s$    **d59o=****r   c                    | j                                         }|dk    r| j        | j        _        | j        j                            || j        f           d| _         d| _        d S )Ns   content-dispositionr   )rw   lowerrx   ry   r#   r+   rL   )r?   r   s     r    on_header_endzMultiPartParser.on_header_end   sh    17799***595WD2'..t7Y/Z[[[,/)-0***r   c                   t          | j        j                  \  }}	 t          |d         | j                  | j        _        n# t          $ r t          d          w xY wd|v r| xj        dz  c_        | j        | j	        k    rt          d| j	         d          t          |d         | j                  }t          | j                  }| j                            |           t          |d|t          | j        j        	          
          | j        _        d S | xj        dz  c_        | j        | j        k    rt          d| j         d          d | j        _        d S )Ns   namez=The Content-Disposition header field "name" must be provided.s   filenamer   z+Too many files. Maximum number of files is .)max_sizer   )raw)r*   sizefilenamerC   z-Too many fields. Maximum number of fields is )r   ry   r#   r7   rz   r&   KeyErrorr9   ru   rp   r   spool_max_sizer}   rL   r   r
   r+   r*   rv   rq   )r?   dispositionoptionsr   tempfiles        r    on_headers_finishedz#MultiPartParser.on_headers_finished   s   3D4F4Z[[W	f,=gg>NPTP],^,^D)) 	f 	f 	f$%deee	f'!!1$"T^33()hW[We)h)h)hiii()=t}MMH+T5HIIIH)00:::&0!D$6$CDDD	' ' 'D###   A%  #do55()kY]Yh)k)k)klll&*D###s   %A Ac                    d S r=   r   r   s    r    r[   zMultiPartParser.on_end   s    r   r	   c           	       K   t          | j        d                   \  }}|                    dd          }t          |t                    r|                    d          }|| _        	 |d         }n# t          $ r t          d          w xY w| j	        | j
        | j        | j        | j        | j        | j        | j        d}t#          j        ||          }	 | j        2 3 d {V }|                    |           | j        D ].\  }}	|j        sJ |j                            |	           d {V  /| j        D ]+}|j        sJ |j                            d           d {V  ,| j                                         | j                                         6 n2# t          $ r%}
| j        D ]}|                                 |
d }
~
ww xY w|                                 t;          | j                  S )	NzContent-Types   charsetzutf-8r3   s   boundaryzMissing boundary in multipart.)r   r   r   r   r   r   r   r[   r   )r   rC   get
isinstancerN   r4   rz   r   r9   r   r   r   r   r   r   r   r[   rH   MultipartParserrD   r^   r{   r*   r|   seekr`   r}   closer_   r	   rd   )r?   _paramscharsetboundaryra   rb   re   partr)   excr*   s               r    rj   zMultiPartParser.parse   sb     (n)EFF	6**Z11gu%% 	0nnY//G	Gk*HH 	G 	G 	G$%EFFF	G
 "/ -+#3#3!/#'#;k	)
 	)
	 *8Y??	#{ 3 3 3 3 3 3 3eU### #'"; 0 0JD$9$$$)//$////////// 6 , ,D9$$$)..++++++++++)//111*002222  +{ " 	 	 	5  

I		 	
###s1   (A1 1BF F$B3F 
G" GGN)rC   r
   rD   rE   rp   rs   rq   rs   rr   rP   r1   r;   rk   rl   rm   )r   r   r   r   rr   r@   r   r   r   r   r   r   r   r[   rj   r   r   r    ro   ro   |   s	        NQM> "&"&(+ + + + + +4- - - -R R R RX X X X= = = => > > >1 1 1 1+ + + +2   2$ 2$ 2$ 2$ 2$ 2$r   ro   )r.   r/   r0   r%   r1   r%   ) 
__future__r   typingdataclassesr   r   enumr   r   r   urllib.parser   starlette.datastructuresr	   r
   r   TYPE_CHECKINGpython_multipartrH   python_multipart.multipartr   r   r   ModuleNotFoundErrormultipart.multipartr   r"   r7   	Exceptionr9   rB   ro   r   r   r    <module>r      ss   " " " " " "  ( ( ( ( ( ( ( (       ) ) ) ) ) ) % % % % % % B B B B B B B B B B	 $((((iiiiiiiiiii	$	A0000GGGGGGG" 	A 	A 	A@@@@@@@@	A  $ $ $	#$
    $    J J J J J J J J% % % %       
A A A A A A A AHW$ W$ W$ W$ W$ W$ W$ W$ W$ W$s0   
A A( A$!A( #A$$A( (	A43A4