diff options
author | Thomas Watson | 2018-09-04 14:42:47 +0000 |
---|---|---|
committer | Thomas Watson | 2018-09-04 14:42:47 +0000 |
commit | 7fb375f71b7741c2e30667acde592e16a5a1b8e7 (patch) | |
tree | 85bbc892aa2b256f1bcdd3cce0ed0dd9ded44bfe | |
parent | d294f846cc8c15de73b3be5cdecd0be21f8c5bae (diff) | |
download | rt.equinox.bundles-R4_9_maintenance.tar.gz rt.equinox.bundles-R4_9_maintenance.tar.xz rt.equinox.bundles-R4_9_maintenance.zip |
Bug 536708 - Multipart request responded with 302 under JettyS4_9_0_RC2R4_9I20180906-0745I20180905-2000I20180905-0800I20180904-2000R4_9_maintenance
Rework fix to use split with a max to handle trailing SLASH
Change-Id: Ia303f97db59bbd1de6a98bcbe7b1385788dd8c14
Signed-off-by: Thomas Watson <tjwatson@us.ibm.com>
2 files changed, 113 insertions, 8 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 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/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(); } |