You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tomcat.apache.org by ma...@apache.org on 2012/12/03 10:48:00 UTC

svn commit: r1416397 - in /tomcat/trunk: java/org/apache/tomcat/websocket/LocalStrings.properties java/org/apache/tomcat/websocket/UriTemplate.java test/org/apache/tomcat/websocket/TestUriTemplate.java

Author: markt
Date: Mon Dec  3 09:47:56 2012
New Revision: 1416397

URL: http://svn.apache.org/viewvc?rev=1416397&view=rev
Log:
Use Pattern.quote() as suggested by kkolinko
Tighten up implementation. WS spec (draft 8, section 3.1.1.) states "if the relative path is a URI template (level-1) the request URI matches if and only if the request URI is an expanded version of the URI-template" so every path segment must be present - none can be optional

Modified:
    tomcat/trunk/java/org/apache/tomcat/websocket/LocalStrings.properties
    tomcat/trunk/java/org/apache/tomcat/websocket/UriTemplate.java
    tomcat/trunk/test/org/apache/tomcat/websocket/TestUriTemplate.java

Modified: tomcat/trunk/java/org/apache/tomcat/websocket/LocalStrings.properties
URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/websocket/LocalStrings.properties?rev=1416397&r1=1416396&r2=1416397&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/tomcat/websocket/LocalStrings.properties (original)
+++ tomcat/trunk/java/org/apache/tomcat/websocket/LocalStrings.properties Mon Dec  3 09:47:56 2012
@@ -17,4 +17,5 @@ serverContainer.endpointDeploy=Endpoint 
 serverContainer.missingEndpoint=An Endpoint instance has been request for path [{0}] but no matching Endpoint class was found
 serverContainer.pojoDeploy=POJO class [{0}] deploying to path [{1}] in ServletContext [{2}]
 serverContainer.servletContextMismatch=Attempted to register a POJO annotated for WebSocket at path [{0}] in the ServletContext with context path [{1}] when the WebSocket ServerContainer is allocated to the ServletContext with context path [{2}]
-serverContainer.servletContextMissing=No ServletContext was specified
\ No newline at end of file
+serverContainer.servletContextMissing=No ServletContext was specified
+uriTemplate.noMatch=The input template [{0}] generated the pattern [{1}] which did not match the supplied pathInfo [{2}]
\ No newline at end of file

Modified: tomcat/trunk/java/org/apache/tomcat/websocket/UriTemplate.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/websocket/UriTemplate.java?rev=1416397&r1=1416396&r2=1416397&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/tomcat/websocket/UriTemplate.java (original)
+++ tomcat/trunk/java/org/apache/tomcat/websocket/UriTemplate.java Mon Dec  3 09:47:56 2012
@@ -23,28 +23,36 @@ import java.util.Map;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
+import org.apache.tomcat.util.res.StringManager;
+
 /**
  * Extracts path parameters from URIs used to create web socket connections
  * using the URI template defined for the associated Endpoint.
  */
 public class UriTemplate {
 
+    private static StringManager sm = StringManager.getManager(
+            Constants.PACKAGE_NAME);
+
+    private final String template;
     private final Pattern pattern;
     private final List<String> names = new ArrayList<>();
 
     public UriTemplate(String template) {
+
+        this.template = template;
+
         // +10 is just a guess at this point
         StringBuilder pattern = new StringBuilder(template.length() + 10);
 
-
         int pos = 0;
         int end = 0;
         int start = template.indexOf('{');
         while (start > -1) {
             end = template.indexOf('}', start);
             pattern.append('(');
-            pattern.append(template.substring(pos, start));
-            pattern.append(")?([^/]*)");
+            pattern.append(Pattern.quote(template.substring(pos, start)));
+            pattern.append(")([^/]*)");
             names.add(template.substring(start + 1, end));
             pos = end + 1;
             start = template.indexOf('{', pos);
@@ -77,7 +85,11 @@ public class UriTemplate {
     public Map<String,String> match(String pathInfo) {
         Map<String,String> result = new HashMap<>();
         Matcher m = pattern.matcher(pathInfo);
-        m.matches();
+
+        if (!m.matches()) {
+            throw new IllegalArgumentException(sm.getString(
+                    "uriTemplate.noMatch", template, pattern, pathInfo));
+        }
 
         int group = 2;
         for (String name : names) {

Modified: tomcat/trunk/test/org/apache/tomcat/websocket/TestUriTemplate.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/test/org/apache/tomcat/websocket/TestUriTemplate.java?rev=1416397&r1=1416396&r2=1416397&view=diff
==============================================================================
--- tomcat/trunk/test/org/apache/tomcat/websocket/TestUriTemplate.java (original)
+++ tomcat/trunk/test/org/apache/tomcat/websocket/TestUriTemplate.java Mon Dec  3 09:47:56 2012
@@ -37,14 +37,10 @@ public class TestUriTemplate {
     }
 
 
-    @Test
+    @Test(expected=java.lang.IllegalArgumentException.class)
     public void testOneOfTwo() throws Exception {
         UriTemplate t = new UriTemplate("/{a}/{b}");
-        Map<String,String> result = t.match("/foo");
-
-        Assert.assertEquals(1, result.size());
-        Assert.assertTrue(result.containsKey("a"));
-        Assert.assertEquals("foo", result.get("a"));
+        t.match("/foo");
     }
 
 
@@ -61,24 +57,34 @@ public class TestUriTemplate {
     }
 
 
-    @Test
+    @Test(expected=java.lang.IllegalArgumentException.class)
     public void testPrefixOneOfTwo() throws Exception {
         UriTemplate t = new UriTemplate("/x{a}/y{b}");
-        Map<String,String> result = t.match("/xfoo");
-
-        Assert.assertEquals(1, result.size());
-        Assert.assertTrue(result.containsKey("a"));
-        Assert.assertEquals("foo", result.get("a"));
+        t.match("/xfoo");
     }
 
 
-    @Test
+    @Test(expected=java.lang.IllegalArgumentException.class)
     public void testPrefixTwoOfTwo() throws Exception {
         UriTemplate t = new UriTemplate("/x{a}/y{b}");
-        Map<String,String> result = t.match("/ybar");
+        t.match("/ybar");
+    }
+
+
+    @Test(expected=java.lang.IllegalArgumentException.class)
+    public void testQuote1() throws Exception {
+        UriTemplate t = new UriTemplate("/.{a}");
+        t.match("/yfoo");
+    }
+
+
+    @Test
+    public void testQuote2() throws Exception {
+        UriTemplate t = new UriTemplate("/.{a}");
+        Map<String,String> result = t.match("/.foo");
 
         Assert.assertEquals(1, result.size());
-        Assert.assertTrue(result.containsKey("b"));
-        Assert.assertEquals("bar", result.get("b"));
+        Assert.assertTrue(result.containsKey("a"));
+        Assert.assertEquals("foo", result.get("a"));
     }
 }



---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@tomcat.apache.org
For additional commands, e-mail: dev-help@tomcat.apache.org