diff options
author | Amaury Forgeot d'Arc <amauryfa@gmail.com> | 2008-11-20 23:53:46 (GMT) |
---|---|---|
committer | Amaury Forgeot d'Arc <amauryfa@gmail.com> | 2008-11-20 23:53:46 (GMT) |
commit | 836b670e893a78cd3fc585aad71875a4bdf1a0a9 (patch) | |
tree | c5bbf55fa42bf428b2f0764f7368feac07c73bcd /Lib | |
parent | 9d24ff027fe93e702d95d95dd520096d4c5a9fc2 (diff) | |
download | cpython-836b670e893a78cd3fc585aad71875a4bdf1a0a9.zip cpython-836b670e893a78cd3fc585aad71875a4bdf1a0a9.tar.gz cpython-836b670e893a78cd3fc585aad71875a4bdf1a0a9.tar.bz2 |
#4338: Fix the distutils "setup.py upload" command.
The code still mixed bytes and strings.
Reviewed by Martin von Loewis.
Diffstat (limited to 'Lib')
-rw-r--r-- | Lib/distutils/command/upload.py | 36 |
1 files changed, 19 insertions, 17 deletions
diff --git a/Lib/distutils/command/upload.py b/Lib/distutils/command/upload.py index 5049f03..7ba7f58 100644 --- a/Lib/distutils/command/upload.py +++ b/Lib/distutils/command/upload.py @@ -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) |