Skip to content

Commit ea0f38e

Browse files
devin-ai-integration[bot]bot_apk
andcommitted
fix(cdk): improve HTTP 400 default error message and reclassify as config_error
- Change FailureType for HTTP 400 from system_error to config_error - Surface parsed API response body in user-facing error message when no custom error_message is set in the ErrorResolution - Keep verbose details in internal_message for debugging Resolves airbytehq/airbyte-internal-issues#16112 Co-Authored-By: bot_apk <apk@cognition.ai>
1 parent acafc75 commit ea0f38e

2 files changed

Lines changed: 17 additions & 4 deletions

File tree

airbyte_cdk/sources/streams/http/error_handlers/default_error_mapping.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,8 +30,8 @@
3030
),
3131
400: ErrorResolution(
3232
response_action=ResponseAction.FAIL,
33-
failure_type=FailureType.system_error,
34-
error_message="HTTP Status Code: 400. Error: Bad request. Please check your request parameters.",
33+
failure_type=FailureType.config_error,
34+
error_message=None,
3535
),
3636
401: ErrorResolution(
3737
response_action=ResponseAction.FAIL,

airbyte_cdk/sources/streams/http/http_client.py

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -466,21 +466,34 @@ def _handle_error_resolution(
466466

467467
if error_resolution.response_action == ResponseAction.FAIL:
468468
if response is not None:
469+
parsed_api_error = self._error_message_parser.parse_response_error_message(response)
469470
filtered_response_message = filter_secrets(
470471
f"Request (body): '{str(request.body)}'. Response (body): '{self._get_response_body(response)}'. Response (headers): '{response.headers}'."
471472
)
472-
error_message = f"'{request.method}' request to '{request.url}' failed with status code '{response.status_code}' and error message: '{self._error_message_parser.parse_response_error_message(response)}'. {filtered_response_message}"
473+
error_message = f"'{request.method}' request to '{request.url}' failed with status code '{response.status_code}' and error message: '{parsed_api_error}'. {filtered_response_message}"
474+
475+
# Build user-facing message: prefer the error handler's custom message,
476+
# fall back to a concise message with the parsed API error body
477+
if error_resolution.error_message:
478+
user_facing_message = error_resolution.error_message
479+
elif parsed_api_error:
480+
user_facing_message = filter_secrets(
481+
f"API responded with HTTP {response.status_code}: {parsed_api_error}"
482+
)
483+
else:
484+
user_facing_message = f"API responded with HTTP {response.status_code}."
473485
else:
474486
error_message = (
475487
f"'{request.method}' request to '{request.url}' failed with exception: '{exc}'"
476488
)
489+
user_facing_message = error_resolution.error_message or error_message
477490

478491
# ensure the exception message is emitted before raised
479492
self._logger.error(error_message)
480493

481494
raise AirbyteTracedException(
482495
internal_message=error_message,
483-
message=error_resolution.error_message or error_message,
496+
message=user_facing_message,
484497
failure_type=error_resolution.failure_type,
485498
)
486499

0 commit comments

Comments
 (0)