You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cxf.apache.org by co...@apache.org on 2020/05/07 07:55:13 UTC
[cxf] 01/02: Only add parenthesese to regex pattern when needed.
(#671)
This is an automated email from the ASF dual-hosted git repository.
coheigea pushed a commit to branch 3.3.x-fixes
in repository https://gitbox.apache.org/repos/asf/cxf.git
commit 1f0b77c702c326c03e8dcb9466280e25e70cc30c
Author: Jim Krueger <31...@users.noreply.github.com>
AuthorDate: Thu May 7 02:52:39 2020 -0500
Only add parenthesese to regex pattern when needed. (#671)
(cherry picked from commit 8c3e380ef63a84fff099c4f8d644746a79f7eeb1)
---
.../org/apache/cxf/jaxrs/model/URITemplate.java | 17 +++++++++---
.../apache/cxf/jaxrs/model/URITemplateTest.java | 32 ++++++++++++++++++++++
2 files changed, 45 insertions(+), 4 deletions(-)
diff --git a/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/model/URITemplate.java b/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/model/URITemplate.java
index d304eb1..d646407 100644
--- a/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/model/URITemplate.java
+++ b/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/model/URITemplate.java
@@ -75,11 +75,20 @@ public final class URITemplate {
} else if (chunk instanceof Variable) {
Variable var = (Variable)chunk;
variables.add(var.getName());
- if (var.getPattern() != null) {
+ String pattern = var.getPattern();
+ if (pattern != null) {
customVariables.add(var.getName());
- patternBuilder.append('(');
- patternBuilder.append(var.getPattern());
- patternBuilder.append(')');
+ // Add parenthesis to the pattern to identify a regex in the pattern,
+ // however do not add them if they already exist since that will cause the Matcher
+ // to create extraneous values. Parens identify a group so multiple parens would
+ // indicate multiple groups.
+ if (pattern.startsWith("(") && pattern.endsWith(")")) {
+ patternBuilder.append(pattern);
+ } else {
+ patternBuilder.append('(');
+ patternBuilder.append(pattern);
+ patternBuilder.append(')');
+ }
} else {
patternBuilder.append(DEFAULT_PATH_VARIABLE_REGEX);
}
diff --git a/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/model/URITemplateTest.java b/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/model/URITemplateTest.java
index a09898e..c2ba414 100644
--- a/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/model/URITemplateTest.java
+++ b/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/model/URITemplateTest.java
@@ -53,6 +53,38 @@ public class URITemplateTest {
}
@Test
+ public void testCompareRegExTemplates2() {
+ // The purpose of this test is to ensure that enclosing a regex expression does not result
+ // in the matcher creating extraneous values. See CXF-8278
+ URITemplate t1 = new URITemplate("/test/{uniqueid : ([0-9a-f]{4}-.*|[0-9a-f]{7}-.*)}/file/{file}");
+ URITemplate t2 = new URITemplate("/test/{uniqueid : [0-9a-f]{4}-.*|[0-9a-f]{7}-.*}/file/{file}");
+ MultivaluedMap<String, String> template = new MetadataMap<String, String>();
+ assertTrue(t1.match("/test/123e-12345/file/test.jpg", template));
+ assertEquals(template.getFirst("uniqueid"), "123e-12345");
+ assertEquals("test.jpg", template.getFirst("file"));
+
+ template.clear();
+ assertTrue(t1.match("/test/123456e-12345/file/test.jpg", template));
+ assertEquals(template.getFirst("uniqueid"), "123456e-12345");
+ assertEquals(template.getFirst("file"), "test.jpg");
+
+ template.clear();
+ assertTrue(t2.match("/test/123e-12345/file/test.jpg", template));
+ assertEquals(template.getFirst("uniqueid"), "123e-12345");
+ assertEquals(template.getFirst("file"), "test.jpg");
+
+ template.clear();
+ assertTrue(t2.match("/test/123456e-12345/file/test.jpg", template));
+ assertEquals(template.getFirst("uniqueid"), "123456e-12345");
+ assertEquals(template.getFirst("file"), "test.jpg");
+
+ template.clear();
+ assertFalse(t2.match("/test/12345678-12345/file/test.jpg", template));
+
+ }
+
+
+ @Test
public void testPathCharacters() {
String pathChars = ":@!$&'*+,;=-._~()";
assertTrue(new URITemplate(pathChars).match(pathChars,