diff options
| author | Konrad Delong <konryd@gmail.com> | 2010-05-13 23:20:53 +0200 |
|---|---|---|
| committer | Konrad Delong <konryd@gmail.com> | 2010-05-13 23:20:53 +0200 |
| commit | b2e9e5f4ba2268f1b01dbbb8e1f16d07d6ee9ae6 (patch) | |
| tree | cb73e75d8309b7dc17eb2b69fa9c15adce872bf2 /src | |
| parent | e00e9fa0faac915b1b12675d1788bcb37b8fc769 (diff) | |
| download | disutils2-b2e9e5f4ba2268f1b01dbbb8e1f16d07d6ee9ae6.tar.gz | |
added encode_multipart
Diffstat (limited to 'src')
| -rw-r--r-- | src/distutils2/command/upload_docs.py | 32 | ||||
| -rw-r--r-- | src/distutils2/tests/test_upload_docs.py | 33 |
2 files changed, 62 insertions, 3 deletions
diff --git a/src/distutils2/command/upload_docs.py b/src/distutils2/command/upload_docs.py index 8400b3d..0904a6b 100644 --- a/src/distutils2/command/upload_docs.py +++ b/src/distutils2/command/upload_docs.py @@ -14,6 +14,38 @@ def zip_dir_into(directory, destination): 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 index a50e618..4d3b23c 100644 --- 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_upload import PyPIServerTestCase 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 @@ class UploadDocsTestCase(PyPIServerTestCase, 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 |
