diff --git a/core/src/main/java/feign/template/Expressions.java b/core/src/main/java/feign/template/Expressions.java index 3b579c33bb..644a24a3b3 100644 --- a/core/src/main/java/feign/template/Expressions.java +++ b/core/src/main/java/feign/template/Expressions.java @@ -38,10 +38,10 @@ public final class Expressions { * * This is not a complete implementation of the rfc * - * RFC 6570 Expressions */ - private static final Pattern EXPRESSION_PATTERN = - Pattern.compile("^(\\{([+#./;?&=,!@|]?)(.+)})$"); + static final Pattern EXPRESSION_PATTERN = + Pattern.compile("^(\\{([+#./;?&=,!@|]?)(.+)\\})$"); // Partially From: // https://stackoverflow.com/questions/29494608/regex-for-uri-templates-rfc-6570-wanted -- I diff --git a/core/src/test/java/feign/template/ExpressionsTest.java b/core/src/test/java/feign/template/ExpressionsTest.java new file mode 100644 index 0000000000..dd2c4cbb9b --- /dev/null +++ b/core/src/test/java/feign/template/ExpressionsTest.java @@ -0,0 +1,36 @@ +/* + * Copyright 2012-2023 The Feign Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ +package feign.template; + +import org.junit.jupiter.api.Test; +import java.util.Collections; +import static org.assertj.core.api.Assertions.assertThat; + +public class ExpressionsTest { + + @Test + public void simpleExpression() { + Expression expression = Expressions.create("{foo}"); + assertThat(expression).isNotNull(); + String expanded = expression.expand(Collections.singletonMap("foo", "bar"), false); + assertThat(expanded).isEqualToIgnoringCase("foo=bar"); + } + + @Test + public void androidCompatibility() { + // To match close brace on Android, it must be escaped due to the simpler ICU regex engine + String pattern = Expressions.EXPRESSION_PATTERN.pattern(); + assertThat(pattern.contains("}")).isEqualTo(pattern.contains("\\}")); + } +}