diff --git a/jira/resilientsession.py b/jira/resilientsession.py index 39ce7643d..4cf7cfb8e 100644 --- a/jira/resilientsession.py +++ b/jira/resilientsession.py @@ -188,6 +188,18 @@ def _jira_prepare(self, **original_kwargs) -> dict: if "verify" not in prepared_kwargs: prepared_kwargs["verify"] = self.verify + if "proxies" not in prepared_kwargs and self.proxies: + # Session.request() only falls back to self.proxies when no + # "proxies" kwarg is passed at all, but by then + # merge_environment_settings() has already used setdefault() to + # fill an empty request-level proxies dict from the http_proxy/ + # https_proxy environment variables, and merge_setting() let's + # that request-level dict win over self.proxies for any matching + # key. Passing self.proxies through explicitly here means it's + # already populated before the environment fallback runs, so it + # can only fill in gaps rather than being overridden by them. + prepared_kwargs["proxies"] = self.proxies + return prepared_kwargs def request( # type: ignore[override] # An intentionally different override diff --git a/tests/test_resilientsession.py b/tests/test_resilientsession.py index 2d0ed9047..f23c917d1 100644 --- a/tests/test_resilientsession.py +++ b/tests/test_resilientsession.py @@ -254,3 +254,30 @@ def test_empty_dict_body_not_forwarded(mocked_request_method: Mock): session.get(url="mocked_url", data={}) kwargs = mocked_request_method.call_args.kwargs assert kwargs.get("data") == {} + + +@patch("requests.Session.request") +def test_configured_proxies_are_forwarded(mocked_request_method: Mock): + # Disable retries for this test. + session = jira.resilientsession.ResilientSession(max_retries=0) + # A user-configured session proxy must be passed explicitly as the + # per-request "proxies" kwarg. Left unset, requests.Session.request() + # let's an env-derived http_proxy/https_proxy value (from + # merge_environment_settings()'s setdefault()) win over self.proxies + # for any matching key. + session.proxies = { + "http": "http://localhost:3128", + "https": "http://localhost:3128", + } + session.get(url="mocked_url") + kwargs = mocked_request_method.call_args.kwargs + assert kwargs.get("proxies") == session.proxies + + +@patch("requests.Session.request") +def test_no_proxies_kwarg_when_unconfigured(mocked_request_method: Mock): + # Disable retries for this test. + session = jira.resilientsession.ResilientSession(max_retries=0) + session.get(url="mocked_url") + kwargs = mocked_request_method.call_args.kwargs + assert "proxies" not in kwargs