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,