From bd4d3fe27bede5ac040439c2c94c1db69686a089 Mon Sep 17 00:00:00 2001 From: Dan Hipschman Date: Sun, 24 May 2020 13:59:27 -0700 Subject: [PATCH] Display better messages on legacy repo HTTP errors --- poetry/repositories/legacy_repository.py | 11 +++++-- tests/repositories/test_legacy_repository.py | 34 ++++++++++++++++++++ 2 files changed, 42 insertions(+), 3 deletions(-) diff --git a/poetry/repositories/legacy_repository.py b/poetry/repositories/legacy_repository.py index 7baf97ccf86..685c72a7418 100644 --- a/poetry/repositories/legacy_repository.py +++ b/poetry/repositories/legacy_repository.py @@ -27,6 +27,7 @@ from ..inspection.info import PackageInfo from .auth import Auth from .exceptions import PackageNotFound +from .exceptions import RepositoryError from .pypi_repository import PyPiRepository @@ -349,8 +350,12 @@ def _get_release_info(self, name, version): # type: (str, str) -> dict def _get(self, endpoint): # type: (str) -> Union[Page, None] url = self._url + endpoint - response = self.session.get(url) - if response.status_code == 404: - return + try: + response = self.session.get(url) + if response.status_code == 404: + return + response.raise_for_status() + except requests.HTTPError as e: + raise RepositoryError(e) return Page(url, response.content, response.headers) diff --git a/tests/repositories/test_legacy_repository.py b/tests/repositories/test_legacy_repository.py index 5413dfc7090..c64cf438a64 100644 --- a/tests/repositories/test_legacy_repository.py +++ b/tests/repositories/test_legacy_repository.py @@ -5,6 +5,7 @@ from poetry.core.packages import Dependency from poetry.repositories.auth import Auth from poetry.repositories.exceptions import PackageNotFound +from poetry.repositories.exceptions import RepositoryError from poetry.repositories.legacy_repository import LegacyRepository from poetry.repositories.legacy_repository import Page from poetry.utils._compat import PY35 @@ -271,3 +272,36 @@ def test_username_password_special_chars(): repo = MockRepository(auth=auth) assert "http://user%3A:%2F%252Fp%40ssword@legacy.foo.bar" == repo.authenticated_url + + +class MockHttpRepository(LegacyRepository): + def __init__(self, endpoint_responses, http): + base_url = "http://legacy.foo.bar" + super(MockHttpRepository, self).__init__( + "legacy", url=base_url, auth=None, disable_cache=True + ) + + for endpoint, response in endpoint_responses.items(): + url = base_url + endpoint + http.register_uri(http.GET, url, status=response) + + +def test_get_200_returns_page(http): + repo = MockHttpRepository({"/foo": 200}, http) + + assert repo._get("/foo") + + +def test_get_404_returns_none(http): + repo = MockHttpRepository({"/foo": 404}, http) + + assert repo._get("/foo") is None + + +def test_get_4xx_and_5xx_raises(http): + endpoints = {"/{}".format(code): code for code in {401, 403, 500}} + repo = MockHttpRepository(endpoints, http) + + for endpoint in endpoints: + with pytest.raises(RepositoryError): + repo._get(endpoint)