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 2014/05/12 18:56:57 UTC

svn commit: r1594028 - in /tomcat/tc7.0.x/trunk: ./ java/org/apache/catalina/connector/ java/org/apache/tomcat/util/http/mapper/ test/org/apache/catalina/connector/ webapps/docs/

Author: markt
Date: Mon May 12 16:56:56 2014
New Revision: 1594028

URL: http://svn.apache.org/r1594028
Log:
Fix https://issues.apache.org/bugzilla/show_bug.cgi?id=56501
Fix https://issues.apache.org/bugzilla/show_bug.cgi?id=56501
HttpServletRequest.getContextPath() should return the undecoded context path used by the user agent.

Modified:
    tomcat/tc7.0.x/trunk/   (props changed)
    tomcat/tc7.0.x/trunk/java/org/apache/catalina/connector/Request.java
    tomcat/tc7.0.x/trunk/java/org/apache/tomcat/util/http/mapper/Mapper.java
    tomcat/tc7.0.x/trunk/java/org/apache/tomcat/util/http/mapper/MappingData.java
    tomcat/tc7.0.x/trunk/test/org/apache/catalina/connector/TestRequest.java
    tomcat/tc7.0.x/trunk/webapps/docs/changelog.xml

Propchange: tomcat/tc7.0.x/trunk/
------------------------------------------------------------------------------
  Merged /tomcat/trunk:r1593621

Modified: tomcat/tc7.0.x/trunk/java/org/apache/catalina/connector/Request.java
URL: http://svn.apache.org/viewvc/tomcat/tc7.0.x/trunk/java/org/apache/catalina/connector/Request.java?rev=1594028&r1=1594027&r2=1594028&view=diff
==============================================================================
--- tomcat/tc7.0.x/trunk/java/org/apache/catalina/connector/Request.java (original)
+++ tomcat/tc7.0.x/trunk/java/org/apache/catalina/connector/Request.java Mon May 12 16:56:56 2014
@@ -1990,7 +1990,17 @@ public class Request
      */
     @Override
     public String getContextPath() {
-        return mappingData.contextPath.toString();
+        String uri = getRequestURI();
+        int lastSlash = mappingData.contextSlashCount;
+        int pos = 0;
+        while (lastSlash > 0) {
+            pos = uri.indexOf('/', pos + 1);
+            if (pos == -1) {
+                return uri;
+            }
+            lastSlash--;
+        }
+        return uri.substring(0, pos);
     }
 
 

Modified: tomcat/tc7.0.x/trunk/java/org/apache/tomcat/util/http/mapper/Mapper.java
URL: http://svn.apache.org/viewvc/tomcat/tc7.0.x/trunk/java/org/apache/tomcat/util/http/mapper/Mapper.java?rev=1594028&r1=1594027&r2=1594028&view=diff
==============================================================================
--- tomcat/tc7.0.x/trunk/java/org/apache/tomcat/util/http/mapper/Mapper.java (original)
+++ tomcat/tc7.0.x/trunk/java/org/apache/tomcat/util/http/mapper/Mapper.java Mon May 12 16:56:56 2014
@@ -237,6 +237,7 @@ public final class Mapper {
                     new ContextVersion[contextVersions.length + 1];
                 ContextVersion newContextVersion = new ContextVersion();
                 newContextVersion.path = path;
+                newContextVersion.slashCount = slashCount;
                 newContextVersion.name = version;
                 newContextVersion.object = context;
                 newContextVersion.welcomeResources = welcomeResources;
@@ -814,6 +815,7 @@ public final class Mapper {
                 }
             }
             mappingData.context = contextVersion.object;
+            mappingData.contextSlashCount = contextVersion.slashCount;
         }
 
         // Wrapper mapping
