Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorThomas Watson2018-09-04 14:42:47 +0000
committerThomas Watson2018-09-05 19:52:27 +0000
commite447a42982b5fe6d6c860b062b9806d4a37d3d88 (patch)
tree0c849377b1767f1a54f798fbf6091b303254a22d
parent95672c3851ca252895750bba8bfb9995d4fee56c (diff)
downloadrt.equinox.bundles-e447a42982b5fe6d6c860b062b9806d4a37d3d88.tar.gz
rt.equinox.bundles-e447a42982b5fe6d6c860b062b9806d4a37d3d88.tar.xz
rt.equinox.bundles-e447a42982b5fe6d6c860b062b9806d4a37d3d88.zip
Bug 536708 - Multipart request responded with 302 under JettyY20180905-2200
Rework fix to use split with a max to handle trailing SLASH Change-Id: Ia303f97db59bbd1de6a98bcbe7b1385788dd8c14 Signed-off-by: Thomas Watson <tjwatson@us.ibm.com>
-rw-r--r--bundles/org.eclipse.equinox.http.servlet.tests/META-INF/MANIFEST.MF2
-rw-r--r--bundles/org.eclipse.equinox.http.servlet.tests/pom.xml2
-rw-r--r--bundles/org.eclipse.equinox.http.servlet.tests/src/org/eclipse/equinox/http/servlet/tests/ServletTest.java111
-rw-r--r--bundles/org.eclipse.equinox.http.servlet/META-INF/MANIFEST.MF2
-rw-r--r--bundles/org.eclipse.equinox.http.servlet/pom.xml2
-rw-r--r--bundles/org.eclipse.equinox.http.servlet/src/org/eclipse/equinox/http/servlet/internal/servlet/ProxyServlet.java10
6 files changed, 117 insertions, 12 deletions
diff --git a/bundles/org.eclipse.equinox.http.servlet.tests/META-INF/MANIFEST.MF b/bundles/org.eclipse.equinox.http.servlet.tests/META-INF/MANIFEST.MF
index 7aa1f42a0..34a0ad3c9 100644
--- a/bundles/org.eclipse.equinox.http.servlet.tests/META-INF/MANIFEST.MF
+++ b/bundles/org.eclipse.equinox.http.servlet.tests/META-INF/MANIFEST.MF
@@ -2,7 +2,7 @@ Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: org.eclipse.equinox.http.servlet.tests
Bundle-SymbolicName: org.eclipse.equinox.http.servlet.tests
-Bundle-Version: 1.5.100.qualifier
+Bundle-Version: 1.5.200.qualifier
Bundle-RequiredExecutionEnvironment: JavaSE-1.7
Eclipse-BundleShape: dir
Bundle-Activator: org.eclipse.equinox.http.servlet.tests.bundle.Activator
diff --git a/bundles/org.eclipse.equinox.http.servlet.tests/pom.xml b/bundles/org.eclipse.equinox.http.servlet.tests/pom.xml
index 00fe5c416..1ed46a426 100644
--- a/bundles/org.eclipse.equinox.http.servlet.tests/pom.xml
+++ b/bundles/org.eclipse.equinox.http.servlet.tests/pom.xml
@@ -19,7 +19,7 @@
</parent>
<groupId>org.eclipse.equinox</groupId>
<artifactId>org.eclipse.equinox.http.servlet.tests</artifactId>
- <version>1.5.100-SNAPSHOT</version>
+ <version>1.5.200-SNAPSHOT</version>
<packaging>eclipse-test-plugin</packaging>
<build>
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 fe0f8cc8e..9c9f6659b 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
@@ -3338,12 +3338,15 @@ public class ServletTest extends BaseTest {
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("/");
+ // Note using empty string here because of the way requestAdvisor works
+ // by appending a slash first.
+ requestAdvisor.request("");
Assert.assertEquals("/foo/", getRequestURI.get());
}
finally {
@@ -3362,6 +3365,67 @@ public class ServletTest extends BaseTest {
@Test
public void test_getRequestURI_trailingSlash2() 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 {
+ HttpSession session = req.getSession();
+ session.setAttribute("test", req.getParameter("p1"));
+ getRequestURI.set(resp.encodeURL(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/?p1=v1");
+ // get the session
+ String initialURI = getRequestURI.get();
+ int sessionIdx = initialURI.indexOf(";jsessionid=");
+ Assert.assertTrue("No session: " + initialURI, sessionIdx > -1);
+ String sessionPostfix = initialURI.substring(sessionIdx);
+ Assert.assertEquals("/foo/a/b/c/" + sessionPostfix, getRequestURI.get());
+ requestAdvisor.request("a/b/" + sessionPostfix);
+ Assert.assertEquals("/foo/a/b/" + sessionPostfix, getRequestURI.get());
+ requestAdvisor.request("a/" + sessionPostfix);
+ Assert.assertEquals("/foo/a/" + sessionPostfix, getRequestURI.get());
+ // Note using empty string here because of the way requestAdvisor works
+ // by appending a slash first.
+ requestAdvisor.request("" + sessionPostfix);
+ Assert.assertEquals("/foo/" + sessionPostfix, 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_trailingSlash3() throws Exception {
Collection<ServiceRegistration<?>> registrations = new ArrayList<ServiceRegistration<?>>();
try {
final AtomicReference<String> getRequestURI = new AtomicReference<String>();
@@ -3399,6 +3463,51 @@ public class ServletTest extends BaseTest {
}
}
+ @Test
+ public void test_getRequestURI_trailingSlash4() 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 {
+ HttpSession session = req.getSession();
+ session.setAttribute("test", req.getParameter("p1"));
+ getRequestURI.set(resp.encodeURL(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/?p1=v1");
+ // get the session
+ String initialURI = getRequestURI.get();
+ int sessionIdx = initialURI.indexOf(";jsessionid=");
+ Assert.assertTrue("No session: " + initialURI, sessionIdx > -1);
+ String sessionPostfix = initialURI.substring(sessionIdx);
+ Assert.assertEquals("/a/b/c/" + sessionPostfix, getRequestURI.get());
+ requestAdvisor.request("a/b/" + sessionPostfix);
+ Assert.assertEquals("/a/b/" + sessionPostfix, getRequestURI.get());
+ requestAdvisor.request("a/" + sessionPostfix);
+ Assert.assertEquals("/a/" + sessionPostfix, getRequestURI.get());
+ // Note using empty string here because of the way requestAdvisor works
+ // by appending a slash first.
+ requestAdvisor.request("" + sessionPostfix);
+ Assert.assertEquals("/" + sessionPostfix, getRequestURI.get());
+ }
+ finally {
+ for (ServiceRegistration<?> registration : registrations) {
+ registration.unregister();
+ }
+ }
+ }
@Test
public void test_Listener1() throws Exception {
diff --git a/bundles/org.eclipse.equinox.http.servlet/META-INF/MANIFEST.MF b/bundles/org.eclipse.equinox.http.servlet/META-INF/MANIFEST.MF
index 8e5f5b1b3..92348f3cc 100644
--- a/bundles/org.eclipse.equinox.http.servlet/META-INF/MANIFEST.MF
+++ b/bundles/org.eclipse.equinox.http.servlet/META-INF/MANIFEST.MF
@@ -3,7 +3,7 @@ Bundle-ManifestVersion: 2
Bundle-Name: %bundleName
Bundle-Vendor: %providerName
Bundle-SymbolicName: org.eclipse.equinox.http.servlet
-Bundle-Version: 1.5.100.qualifier
+Bundle-Version: 1.5.200.qualifier
Bundle-Activator: org.eclipse.equinox.http.servlet.internal.Activator
Bundle-Localization: plugin
Bundle-RequiredExecutionEnvironment: JavaSE-1.6
diff --git a/bundles/org.eclipse.equinox.http.servlet/pom.xml b/bundles/org.eclipse.equinox.http.servlet/pom.xml
index 5a45564fa..303618123 100644
--- a/bundles/org.eclipse.equinox.http.servlet/pom.xml
+++ b/bundles/org.eclipse.equinox.http.servlet/pom.xml
@@ -20,6 +20,6 @@
</parent>
<groupId>org.eclipse.equinox</groupId>
<artifactId>org.eclipse.equinox.http.servlet</artifactId>
- <version>1.5.100-SNAPSHOT</version>
+ <version>1.5.200-SNAPSHOT</version>
<packaging>eclipse-plugin</packaging>
</project>
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 db26e9dcb..a4d64bb2b 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,9 +67,9 @@ 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);
+ // NOTE use split that takes a max to preserve ending SLASH
+ String[] pathInfoSegments = pathInfo.split(Const.SLASH, Integer.MAX_VALUE - 1);
+ String[] requestUriSegments = requestUri.split(Const.SLASH, Integer.MAX_VALUE - 1);
if(pathInfoSegments.length == requestUriSegments.length) {
return requestUri;
@@ -79,10 +79,6 @@ 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