Skip to content

Commit 2f1a3b0

Browse files
committed
add fallback for http error codes from mds
1 parent 8f7e197 commit 2f1a3b0

File tree

2 files changed

+36
-2
lines changed

2 files changed

+36
-2
lines changed

google/auth/compute_engine/_mtls.py

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -141,8 +141,14 @@ def send(self, request, **kwargs):
141141

142142
# In default mode, attempt mTLS first, then fallback to HTTP on failure
143143
try:
144-
return super(MdsMtlsAdapter, self).send(request, **kwargs)
145-
except (ssl.SSLError, requests.exceptions.SSLError) as e:
144+
response = super(MdsMtlsAdapter, self).send(request, **kwargs)
145+
response.raise_for_status()
146+
return response
147+
except (
148+
ssl.SSLError,
149+
requests.exceptions.SSLError,
150+
requests.exceptions.HTTPError,
151+
) as e:
146152
_LOGGER.warning(
147153
"mTLS connection to Compute Engine Metadata server failed. "
148154
"Falling back to standard HTTP. Reason: %s",

tests/compute_engine/test__mtls.py

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -193,6 +193,34 @@ def test_mds_mtls_adapter_send_fallback_default_mode(
193193
assert fallback_request.url == "http://example.com/"
194194

195195

196+
@mock.patch("google.auth.compute_engine._mtls.HTTPAdapter")
197+
@mock.patch("google.auth.compute_engine._mtls._parse_mds_mode")
198+
@mock.patch("ssl.create_default_context")
199+
def test_mds_mtls_adapter_send_fallback_http_error(
200+
mock_ssl_context, mock_parse_mds_mode, mock_http_adapter_class, mock_mds_mtls_config
201+
):
202+
mock_parse_mds_mode.return_value = _mtls.MdsMtlsMode.DEFAULT
203+
adapter = _mtls.MdsMtlsAdapter(mock_mds_mtls_config)
204+
205+
mock_fallback_send = mock.Mock()
206+
mock_http_adapter_class.return_value.send = mock_fallback_send
207+
208+
# Simulate HTTPError on the super().send() call
209+
mock_mtls_response = requests.Response()
210+
mock_mtls_response.status_code = 404
211+
with mock.patch(
212+
"requests.adapters.HTTPAdapter.send", return_value=mock_mtls_response
213+
):
214+
request = requests.Request(method="GET", url="https://example.com").prepare()
215+
adapter.send(request)
216+
217+
# Check that fallback to HTTPAdapter.send occurred
218+
mock_http_adapter_class.assert_called_once()
219+
mock_fallback_send.assert_called_once()
220+
fallback_request = mock_fallback_send.call_args[0][0]
221+
assert fallback_request.url == "http://example.com/"
222+
223+
196224
@mock.patch("google.auth.compute_engine._mtls._parse_mds_mode")
197225
@mock.patch("ssl.create_default_context")
198226
def test_mds_mtls_adapter_send_no_fallback_strict_mode(

0 commit comments

Comments
 (0)