Skip to content

Commit 7624070

Browse files
committed
fix response not sent for methods not returning values
1 parent 1c332dd commit 7624070

2 files changed

Lines changed: 54 additions & 6 deletions

File tree

a2asrv/jsonrpc.go

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -133,12 +133,10 @@ func (h *jsonrpcHandler) handleRequest(ctx context.Context, rw http.ResponseWrit
133133
return
134134
}
135135

136-
if result != nil {
137-
rw.Header().Set("Content-Type", "application/json")
138-
resp := jsonrpc.ServerResponse{JSONRPC: jsonrpc.Version, ID: req.ID, Result: result}
139-
if err := json.NewEncoder(rw).Encode(resp); err != nil {
140-
log.Error(ctx, "failed to encode response", err)
141-
}
136+
rw.Header().Set("Content-Type", "application/json")
137+
resp := jsonrpc.ServerResponse{JSONRPC: jsonrpc.Version, ID: req.ID, Result: result}
138+
if err := json.NewEncoder(rw).Encode(resp); err != nil {
139+
log.Error(ctx, "failed to encode response", err)
142140
}
143141
}
144142

a2asrv/jsonrpc_test.go

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -382,6 +382,56 @@ func TestJSONRPC_StreamingKeepAlive(t *testing.T) {
382382
}
383383
}
384384

385+
func TestJSONRPC_DeletePushConfigResponse(t *testing.T) {
386+
t.Parallel()
387+
ctx := t.Context()
388+
389+
taskID := a2a.NewTaskID()
390+
config := &a2a.PushConfig{ID: "config-1", URL: "https://example.com/push"}
391+
store := testutil.NewTestTaskStore().WithTasks(t, &a2a.Task{ID: taskID})
392+
pushStore := testutil.NewTestPushConfigStore().WithConfigs(t, taskID, config)
393+
pushSender := testutil.NewTestPushSender(t).SetSendPushError(nil)
394+
reqHandler := NewHandler(
395+
&mockAgentExecutor{},
396+
WithTaskStore(store),
397+
WithPushNotifications(pushStore, pushSender),
398+
)
399+
server := httptest.NewServer(NewJSONRPCHandler(reqHandler))
400+
defer server.Close()
401+
402+
params := mustMarshal(t, &a2a.DeleteTaskPushConfigRequest{TaskID: taskID, ID: config.ID})
403+
request := jsonrpc.ServerRequest{
404+
JSONRPC: "2.0",
405+
Method: jsonrpc.MethodPushConfigDelete,
406+
Params: params,
407+
ID: "delete-1",
408+
}
409+
req, err := http.NewRequestWithContext(ctx, "POST", server.URL, bytes.NewBuffer(mustMarshal(t, request)))
410+
if err != nil {
411+
t.Fatalf("http.NewRequestWithContext() error = %v", err)
412+
}
413+
414+
resp, err := http.DefaultClient.Do(req)
415+
if err != nil {
416+
t.Fatalf("http.DefaultClient.Do() error = %v", err)
417+
}
418+
defer func() { _ = resp.Body.Close() }()
419+
420+
var payload jsonrpc.ServerResponse
421+
if err := json.NewDecoder(resp.Body).Decode(&payload); err != nil {
422+
t.Fatalf("json.Decode() error = %v, want valid JSON-RPC response", err)
423+
}
424+
if payload.JSONRPC != "2.0" {
425+
t.Fatalf("payload.JSONRPC = %q, want %q", payload.JSONRPC, "2.0")
426+
}
427+
if payload.Error != nil {
428+
t.Fatalf("payload.Error = %v, want nil", payload.Error)
429+
}
430+
if payload.ID != "delete-1" {
431+
t.Fatalf("payload.ID = %v, want %q", payload.ID, "delete-1")
432+
}
433+
}
434+
385435
func mustMarshal(t *testing.T, data any) []byte {
386436
t.Helper()
387437
body, err := json.Marshal(data)

0 commit comments

Comments
 (0)