Hacktoberfest 2026 : les issues que les mainteneurs ont marquées pour octobre, ouvertes et accessibles aux débutants. Parcourir les issues Hacktoberfest

[Bug]: REST transport: getTask builds an invalid URL for single-digit historyLength

Fermée Adaptée aux débutants
#1,197 0 commentaires 0 réactions 0 personnes assignées Voir sur GitHub

Les mainteneurs répondent en général sous 2 jours

@014-code y travaille déjà.

Depuis le 2/10/2026.

  • #1 par @014-code — fermée sans fusion
  • #1199 par @014-code — fermée sans fusion
  • #1200 par @014-code — ouverte

Évaluation

Difficulté
2/5
Temps estimé
1-3 heures
Accessibilité débutants
88/100
Type d'issue
Bug
Clarté
Clairement spécifiée
Activité
Active
Stack technique
java
Domaine
api

Piste de recherche

Commencez dans client/transport/rest/src/main/java/io/a2aproject/a2a/client/transport/rest/RestTransport.java, au niveau de getTask, et examinez le formatage de l’URL. Exécutez RestTransportTest.testGetTask avec un historyLength à un seul chiffre, tel que 5, puis ajoutez une couverture de régression montrant que l’URI générée est valide et que la requête ne contient aucun remplissage ; normalisez les chaînes de format associées si elles sont incluses dans la modification.

Rédigé par le modèle d'indexation à partir du texte de l'issue.

Description

What happened?

Summary

RestTransport.getTask builds the request URL with a String.format pattern that uses width specifiers (%2d) where argument-index specifiers (%2$d) were intended. For a single-digit historyLength (0–9), %2d left-pads the value with a space, producing historyLength= 5. A raw space is illegal in a URI, so java.net.URI.create(...) throws IllegalArgumentException: Illegal character in query, and the getTask call fails before any request is sent.

Affected code

client/transport/rest/src/main/java/io/a2a/client/transport/rest/RestTransport.java, in getTask:

url.append(String.format("/tasks/%1s?historyLength=%2d", taskQueryParams.id(), taskQueryParams.historyLength()));

In Java format syntax, an argument index requires a trailing $ (%2$d). Without it, %2d means "decimal, minimum width 2", and %1s means "string, minimum width 1" — these are width fields, not argument references. The %1s on the id is harmless only by accident (a UUID is always wider than 1, so nothing is padded); the %2d on the integer pads any single-digit value.

Reproduction

String.format("/tasks/%1s?historyLength=%2d", "de38c76d-d54c-436c-8b9f-4c2703648d64", 5);
// => "/tasks/de38c76d-d54c-436c-8b9f-4c2703648d64?historyLength= 5"
//                                                               ^ stray space

URI.create("https://host/tasks/de38c76d-d54c-436c-8b9f-4c2703648d64?historyLength= 5");
// => java.lang.IllegalArgumentException: Illegal character in query at index N: ...historyLength= 5

Behavior by value:

historyLength formatted query valid URI?
1–9 historyLength= N (leading space) ❌
0 n/a — getTask skips the query when historyLength <= 0 ✅
≥ 10 historyLength=NN ✅

So any getTask call with historyLength in 1–9 fails. This is the common case (clients typically request a small history window), which makes the practical impact high.

Why existing tests don't catch it

RestTransportTest.testGetTask uses new TaskQueryParams("...", 10) — a two-digit value that satisfies the width-2 field, so no space is injected and the URL stays valid. Single-digit values are never exercised.

Suggested fix

Drop the width (preferred) or use real positional indices:

// simplest
url.append(String.format("/tasks/%s?historyLength=%d", taskQueryParams.id(), taskQueryParams.historyLength()));

// or, if explicit indices are desired
url.append(String.format("/tasks/%1$s?historyLength=%2$d", taskQueryParams.id(), taskQueryParams.historyLength()));

Also recommend adding a regression test that calls getTask with a single-digit historyLength (e.g. 5) and asserts the resulting URL/query is well-formed.

Related occurrences (same specifier mistake, latent)

The same %Ns width-vs-index pattern appears on other URL-building sites in RestTransport.java (e.g. /tasks/%1s:cancel, /tasks/%1s/pushNotificationConfigs/%2s, /tasks/%1s:subscribe). These don't currently misbehave because their arguments are strings whose length exceeds the width, so no padding occurs — but they're the same bug waiting on a short/empty value and would be worth normalizing to %s in the same change.

Environment

  • Observed on the v1.x line (org.a2aproject.sdk) and the v0.3 line (io.github.a2asdk:0.3.3.Final); both contain the identical historyLength=%2d line, and it is still present on the latest main.
  • Transport: HTTP+JSON (REST). JSON-RPC transport is unaffected (it doesn't build this query).
Relevant log output

Code of Conduct
  • I agree to follow this project's Code of Conduct
Langage dominant
Java
Étoiles
507
Forks
192
Merge moyen
3 j 8 h
PR mergées (30 j)
23

Préparer son environnement

Par où commencer

  1. Lisez l'issue en entier, puis le guide de contribution du projet.
  2. Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
  3. Forkez le dépôt et travaillez sur une branche.
  4. Ouvrez une pull request qui référence le numéro de l'issue.

Autres issues de a2aproject/a2a-java

Toutes les issues de a2aproject/a2a-java

Issues similaires

Plus d'issues Java

Recevez les nouvelles issues par e-mail

Un résumé court des issues GitHub adaptées aux débutants.