Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--bundles/org.eclipse.equinox.http.servlet.tests/src/org/eclipse/equinox/http/servlet/tests/ServletTest.java92
-rw-r--r--bundles/org.eclipse.equinox.http.servlet/src/org/eclipse/equinox/http/servlet/internal/servlet/ProxyServlet.java5
2 files changed, 97 insertions, 0 deletions
diff --git a/bundles/org.eclipse.equinox.http.servlet.tests/src/org/eclipse/equinox/http/servlet/tests/ServletTest.java b/bundles/org.eclipse.equinox.http.servlet.tests/src/org/eclipse/equinox/http/servlet/tests/ServletTest.java
index de740d41e..fe0f8cc8e 100644
--- a/bundles/org.eclipse.equinox.http.servlet.tests/src/org/eclipse/equinox/http/servlet/tests/ServletTest.java
+++ b/bundles/org.eclipse.equinox.http.servlet.tests/src/org/eclipse/equinox/http/servlet/tests/ServletTest.java
@@ -3309,6 +3309,98 @@ public class ServletTest extends BaseTest {
}
@Test
+ public void test_getRequestURI_trailingSlash1() throws Exception {
+ try {
+ stopJetty();
+ System.setProperty("org.eclipse.equinox.http.jetty.context.path", "/foo");
+ }
+ finally {
+ startJetty();
+ }
+
+ Collection<ServiceRegistration<?>> registrations = new ArrayList<ServiceRegistration<?>>();
+ try {
+ final AtomicReference<String> getRequestURI = new AtomicReference<String>();
+
+ Servlet servletA = new HttpServlet() {
+ private static final long serialVersionUID = 1L;
+ @Override
+ protected void service(HttpServletRequest req, HttpServletResponse resp)
+ throws IOException, ServletException {
+ getRequestURI.set(req.getRequestURI());
+ }
+ };
+
+ Dictionary<String, Object> props = new Hashtable<String, Object>();
+ props.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_SERVLET_NAME, "SA");
+ props.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_SERVLET_PATTERN, "/*");
+ registrations.add(getBundleContext().registerService(Servlet.class, servletA, props));
+ props = new Hashtable<String, Object>();
+
+ requestAdvisor.request("a/b/c/");
+ Assert.assertEquals("/foo/a/b/c/", getRequestURI.get());
+ requestAdvisor.request("a/b/");
+ Assert.assertEquals("/foo/a/b/", getRequestURI.get());
+ requestAdvisor.request("a/");
+ Assert.assertEquals("/foo/a/", getRequestURI.get());
+ requestAdvisor.request("/");
+ Assert.assertEquals("/foo/", getRequestURI.get());
+ }
+ finally {
+ for (ServiceRegistration<?> registration : registrations) {
+ registration.unregister();
+ }
+ try {
+ stopJetty();
+ System.setProperty("org.eclipse.equinox.http.jetty.context.path", "");
+ }
+ finally {
+ startJetty();
+ }
+ }
+ }
+
+ @Test
+ public void test_getRequestURI_trailingSlash2() throws Exception {
+ Collection<ServiceRegistration<?>> registrations = new ArrayList<ServiceRegistration<?>>();
+ try {
+ final AtomicReference<String> getRequestURI = new AtomicReference<String>();
+
+ Servlet servletA = new HttpServlet() {
+ private static final long serialVersionUID = 1L;
+ @Override
+ protected void service(HttpServletRequest req, HttpServletResponse resp)
+ throws IOException, ServletException {
+ getRequestURI.set(req.getRequestURI());
+ }
+ };
+
+ Dictionary<String, Object> props = new Hashtable<String, Object>();
+ props.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_SERVLET_NAME, "SA");
+ props.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_SERVLET_PATTERN, "/*");
+ registrations.add(getBundleContext().registerService(Servlet.class, servletA, props));
+ props = new Hashtable<String, Object>();
+
+ requestAdvisor.request("a/b/c/");
+ Assert.assertEquals("/a/b/c/", getRequestURI.get());
+ requestAdvisor.request("a/b/");
+ Assert.assertEquals("/a/b/", getRequestURI.get());
+ requestAdvisor.request("a/");
+ Assert.assertEquals("/a/", getRequestURI.get());
+ // Note using empty string here because of the way requestAdvisor works
+ // by appending a slash first.
+ requestAdvisor.request("");
+ Assert.assertEquals("/", getRequestURI.get());
+ }
+ finally {
+ for (ServiceRegistration<?> registration : registrations) {
+ registration.unregister();
+ }
+ }
+ }
+
+
+ @Test
public void test_Listener1() throws Exception {
BaseServletContextListener scl1 =
new BaseServletContextListener();
diff --git a/bundles/org.eclipse.equinox.http.servlet/src/org/eclipse/equinox/http/servlet/internal/servlet/ProxyServlet.java b/bundles/org.eclipse.equinox.http.servlet/src/org/eclipse/equinox/http/servlet/internal/servlet/ProxyServlet.java
index 805aaf489..db26e9dcb 100644
--- a/bundles/org.eclipse.equinox.http.servlet/src/org/eclipse/equinox/http/servlet/internal/servlet/ProxyServlet.java
+++ b/bundles/org.eclipse.equinox.http.servlet/src/org/eclipse/equinox/http/servlet/internal/servlet/ProxyServlet.java
@@ -67,6 +67,7 @@ public class ProxyServlet extends HttpServlet {
}
String requestUri = HttpServletRequestWrapperImpl.getDispatchRequestURI(request);
+ // NOTE split does not include trailing empty strings for paths that end in SLASH
String[] pathInfoSegments = pathInfo.split(Const.SLASH);
String[] requestUriSegments = requestUri.split(Const.SLASH);
@@ -78,6 +79,10 @@ public class ProxyServlet extends HttpServlet {
for(int i=(requestUriSegments.length - pathInfoSegments.length + 1);i<requestUriSegments.length;i++) {
aliasBuilder.append(Const.SLASH).append(requestUriSegments[i]);
}
+ // if the original request ends in '/' then be sure to append a '/'
+ if (requestUri.endsWith(Const.SLASH)) {
+ aliasBuilder.append(Const.SLASH);
+ }
return aliasBuilder.toString();
}

Back to the top