From 300b4173f074e730d94729c32aa77fafeaf58c40 Mon Sep 17 00:00:00 2001 From: Daniel Sanche Date: Fri, 6 Mar 2026 16:38:53 -0800 Subject: [PATCH 1/6] added reproductive test --- .../tests/compute_engine/test__metadata.py | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/packages/google-auth/tests/compute_engine/test__metadata.py b/packages/google-auth/tests/compute_engine/test__metadata.py index 9fc2c8cf6cb5..4c3865ad32fd 100644 --- a/packages/google-auth/tests/compute_engine/test__metadata.py +++ b/packages/google-auth/tests/compute_engine/test__metadata.py @@ -955,3 +955,16 @@ def test__prepare_request_for_mds_mtls_no_session(mock_mds_mtls_adapter): mock_session_class.assert_called_once() mock_mds_mtls_adapter.assert_called_once() assert request.session.mount.call_count == len(_metadata._GCE_DEFAULT_MDS_HOSTS) + + +@mock.patch("google.auth.compute_engine._mtls.MdsMtlsAdapter") +def test__prepare_request_for_mds_mtls_attribute_error(mock_mds_mtls_adapter): + # Regression test for https://github.com/googleapis/google-cloud-python/issues/16035 + from google.auth.transport import _http_client + request = _http_client.Request() + with mock.patch("requests.Session") as mock_session_class: + _metadata._prepare_request_for_mds(request, use_mtls=True) + + mock_session_class.assert_called_once() + mock_mds_mtls_adapter.assert_called_once() + assert request.session.mount.call_count == len(_metadata._GCE_DEFAULT_MDS_HOSTS) From 0867d5dbd9b1a40ba11e690ebff2e6f7c8bbcc3b Mon Sep 17 00:00:00 2001 From: Daniel Sanche Date: Fri, 6 Mar 2026 16:40:04 -0800 Subject: [PATCH 2/6] added fix --- packages/google-auth/google/auth/compute_engine/_metadata.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/google-auth/google/auth/compute_engine/_metadata.py b/packages/google-auth/google/auth/compute_engine/_metadata.py index c1fecd3b7dca..cd198e06b9f2 100644 --- a/packages/google-auth/google/auth/compute_engine/_metadata.py +++ b/packages/google-auth/google/auth/compute_engine/_metadata.py @@ -177,7 +177,7 @@ def _prepare_request_for_mds(request, use_mtls=False) -> None: # Only modify the request if mTLS is enabled. if use_mtls: # Ensure the request has a session to mount the adapter to. - if not request.session: + if not hasattr(request, "session") or not request.session: request.session = requests.Session() adapter = _mtls.MdsMtlsAdapter() From 99b3e2ae6b7639c08f41c933837c1c755501b5c2 Mon Sep 17 00:00:00 2001 From: Daniel Sanche Date: Fri, 6 Mar 2026 16:46:25 -0800 Subject: [PATCH 3/6] fixed lint --- packages/google-auth/tests/compute_engine/test__metadata.py | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/google-auth/tests/compute_engine/test__metadata.py b/packages/google-auth/tests/compute_engine/test__metadata.py index 4c3865ad32fd..c9ff43f3579b 100644 --- a/packages/google-auth/tests/compute_engine/test__metadata.py +++ b/packages/google-auth/tests/compute_engine/test__metadata.py @@ -961,6 +961,7 @@ def test__prepare_request_for_mds_mtls_no_session(mock_mds_mtls_adapter): def test__prepare_request_for_mds_mtls_attribute_error(mock_mds_mtls_adapter): # Regression test for https://github.com/googleapis/google-cloud-python/issues/16035 from google.auth.transport import _http_client + request = _http_client.Request() with mock.patch("requests.Session") as mock_session_class: _metadata._prepare_request_for_mds(request, use_mtls=True) From 9a49f21698f860cf1f61d82d741bca74db947545 Mon Sep 17 00:00:00 2001 From: Daniel Sanche Date: Fri, 6 Mar 2026 16:54:32 -0800 Subject: [PATCH 4/6] Update packages/google-auth/google/auth/compute_engine/_metadata.py Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> --- packages/google-auth/google/auth/compute_engine/_metadata.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/google-auth/google/auth/compute_engine/_metadata.py b/packages/google-auth/google/auth/compute_engine/_metadata.py index cd198e06b9f2..307eafafc73c 100644 --- a/packages/google-auth/google/auth/compute_engine/_metadata.py +++ b/packages/google-auth/google/auth/compute_engine/_metadata.py @@ -177,7 +177,7 @@ def _prepare_request_for_mds(request, use_mtls=False) -> None: # Only modify the request if mTLS is enabled. if use_mtls: # Ensure the request has a session to mount the adapter to. - if not hasattr(request, "session") or not request.session: + if not getattr(request, "session", None): request.session = requests.Session() adapter = _mtls.MdsMtlsAdapter() From af098fb8601dd28a34f10fd08cb696fae69483ef Mon Sep 17 00:00:00 2001 From: Daniel Sanche Date: Fri, 6 Mar 2026 17:18:01 -0800 Subject: [PATCH 5/6] updated docstring --- .../google-auth/google/auth/compute_engine/_metadata.py | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/packages/google-auth/google/auth/compute_engine/_metadata.py b/packages/google-auth/google/auth/compute_engine/_metadata.py index 307eafafc73c..1a07becd26ac 100644 --- a/packages/google-auth/google/auth/compute_engine/_metadata.py +++ b/packages/google-auth/google/auth/compute_engine/_metadata.py @@ -166,13 +166,11 @@ def _prepare_request_for_mds(request, use_mtls=False) -> None: Args: request (google.auth.transport.Request): A callable used to make - HTTP requests. + HTTP requests. If mTLS is enabled, the request will have the mTLS + adapter mounted. Otherwise, there will be no change. use_mtls (bool): Whether to use mTLS for the request. - Returns: - google.auth.transport.Request: A request object to use. - If mTLS is enabled, the request will have the mTLS adapter mounted. - Otherwise, the original request will be returned unchanged. + """ # Only modify the request if mTLS is enabled. if use_mtls: From 0c281804717fdea770d1c247c8a51f00024eaef6 Mon Sep 17 00:00:00 2001 From: Daniel Sanche Date: Mon, 9 Mar 2026 16:49:52 -0700 Subject: [PATCH 6/6] ignore http requests --- .../google/auth/compute_engine/_metadata.py | 11 ++++++----- .../tests/compute_engine/test__metadata.py | 14 +++++++------- 2 files changed, 13 insertions(+), 12 deletions(-) diff --git a/packages/google-auth/google/auth/compute_engine/_metadata.py b/packages/google-auth/google/auth/compute_engine/_metadata.py index 1a07becd26ac..aae724ab18ee 100644 --- a/packages/google-auth/google/auth/compute_engine/_metadata.py +++ b/packages/google-auth/google/auth/compute_engine/_metadata.py @@ -166,16 +166,17 @@ def _prepare_request_for_mds(request, use_mtls=False) -> None: Args: request (google.auth.transport.Request): A callable used to make - HTTP requests. If mTLS is enabled, the request will have the mTLS - adapter mounted. Otherwise, there will be no change. + HTTP requests. If mTLS is enabled, and the request supports sessions, + the request will have the mTLS adapter mounted. Otherwise, there + will be no change. use_mtls (bool): Whether to use mTLS for the request. """ - # Only modify the request if mTLS is enabled. - if use_mtls: + # Only modify the request if mTLS is enabled, and request supports sessions. + if use_mtls and hasattr(request, "session"): # Ensure the request has a session to mount the adapter to. - if not getattr(request, "session", None): + if not request.session: request.session = requests.Session() adapter = _mtls.MdsMtlsAdapter() diff --git a/packages/google-auth/tests/compute_engine/test__metadata.py b/packages/google-auth/tests/compute_engine/test__metadata.py index c9ff43f3579b..35996ab24b92 100644 --- a/packages/google-auth/tests/compute_engine/test__metadata.py +++ b/packages/google-auth/tests/compute_engine/test__metadata.py @@ -958,14 +958,14 @@ def test__prepare_request_for_mds_mtls_no_session(mock_mds_mtls_adapter): @mock.patch("google.auth.compute_engine._mtls.MdsMtlsAdapter") -def test__prepare_request_for_mds_mtls_attribute_error(mock_mds_mtls_adapter): - # Regression test for https://github.com/googleapis/google-cloud-python/issues/16035 +def test__prepare_request_for_mds_mtls_http_request(mock_mds_mtls_adapter): + """ + http requests should be ignored. + Regression test for https://github.com/googleapis/google-cloud-python/issues/16035 + """ from google.auth.transport import _http_client request = _http_client.Request() - with mock.patch("requests.Session") as mock_session_class: - _metadata._prepare_request_for_mds(request, use_mtls=True) + _metadata._prepare_request_for_mds(request, use_mtls=True) - mock_session_class.assert_called_once() - mock_mds_mtls_adapter.assert_called_once() - assert request.session.mount.call_count == len(_metadata._GCE_DEFAULT_MDS_HOSTS) + assert mock_mds_mtls_adapter.call_count == 0