
    E0j                          d dl Z d dlZ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  G d d          Zd Z G d	 d
e          Z G d de	          ZdS )    N)BytesIO)
BaseStreamREADABLE)	DaraModel)	urlencodec                   Z    e Zd Zededefd            Zed             Zed             ZdS )Formvalreturnc                 ~      sdS t          t                               } fd|D             }t          |          S )z`
        Format a map to form string, like a=a%20b%20c
        @return: the form string
         c                 X    i | ]&}t          |         t                    ||         'S  )
isinstancer   ).0kr
   s     \/home/rurouni/.hermes/hermes-agent/venv/lib/python3.11/site-packages/darabonba/utils/form.py
<dictcomp>z'Form.to_form_string.<locals>.<dictcomp>   s2    KKKQjQ.J.JKq#a&KKK    )sortedlistr   )r
   keysdics   `  r   to_form_stringzForm.to_form_string   sJ      	2d3ii  KKKK$KKK~~r   c                  x    dt          t          j                    dz            z  } |                     d          S )Nz%sl    @ k    )intrandomzfill)results    r   get_boundaryzForm.get_boundary   s1    FMOOo=>>>||Br   c                 "    t          | |          S N)FileFormInputStream)formboundarys     r   to_file_formzForm.to_file_form   s    "4222r   N)	__name__
__module____qualname__staticmethoddictstrr   r!   r'   r   r   r   r	   r	   	   sx        	   \     \  3 3 \3 3 3r   r	   c                    t          | d          r| j        S t          | t                    r|                                 j        S t          | d          r$t          j                            | j	                  S t          |           S )Nlenfileno)
hasattrr/   r   r   	getbuffernbytesospathgetsizename)os    r   _lengthr9   "   sq    q% 'u	Aw		 '{{}}##	H		 'wqv&&&q66Mr   c                   ^     e Zd Zd fd	Zd Zd Zd Zd Zd Zd Z	d	 Z
ddZd Zd Z xZS )r$      c                 .   t                                          |           || _        || _        d| _        i | _        i | _        g | _        |                                  d| _	        | 
                                 t          | j	                  | _        d S )Nr   r   )super__init__r%   r&   file_size_leftformsfiles
files_keys_to_mapform_str_build_str_formsr/   
str_length)selfr%   r&   size	__class__s       r   r>   zFileFormInputStream.__init__-   s    	 

dm,,r   c                     | j                                         D ]I\  }}t          |t                    r%|| j        |<   | j                            |           ?|| j        |<   Jd S r#   )r%   itemsr   	FileFieldrA   rB   appendr@   )rG   r   vs      r   rC   zFileFormInputStream._to_map<   sn    IOO%% 	" 	"DAq!Y'' " !
1&&q)))) !
1	" 	"r   c                     d}d}t          t          | j                            }|D ]}| j        |         }||| j        ||fz  z  } |                    d          | _        d S )Nr   z7--%s
Content-Disposition: form-data; name="%s"

%s
utf-8)r   r   r@   r&   encoderD   )rG   rD   str_fmt
forms_listkeyvalues         r   rE   z$FileFormInputStream._build_str_formsD   sn    SD,,--
 	> 	>CJsOE4=#u"===HH 00r   c                    d}| j                                         D ]\  }}t          |j                            d                    t          |j                  z   t          |                    d                    z   t          | j                  z   dz   }|t          |j                  |z   z  }| j	        |z   t          | j                  z   dz   }|S )Nr   rP   N      )
rA   rK   r/   filenamerQ   content_typer&   r9   contentrF   )rG   file_lengthr   fffield_lengthstream_lengths         r   _get_stream_lengthz&FileFormInputStream._get_stream_lengthM   s    Z%%'' 	> 	>EArr{11'::;;c"/>R>RRqxx00112474F4FGIKLL 72:..==KK+5DM8J8JJQNr   c                 *    |                                  S r#   )r`   rG   s    r   __len__zFileFormInputStream.__len__X   s    &&(((r   c                     | S r#   r   rb   s    r   __iter__zFileFormInputStream.__iter__[   s    r   c                 :    |                      | j        d          S )NT)loop)readrH   rb   s    r   __next__zFileFormInputStream.__next__^   s    yyy...r   c                    d}d}d}| j         r| j        d d          D ]}|dk    r n| j        |         }|j                            |          }t          |t                    r|                    d          }| j         |k    r<|d|z  z  }d| _         |t          |          z  }| j        	                    |           ||z  }| xj         |z  c_         |t          |          z  }ʐni| j        d d          D ]X}|dk    r nN| j        |         }t          |j                  }|| _         |j                            |          }t          |t                    r|                    d          }|| j        |fz  }	||j                            d          |j                            d          |fz  }
| j         |k     rR|d|	                    d          |
fz  z  }d| _         |t          |          z  }| j        	                    |           |d|	                    d          |
fz  z  }| xj         |z  c_         |t          |          z  }Z|S )	Nr   z0--%s
Content-Disposition: form-data; name="%s";s&    filename="%s"
Content-Type: %s

%sr   rP   s   %s
s   %s%s
s   %s%s)r?   rB   rA   r[   rh   r   r-   rQ   r/   remover9   r&   rY   rZ   )rG   rH   rD   	start_fmtcontent_fmtrT   
file_fieldfile_content	file_sizestartr[   s              r   file_strzFileFormInputStream.file_stra   s   H	E -	.qqq) . .199E!Z_
)166t<<lC00 @#/#6#6w#?#?L&$..	L 88H*+D'C---DO**3////,H''4/''C---DDqqq) . .199E!Z_
#J$677	&/#)166t<<lC00 @#/#6#6w#?#?L "T]C$88%'..w77+227;; ) 
 &--u||G/D/Dg.N NNH*+D'C---DO**3////5<<+@+@'*J JJH''4/''C---DDr   NFc                    | j         s&| j        s|                                  |rt          dS |t          j        }| j        rO| j        d |         }| j        |d          | _        t          |          |k     r||                     |          z  }n|                     |          }| j        s'| j         s |d| j        	                    d          z  z  }|S )Nr   s   --%s--
rP   )
rB   rD   refreshStopIterationsysmaxsizer/   rr   r&   rQ   )rG   rH   rg   rD   s       r   rh   zFileFormInputStream.read   s     	t} 	LLNNN ##s<;D= 	+}UdU+H M$%%0DM8}}t##DMM$///}}T**H} 	FT_ 	F(<(<W(E(EEEHr   c                     | j                                         D ]2}t          |j        d          r|j                            dd           3d S )Nseekr   )rA   valuesr1   r[   ry   )rG   r]   s     r   refresh_cursorz"FileFormInputStream.refresh_cursor   sT    *##%% 	& 	&Brz6** &
1%%%	& 	&r   c                     d| _         |                                  |                                  |                                  d S )Nr   )r?   rC   rE   r{   rb   s    r   rt   zFileFormInputStream.refresh   sA    r   )r;   )NF)r(   r)   r*   r>   rC   rE   r`   rc   re   ri   rr   rh   r{   rt   __classcell__)rI   s   @r   r$   r$   ,   s        - - - - - -" " "1 1 1	 	 	) ) )  / / /5 5 5n   .& & &
      r   r$   c                   ,    e Zd ZddZd Zd Zi fdZdS )rL   Nc                 0    || _         || _        || _        d S r#   rY   rZ   r[   )rG   rY   rZ   r[   s       r   r>   zFileField.__init__   s     (r   c                     |                      | j        d           |                      | j        d           |                      | j        d           d S )NrY   rZ   r[   )validate_requiredrY   rZ   r[   rb   s    r   validatezFileField.validate   sQ    t}j999t0.AAAt|Y77777r   c                 F    i }| j         |d<   | j        |d<   | j        |d<   |S NrY   contentTyper[   r   )rG   r    s     r   to_mapzFileField.to_map   s1    !]z $ 1} Lyr   c                     |                     d          | _        |                     d          | _        |                     d          | _        | S r   )getrY   rZ   r[   )rG   maps     r   from_mapzFileField.from_map   sA    
++GGM22wwy))r   )NNN)r(   r)   r*   r>   r   r   r   r   r   r   rL   rL      s_           
8 8 8
         r   rL   )r4   rv   _ior   r   darabonba.utils.streamr   r   darabonba.corer   urllib.parser   r	   r9   r$   rL   r   r   r   <module>r      s   				 



        7 7 7 7 7 7 7 7 $ $ $ $ $ $ " " " " " "3 3 3 3 3 3 3 32  L L L L L* L L L\    	     r   