@@ -1503,6 +1505,7 @@ public final class Mapper {
 
     protected static final class ContextVersion extends MapElement {
         public String path = null;
+        public int slashCount;
         public String[] welcomeResources = new String[0];
         public javax.naming.Context resources = null;
         public Wrapper defaultWrapper = null;

Modified: tomcat/tc7.0.x/trunk/java/org/apache/tomcat/util/http/mapper/MappingData.java
URL: http://svn.apache.org/viewvc/tomcat/tc7.0.x/trunk/java/org/apache/tomcat/util/http/mapper/MappingData.java?rev=1594028&r1=1594027&r2=1594028&view=diff
==============================================================================
--- tomcat/tc7.0.x/trunk/java/org/apache/tomcat/util/http/mapper/MappingData.java (original)
+++ tomcat/tc7.0.x/trunk/java/org/apache/tomcat/util/http/mapper/MappingData.java Mon May 12 16:56:56 2014
@@ -28,6 +28,7 @@ public class MappingData {
 
     public Object host = null;
     public Object context = null;
+    public int contextSlashCount = 0;
     public Object[] contexts = null;
     public Object wrapper = null;
     public boolean jspWildCard = false;
@@ -42,6 +43,7 @@ public class MappingData {
     public void recycle() {
         host = null;
         context = null;
+        contextSlashCount = 0;
         contexts = null;
         wrapper = null;
         jspWildCard = false;

Modified: tomcat/tc7.0.x/trunk/test/org/apache/catalina/connector/TestRequest.java
URL: http://svn.apache.org/viewvc/tomcat/tc7.0.x/trunk/test/org/apache/catalina/connector/TestRequest.java?rev=1594028&r1=1594027&r2=1594028&view=diff
==============================================================================
--- tomcat/tc7.0.x/trunk/test/org/apache/catalina/connector/TestRequest.java (original)
+++ tomcat/tc7.0.x/trunk/test/org/apache/catalina/connector/TestRequest.java Mon May 12 16:56:56 2014
@@ -697,4 +697,114 @@ public class TestRequest extends TomcatB
             fail("OK status was expected: " + status);
         }
     }
+
+    @Test
+    public void testBug56501a() throws Exception {
+        doBug56501("/path", "/path", "/path");
+    }
+
+    @Test
+    public void testBug56501b() throws Exception {
+        doBug56501("/path", "/path/", "/path");
+    }
+
+    @Test
+    public void testBug56501c() throws Exception {
+        doBug56501("/path", "/path/xxx", "/path");
+    }
+
+    @Test
+    public void testBug56501d() throws Exception {
+        doBug56501("", "", "");
+    }
+
+    @Test
+    public void testBug56501e() throws Exception {
+        doBug56501("", "/", "");
+    }
+
+    @Test
+    public void testBug56501f() throws Exception {
+        doBug56501("", "/xxx", "");
+    }
+
+    @Test
+    public void testBug56501g() throws Exception {
+        doBug56501("/path/abc", "/path/abc", "/path/abc");
+    }
+
+    @Test
+    public void testBug56501h() throws Exception {
+        doBug56501("/path/abc", "/path/abc/", "/path/abc");
+    }
+
+    @Test
+    public void testBug56501i() throws Exception {
+        doBug56501("/path/abc", "/path/abc/xxx", "/path/abc");
+    }
+
+    @Test
+    public void testBug56501j() throws Exception {
+        doBug56501("/pa_th/abc", "/pa%5Fth/abc", "/pa%5Fth/abc");
+    }
+
+    @Test
+    public void testBug56501k() throws Exception {
+        doBug56501("/pa_th/abc", "/pa%5Fth/abc/", "/pa%5Fth/abc");
+    }
+
+    @Test
+    public void testBug56501l() throws Exception {
+        doBug56501("/pa_th/abc", "/pa%5Fth/abc/xxx", "/pa%5Fth/abc");
+    }
+
+    @Test
+    public void testBug56501m() throws Exception {
+        doBug56501("/pa_th/abc", "/pa_th/abc", "/pa_th/abc");
+    }
+
+    @Test
+    public void testBug56501n() throws Exception {
+        doBug56501("/pa_th/abc", "/pa_th/abc/", "/pa_th/abc");
+    }
+
+    @Test
+    public void testBug56501o() throws Exception {
+        doBug56501("/pa_th/abc", "/pa_th/abc/xxx", "/pa_th/abc");
+    }
+
+    private void doBug56501(String deployPath, String requestPath, String expected)
+            throws Exception {
+
+        // Setup Tomcat instance
+        Tomcat tomcat = getTomcatInstance();
+
+        // Must have a real docBase - just use temp
+        Context ctx = tomcat.addContext(deployPath,
+                System.getProperty("java.io.tmpdir"));
+
+        Tomcat.addServlet(ctx, "servlet", new Bug56501Servelet());
+        ctx.addServletMapping("/*", "servlet");
+
+        tomcat.start();
+
+        ByteChunk res = getUrl("http://localhost:" + getPort() + requestPath);
+        String resultPath = res.toString();
+        if (resultPath == null) {
+            resultPath = "";
+        }
+        assertEquals(expected, resultPath);
+    }
+
+    private class Bug56501Servelet extends HttpServlet {
+
+        private static final long serialVersionUID = 1L;
+
+        @Override
+        protected void doGet(HttpServletRequest req, HttpServletResponse resp)
+                throws ServletException, IOException {
+            resp.setContentType("text/plain");
+            resp.getWriter().print(req.getContextPath());
+        }
+    }
 }

Modified: tomcat/tc7.0.x/trunk/webapps/docs/changelog.xml
URL: http://svn.apache.org/viewvc/tomcat/tc7.0.x/trunk/webapps/docs/changelog.xml?rev=1594028&r1=1594027&r2=1594028&view=diff
==============================================================================
--- tomcat/tc7.0.x/trunk/webapps/docs/changelog.xml (original)
+++ tomcat/tc7.0.x/trunk/webapps/docs/changelog.xml Mon May 12 16:56:56 2014
@@ -178,6 +178,10 @@
         authentication of users when using the
         <code>JAASMemoryLoginModule</code>. (markt)
       </fix>
+      <fix>
+        <bug>56501</bug>: <code>HttpServletRequest.getContextPath()</code>
+        should return the undecoded context path used by the user agent. (markt)
+      </fix>
     </changelog>
   </subsection>
   <subsection name="Coyote">



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