Skip to content

Commit d2206e3

Browse files
committed
fix!: Add request body parameter to cancelTask method
Update cancelTask signature across REST transport and tests to include the request body parameter, aligning with recent a2a.proto changes. Fixes Signed-off-by: Emmanuel Hugonnet <ehugonne@redhat.com>
1 parent 41aa7e9 commit d2206e3

6 files changed

Lines changed: 30 additions & 12 deletions

File tree

client/transport/rest/src/main/java/io/a2a/client/transport/rest/RestTransport.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -165,8 +165,7 @@ public Task getTask(TaskQueryParams taskQueryParams, @Nullable ClientCallContext
165165
@Override
166166
public Task cancelTask(TaskIdParams taskIdParams, @Nullable ClientCallContext context) throws A2AClientException {
167167
checkNotNullParam("taskIdParams", taskIdParams);
168-
io.a2a.grpc.CancelTaskRequest.Builder builder = io.a2a.grpc.CancelTaskRequest.newBuilder();
169-
builder.setId(taskIdParams.id());
168+
io.a2a.grpc.CancelTaskRequest.Builder builder = io.a2a.grpc.CancelTaskRequest.newBuilder(ProtoUtils.ToProto.cancelTaskRequest(taskIdParams));
170169
PayloadAndHeaders payloadAndHeaders = applyInterceptors(CANCEL_TASK_METHOD, builder, agentCard, context);
171170
try {
172171
String httpResponseBody = sendPostRequest(Utils.buildBaseUrl(agentInterface, taskIdParams.tenant()) + String.format("/tasks/%1s:cancel", taskIdParams.id()), payloadAndHeaders);

reference/jsonrpc/src/test/java/io/a2a/server/apps/quarkus/A2AServerRoutesTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -417,7 +417,7 @@ public void testListTaskPushNotificationConfig_MethodNameSetInContext() {
417417
{
418418
"jsonrpc": "2.0",
419419
"id": "cd4c76de-d54c-436c-8b9f-4c2703648d64",
420-
"method": "ListTaskPushNotificationConfig",
420+
"method": "ListTaskPushNotificationConfigs",
421421
"params": {
422422
"taskId": "de38c76d-d54c-436c-8b9f-4c2703648d64",
423423
"pageSize": 0,

reference/rest/src/main/java/io/a2a/server/rest/quarkus/A2AServerRoutes.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -199,15 +199,15 @@ public void getTask(RoutingContext rc) {
199199
}
200200

201201
@Route(regex = "^\\/(?<tenant>[^\\/]*\\/?)tasks\\/(?<taskId>[^/]+):cancel$", order = 1, methods = {Route.HttpMethod.POST}, type = Route.HandlerType.BLOCKING)
202-
public void cancelTask(RoutingContext rc) {
202+
public void cancelTask(@Body String body, RoutingContext rc) {
203203
String taskId = rc.pathParam("taskId");
204204
ServerCallContext context = createCallContext(rc, CANCEL_TASK_METHOD);
205205
HTTPRestResponse response = null;
206206
try {
207207
if (taskId == null || taskId.isEmpty()) {
208208
response = jsonRestHandler.createErrorResponse(new InvalidParamsError("bad task id"));
209209
} else {
210-
response = jsonRestHandler.cancelTask(context, extractTenant(rc), taskId);
210+
response = jsonRestHandler.cancelTask(context, extractTenant(rc), body, taskId);
211211
}
212212
} catch (Throwable t) {
213213
if (t instanceof A2AError error) {

reference/rest/src/test/java/io/a2a/server/rest/quarkus/A2AServerRoutesTest.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -160,15 +160,15 @@ public void testCancelTask_MethodNameSetInContext() {
160160
when(mockHttpResponse.getStatusCode()).thenReturn(200);
161161
when(mockHttpResponse.getContentType()).thenReturn("application/json");
162162
when(mockHttpResponse.getBody()).thenReturn("{}");
163-
when(mockRestHandler.cancelTask(any(ServerCallContext.class), anyString(), anyString())).thenReturn(mockHttpResponse);
163+
when(mockRestHandler.cancelTask(any(ServerCallContext.class), anyString(), anyString(), anyString())).thenReturn(mockHttpResponse);
164164

165165
ArgumentCaptor<ServerCallContext> contextCaptor = ArgumentCaptor.forClass(ServerCallContext.class);
166166

167167
// Act
168-
routes.cancelTask(mockRoutingContext);
168+
routes.cancelTask("{\"id\":\"task123\"}", mockRoutingContext);
169169

170170
// Assert
171-
verify(mockRestHandler).cancelTask(contextCaptor.capture(), anyString(), eq("task123"));
171+
verify(mockRestHandler).cancelTask(contextCaptor.capture(), anyString(), anyString(), eq("task123"));
172172
ServerCallContext capturedContext = contextCaptor.getValue();
173173
assertNotNull(capturedContext);
174174
assertEquals(CANCEL_TASK_METHOD, capturedContext.getState().get(METHOD_NAME_KEY));

transport/rest/src/main/java/io/a2a/transport/rest/handler/RestHandler.java

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -144,12 +144,29 @@ public HTTPRestResponse sendStreamingMessage(ServerCallContext context, String t
144144
}
145145
}
146146

147-
public HTTPRestResponse cancelTask(ServerCallContext context, String tenant, String taskId) {
147+
public HTTPRestResponse cancelTask(ServerCallContext context, String tenant, String body, String taskId) {
148148
try {
149149
if (taskId == null || taskId.isEmpty()) {
150150
throw new InvalidParamsError();
151151
}
152-
TaskIdParams params = TaskIdParams.builder().id(taskId).tenant(tenant).build();
152+
TaskIdParams params;
153+
if (body != null && !body.isEmpty()) {
154+
io.a2a.grpc.CancelTaskRequest.Builder request = io.a2a.grpc.CancelTaskRequest.newBuilder();
155+
parseRequestBody(body, request);
156+
request.setTenant(tenant);
157+
if (!taskId.equals(request.getId())) {
158+
throw new InvalidParamsError();
159+
}
160+
params = ProtoUtils.FromProto.taskIdParams(request);
161+
} else {
162+
params = TaskIdParams.builder().id(taskId).tenant(tenant).build();
163+
}
164+
io.a2a.grpc.CancelTaskRequest.Builder request = io.a2a.grpc.CancelTaskRequest.newBuilder();
165+
parseRequestBody(body, request);
166+
request.setTenant(tenant);
167+
if (!taskId.equals(request.getId())) {
168+
throw new InvalidParamsError();
169+
}
153170
Task task = requestHandler.onCancelTask(params, context);
154171
if (task != null) {
155172
return createSuccessResponse(200, io.a2a.grpc.Task.newBuilder(ProtoUtils.ToProto.task(task)));

transport/rest/src/test/java/io/a2a/transport/rest/handler/RestHandlerTest.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -174,7 +174,8 @@ public void testCancelTaskSuccess() {
174174
agentEmitter.cancel();
175175
};
176176

177-
RestHandler.HTTPRestResponse response = handler.cancelTask(callContext, "", MINIMAL_TASK.id());
177+
String requestBody = String.format("{\"id\":\"%s\"}", MINIMAL_TASK.id());
178+
RestHandler.HTTPRestResponse response = handler.cancelTask(callContext, "", requestBody, MINIMAL_TASK.id());
178179

179180
Assertions.assertEquals(200, response.getStatusCode());
180181
Assertions.assertEquals("application/json", response.getContentType());
@@ -185,7 +186,8 @@ public void testCancelTaskSuccess() {
185186
public void testCancelTaskNotFound() {
186187
RestHandler handler = new RestHandler(CARD, requestHandler, internalExecutor);
187188

188-
RestHandler.HTTPRestResponse response = handler.cancelTask(callContext, "", "nonexistent");
189+
String requestBody = "{\"id\":\"nonexistent\"}";
190+
RestHandler.HTTPRestResponse response = handler.cancelTask(callContext, "", requestBody, "nonexistent");
189191

190192
Assertions.assertEquals(404, response.getStatusCode());
191193
Assertions.assertEquals("application/json", response.getContentType());

0 commit comments

Comments
 (0)