From 64fab11a766a07e98293121af2d2199e04d7ea7e Mon Sep 17 00:00:00 2001 From: cyphercodes Date: Thu, 27 Aug 2026 06:46:50 +0300 Subject: [PATCH] fix(api-core): handle list-shaped REST error payloads --- .../google/api_core/exceptions.py | 2 ++ .../tests/unit/test_exceptions.py | 25 +++++++++++++++++++ 2 files changed, 27 insertions(+) diff --git a/packages/google-api-core/google/api_core/exceptions.py b/packages/google-api-core/google/api_core/exceptions.py index 71ceb759b2fc..df3e54e8f223 100644 --- a/packages/google-api-core/google/api_core/exceptions.py +++ b/packages/google-api-core/google/api_core/exceptions.py @@ -510,6 +510,8 @@ def format_http_response_error( :class:`GoogleAPICallError`, with the message and errors populated from the response. """ + if isinstance(payload, list): + payload = next((item for item in payload if isinstance(item, dict)), {}) payload = {} if not payload else payload error_message = payload.get("error", {}).get("message", "unknown error") errors = payload.get("error", {}).get("errors", ()) diff --git a/packages/google-api-core/tests/unit/test_exceptions.py b/packages/google-api-core/tests/unit/test_exceptions.py index c7171204d093..6a71ddeb9261 100644 --- a/packages/google-api-core/tests/unit/test_exceptions.py +++ b/packages/google-api-core/tests/unit/test_exceptions.py @@ -132,6 +132,31 @@ def test_from_http_response_json_content(): assert exception.errors == ["1", "2"] +def test_from_http_response_json_list_content(): + response = make_response( + json.dumps( + [{"error": {"message": "json message", "errors": ["1", "2"]}}] + ).encode("utf-8") + ) + + exception = exceptions.from_http_response(response) + + assert isinstance(exception, exceptions.NotFound) + assert exception.code == http.client.NOT_FOUND + assert exception.message == "POST https://example.com/: json message" + assert exception.errors == ["1", "2"] + + +def test_from_http_response_json_list_content_without_error_dict(): + response = make_response(json.dumps(["error message"]).encode("utf-8")) + + exception = exceptions.from_http_response(response) + + assert isinstance(exception, exceptions.NotFound) + assert exception.code == http.client.NOT_FOUND + assert exception.message == "POST https://example.com/: unknown error" + + def test_from_http_response_bad_json_content(): response = make_response(json.dumps({"meep": "moop"}).encode("utf-8"))