From 43b1ac3b7b812e6f2d2b730318a988571904a797 Mon Sep 17 00:00:00 2001 From: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> Date: Sat, 23 May 2026 14:17:44 +0000 Subject: [PATCH 1/2] fix(cdk): classify HTTP 400 as config error --- .../streams/http/error_handlers/default_error_mapping.py | 2 +- .../requesters/error_handlers/test_default_error_handler.py | 2 +- unit_tests/sources/streams/http/test_http_client.py | 6 +++--- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/airbyte_cdk/sources/streams/http/error_handlers/default_error_mapping.py b/airbyte_cdk/sources/streams/http/error_handlers/default_error_mapping.py index 45716768fd..464f7945b8 100644 --- a/airbyte_cdk/sources/streams/http/error_handlers/default_error_mapping.py +++ b/airbyte_cdk/sources/streams/http/error_handlers/default_error_mapping.py @@ -30,7 +30,7 @@ ), 400: ErrorResolution( response_action=ResponseAction.FAIL, - failure_type=FailureType.system_error, + failure_type=FailureType.config_error, error_message="HTTP Status Code: 400. Error: Bad request. Please check your request parameters.", ), 401: ErrorResolution( diff --git a/unit_tests/sources/declarative/requesters/error_handlers/test_default_error_handler.py b/unit_tests/sources/declarative/requesters/error_handlers/test_default_error_handler.py index 526e5760fc..2b202e1363 100644 --- a/unit_tests/sources/declarative/requesters/error_handlers/test_default_error_handler.py +++ b/unit_tests/sources/declarative/requesters/error_handlers/test_default_error_handler.py @@ -91,7 +91,7 @@ def test_default_error_handler_with_default_response_filter( parameters={}, ), ResponseAction.RETRY, - FailureType.system_error, + FailureType.config_error, "HTTP Status Code: 400. Error: Bad request. Please check your request parameters.", ), ( diff --git a/unit_tests/sources/streams/http/test_http_client.py b/unit_tests/sources/streams/http/test_http_client.py index 48d396cb63..87a12d0014 100644 --- a/unit_tests/sources/streams/http/test_http_client.py +++ b/unit_tests/sources/streams/http/test_http_client.py @@ -785,13 +785,13 @@ def test_send_request_respects_environment_variables(): @pytest.mark.parametrize( "response_code, expected_failure_type, error_message, exception_class", [ - (400, FailureType.system_error, "test error message", UserDefinedBackoffException), + (400, FailureType.config_error, "test error message", UserDefinedBackoffException), (401, FailureType.config_error, "test error message", UserDefinedBackoffException), (403, FailureType.transient_error, "test error message", UserDefinedBackoffException), - (400, FailureType.system_error, "test error message", DefaultBackoffException), + (400, FailureType.config_error, "test error message", DefaultBackoffException), (401, FailureType.config_error, "test error message", DefaultBackoffException), (403, FailureType.transient_error, "test error message", DefaultBackoffException), - (400, FailureType.system_error, "test error message", RateLimitBackoffException), + (400, FailureType.config_error, "test error message", RateLimitBackoffException), (401, FailureType.config_error, "test error message", RateLimitBackoffException), (403, FailureType.transient_error, "test error message", RateLimitBackoffException), ], From 51951c37cfd0026686a3ac55eb3b2de91184e661 Mon Sep 17 00:00:00 2001 From: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> Date: Sat, 23 May 2026 14:27:52 +0000 Subject: [PATCH 2/2] test(cdk): update resumable refresh 400 classification --- .../sources/mock_server_tests/test_resumable_full_refresh.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/unit_tests/sources/mock_server_tests/test_resumable_full_refresh.py b/unit_tests/sources/mock_server_tests/test_resumable_full_refresh.py index 04e232083e..a2a88923c2 100644 --- a/unit_tests/sources/mock_server_tests/test_resumable_full_refresh.py +++ b/unit_tests/sources/mock_server_tests/test_resumable_full_refresh.py @@ -370,6 +370,6 @@ def test_resumable_full_refresh_failure(self, http_mocker): page=2 ) - assert actual_messages.errors[0].trace.error.failure_type == FailureType.system_error + assert actual_messages.errors[0].trace.error.failure_type == FailureType.config_error assert actual_messages.errors[0].trace.error.stream_descriptor.name == "justice_songs" assert "Bad request" in actual_messages.errors[0].trace.error.message