Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -517,6 +517,16 @@ def _make_api_call_with_retries(
request_kwargs: dict[str, Any] = {**user_kwargs, **base_request_kwargs}
response = session.request(**request_kwargs)
response.raise_for_status()
try:
response.raise_for_status()
except requests.exceptions.HTTPError as e:
if e.response is not None and e.response.status_code == 422:
payload = e.response.text or "<no response body>"
raise AirflowException(
f"Snowflake SQL API returned HTTP 422 with payload: {payload}"
) from e
raise

return response.status_code, response.json()

async def _make_api_call_with_retries_async(self, method, url, headers, params=None):
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1611,3 +1611,19 @@ async def test_make_api_call_with_retries_async_rejects_aiohttp_request_kwargs_o
match=r"aiohttp_request_kwargs must not override request identity fields",
):
await hook._make_api_call_with_retries_async("GET", API_URL, HEADERS)

def test_sql_api_422_payload_is_preserved(mocker):
hook = SnowflakeSqlApiHook(snowflake_conn_id="test")

response = mocker.Mock()
response.status_code = 422
response.text = '{"message": "Invalid SQL"}'
response.raise_for_status.side_effect = requests.exceptions.HTTPError(response=response)

session = mocker.Mock()
session.request.return_value = response
mocker.patch("requests.Session", return_value=session)

with pytest.raises(AirflowException, match="Invalid SQL"):
hook._make_api_call_with_retries("POST", "http://test", {}, {})

Loading