diff --git a/src/poetry/repositories/http_repository.py b/src/poetry/repositories/http_repository.py index 298fc1e815b..3fc11a02731 100644 --- a/src/poetry/repositories/http_repository.py +++ b/src/poetry/repositories/http_repository.py @@ -79,10 +79,13 @@ def _get_info_from_wheel(self, url: str) -> PackageInfo: from poetry.inspection.info import PackageInfo wheel_name = urllib.parse.urlparse(url).path.rsplit("/")[-1] - self._log(f"Downloading wheel: {wheel_name}", level="debug") filename = os.path.basename(wheel_name) + filepath = self._authenticator.get_cached_file_for_url(url) + if filepath: + return PackageInfo.from_wheel(filepath) + self._log(f"Downloading wheel: {wheel_name}", level="debug") with temporary_directory() as temp_dir: filepath = Path(temp_dir) / filename self._download(url, filepath) diff --git a/src/poetry/utils/authenticator.py b/src/poetry/utils/authenticator.py index edf6fe073e4..bd80735eb95 100644 --- a/src/poetry/utils/authenticator.py +++ b/src/poetry/utils/authenticator.py @@ -11,6 +11,7 @@ from pathlib import Path from typing import TYPE_CHECKING from typing import Any +from typing import cast import lockfile import requests @@ -19,6 +20,7 @@ from cachecontrol import CacheControlAdapter from cachecontrol.caches import FileCache +from cachecontrol.caches.file_cache import url_to_file_path from filelock import FileLock from poetry.config.config import Config @@ -157,6 +159,7 @@ def __init__( self._get_repository_config_for_url ) self._pool_size = pool_size + self._disable_cache = disable_cache def create_session(self) -> requests.Session: session = requests.Session() @@ -463,6 +466,13 @@ def _get_certs_for_url(self, url: str) -> RepositoryCertificateConfig: return selected.certs(config=self._config) return RepositoryCertificateConfig() + def get_cached_file_for_url(self, url: str) -> Path | None: + if self._disable_cache: + return None + + path = Path(url_to_file_path(url, cast(FileCache, self._cache_control))) + return path if path.exists() else None + _authenticator: Authenticator | None = None diff --git a/tests/utils/test_authenticator.py b/tests/utils/test_authenticator.py index 2a0d1bee564..335e2b50c1e 100644 --- a/tests/utils/test_authenticator.py +++ b/tests/utils/test_authenticator.py @@ -627,6 +627,22 @@ def test_authenticator_git_repositories( assert not three.password +def test_authenticator_get_cached_file_for_url__cache_miss(config: Config) -> None: + authenticator = Authenticator(config, NullIO()) + assert ( + authenticator.get_cached_file_for_url("https://foo.bar/cache/miss.whl") is None + ) + + +def test_authenticator_get_cached_file_for_url__cache_hit(config: Config) -> None: + authenticator = Authenticator(config, NullIO()) + url = "https://foo.bar/files/foo-0.1.0.tar.gz" + + authenticator._cache_control.set(url, b"hello") + + assert authenticator.get_cached_file_for_url(url) + + @pytest.mark.parametrize( ("ca_cert", "client_cert", "result"), [