Skip to content

Commit c67c556

Browse files
bosper351octavia-squidington-iiiaaronsteers
authored
feat(requests-ca): respect REQUESTS_CA_BUNDLE environment variable (#755)
Co-authored-by: octavia-squidington-iii <contact@airbyte.com> Co-authored-by: Aaron ("AJ") Steers <aj@airbyte.io>
1 parent e7f1e4c commit c67c556

File tree

3 files changed

+42
-2
lines changed

3 files changed

+42
-2
lines changed

airbyte_cdk/sources/streams/http/http_client.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -560,6 +560,15 @@ def send_request(
560560
data=data,
561561
)
562562

563+
env_settings = self._session.merge_environment_settings(
564+
url=request.url,
565+
proxies=request_kwargs.get("proxies"),
566+
stream=request_kwargs.get("stream"),
567+
verify=request_kwargs.get("verify"),
568+
cert=request_kwargs.get("cert"),
569+
)
570+
request_kwargs = {**request_kwargs, **env_settings}
571+
563572
response: requests.Response = self._send_with_retry(
564573
request=request,
565574
request_kwargs=request_kwargs,

unit_tests/sources/streams/http/test_http.py

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,10 @@ def test_requests_native_token_authenticator():
9292

9393
def test_request_kwargs_used(mocker, requests_mock):
9494
stream = StubBasicReadHttpStream()
95-
request_kwargs = {"cert": None, "proxies": "google.com"}
95+
request_kwargs = {
96+
"cert": None,
97+
"proxies": {"http": "http://example.com", "https": "http://example.com"},
98+
}
9699
mocker.patch.object(stream, "request_kwargs", return_value=request_kwargs)
97100
send_mock = mocker.patch.object(
98101
stream._http_client._session, "send", wraps=stream._http_client._session.send
@@ -101,8 +104,16 @@ def test_request_kwargs_used(mocker, requests_mock):
101104

102105
list(stream.read_records(sync_mode=SyncMode.full_refresh))
103106

104-
stream._http_client._session.send.assert_any_call(ANY, **request_kwargs)
105107
assert send_mock.call_count == 1
108+
call_args = send_mock.call_args_list[0]
109+
call_kwargs = call_args.kwargs
110+
111+
assert call_kwargs.get("cert") is None
112+
113+
proxies = call_kwargs.get("proxies")
114+
assert proxies is not None
115+
assert proxies["http"] == "http://example.com"
116+
assert proxies["https"] == "http://example.com"
106117

107118

108119
def test_stub_basic_read_http_stream_read_records(mocker):

unit_tests/sources/streams/http/test_http_client.py

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
# Copyright (c) 2024 Airbyte, Inc., all rights reserved.
22

33
import logging
4+
import os
45
from datetime import timedelta
56
from unittest.mock import MagicMock, patch
67

@@ -746,6 +747,25 @@ def test_given_different_headers_then_response_is_not_cached(requests_mock):
746747
assert second_response.json()["test"] == "second response"
747748

748749

750+
@patch.dict("os.environ", {"REQUESTS_CA_BUNDLE": "/path/to/ca-bundle.crt"})
751+
def test_send_request_respects_environment_variables():
752+
"""Test that send_request respects REQUESTS_CA_BUNDLE environment variable."""
753+
http_client = HttpClient(
754+
name="test",
755+
logger=MagicMock(),
756+
)
757+
758+
with patch.object(http_client, "_send_with_retry") as mock_send_with_retry:
759+
http_client.send_request(
760+
http_method="GET", url="https://api.example.com", request_kwargs={"timeout": 10}
761+
)
762+
763+
passed_kwargs = mock_send_with_retry.call_args[1]["request_kwargs"]
764+
765+
assert "verify" in passed_kwargs
766+
assert passed_kwargs["verify"] == "/path/to/ca-bundle.crt"
767+
768+
749769
@pytest.mark.usefixtures("mock_sleep")
750770
@pytest.mark.parametrize(
751771
"response_code, expected_failure_type, error_message, exception_class",

0 commit comments

Comments
 (0)