Commit 2dd63774 authored by Amaury Forgeot d'Arc's avatar Amaury Forgeot d'Arc

#4338: Fix the distutils "setup.py upload" command.

The code still mixed bytes and strings.

Reviewed by Martin von Loewis.
parent 94f19788
......@@ -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)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment