Bug 569406 - Check original request URI for / positions
Checking the decoded path for the slash position ends up getting us the
wrong position when a requiest has multiple path elements.
Change-Id: I12dc010ede604dc3cd1a3ebd99f58de3956901d2
Signed-off-by: Thomas Watson <tjwatson@us.ibm.com>
diff --git a/bundles/org.eclipse.equinox.http.servlet.tests/src/org/eclipse/equinox/http/servlet/testbase/AllTests.java b/bundles/org.eclipse.equinox.http.servlet.tests/src/org/eclipse/equinox/http/servlet/testbase/AllTests.java
index b03fceb..bcabe7b 100644
--- a/bundles/org.eclipse.equinox.http.servlet.tests/src/org/eclipse/equinox/http/servlet/testbase/AllTests.java
+++ b/bundles/org.eclipse.equinox.http.servlet.tests/src/org/eclipse/equinox/http/servlet/testbase/AllTests.java
@@ -19,6 +19,7 @@
import org.eclipse.equinox.http.servlet.tests.Bug562843_2_Test;
import org.eclipse.equinox.http.servlet.tests.Bug562843_Test;
import org.eclipse.equinox.http.servlet.tests.Bug564747_Test;
+import org.eclipse.equinox.http.servlet.tests.Bug569406_Test;
import org.eclipse.equinox.http.servlet.tests.ContextHelperCustomizerTests;
import org.eclipse.equinox.http.servlet.tests.DispatchingTest;
import org.eclipse.equinox.http.servlet.tests.PreprocessorTestCase;
@@ -106,7 +107,8 @@
Bug562843_Test.class,
Bug562843_2_Test.class,
Bug564747_Test.class,
- Bug562440_Test.class
+ Bug562440_Test.class,
+ Bug569406_Test.class
})
public class AllTests {
// see @SuiteClasses
diff --git a/bundles/org.eclipse.equinox.http.servlet.tests/src/org/eclipse/equinox/http/servlet/tests/Bug569406_Test.java b/bundles/org.eclipse.equinox.http.servlet.tests/src/org/eclipse/equinox/http/servlet/tests/Bug569406_Test.java
new file mode 100644
index 0000000..cce183e
--- /dev/null
+++ b/bundles/org.eclipse.equinox.http.servlet.tests/src/org/eclipse/equinox/http/servlet/tests/Bug569406_Test.java
@@ -0,0 +1,78 @@
+package org.eclipse.equinox.http.servlet.tests;
+
+import java.io.IOException;
+import java.io.PrintWriter;
+import java.util.Dictionary;
+import java.util.Hashtable;
+import java.util.concurrent.atomic.AtomicReference;
+
+import javax.servlet.Servlet;
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.eclipse.equinox.http.servlet.testbase.BaseTest;
+import org.junit.Assert;
+import org.junit.Test;
+import org.osgi.service.http.whiteboard.HttpWhiteboardConstants;
+
+public class Bug569406_Test extends BaseTest {
+
+ @Test
+ public void test_Bug562843_Encode_Space() throws Exception {
+ final AtomicReference<String> requestURI = new AtomicReference<>();
+ final AtomicReference<String> servletPath = new AtomicReference<>();
+ final AtomicReference<String> pathInfo = new AtomicReference<>();
+ Servlet servlet = new HttpServlet() {
+ private static final long serialVersionUID = 1L;
+ @Override
+ protected void doGet(
+ final HttpServletRequest req, final HttpServletResponse resp)
+ throws IOException {
+ requestURI.set(req.getRequestURI());
+ servletPath.set(req.getServletPath());
+ pathInfo.set(req.getPathInfo());
+ PrintWriter writer = resp.getWriter();
+ writer.write("OK");
+ }
+ };
+ Dictionary<String, Object> props = new Hashtable<>();
+ props.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_SERVLET_NAME, "Bug 562843");
+ props.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_SERVLET_PATTERN, "/Bug 562843/this pat/*");
+ registrations.add(getBundleContext().registerService(Servlet.class, servlet, props));
+ String result = requestAdvisor.request("Bug%20562843/this%20pat/a%20b%20c/d%20e%20f");
+ Assert.assertEquals("OK", result);
+ Assert.assertEquals("/Bug%20562843/this%20pat/a%20b%20c/d%20e%20f", requestURI.get());
+ Assert.assertEquals("/Bug 562843/this pat", servletPath.get());
+ Assert.assertEquals("/a b c/d e f", pathInfo.get());
+ }
+
+ @Test
+ public void test_Bug562843_Encode_Slash() throws Exception {
+ final AtomicReference<String> requestURI = new AtomicReference<>();
+ final AtomicReference<String> servletPath = new AtomicReference<>();
+ final AtomicReference<String> pathInfo = new AtomicReference<>();
+ Servlet servlet = new HttpServlet() {
+ private static final long serialVersionUID = 1L;
+ @Override
+ protected void doGet(
+ final HttpServletRequest req, final HttpServletResponse resp)
+ throws IOException {
+ requestURI.set(req.getRequestURI());
+ servletPath.set(req.getServletPath());
+ pathInfo.set(req.getPathInfo());
+ PrintWriter writer = resp.getWriter();
+ writer.write("OK");
+ }
+ };
+ Dictionary<String, Object> props = new Hashtable<>();
+ props.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_SERVLET_NAME, "Bug 562843");
+ props.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_SERVLET_PATTERN, "/Bug 562843/this pat/*");
+ registrations.add(getBundleContext().registerService(Servlet.class, servlet, props));
+ String result = requestAdvisor.request("Bug%20562843/this%20pat/aa%2Fb%2Fc/d%2Fe%2Ff");
+ Assert.assertEquals("OK", result);
+ Assert.assertEquals("/Bug%20562843/this%20pat/aa%2Fb%2Fc/d%2Fe%2Ff", requestURI.get());
+ Assert.assertEquals("/Bug 562843/this pat", servletPath.get());
+ Assert.assertEquals("/aa/b/c/d/e/f", pathInfo.get());
+ }
+}
diff --git a/bundles/org.eclipse.equinox.http.servlet/src/org/eclipse/equinox/http/servlet/internal/HttpServiceRuntimeImpl.java b/bundles/org.eclipse.equinox.http.servlet/src/org/eclipse/equinox/http/servlet/internal/HttpServiceRuntimeImpl.java
index 872fa05..f4d5867 100644
--- a/bundles/org.eclipse.equinox.http.servlet/src/org/eclipse/equinox/http/servlet/internal/HttpServiceRuntimeImpl.java
+++ b/bundles/org.eclipse.equinox.http.servlet/src/org/eclipse/equinox/http/servlet/internal/HttpServiceRuntimeImpl.java
@@ -542,7 +542,7 @@
String newServletPath = requestURI.substring(0, pos);
pathInfo = decode(requestURI.substring(pos));
servletPath = decode(newServletPath);
- pos = servletPath.lastIndexOf('/');
+ pos = newServletPath.lastIndexOf('/');
continue;
}