Skip to content

Commit f350c65

Browse files
adriancolespencergibb
authored andcommitted
Allows query parameters to match on a substring. Ex q=body:{body} (OpenFeign#428)
This is to help develop apis like Elasticsearch which nest queries in query parameters. Fixes OpenFeign#424
1 parent 919339a commit f350c65

File tree

3 files changed

+19
-17
lines changed

3 files changed

+19
-17
lines changed

CHANGELOG.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,6 @@
1+
### Version 9.1
2+
* Allows query parameters to match on a substring. Ex `q=body:{body}`
3+
14
### Version 9.0
25
* Migrates to maven from gradle
36
* Changes maven groupId to `io.github.openfeign`

core/src/main/java/feign/Contract.java

Lines changed: 1 addition & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -258,7 +258,7 @@ protected boolean processAnnotationsOnParameter(MethodMetadata data, Annotation[
258258
isHttpAnnotation = true;
259259
String varName = '{' + name + '}';
260260
if (data.template().url().indexOf(varName) == -1 &&
261-
!searchMapValuesContainsExact(data.template().queries(), varName) &&
261+
!searchMapValuesContainsSubstring(data.template().queries(), varName) &&
262262
!searchMapValuesContainsSubstring(data.template().headers(), varName)) {
263263
data.formParams().add(name);
264264
}
@@ -276,22 +276,6 @@ protected boolean processAnnotationsOnParameter(MethodMetadata data, Annotation[
276276
return isHttpAnnotation;
277277
}
278278

279-
private static <K, V> boolean searchMapValuesContainsExact(Map<K, Collection<V>> map,
280-
V search) {
281-
Collection<Collection<V>> values = map.values();
282-
if (values == null) {
283-
return false;
284-
}
285-
286-
for (Collection<V> entry : values) {
287-
if (entry.contains(search)) {
288-
return true;
289-
}
290-
}
291-
292-
return false;
293-
}
294-
295279
private static <K, V> boolean searchMapValuesContainsSubstring(Map<K, Collection<String>> map,
296280
String search) {
297281
Collection<Collection<String>> values = map.values();

core/src/test/java/feign/DefaultContractTest.java

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -770,4 +770,19 @@ public void defaultMethodsOnInterfaceIgnored() throws Exception {
770770
MethodMetadata md = mds.get(0);
771771
assertThat(md.configKey()).isEqualTo("DefaultMethodOnInterface#get(String)");
772772
}
773+
774+
interface SubstringQuery {
775+
@RequestLine("GET /_search?q=body:{body}")
776+
String paramIsASubstringOfAQuery(@Param("body") String body);
777+
}
778+
779+
@Test
780+
public void paramIsASubstringOfAQuery() throws Exception {
781+
List<MethodMetadata> mds = contract.parseAndValidatateMetadata(SubstringQuery.class);
782+
783+
assertThat(mds.get(0).template().queries()).containsExactly(
784+
entry("q", asList("body:{body}"))
785+
);
786+
assertThat(mds.get(0).formParams()).isEmpty(); // Prevent issue 424
787+
}
773788
}

0 commit comments

Comments
 (0)