From 24129260efaa351ebac8023f550529c7e84e0bc6 Mon Sep 17 00:00:00 2001 From: hae02y Date: Thu, 8 Jan 2026 14:24:39 +0900 Subject: [PATCH 1/3] fix(rest): handle listTasks status wire strings - Fixes #577 --- .../transport/rest/handler/RestHandler.java | 9 ++++++- .../rest/handler/RestHandlerTest.java | 25 +++++++++++++++++++ 2 files changed, 33 insertions(+), 1 deletion(-) diff --git a/transport/rest/src/main/java/io/a2a/transport/rest/handler/RestHandler.java b/transport/rest/src/main/java/io/a2a/transport/rest/handler/RestHandler.java index 8c4050fd9..3182147a4 100644 --- a/transport/rest/src/main/java/io/a2a/transport/rest/handler/RestHandler.java +++ b/transport/rest/src/main/java/io/a2a/transport/rest/handler/RestHandler.java @@ -208,7 +208,14 @@ public HTTPRestResponse listTasks(@Nullable String contextId, @Nullable String s paramsBuilder.contextId(contextId); } if (status != null) { - paramsBuilder.status(TaskState.valueOf(status)); + try { + paramsBuilder.status(TaskState.fromString(status)); + } catch (IllegalArgumentException e) { + Map errorData = new HashMap<>(); + errorData.put("parameter", "status"); + errorData.put("reason", "Must be one of: submitted, working, input-required, auth-required, completed, canceled, failed, rejected, unknown"); + throw new InvalidParamsError(null, "Invalid params", errorData); + } } if (pageSize != null) { paramsBuilder.pageSize(pageSize); diff --git a/transport/rest/src/test/java/io/a2a/transport/rest/handler/RestHandlerTest.java b/transport/rest/src/test/java/io/a2a/transport/rest/handler/RestHandlerTest.java index df2a5e7af..0487a6f54 100644 --- a/transport/rest/src/test/java/io/a2a/transport/rest/handler/RestHandlerTest.java +++ b/transport/rest/src/test/java/io/a2a/transport/rest/handler/RestHandlerTest.java @@ -58,6 +58,31 @@ public void testGetTaskNotFound() { Assertions.assertTrue(response.getBody().contains("TaskNotFoundError")); } + @Test + public void testListTasksStatusWireString() { + RestHandler handler = new RestHandler(CARD, requestHandler, internalExecutor); + taskStore.save(MINIMAL_TASK); + + RestHandler.HTTPRestResponse response = handler.listTasks(null, "submitted", null, null, + null, null, null, "", callContext); + + Assertions.assertEquals(200, response.getStatusCode()); + Assertions.assertEquals("application/json", response.getContentType()); + Assertions.assertTrue(response.getBody().contains(MINIMAL_TASK.id())); + } + + @Test + public void testListTasksInvalidStatus() { + RestHandler handler = new RestHandler(CARD, requestHandler, internalExecutor); + + RestHandler.HTTPRestResponse response = handler.listTasks(null, "not-a-status", null, null, + null, null, null, "", callContext); + + Assertions.assertEquals(422, response.getStatusCode()); + Assertions.assertEquals("application/json", response.getContentType()); + Assertions.assertTrue(response.getBody().contains("InvalidParamsError")); + } + @Test public void testSendMessage() throws InvalidProtocolBufferException { RestHandler handler = new RestHandler(CARD, requestHandler, internalExecutor); From 6be62714359425ba38a4a32b9a697e801b0680ba Mon Sep 17 00:00:00 2001 From: hae02y Date: Thu, 8 Jan 2026 14:41:27 +0900 Subject: [PATCH 2/3] fix: valid status list is generated from enum to avoid drift Fixes #577 --- .../java/io/a2a/transport/rest/handler/RestHandler.java | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/transport/rest/src/main/java/io/a2a/transport/rest/handler/RestHandler.java b/transport/rest/src/main/java/io/a2a/transport/rest/handler/RestHandler.java index 3182147a4..9998d9b25 100644 --- a/transport/rest/src/main/java/io/a2a/transport/rest/handler/RestHandler.java +++ b/transport/rest/src/main/java/io/a2a/transport/rest/handler/RestHandler.java @@ -5,6 +5,7 @@ import java.time.Instant; import java.time.format.DateTimeParseException; +import java.util.Arrays; import java.util.HashMap; import java.util.Map; import java.util.concurrent.CompletableFuture; @@ -12,6 +13,7 @@ import java.util.concurrent.Flow; import java.util.logging.Level; import java.util.logging.Logger; +import java.util.stream.Collectors; import jakarta.enterprise.context.ApplicationScoped; import jakarta.enterprise.inject.Instance; @@ -211,9 +213,12 @@ public HTTPRestResponse listTasks(@Nullable String contextId, @Nullable String s try { paramsBuilder.status(TaskState.fromString(status)); } catch (IllegalArgumentException e) { + String validStates = Arrays.stream(TaskState.values()) + .map(TaskState::asString) + .collect(Collectors.joining(", ")); Map errorData = new HashMap<>(); errorData.put("parameter", "status"); - errorData.put("reason", "Must be one of: submitted, working, input-required, auth-required, completed, canceled, failed, rejected, unknown"); + errorData.put("reason", "Must be one of: " + validStates); throw new InvalidParamsError(null, "Invalid params", errorData); } } From 3da3b446308c9e5c36ac3703b2af84d1d84b7140 Mon Sep 17 00:00:00 2001 From: hae02y Date: Thu, 8 Jan 2026 15:05:45 +0900 Subject: [PATCH 3/3] fix: handle listTasks status wire strings Fixes #577 --- .../transport/rest/handler/RestHandler.java | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/transport/rest/src/main/java/io/a2a/transport/rest/handler/RestHandler.java b/transport/rest/src/main/java/io/a2a/transport/rest/handler/RestHandler.java index 9998d9b25..a5758974f 100644 --- a/transport/rest/src/main/java/io/a2a/transport/rest/handler/RestHandler.java +++ b/transport/rest/src/main/java/io/a2a/transport/rest/handler/RestHandler.java @@ -213,13 +213,17 @@ public HTTPRestResponse listTasks(@Nullable String contextId, @Nullable String s try { paramsBuilder.status(TaskState.fromString(status)); } catch (IllegalArgumentException e) { - String validStates = Arrays.stream(TaskState.values()) - .map(TaskState::asString) - .collect(Collectors.joining(", ")); - Map errorData = new HashMap<>(); - errorData.put("parameter", "status"); - errorData.put("reason", "Must be one of: " + validStates); - throw new InvalidParamsError(null, "Invalid params", errorData); + try { + paramsBuilder.status(TaskState.valueOf(status)); + } catch (IllegalArgumentException valueOfError) { + String validStates = Arrays.stream(TaskState.values()) + .map(TaskState::asString) + .collect(Collectors.joining(", ")); + Map errorData = new HashMap<>(); + errorData.put("parameter", "status"); + errorData.put("reason", "Must be one of: " + validStates); + throw new InvalidParamsError(null, "Invalid params", errorData); + } } } if (pageSize != null) {