[Python-checkins] distutils2: added encode_multipart

tarek.ziade python-checkins at python.org
Sun Jul 4 11:48:38 CEST 2010


tarek.ziade pushed bffc38f3b3ad to distutils2:

http://hg.python.org/distutils2/rev/bffc38f3b3ad
changeset:   271:bffc38f3b3ad
user:        Konrad Delong <konryd at gmail.com>
date:        Thu May 13 23:20:53 2010 +0200
summary:     added encode_multipart
files:       src/distutils2/command/upload_docs.py, src/distutils2/tests/test_upload_docs.py

diff --git a/src/distutils2/command/upload_docs.py b/src/distutils2/command/upload_docs.py
--- a/src/distutils2/command/upload_docs.py
+++ b/src/distutils2/command/upload_docs.py
@@ -14,6 +14,38 @@
             zip_file.write(full, dest)
     zip_file.close()
 
+# grabbed from
+#    http://code.activestate.com/recipes/146306-http-client-to-post-using-multipartform-data/
+def encode_multipart(fields, files, boundary=None):
+    """
+    fields is a sequence of (name, value) elements for regular form fields.
+    files is a sequence of (name, filename, content_type, value)
+                            elements for data to be uploaded as files
+    Return (content_type, body) ready for httplib.HTTP instance
+    """
+    if boundary is None:
+        boundary = '--------------GHSKFJDLGDS7543FJKLFHRE75642756743254'
+    CRLF = '\r\n'
+    l = []
+    for (key, value) in fields:
+        l.extend([
+            '--' + boundary,
+            'Content-Disposition: form-data; name="%s"' % key,
+            '',
+            value])
+    for (key, filename, content_type, value) in files:
+        l.extend([
+            '--' + boundary,
+            'Content-Disposition: form-data; name="%s"; filename="%s"' % (key, filename),
+            'Content-Type: %s' % content_type,
+            '',
+            value])
+    l.append('--' + boundary + '--')
+    l.append('')
+    body = CRLF.join(l)
+    content_type = 'multipart/form-data; boundary=%s' % boundary
+    return content_type, body
+
 class upload_docs(Command):
 
     user_options = [
diff --git a/src/distutils2/tests/test_upload_docs.py b/src/distutils2/tests/test_upload_docs.py
--- a/src/distutils2/tests/test_upload_docs.py
+++ b/src/distutils2/tests/test_upload_docs.py
@@ -2,7 +2,8 @@
 # -*- encoding: utf8 -*-
 import os, os.path, tempfile, unittest2, zipfile
 
-from distutils2.command.upload_docs import upload_docs, zip_dir_into
+from distutils2.command.upload_docs import (upload_docs, zip_dir_into,
+                                    encode_multipart)
 from distutils2.core import Distribution
 
 from distutils2.tests import support
@@ -11,6 +12,29 @@
 from distutils2.tests.test_config import PYPIRC, PyPIRCCommandTestCase
 
 
+EXPECTED_MULTIPART_OUTPUT = "\r\n".join([
+'---x',
+'Content-Disposition: form-data; name="a"',
+'',
+'b',
+'---x',
+'Content-Disposition: form-data; name="c"',
+'',
+'d',
+'---x',
+'Content-Disposition: form-data; name="e"; filename="f"',
+'Content-Type: g',
+'',
+'h',
+'---x',
+'Content-Disposition: form-data; name="i"; filename="j"',
+'Content-Type: k',
+'',
+'l',
+'---x--',
+'',
+])
+
 class UploadDocsTestCase(PyPIServerTestCase,
                          support.TempdirManager,
                          unittest2.TestCase):
@@ -38,8 +62,11 @@
         zip_f = zipfile.ZipFile(destination)
         self.assertEqual(zip_f.namelist(), ['some_dir/some_file'])
 
-    def test_zip_dir(self):
-        pass
+    def test_encode_multipart(self):
+        fields = [("a", "b"), ("c", "d")]
+        files = [("e", "f", "g", "h"), ("i", "j", "k", "l")]
+        self.assertEqual(encode_multipart(fields, files, "-x")[0], "multipart/form-data; boundary=-x")
+        self.assertEqual(encode_multipart(fields, files, "-x")[1], EXPECTED_MULTIPART_OUTPUT)
 
     def test_upload(self):
         pass

--
Repository URL: http://hg.python.org/distutils2


More information about the Python-checkins mailing list