Skip to content

Commit 29d1db5

Browse files
lowzjadriancole
authored andcommitted
fix OpenFeigngh-470, support the values of QueryMap starting with '{' (OpenFeign#540)
1 parent dbbb112 commit 29d1db5

3 files changed

Lines changed: 41 additions & 4 deletions

File tree

‎core/src/main/java/feign/ReflectiveFeign.java‎

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -273,18 +273,19 @@ private RequestTemplate addQueryMapQueryParameters(Object[] argv, RequestTemplat
273273

274274
Collection<String> values = new ArrayList<String>();
275275

276+
boolean encoded = metadata.queryMapEncoded();
276277
Object currValue = currEntry.getValue();
277278
if (currValue instanceof Iterable<?>) {
278279
Iterator<?> iter = ((Iterable<?>) currValue).iterator();
279280
while (iter.hasNext()) {
280281
Object nextObject = iter.next();
281-
values.add(nextObject == null ? null : nextObject.toString());
282+
values.add(nextObject == null ? null : encoded ? nextObject.toString() : RequestTemplate.urlEncode(nextObject.toString()));
282283
}
283284
} else {
284-
values.add(currValue == null ? null : currValue.toString());
285+
values.add(currValue == null ? null : encoded ? currValue.toString() : RequestTemplate.urlEncode(currValue.toString()));
285286
}
286287

287-
mutable.query(metadata.queryMapEncoded(), (String) currEntry.getKey(), values);
288+
mutable.query(true, encoded ? (String) currEntry.getKey() : RequestTemplate.urlEncode(currEntry.getKey()), values);
288289
}
289290
return mutable;
290291
}

‎core/src/main/java/feign/RequestTemplate.java‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,7 @@ private static String urlDecode(String arg) {
8383
}
8484
}
8585

86-
private static String urlEncode(Object arg) {
86+
static String urlEncode(Object arg) {
8787
try {
8888
return URLEncoder.encode(String.valueOf(arg), UTF_8.name());
8989
} catch (UnsupportedEncodingException e) {

‎core/src/test/java/feign/FeignTest.java‎

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -367,6 +367,39 @@ public void queryMapKeysMustBeStrings() throws Exception {
367367
}
368368
}
369369

370+
@Test
371+
public void queryMapValueStartingWithBrace() throws Exception {
372+
TestInterface api = new TestInterfaceBuilder().target("http://localhost:" + server.getPort());
373+
374+
server.enqueue(new MockResponse());
375+
Map<String, Object> queryMap = new LinkedHashMap<String, Object>();
376+
queryMap.put("name", "{alice");
377+
api.queryMap(queryMap);
378+
assertThat(server.takeRequest())
379+
.hasPath("/?name=%7Balice");
380+
381+
server.enqueue(new MockResponse());
382+
queryMap = new LinkedHashMap<String, Object>();
383+
queryMap.put("{name", "alice");
384+
api.queryMap(queryMap);
385+
assertThat(server.takeRequest())
386+
.hasPath("/?%7Bname=alice");
387+
388+
server.enqueue(new MockResponse());
389+
queryMap = new LinkedHashMap<String, Object>();
390+
queryMap.put("name", "%7Balice");
391+
api.queryMapEncoded(queryMap);
392+
assertThat(server.takeRequest())
393+
.hasPath("/?name=%7Balice");
394+
395+
server.enqueue(new MockResponse());
396+
queryMap = new LinkedHashMap<String, Object>();
397+
queryMap.put("%7Bname", "%7Balice");
398+
api.queryMapEncoded(queryMap);
399+
assertThat(server.takeRequest())
400+
.hasPath("/?%7Bname=%7Balice");
401+
}
402+
370403
@Test
371404
public void configKeyFormatsAsExpected() throws Exception {
372405
assertEquals("TestInterface#post()",
@@ -715,6 +748,9 @@ void form(
715748
@RequestLine("GET /")
716749
void queryMap(@QueryMap Map<String, Object> queryMap);
717750

751+
@RequestLine("GET /")
752+
void queryMapEncoded(@QueryMap(encoded = true) Map<String, Object> queryMap);
753+
718754
@RequestLine("GET /?name={name}")
719755
void queryMapWithQueryParams(@Param("name") String name, @QueryMap Map<String, Object> queryMap);
720756

0 commit comments

Comments
 (0)