Commit ead7e21e by Sébastien Eustace Committed by GitHub

Fix TooManyRedirects error when resolving dependencies (#1564)

parent 779fecd0
......@@ -8,10 +8,12 @@ from typing import Union
from cachecontrol import CacheControl
from cachecontrol.caches.file_cache import FileCache
from cachecontrol.controller import logger as cache_control_logger
from cachy import CacheManager
from html5lib.html5parser import parse
from requests import get
from requests import session
from requests.exceptions import TooManyRedirects
from poetry.locations import CACHE_DIR
from poetry.packages import Package
......@@ -39,6 +41,8 @@ except ImportError:
import urlparse
cache_control_logger.setLevel(logging.ERROR)
logger = logging.getLogger(__name__)
......@@ -63,9 +67,8 @@ class PyPiRepository(Repository):
}
)
self._session = CacheControl(
session(), cache=FileCache(str(release_cache_dir / "_http"))
)
self._cache_control_cache = FileCache(str(release_cache_dir / "_http"))
self._session = CacheControl(session(), cache=self._cache_control_cache)
self._inspector = Inspector()
super(PyPiRepository, self).__init__()
......@@ -357,7 +360,14 @@ class PyPiRepository(Repository):
return data
def _get(self, endpoint): # type: (str) -> Union[dict, None]
try:
json_response = self._session.get(self._url + endpoint)
except TooManyRedirects:
# Cache control redirect loop.
# We try to remove the cache and try again
self._cache_control_cache.delete(self._url + endpoint)
json_response = self._session.get(self._url + endpoint)
if json_response.status_code == 404:
return None
......
import json
import shutil
from io import BytesIO
import pytest
from requests.exceptions import TooManyRedirects
from requests.models import Response
from poetry.packages import Dependency
from poetry.repositories.pypi_repository import PyPiRepository
from poetry.utils._compat import PY35
from poetry.utils._compat import Path
from poetry.utils._compat import encode
class MockRepository(PyPiRepository):
......@@ -186,3 +192,19 @@ def test_invalid_versions_ignored():
# and a correct one.
packages = repo.find_packages("pygame-music-grid")
assert len(packages) == 1
def test_get_should_invalid_cache_on_too_many_redirects_error(mocker):
delete_cache = mocker.patch("cachecontrol.caches.file_cache.FileCache.delete")
response = Response()
response.encoding = "utf-8"
response.raw = BytesIO(encode('{"foo": "bar"}'))
mocker.patch(
"cachecontrol.adapter.CacheControlAdapter.send",
side_effect=[TooManyRedirects(), response],
)
repository = PyPiRepository()
repository._get("https://pypi.org/pypi/async-timeout/json")
assert delete_cache.called
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