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-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org