diff --git a/core/src/main/java/feign/template/Expressions.java b/core/src/main/java/feign/template/Expressions.java index 96dfe02dc..2410cf8aa 100644 --- a/core/src/main/java/feign/template/Expressions.java +++ b/core/src/main/java/feign/template/Expressions.java @@ -38,7 +38,8 @@ public final class Expressions { * * see https://tools.ietf.org/html/rfc6570#section-2.3 for more information. */ - expressions.put(Pattern.compile("(\\w[-\\w.\\[\\]]*[ ]*)(:(.+))?"), + + expressions.put(Pattern.compile("^([+#./;?&]?)(.*)$"), SimpleExpression.class); } @@ -70,10 +71,18 @@ public static Expression create(final String value, final FragmentType type) { Matcher matcher = expressionPattern.matcher(expression); if (matcher.matches()) { /* we have a valid variable expression, extract the name from the first group */ - variableName = matcher.group(1).trim(); - if (matcher.group(2) != null && matcher.group(3) != null) { - /* this variable contains an optional pattern */ - variablePattern = matcher.group(3); + variableName = matcher.group(2).trim(); + if (variableName.contains(":")) { + /* split on the colon */ + String[] parts = variableName.split(":"); + variableName = parts[0]; + variablePattern = parts[1]; + } + + /* look for nested expressions */ + if (variableName.contains("{")) { + /* nested, literal */ + return null; } } diff --git a/core/src/test/java/feign/template/QueryTemplateTest.java b/core/src/test/java/feign/template/QueryTemplateTest.java index ffa3cb620..4d7cb5e2b 100644 --- a/core/src/test/java/feign/template/QueryTemplateTest.java +++ b/core/src/test/java/feign/template/QueryTemplateTest.java @@ -176,4 +176,15 @@ public void expandCollectionValueWithBrackets() { /* brackets will be pct-encoded */ assertThat(expanded).isEqualToIgnoringCase("collection%5B%5D=1,2"); } + + @Test + public void expandCollectionValueWithDollar() { + QueryTemplate template = + QueryTemplate.create("$collection", Collections.singletonList("{$collection}"), + Util.UTF_8, CollectionFormat.CSV); + String expanded = template.expand(Collections.singletonMap("$collection", + Arrays.asList("1", "2"))); + /* brackets will be pct-encoded */ + assertThat(expanded).isEqualToIgnoringCase("$collection=1,2"); + } }