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 ...@@ -8,10 +8,12 @@ from typing import Union
from cachecontrol import CacheControl from cachecontrol import CacheControl
from cachecontrol.caches.file_cache import FileCache from cachecontrol.caches.file_cache import FileCache
from cachecontrol.controller import logger as cache_control_logger
from cachy import CacheManager from cachy import CacheManager
from html5lib.html5parser import parse from html5lib.html5parser import parse
from requests import get from requests import get
from requests import session from requests import session
from requests.exceptions import TooManyRedirects
from poetry.locations import CACHE_DIR from poetry.locations import CACHE_DIR
from poetry.packages import Package from poetry.packages import Package
...@@ -39,6 +41,8 @@ except ImportError: ...@@ -39,6 +41,8 @@ except ImportError:
import urlparse import urlparse
cache_control_logger.setLevel(logging.ERROR)
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
...@@ -63,9 +67,8 @@ class PyPiRepository(Repository): ...@@ -63,9 +67,8 @@ class PyPiRepository(Repository):
} }
) )
self._session = CacheControl( self._cache_control_cache = FileCache(str(release_cache_dir / "_http"))
session(), cache=FileCache(str(release_cache_dir / "_http")) self._session = CacheControl(session(), cache=self._cache_control_cache)
)
self._inspector = Inspector() self._inspector = Inspector()
super(PyPiRepository, self).__init__() super(PyPiRepository, self).__init__()
...@@ -357,7 +360,14 @@ class PyPiRepository(Repository): ...@@ -357,7 +360,14 @@ class PyPiRepository(Repository):
return data return data
def _get(self, endpoint): # type: (str) -> Union[dict, None] def _get(self, endpoint): # type: (str) -> Union[dict, None]
json_response = self._session.get(self._url + endpoint) 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: if json_response.status_code == 404:
return None return None
......
import json import json
import shutil import shutil
from io import BytesIO
import pytest import pytest
from requests.exceptions import TooManyRedirects
from requests.models import Response
from poetry.packages import Dependency from poetry.packages import Dependency
from poetry.repositories.pypi_repository import PyPiRepository from poetry.repositories.pypi_repository import PyPiRepository
from poetry.utils._compat import PY35 from poetry.utils._compat import PY35
from poetry.utils._compat import Path from poetry.utils._compat import Path
from poetry.utils._compat import encode
class MockRepository(PyPiRepository): class MockRepository(PyPiRepository):
...@@ -186,3 +192,19 @@ def test_invalid_versions_ignored(): ...@@ -186,3 +192,19 @@ def test_invalid_versions_ignored():
# and a correct one. # and a correct one.
packages = repo.find_packages("pygame-music-grid") packages = repo.find_packages("pygame-music-grid")
assert len(packages) == 1 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