Skip to content

Commit fffd5ac

Browse files
authored
Pass the session's proxies property to request (#10680)
1 parent 4306edf commit fffd5ac

File tree

4 files changed

+46
-1
lines changed

4 files changed

+46
-1
lines changed

news/9691.bugfix.rst

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Fix pip install issues using a proxy due to an inconsistency in how Requests is currently handling variable precedence in session.

src/pip/_internal/network/session.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -449,6 +449,8 @@ def is_secure_origin(self, location: Link) -> bool:
449449
def request(self, method: str, url: str, *args: Any, **kwargs: Any) -> Response:
450450
# Allow setting a default timeout on a session
451451
kwargs.setdefault("timeout", self.timeout)
452+
# Allow setting a default proxies on a session
453+
kwargs.setdefault("proxies", self.proxies)
452454

453455
# Dispatch the actual request
454456
return super().request(method, url, *args, **kwargs)

tests/conftest.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,12 @@ def pytest_addoption(parser: Parser) -> None:
7070
default=False,
7171
help="run 'pip search' tests",
7272
)
73+
parser.addoption(
74+
"--proxy",
75+
action="store",
76+
default=None,
77+
help="use given proxy in session network tests",
78+
)
7379

7480

7581
def pytest_collection_modifyitems(config: Config, items: List[pytest.Item]) -> None:
@@ -628,3 +634,8 @@ def utc() -> Iterator[None]:
628634
tzset()
629635
yield
630636
tzset()
637+
638+
639+
@pytest.fixture
640+
def proxy(request: pytest.FixtureRequest) -> str:
641+
return request.config.getoption("proxy")

tests/unit/test_network_session.py

Lines changed: 32 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,10 @@
11
import logging
2-
from typing import Any, List
2+
from typing import Any, List, Optional
3+
from urllib.parse import urlparse
4+
from urllib.request import getproxies
35

46
import pytest
7+
from pip._vendor import requests
58

69
from pip import __version__
710
from pip._internal.models.link import Link
@@ -242,3 +245,31 @@ def warning(self, *args: Any, **kwargs: Any) -> None:
242245
actual_level, actual_message = log_records[0]
243246
assert actual_level == "WARNING"
244247
assert "is not a trusted or secure host" in actual_message
248+
249+
@pytest.mark.network
250+
def test_proxy(self, proxy: Optional[str]) -> None:
251+
session = PipSession(trusted_hosts=[])
252+
253+
if not proxy:
254+
# if user didn't pass --proxy then try to get it from the system.
255+
env_proxy = getproxies().get("http", None)
256+
proxy = urlparse(env_proxy).netloc if env_proxy else None
257+
258+
if proxy:
259+
# set proxy scheme to session.proxies
260+
session.proxies = {
261+
"http": f"{proxy}",
262+
"https": f"{proxy}",
263+
"ftp": f"{proxy}",
264+
}
265+
266+
connection_error = None
267+
try:
268+
session.request("GET", "https://pypi.org", timeout=1)
269+
except requests.exceptions.ConnectionError as e:
270+
connection_error = e
271+
272+
assert connection_error is None, (
273+
f"Invalid proxy {proxy} or session.proxies: "
274+
f"{session.proxies} is not correctly passed to session.request."
275+
)

0 commit comments

Comments
 (0)