HTTP+JSON CancelTask returns 409 Conflict instead of 400 Bad Request for TaskNotCancelableError

Aberta Para iniciantes
#1,298 0 comentários 0 reações 0 responsáveis Ver no GitHub

Mantenedores costumam responder em até 1 dia

Ninguém assumiu esta issue ainda.

Avaliação

Dificuldade
2/5
Tempo estimado
1-3 horas
Facilidade para iniciantes
76/100
Tipo de issue
Bug
Clareza
Claramente especificada
Status de atividade
Ativa
Stack de tecnologia
java
Domínio
api

Direção de pesquisa

Comece rastreando como o transporte HTTP+JSON associa TaskNotCancelableError a um status HTTP e, em seguida, compare essa associação com a tabela de erros da especificação na seção 3.3.2. Execute tests/compatibility/core_operations/test_task_lifecycle.py::TestCancelTask::test_cancel_terminal_task_returns_error[http_json] para reproduzir o problema; o resultado esperado é uma resposta HTTP 400 com o código 400 e o motivo TASK_NOT_CANCELABLE.

Escrita pelo modelo de indexação a partir do texto da issue.

Descrição

Summary

When canceling a task that is already in a terminal state (TASK_STATE_COMPLETED), the HTTP+JSON transport returns 409 Conflict instead of 400 Bad Request as required by the A2A specification's error mapping table.

Requirement

Specification

CancelTask MUST return TaskNotCancelableError when the task is not in a cancelable state (already completed, failed, or canceled).

The error mapping table in section 3.3.2 specifies:

Error Name JSON-RPC gRPC HTTP
TaskNotCancelableError -32002 FAILED_PRECONDITION 400 Bad Request

Expected behavior

The HTTP+JSON transport should return HTTP status 400 Bad Request with an AIP-193 error body containing "code": 400 and an ErrorInfo detail with "reason": "TASK_NOT_CANCELABLE".

Actual behavior

The SUT returns HTTP 409 Conflict with "code": 409 and "status": "FAILED_PRECONDITION":

{
  "error": {
    "code": 409,
    "status": "FAILED_PRECONDITION",
    "message": "Task cannot be canceled - current state: TASK_STATE_COMPLETED",
    "details": [
      {
        "@type": "type.googleapis.com/google.rpc.ErrorInfo",
        "reason": "TASK_NOT_CANCELABLE",
        "domain": "a2a-protocol.org",
        "metadata": {}
      }
    ]
  }
}

Note: The reason and error structure are correct — only the HTTP status code is wrong.

Reproducer

# 1. Create a task that completes immediately
TASK_ID=$(curl -s -X POST "http://localhost:9999/message:send" \
  -H "Content-Type: application/json" \
  -H "A2A-Version: 1.0" \
  -d '{"message":{"role":"ROLE_USER","parts":[{"text":"TCK prerequisite task creation"}],"messageId":"tck-complete-task-repro"},"configuration":{"acceptedOutputModes":["text"]}}' \
  | python3 -c "import sys,json; d=json.load(sys.stdin); print(d['task']['id'])")

# 2. Verify the task is completed
curl -s -X GET "http://localhost:9999/tasks/$TASK_ID" \
  -H "A2A-Version: 1.0" \
  | python3 -c "import sys,json; d=json.load(sys.stdin); print(d['status']['state'])"
# → TASK_STATE_COMPLETED

# 3. Attempt to cancel the completed task (expect 400, get 409)
curl -s -w "\nHTTP Status: %{http_code}\n" -X POST "http://localhost:9999/tasks/$TASK_ID:cancel" \
  -H "A2A-Version: 1.0"
# → HTTP Status: 409 (should be 400)

TCK test

tests/compatibility/core_operations/test_task_lifecycle.py::TestCancelTask::test_cancel_terminal_task_returns_error[http_json]

Linguagem predominante
Java
Estrelas
510
Forks
196
Merge médio
2d 4h
PRs com merge (30d)
57

Preparar o ambiente

Primeiros passos

  1. Leia a issue inteira e depois o guia de contribuição do projeto.
  2. Comente na issue dizendo que vai assumir — evita que duas pessoas façam o mesmo trabalho.
  3. Faça um fork do repositório e trabalhe em uma branch.
  4. Abra um pull request que referencie o número da issue.

Mais de a2aproject/a2a-java

Todas as issues de a2aproject/a2a-java

Issues semelhantes

Mais issues de Java

Receba novas issues na sua caixa de entrada

Um resumo curto de issues do GitHub para quem está começando.