mirror of
https://github.com/python/cpython.git
synced 2025-09-27 10:50:04 +00:00
Issue #21776: distutils.upload now correctly handles HTTPError
Initial patch by Claudiu Popa.
This commit is contained in:
parent
947ff38725
commit
6a8e626a60
3 changed files with 40 additions and 8 deletions
|
@ -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)
|
|
||||||
|
|
|
@ -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)
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue