Issue #21776: distutils.upload now correctly handles HTTPError

Initial patch by Claudiu Popa.
This commit is contained in:
Berker Peksag 2016-06-02 13:45:53 -07:00
parent 947ff38725
commit 6a8e626a60
3 changed files with 40 additions and 8 deletions

View file

@ -181,21 +181,21 @@ class upload(PyPIRCCommand):
result = urlopen(request) result = urlopen(request)
status = result.getcode() status = result.getcode()
reason = result.msg reason = result.msg
except OSError as e:
self.announce(str(e), log.ERROR)
raise
except HTTPError as e: except HTTPError as e:
status = e.code status = e.code
reason = e.msg reason = e.msg
except OSError as e:
self.announce(str(e), log.ERROR)
raise
if status == 200: if status == 200:
self.announce('Server response (%s): %s' % (status, reason), self.announce('Server response (%s): %s' % (status, reason),
log.INFO) log.INFO)
if self.show_response:
text = self._read_pypi_response(result)
msg = '\n'.join(('-' * 75, text, '-' * 75))
self.announce(msg, log.INFO)
else: else:
msg = 'Upload failed (%s): %s' % (status, reason) msg = 'Upload failed (%s): %s' % (status, reason)
self.announce(msg, log.ERROR) self.announce(msg, log.ERROR)
raise DistutilsError(msg) raise DistutilsError(msg)
if self.show_response:
text = self._read_pypi_response(result)
msg = '\n'.join(('-' * 75, text, '-' * 75))
self.announce(msg, log.INFO)

View file

@ -1,13 +1,16 @@
"""Tests for distutils.command.upload.""" """Tests for distutils.command.upload."""
import os import os
import unittest import unittest
import unittest.mock as mock
from urllib.request import HTTPError
from test.support import run_unittest from test.support import run_unittest
from distutils.command import upload as upload_mod from distutils.command import upload as upload_mod
from distutils.command.upload import upload from distutils.command.upload import upload
from distutils.core import Distribution from distutils.core import Distribution
from distutils.errors import DistutilsError from distutils.errors import DistutilsError
from distutils.log import INFO from distutils.log import ERROR, INFO
from distutils.tests.test_config import PYPIRC, PyPIRCCommandTestCase from distutils.tests.test_config import PYPIRC, PyPIRCCommandTestCase
@ -144,6 +147,32 @@ class uploadTestCase(PyPIRCCommandTestCase):
self.next_code = 404 self.next_code = 404
self.assertRaises(DistutilsError, self.test_upload) self.assertRaises(DistutilsError, self.test_upload)
def test_wrong_exception_order(self):
tmp = self.mkdtemp()
path = os.path.join(tmp, 'xxx')
self.write_file(path)
dist_files = [('xxx', '2.6', path)] # command, pyversion, filename
self.write_file(self.rc, PYPIRC_LONG_PASSWORD)
pkg_dir, dist = self.create_dist(dist_files=dist_files)
tests = [
(OSError('oserror'), 'oserror', OSError),
(HTTPError('url', 400, 'httperror', {}, None),
'Upload failed (400): httperror', DistutilsError),
]
for exception, expected, raised_exception in tests:
with self.subTest(exception=type(exception).__name__):
with mock.patch('distutils.command.upload.urlopen',
new=mock.Mock(side_effect=exception)):
with self.assertRaises(raised_exception):
cmd = upload(dist)
cmd.ensure_finalized()
cmd.run()
results = self.get_logs(ERROR)
self.assertIn(expected, results[-1])
self.clear_logs()
def test_suite(): def test_suite():
return unittest.makeSuite(uploadTestCase) return unittest.makeSuite(uploadTestCase)

View file

@ -128,6 +128,9 @@ Core and Builtins
Library Library
------- -------
- Issue #21776: distutils.upload now correctly handles HTTPError.
Initial patch by Claudiu Popa.
- Issue #27114: Fix SSLContext._load_windows_store_certs fails with - Issue #27114: Fix SSLContext._load_windows_store_certs fails with
PermissionError PermissionError