Sindbad~EG File Manager
�
&ΜgY���ddlZddlZddlZddlZddlmZddlmZmZddl m
Z
ddlmZejd�ZGd�d�Ze�e_Gd �d
�Zd�Zdifd
ed�fded�fdifdifdddgifded�fded�fded�fdddgifdddgifdddgifdddgifded�fd ed!�fd"d#gd$gd%�fd&dd#d'gifd(d)gd*gd+gd,�fd-d.gd/gd0gd1gd2gd3gd4gd5gd6�fd7d8gd9gd:gd)gd;gd<gd=�fgZd>�Zd?�Zd@�ZdA�ZGdB�dCej0�ZdDZdEZdFZdGZdHZedIk(rej@�yy)J�N)�
namedtuple)�StringIO�BytesIO)�support)�warnings_helper�cgic�(�eZdZgZej
Zy)�HackedSysModuleN)�__name__�
__module__�__qualname__�argv�sys�stdin���*/usr/local/lib/python3.12/test/test_cgi.pyr
r
s���D��I�I�Err
c�$�eZdZd�Zd�Zd�Zd�Zy)�ComparableExceptionc��||_y�N)�err)�selfrs r�__init__zComparableException.__init__s ����rc�,�t|j�Sr)�strr�rs r�__str__zComparableException.__str__s���4�8�8�}�rc��t|t�stS|jj|jk(xr#|jj
|j
k(Sr)�
isinstance� Exception�NotImplementedr� __class__�args)r�anExcs r�__eq__zComparableException.__eq__sF���%��+�!�!����"�"�e�o�o�5�,����
�
����+� -rc�.�t|j|�Sr)�getattrr)r�attrs r�__getattr__zComparableException.__getattr__"s���t�x�x��&�&rN)rrr
rrr&r*rrrrrs����-�'rrc�<�i}|dk(r
d}d|d<||d<nO|dk(r<t|jd��}d|d<d|d<tt|��|d<nt d |z�� t
j
||d
��S#t$r}t|�cYd}~Sd}~wwxYw)N�GET�REQUEST_METHOD�QUERY_STRING�POST�latin-1�!application/x-www-form-urlencoded�CONTENT_TYPE�CONTENT_LENGTHzunknown method: %s�)�strict_parsing) r�encoder�len�
ValueErrorr�parser!r)�buf�method�env�fprs r�do_testr>%s���
�C�
���
�� %����!��N�� �6� �
�S�Z�Z� �*�
+�� &����A��N�� #�C��H�
�����-��6�7�7�(��y�y��S��y�3�3���(�"�3�'�'��(�s�%A=�= B�
B�B�B��&�bad query field: ''z&&�=z=&=z=a�az&=az=a&z=&a�bad query field: 'a'zb=a�bzb+=azb za=b=aza=+b=az b=az&b=azb&=a�bad query field: 'b'za=a+b&b=b+c�a b�b c�rCrEza=a+b&a=b+a�b azx=1&y=2.0&z=2-3.%2b0�1�2.0�2-3.+0��x�y�zz�Hbc5161168c542333633315dee1182227:key_store_seqid=400006&cuyer=r&view=bustomer&order_id=0bb2e248638833d48cb7fed300000f1b&expire=964546263&lobale=en-US&kid=130003.300038&ss=env�400006�r� 964546263z
130003.300038zen-US� 0bb2e248638833d48cb7fed300000f1br<�bustomer)z1Hbc5161168c542333633315dee1182227:key_store_seqid�cuyer�expire�kid�lobale�order_id�ss�viewzQgroup_id=5470&set=custom&_assigned_to=31392&_status=1&_category=100&SUBMIT=Browse�Browse�31392�100�5470�custom)�SUBMIT�_assigned_to� _category�_status�group_id�setc�$�t|t��S)N)�key)�sorted�repr)�seqs r�normrnas���#�4� � rc�2�|D�cgc]}|d�� c}Scc}w�Nrr��list�ps r�
first_eltsrtds����$�Q�A�a�D�$����s�c�B�|D�cgc]}|d|ddf��c}Scc}w)Nrr4rrqs r�first_second_eltsrvgs*��%)�*�T��Q�q�T�1�Q�4��7�O�T�*�*��*s�c�>�d}t|j|��}|jd�tj |||��}i}t|�j
�D]9\}}t|t�xr|j|�xs|j||<�;|S)Nr0r)r=�environ�encoding)rr6�seekr�FieldStorage�dict�itemsr rr�getlist�value)�datarxry�
fake_stdin�form�result�k�vs r�
gen_resultr�js����H�����X�.�/�J��O�O�A�����z�7�X��N�D�
�F��T�
� � �"���1��q�$�'�;�D�L�L��O�F�q�w�w��q� �#��Mrc���eZdZd�Zd�Zd�Zd�Zd�Zd�Zd�Z e
je��d ��Z
d
�Zd�Zd�Zd
�Zd�Zd�Zd�Zd�Zd�Zdddgddd�Zd�Zd�Zd�Zd�Zd�Zd�Zy) �CgiTestsc���ttjd��}tjd�dd�}tj||�}dgdgdgdgd�}|j
||�y) N�latin1�558��boundaryzCONTENT-LENGTH� Add �1234�
Testing 123.
r?)�submit�id�file�title)r�POSTDATAr6�BOUNDARYr�parse_multipart�assertEqual)rr=r<r��expecteds r�test_parse_multipartzCgiTests.test_parse_multipartxsh��
�X�_�_�X�.�
/��#�?�?�8�4�!&�(���$�$�R��-��&�i��x�.�/�2�$�@�������*rc��d}t|jd��}ddjd�i}tj||�}ddgi}|j ||�y)NzY--JfISa01
Content-Disposition: form-data; name="submit-name"
just a string
--JfISa01--
r�r��JfISa01�submit-namezjust a string
)rr6rr�r�)rr�r=r<r�r�s r�+test_parse_multipart_without_content_lengthz4CgiTests.test_parse_multipart_without_content_length�sc�����X�_�_�X�.�
/���9�+�+�H�5�6���$�$�R��-��!�$5�#6�7�������*rc�x�d}d}t|jd��}|jd�tt|jd���d�}tj||dd��}d d
gi}|j
||�|j
djd�|d djdd��y)
Nr�u]--JfISa01
Content-Disposition: form-data; name="submit-name"
Content-Length: 3
☃
--JfISa01�utf8r�r��ascii�surrogateescape)ry�errorsr�u ���u☃r)rr6rr7rr�r�)rr�r�r=r<r�r�s r�%test_parse_multipart_invalid_encodingz.CgiTests.test_parse_multipart_invalid_encoding�s�����
���X�_�_�V�,�
-��#�?�?�8�4�!$�S�����)@�%A�!B�D���$�$�R��w�,=�%�?��!�$8�#9�:�������*��������0��
�.�q�1�8�8��AR�S� Urc�`�tj�}|j|�|jdt |��|jt
|�t
|j���|jjtdd�d��|j|�y)Nr{�MockFieldStorage�name�
fieldvalue)rr{�assertFalse�assertInrlr�rr�keys�appendr�
assertTrue�r�fss r�test_fieldstorage_propertiesz%CgiTests.test_fieldstorage_properties�sz��
�
�
�
��������
�
�n�d�2�h�/�����b��4���� �?�3�
�����=�z�"4�f�=�l�K�L�����rc��|jttjdddi��|jttjdd�tjddi� �}|jtt|�y)
Nznot-a-file-objr-�PUT�rx�foo�barzcontent-type�
text/plain)�headers)�assertRaises� TypeErrorrr{�boolr�s r�test_fieldstorage_invalidz"CgiTests.test_fieldstorage_invalid�sp�����)�S�%5�%5�7G�EU�V[�D\� � ^����)�S�%5�%5�u�e�D�
�
�
�~�l�&C�
�
D�����)�T�2�.rc ��tD�]{\}}t|d�}|j||dt|�z�t|d�}|j||dt|�z�d|i}tj|��}t
|t�s��|jt|�t|��|j|j�|j��|j|jdd�d�|j�D]m}||}|j||�t|�d kDr"|j|j|�|��J|j|j|�|d
��o��~y)Nr,zError parsing %s method GETr/zError parsing %s method POSTr.r�znonexistent field�defaultr4r)
�parse_strict_test_casesr>r�rlrr{r r|r7�assertCountEqualr��getvaluer�)r�orig�expect�dr<r�rj�
expect_vals r�test_strictzCgiTests.test_strict�sE��3�3�L�D�&���e�$�A����Q��(E��T�
�(R�S���f�%�A����Q��(F��d��(S�T�!�4�(�C��!�!�#�!�.�B��&�$�'�� � ��V��c�"�g�6��%�%�f�k�k�m�R�W�W�Y�?�� � ����-@�)�!L�i�X�!�;�;�=�C�!'���J��M�M�#�r�*��:���*��(�(����S�)9�:�F��(�(����S�)9�:�a�=�I�
)�#4rc�.�ddgdgd�fddgdgdgd�fdtd �fd
td �fdtd�fd
td �fdtd�fddgdgd�fddddgifg }|D]�\}}d|i}tjd|��}t|t�s�2|j�D]m}||}|j
||�t|�dkDr"|j|j|�|��J|j|j|�|d��o��y)Nz x=1;y=2.0rKrL)rOrPzx=1;y=2.0;z=2-3.%2b0rMrN�;rAz;;z=;arDz;b=azb;=arFza=a+b;b=b+crGrHrIza=a+b;a=b+arCrJr.)� separatorrxr4r)
r8rr{r r|r�r�r7r�r�)r�parse_semicolonr�r�r<r�rjr�s r�test_separatorzCgiTests.test_separator�s9��
���U�G�4�5�
#�C�5��w�h�Z�%P�Q�
�*�2�3�4�
�:�3�4�5�
�J�5�6�7�
�Z� 5�6�7�
�Z� 6�7�8�
�5�'���8�9�
�S�5�%�.�1�2�
��,�L�D�&�!�4�(�C��!�!�C��!�=�B��&�$�'�!�;�;�=�C�!'���J��M�M�#�r�*��:���*��(�(����S�)9�:�F��(�(����S�)9�:�a�=�I�
)� ,r)�categoryc�@�tjd�t�t_tj dd�tjdd�|jtjj
�d�tjjtj�rodt_tjt_tj dd�|jtj�tjd�yy)N�Testingz%szTesting initlog 1z
Testing log 2z Testing initlog 1
Testing log 2
z
Testing log 3z
Testing log 4)r�logr�logfp�initlogr�r��os�path�exists�devnull�logfile�
addCleanup�closelogrs r�test_logzCgiTests.test_log�s������ ���J�� ����D�-�.�����o�&�������+�+�-�/S�T�
�7�7�>�>�"�*�*�%��C�I��*�*�C�K��K�K��o�.��O�O�C�L�L�)��G�G�O�$�&rc��Gd�d�}|tjd��}|j|j�|j ddz�|jd�ddi}tj||� �}|j|jj�|j|jd
�|j�y)Nc� �eZdZd�Zdd�Zd�Zy)�=CgiTests.test_fieldstorage_readline.<locals>.TestReadlineFilec� �||_d|_yrp)r��numcalls)rr�s rrzFCgiTests.test_fieldstorage_readline.<locals>.TestReadlineFile.__init__�s�� �� � !��
rNc��|xjdz
c_|r|jj|�S|jj�S)Nr4)r�r��readline)r�sizes rr�zFCgiTests.test_fieldstorage_readline.<locals>.TestReadlineFile.readline�s;���
�
��"�
���9�9�-�-�d�3�3��9�9�-�-�/�/rc�v�|jd}t||�}t|t�s
t |||�|S)Nr�)�__dict__r(r �int�setattr)rr�r�rCs rr*zICgiTests.test_fieldstorage_readline.<locals>.TestReadlineFile.__getattr__s7���}�}�V�,���D�$�'��!�!�S�)��D�$��*��rr)rrr
rr�r*rrr�TestReadlineFiler��s��
"�
0�
rr�zwb+sxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxirr-r��r=rx�)�tempfile�
TemporaryFiler��close�writerzrr{r��
assertGreaterr�)rr��fr<r�s r�test_fieldstorage_readlinez#CgiTests.test_fieldstorage_readline�s���
� �&
�X�3�3�E�:�;�������� � ���
�T�!�"� ���q� ���&��
�
�
��C�
�
0��������
�
�&�
���1�:�:�q�)� ��� rc���ddjt�dd�}ttj d��}t
j
||d��}|jt|j�d�ddd d
�dddd
�d
ddd
�dddd
�g}tt|j��D]H}||j�D]0\}}t|j||�}|j||��2�Jy)Nr/� multipart/form-data; boundary={}r��r-r2r3r0�rxry�r�r��r��filenamerr�r?r��test.txtr�r�r��
�formatr�rr�r6rr{r�r7rr�ranger}r(� rr<r=r�r�rOr��exp�gots r�test_fieldstorage_multipartz$CgiTests.test_fieldstorage_multiparts���%�>�E�E�h�O�#�%���X�_�_�Y�/�
0��
�
�
�b�#� �
�
B������R�W�W��q�)��4��@�!�d�B�?� �Z�AR�S�"�t�W�E�G���s�2�7�7�|�$�A� ��)�/�/�+���3��b�g�g�a�j�!�,��� � ��c�*�,�%rc���ddjt�dd�}tdtj d�z�}t
j
||d��}|jt|j�d�d dd
d�ddd
d�dddd�dddd�g}tt|j��D]H}||j�D]0\}}t|j||�}|j||��2�Jy)Nr/r��560r�s
r0r�r�r�r�r�r�r?r�r�r�r�r�r�r�s r�.test_fieldstorage_multipart_leading_whitespacez7CgiTests.test_fieldstorage_multipart_leading_whitespace(s���$�>�E�E�h�O�#�%���W�x���y�9�9�
:��
�
�
�b�#� �
�
B������R�W�W��q�)��4��@�!�d�B�?� �Z�AR�S�"�t�W�E�G���s�2�7�7�|�$�A� ��)�/�/�+���3��b�g�g�a�j�!�,��� � ��c�*�,�%rc���ddjt�dd�}dD]�}ttj |��}t
j
|||��}|jt|j�d�ddd d
�g}tt|j��D]H}||j�D]0\}}t|j||�} |j| |��2�J��y)Nr/r�r�r�)z
iso-8859-1zutf-8r�r4r�uçñr�)
r�r�r�POSTDATA_NON_ASCIIr6rr{r�r7rrr�r}r()
rr<ryr=r�r�rOr�r�r�s
r�%test_fieldstorage_multipart_non_asciiz.CgiTests.test_fieldstorage_multipart_non_ascii;s��� &�>�E�E�h�O�"�$��/�H��+�2�2�8�<�=�B��!�!�"�c�8�!�D�B����S����\�1�-�"�t�^�L�M�F��3�r�w�w�<�(��$�Q�i�o�o�/�F�A�s�!�"�'�'�!�*�a�0�C��$�$�S�#�.�0�)�/rc���d}d�_�fd�}|d|dz
z�|d|dz
zdz�|d|dz
zdzd|dz
zz�y)Nic���djdd�|z}tt|��ddd�}�jt ||�d|jd�i�y) Nzp---123
Content-Disposition: form-data; name="upload"; filename="fake.txt"
Content-Type: text/plain
%s
---123--
�
z
�"multipart/form-data; boundary=-123r/�r3r2r-�uploadr�)�replacerr7r�r�r6)�contentr�rxrs �r�checkz;CgiTests.test_fieldstorage_multipart_maxline.<locals>.checkNsd�����G�D�&��G�
$�D�%(��D� �N�$H�$*��G�
���Z��g�6�&����x�(@�A�
CrrOr4�
rP)�maxDiff)r�maxliners` r�#test_fieldstorage_multipart_maxlinez,CgiTests.test_fieldstorage_multipart_maxlineJsb�������� C� �c�W�q�[�!�"�
�c�W�q�[�!�D�(�)�
�c�W�q�[�!�D�(�3�'�A�+�+>�>�?rc�8�ddjt�ttt��d�}ttj
d��}tj||d��}|jt|j�d�|j|jdjd�|j|jdjd �|j|jd
jd�|jd
j}|jt|�d�ddd
d�dddd�g}tt|��D]>}||j�D]&\}}t|||�} |j| |��(�@y)Nr/r�r�r0r�r�rr��Larryr4�filesz file1.txts... contents of file1.txt ...r�z file2.gifs...contents of file2.gif...)r��BOUNDARY_W3rr7�POSTDATA_W3rr6rr{r�rrr�rr�r}r()
rr<r=r�rr�rOr�r�r�s
r�test_fieldstorage_multipart_w3cz(CgiTests.test_fieldstorage_multipart_w3casV��%�>�E�E�k�R�!�#�k�"2�3�5���[�'�'� �2�
3��
�
�
�b�#� �
�
B������R�W�W��q�)�����������-�8���������)�)�7�3�����������'�2�����
� � ������U��Q�'��[�Cc�d��[�Ca�b�d���s�5�z�"�A� ��)�/�/�+���3��e�A�h��*��� � ��c�*�,�#rc��d}d}ddj|�tt|��d�}t|j d��}t
j
||d��}|jt|j�d�|j|jd jd
�|j|jd jd�y)Nr�z_--JfISa01
Content-Disposition: form-data; name="submit-name"
Content-Length: 5
Larry
--JfISa01r/r�r�r0r�r4rr�r)r�rr7rr6rr{r�rrr�r)rr�r�r<r=r�s r�%test_fieldstorage_part_content_lengthz.CgiTests.test_fieldstorage_part_content_lengthvs�����
��%�>�E�E�h�O�!�#�h�-�0�2���X�_�_�Y�/�
0��
�
�
�b�#� �
�
B������R�W�W��q�)�����������-�8���������)�)�7�3rc��td�}dd|d�}tj||��}|jt |dj
j
��d�y)Nsa--MyBoundary
Content-Disposition: form-data; name="my-arg"; filename="foo"
Test
--MyBoundary--
r/z(multipart/form-data; boundary=MyBoundary)r-r2z
wsgi.inputr�zmy-arg�)rrr{r�r7r��read)rr=r<�fieldss r�.test_field_storage_multipart_no_content_lengthz7CgiTests.test_field_storage_multipart_no_content_length�sc��
����%�F��
��
�!�!�"�c�!�2������V�H�-�2�2�7�7�9�:�A�>rc���td�}ddi}tj||��5}|jj �}|j|jj�ddd�|jjj�|jd�|jtd�5|jj �ddd�y#1swY�zxYw#1swYyxYw)Ns
xxxxxxxxxxr-r�r��
xxxxxxxxxxzI/O operation on closed file)rrr{r�rr��closedr�r��assertRaisesRegexr8)rr=r<r�rs r�$test_fieldstorage_as_context_managerz-CgiTests.test_fieldstorage_as_context_manager�s���
�Y�
����'��
�
�
��S�
�
1�R��g�g�l�l�n�G����R�W�W�^�^�,�2�
��������'�����(�+�
�
#�
#�J�0N�
O��G�G�L�L�N�P�
O�2�
1��
P�
O�s�AC �<C,� C)�,C5�value1�value2x�value2y�value3�value4)�key1�key2�key3�key4c��d}tt|��dddd�}t||�}|j|j|�y)Nz$key2=value2x&key3=value3&key4=value4r1zkey1=value1&key2=value2yr/�r3r2r.r-�rr7r�r��
_qs_result�rr�rxr�s r�testQSAndUrlEncodezCgiTests.testQSAndUrlEncode�sD��5�� #�C��I�� C� :� &�
��
�t�W�%��������!�,rc�V�djdgdz�}tt|��ddd�}|jt�5t
j
t|j��|d��ddd�d }tt|��d
ddd�}|jt�5t
j
t|j��|d
��ddd�t
j
t|j��|d��y#1swY��xYw#1swY�ExYw)Nr@za=a�r1r/r�
)r=rx�max_num_fieldsz�---123
Content-Disposition: form-data; name="a"
3
---123
Content-Type: application/x-www-form-urlencoded
a=4
---123
Content-Type: application/x-www-form-urlencoded
a=5
---123--
rza=1&a=2r-r�r) �joinrr7r�r8rr{rr6)rr�rxs r�test_max_num_fieldszCgiTests.test_max_num_fields�s���x�x����
�#��!�#�d�)�n�?�$�
���
�
�z�
*�����4�;�;�=�)��!�
�
�+�
��!$�C��I�� D� )� &�
���
�
�z�
*�����4�;�;�=�)�� �
�
�+� ����t�{�{�}�%��� �
�O+�
*��B+�
*�s�0D�+0D�D�D(c��d}tt|��dddd�}t||�}|j|j|�y)Nz�---123
Content-Disposition: form-data; name="key2"
value2y
---123
Content-Disposition: form-data; name="key3"
value3
---123
Content-Disposition: form-data; name="key4"
value4
---123--
r�key1=value1&key2=value2xr/r-r.r0s r�testQSAndFormDatazCgiTests.testQSAndFormData�sH��
��!$�C��I�� D� :� &�
��
�t�W�%��������!�,rc���d}tt|��dddd�}|jj�}|j ddi�t||�}|j
||�y)NaE---123
Content-Disposition: form-data; name="key2"
value2y
---123
Content-Disposition: form-data; name="key3"
value3
---123
Content-Disposition: form-data; name="key4"
value4
---123
Content-Disposition: form-data; name="upload"; filename="fake.txt"
Content-Type: text/plain
this is the content of the fake file
---123--
rr9r/r-r s%this is the content of the fake file
)rr7r/�copy�updater�r�)rr�rxr�r�s r�testQSAndFormDataFilezCgiTests.testQSAndFormDataFileso����*!$�C��I�� D� :� &�
�����%�%�'���
�
��?�
� �
�t�W�%�������#rc���|jtjd�dif�|jtjd�dif�|jtjd�dddif�|jtjd�dddif�|jtjd�ddd d
�f�|jtjd�dd
dif�|jtjd�dd
dif�|jtjd�dddd�f�|jtjd�dddd�f�y)Nr�ztext/vnd.just.made.this.up ; ztext/vnd.just.made.this.upztext/plain;charset=us-ascii�charsetzus-asciiztext/plain ; charset="us-ascii"z,text/plain ; charset="us-ascii"; another=opt�opt)r@�anotherz attachment; filename="silly.txt"�
attachmentr�z silly.txtz#attachment; filename="strange;name"zstrange;namez-attachment; filename="strange;name";size=123;�123)r�r�z-form-data; name="files"; filename="fo\"o;bar"z form-datarzfo"o;bar)r�r�)r�r�parse_headerrs r�test_parse_headerzCgiTests.test_parse_header%s���������\�*�
�2�� �
������<�=�
)�2�.� 0�
������:�;�
�I�z�2�3� 5�
������>�?�
�I�z�2�3� 5�
������K�L�
�z�e�D�E� G�
������?�@�
�J��4�5� 7�
������B�C�
�J��7�8� :�
������L�M�
���F�G� I�
������M�N�
�7�
�C�D� Frc�D�hd�}tj|t|��y)N> r��dologr��nolog�maxlenr�r�r��valid_boundary)�not_exported)r�check__all__r)rrLs r�test_allzCgiTests.test_allBs��(�� ���T�3�\�BrN)rrr
r�r�r�r�r�r�r�r�ignore_warnings�DeprecationWarningr�r�r�rrrrrrr"r/r1r7r:r>rFrNrrrr�r�vs���+�+�U�$�/�J�4J�0%�_�$�$�.@�A�%�B�%�#�J+�$+�&
/�@�.+�*4�$?�" ���I�&��� �J� -�4
�l-�0 $�DF�:Crr�z6---------------------------721837373350705526688164684a-----------------------------721837373350705526688164684
Content-Disposition: form-data; name="id"
1234
-----------------------------721837373350705526688164684
Content-Disposition: form-data; name="title"
-----------------------------721837373350705526688164684
Content-Disposition: form-data; name="file"; filename="test.txt"
Content-Type: text/plain
Testing 123.
-----------------------------721837373350705526688164684
Content-Disposition: form-data; name="submit"
Add
-----------------------------721837373350705526688164684--
u�-----------------------------721837373350705526688164684
Content-Disposition: form-data; name="id"
çñ
-----------------------------721837373350705526688164684
�AaB03xa�--AaB03x
Content-Disposition: form-data; name="submit-name"
Larry
--AaB03x
Content-Disposition: form-data; name="files"
Content-Type: multipart/mixed; boundary=BbC04y
--BbC04y
Content-Disposition: file; filename="file1.txt"
Content-Type: text/plain
... contents of file1.txt ...
--BbC04y
Content-Disposition: file; filename="file2.gif"
Content-Type: image/gif
Content-Transfer-Encoding: binary
...contents of file2.gif...
--BbC04y--
--AaB03x--
�__main__)!r�rr��unittest�collectionsr�iorr�testr�test.supportr�import_deprecatedrr
rr>r8r�rnrtrvr��TestCaser�r�r�rrrr�mainrrr�<module>r[s&�� �
���"� ��(�'�o�'�'��.�����
���'�'� (�&��H��*�*�
+�,� �:�+�,�-��"�I�
�B�K� �B���;��
�J�,�-�.�
�J�,�-�.�
�J�-�.�/�
�S�3�%�L���d�S�E�]���s�U�G�n��
��f�X����Z�-�
.�/��Z�.�
/�0��5�'���0�1��S�5�%�.�)�*��C�5��w�h�Z�H�I�w�<D�:��u��
��
�� �5�6�
�G��l�� �Y��
��i��7����(��Z�� �A(��T!� �+�
�PC�x� � �PC�fD����*������.�z���H�M�M�O�r
Sindbad File Manager Version 1.0, Coded By Sindbad EG ~ The Terrorists