]> granicus.if.org Git - python/commitdiff
#4338: Fix the distutils "setup.py upload" command.
authorAmaury Forgeot d'Arc <amauryfa@gmail.com>
Thu, 20 Nov 2008 23:53:46 +0000 (23:53 +0000)
committerAmaury Forgeot d'Arc <amauryfa@gmail.com>
Thu, 20 Nov 2008 23:53:46 +0000 (23:53 +0000)
The code still mixed bytes and strings.

Reviewed by Martin von Loewis.

Lib/distutils/command/upload.py
Misc/NEWS

index 5049f03e93a2955192e9293985544468cdecb234..7ba7f5888a7613776b942b2d160f8796a2f0ae6c 100644 (file)
@@ -7,11 +7,11 @@ from distutils.core import PyPIRCCommand
 from distutils.spawn import spawn
 from distutils import log
 from hashlib import md5
-import os
+import os, io
 import socket
 import platform
 import configparser
-import http.client
+import http.client as httpclient
 import base64
 import urllib.parse
 
@@ -113,33 +113,35 @@ class upload(PyPIRCCommand):
                                      open(filename+".asc").read())
 
         # set up the authentication
-        auth = "Basic " + base64.encodestring(self.username + ":" + self.password).strip()
+        user_pass = (self.username + ":" + self.password).encode('ascii')
+        # The exact encoding of the authentication string is debated.
+        # Anyway PyPI only accepts ascii for both username or password.
+        auth = "Basic " + base64.encodestring(user_pass).strip().decode('ascii')
 
         # Build up the MIME payload for the POST data
         boundary = '--------------GHSKFJDLGDS7543FJKLFHRE75642756743254'
-        sep_boundary = '\n--' + boundary
-        end_boundary = sep_boundary + '--'
-        body = io.StringIO()
+        sep_boundary = b'\n--' + boundary.encode('ascii')
+        end_boundary = sep_boundary + b'--'
+        body = io.BytesIO()
         for key, value in data.items():
+            title = '\nContent-Disposition: form-data; name="%s"' % key
             # handle multiple entries for the same name
             if type(value) != type([]):
                 value = [value]
             for value in value:
                 if type(value) is tuple:
-                    fn = ';filename="%s"' % value[0]
+                    title += '; filename="%s"' % value[0]
                     value = value[1]
                 else:
-                    fn = ""
-                value = str(value)
+                    value = str(value).encode('utf-8')
                 body.write(sep_boundary)
-                body.write('\nContent-Disposition: form-data; name="%s"'%key)
-                body.write(fn)
-                body.write("\n\n")
+                body.write(title.encode('utf-8'))
+                body.write(b"\n\n")
                 body.write(value)
-                if value and value[-1] == '\r':
-                    body.write('\n')  # write an extra newline (lurve Macs)
+                if value and value[-1:] == b'\r':
+                    body.write(b'\n')  # write an extra newline (lurve Macs)
         body.write(end_boundary)
-        body.write("\n")
+        body.write(b"\n")
         body = body.getvalue()
 
         self.announce("Submitting %s to %s" % (filename, self.repository), log.INFO)
@@ -152,9 +154,9 @@ class upload(PyPIRCCommand):
             urllib.parse.urlparse(self.repository)
         assert not params and not query and not fragments
         if schema == 'http':
-            http = http.client.HTTPConnection(netloc)
+            http = httpclient.HTTPConnection(netloc)
         elif schema == 'https':
-            http = http.client.HTTPSConnection(netloc)
+            http = httpclient.HTTPSConnection(netloc)
         else:
             raise AssertionError("unsupported schema "+schema)
 
index c5179d717a2b5e4bc1009e48a4605a3c859f2d24..91df34f0d2e7a0cb0fee538f49e6639cb28b2c10 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -33,6 +33,8 @@ Core and Builtins
 Library
 -------
 
+- Issue #4338: Fix distutils upload command.
+
 - Issue #4354: Fix distutils register command.
 
 - Issue #4116: Resolve member name conflict in ScrolledCanvas.__init__.