From 3e507f2e1a4c4d9dc41e9b1ee5a54fa94aaf8f3e Mon Sep 17 00:00:00 2001 From: azilbersteinSFDC Date: Thu, 26 Feb 2026 00:27:04 -0800 Subject: [PATCH 1/3] fix: return 422 for invalid historyLength in REST get_task Replace unhandled int() conversion with Pydantic validation so non-numeric historyLength query params (e.g. ?historyLength=abc) return 422 InvalidParamsError instead of 500. --- src/a2a/server/request_handlers/rest_handler.py | 9 +++++++-- tests/server/apps/rest/test_rest_fastapi_app.py | 12 ++++++++++++ 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/src/a2a/server/request_handlers/rest_handler.py b/src/a2a/server/request_handlers/rest_handler.py index 3f7ce6b5c..d2d5610b1 100644 --- a/src/a2a/server/request_handlers/rest_handler.py +++ b/src/a2a/server/request_handlers/rest_handler.py @@ -31,7 +31,7 @@ SubscribeToTaskRequest, ) from a2a.utils import proto_utils -from a2a.utils.errors import ServerError, TaskNotFoundError +from a2a.utils.errors import InvalidParamsError, ServerError, TaskNotFoundError from a2a.utils.helpers import validate from a2a.utils.telemetry import SpanKind, trace_class @@ -249,7 +249,12 @@ async def on_get_task( """ task_id = request.path_params['id'] history_length_str = request.query_params.get('historyLength') - history_length = int(history_length_str) if history_length_str else None + try: + history_length = int(history_length_str) if history_length_str else None + except ValueError: + raise ServerError( + error=InvalidParamsError(message='historyLength must be a valid integer') + ) params = GetTaskRequest(id=task_id, history_length=history_length) task = await self.request_handler.on_get_task(params, context) if task: diff --git a/tests/server/apps/rest/test_rest_fastapi_app.py b/tests/server/apps/rest/test_rest_fastapi_app.py index b6b0ad525..12b060e57 100644 --- a/tests/server/apps/rest/test_rest_fastapi_app.py +++ b/tests/server/apps/rest/test_rest_fastapi_app.py @@ -396,5 +396,17 @@ async def test_send_message_rejected_task( assert expected_response == actual_response +@pytest.mark.anyio +async def test_get_task_invalid_history_length_returns_422( + client: AsyncClient, +) -> None: + """Non-numeric historyLength query param returns 422 InvalidParamsError.""" + response = await client.get('/v1/tasks/some-task-id?historyLength=abc') + assert response.status_code == 422 + data = response.json() + assert 'message' in data + assert 'historylength' in data['message'].lower() + + if __name__ == '__main__': pytest.main([__file__]) From 4835a421c4345aa9232f140cd06dd210585e7351 Mon Sep 17 00:00:00 2001 From: azilbersteinSFDC Date: Thu, 26 Feb 2026 00:34:00 -0800 Subject: [PATCH 2/3] fix: address ruff lint (import order, B904 exception chaining) --- src/a2a/server/request_handlers/rest_handler.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/a2a/server/request_handlers/rest_handler.py b/src/a2a/server/request_handlers/rest_handler.py index d2d5610b1..fbeb1cc89 100644 --- a/src/a2a/server/request_handlers/rest_handler.py +++ b/src/a2a/server/request_handlers/rest_handler.py @@ -254,7 +254,7 @@ async def on_get_task( except ValueError: raise ServerError( error=InvalidParamsError(message='historyLength must be a valid integer') - ) + ) from None params = GetTaskRequest(id=task_id, history_length=history_length) task = await self.request_handler.on_get_task(params, context) if task: From ca53fb5ac4bb102659b2a95d001a747ff21af99d Mon Sep 17 00:00:00 2001 From: azilbersteinSFDC Date: Thu, 26 Feb 2026 00:36:35 -0800 Subject: [PATCH 3/3] style: ruff format --- src/a2a/server/request_handlers/rest_handler.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/a2a/server/request_handlers/rest_handler.py b/src/a2a/server/request_handlers/rest_handler.py index fbeb1cc89..6738f208b 100644 --- a/src/a2a/server/request_handlers/rest_handler.py +++ b/src/a2a/server/request_handlers/rest_handler.py @@ -250,10 +250,14 @@ async def on_get_task( task_id = request.path_params['id'] history_length_str = request.query_params.get('historyLength') try: - history_length = int(history_length_str) if history_length_str else None + history_length = ( + int(history_length_str) if history_length_str else None + ) except ValueError: raise ServerError( - error=InvalidParamsError(message='historyLength must be a valid integer') + error=InvalidParamsError( + message='historyLength must be a valid integer' + ) ) from None params = GetTaskRequest(id=task_id, history_length=history_length) task = await self.request_handler.on_get_task(params, context)