diff Lib/packaging/command/upload.py @ 71253:c2785ed52ed4

Factor out code used by packaging commands for HTTP requests (#12169). We now have one function to prepare multipart POST requests, and we use CRLF, as recommended by the HTTP spec (#10150). Initial patch by John Edmonds.
author Éric Araujo <merwok@netwok.org>
date Fri, 08 Jul 2011 16:27:12 +0200
parents 1a31c3be88b1
children 28e4cd8fd864
line wrap: on
line diff
--- a/Lib/packaging/command/upload.py	Sat Jul 02 16:58:25 2011 +0200
+++ b/Lib/packaging/command/upload.py	Fri Jul 08 16:27:12 2011 +0200
@@ -14,7 +14,7 @@
 from packaging import logger
 from packaging.errors import PackagingOptionError
 from packaging.util import (spawn, read_pypirc, DEFAULT_REPOSITORY,
-                            DEFAULT_REALM)
+                            DEFAULT_REALM, encode_multipart)
 from packaging.command.cmd import Command
 
 
@@ -131,54 +131,22 @@
         auth = b"Basic " + standard_b64encode(user_pass)
 
         # Build up the MIME payload for the POST data
-        boundary = b'--------------GHSKFJDLGDS7543FJKLFHRE75642756743254'
-        sep_boundary = b'\n--' + boundary
-        end_boundary = sep_boundary + b'--'
-        body = BytesIO()
-
-        file_fields = ('content', 'gpg_signature')
-
-        for key, value in data.items():
-            # handle multiple entries for the same name
-            if not isinstance(value, tuple):
-                value = [value]
-
-            content_dispo = '\nContent-Disposition: form-data; name="%s"' % key
+        files = []
+        for key in ('content', 'gpg_signature'):
+            if key in data:
+                filename_, value = data.pop(key)
+                files.append((key, filename_, value))
 
-            if key in file_fields:
-                filename_, content = value
-                filename_ = ';filename="%s"' % filename_
-                body.write(sep_boundary)
-                body.write(content_dispo.encode('utf-8'))
-                body.write(filename_.encode('utf-8'))
-                body.write(b"\n\n")
-                body.write(content)
-            else:
-                for value in value:
-                    value = str(value).encode('utf-8')
-                    body.write(sep_boundary)
-                    body.write(content_dispo.encode('utf-8'))
-                    body.write(b"\n\n")
-                    body.write(value)
-                    if value and value.endswith(b'\r'):
-                        # write an extra newline (lurve Macs)
-                        body.write(b'\n')
-
-        body.write(end_boundary)
-        body.write(b"\n")
-        body = body.getvalue()
+        content_type, body = encode_multipart(data.items(), files)
 
         logger.info("Submitting %s to %s", filename, self.repository)
 
         # build the Request
-        headers = {'Content-type':
-                        'multipart/form-data; boundary=%s' %
-                        boundary.decode('ascii'),
+        headers = {'Content-type': content_type,
                    'Content-length': str(len(body)),
                    'Authorization': auth}
 
-        request = Request(self.repository, data=body,
-                          headers=headers)
+        request = Request(self.repository, body, headers)
         # send the data
         try:
             result = urlopen(request)