summaryrefslogtreecommitdiffstats
path: root/Lib/distutils/command/upload.py
diff options
context:
space:
mode:
authorAmaury Forgeot d'Arc <amauryfa@gmail.com>2008-11-20 23:53:46 (GMT)
committerAmaury Forgeot d'Arc <amauryfa@gmail.com>2008-11-20 23:53:46 (GMT)
commit836b670e893a78cd3fc585aad71875a4bdf1a0a9 (patch)
treec5bbf55fa42bf428b2f0764f7368feac07c73bcd /Lib/distutils/command/upload.py
parent9d24ff027fe93e702d95d95dd520096d4c5a9fc2 (diff)
downloadcpython-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/distutils/command/upload.py')
-rw-r--r--Lib/distutils/command/upload.py36
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)