Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRaymond Auge2016-05-13 19:43:36 +0000
committerRaymond Auge2016-05-13 19:43:36 +0000
commit455f9cefc23966584335cfe679a09e45ecf3a93d (patch)
treea47b78b1e812fede7a62d991f8f8e97e4fdaf8cf
parent1593ffc5311c0257888cb9272ffb05f075eee717 (diff)
downloadrt.equinox.bundles-455f9cefc23966584335cfe679a09e45ecf3a93d.tar.gz
rt.equinox.bundles-455f9cefc23966584335cfe679a09e45ecf3a93d.tar.xz
rt.equinox.bundles-455f9cefc23966584335cfe679a09e45ecf3a93d.zip
Bug 490608 - [http servlet] simplify, make sure we only wrap once and testI20160516-2000I20160515-2000I20160514-1500I20160513-2000
Signed-off-by: Raymond Auge <raymond.auge@liferay.com>
-rw-r--r--bundles/org.eclipse.equinox.http.servlet.tests/src/org/eclipse/equinox/http/servlet/tests/DispatchingTest.java157
-rw-r--r--bundles/org.eclipse.equinox.http.servlet/src/org/eclipse/equinox/http/servlet/internal/context/DispatchTargets.java25
2 files changed, 169 insertions, 13 deletions
diff --git a/bundles/org.eclipse.equinox.http.servlet.tests/src/org/eclipse/equinox/http/servlet/tests/DispatchingTest.java b/bundles/org.eclipse.equinox.http.servlet.tests/src/org/eclipse/equinox/http/servlet/tests/DispatchingTest.java
index e609868ca..6f8340b4a 100644
--- a/bundles/org.eclipse.equinox.http.servlet.tests/src/org/eclipse/equinox/http/servlet/tests/DispatchingTest.java
+++ b/bundles/org.eclipse.equinox.http.servlet.tests/src/org/eclipse/equinox/http/servlet/tests/DispatchingTest.java
@@ -14,9 +14,15 @@ package org.eclipse.equinox.http.servlet.tests;
import java.io.IOException;
import java.io.PrintWriter;
import java.io.StringWriter;
+import java.text.SimpleDateFormat;
import java.util.Arrays;
+import java.util.Date;
import java.util.Dictionary;
import java.util.Hashtable;
+import java.util.List;
+import java.util.Locale;
+import java.util.Map;
+import java.util.TimeZone;
import java.util.concurrent.atomic.AtomicReference;
import javax.servlet.DispatcherType;
@@ -28,6 +34,7 @@ import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
+import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@@ -1262,4 +1269,154 @@ public class DispatchingTest extends BaseTest {
Assert.assertEquals("|/Bug479115/a", result);
}
+ @Test
+ public void test_headers_include() throws Exception {
+ SimpleDateFormat format = new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss zzz");
+ format.setTimeZone(TimeZone.getTimeZone("GMT"));
+ final long date1 = System.currentTimeMillis() - (1000*60*60*24*365*30);
+ final long date2 = System.currentTimeMillis() - (1000*60*60*24*365*40);
+
+ Servlet servlet1 = new BaseServlet() {
+ private static final long serialVersionUID = 1L;
+
+ @Override
+ protected void service(HttpServletRequest request, HttpServletResponse response)
+ throws ServletException, IOException {
+
+ response.addCookie(new Cookie("foo","bar"));
+ response.addDateHeader("X-date", date1);
+ response.addHeader("X-colour", "blue");
+ response.addIntHeader("X-size", 20);
+ response.setCharacterEncoding("UTF-8");
+ response.setContentType("text/plain");
+ response.setHeader("X-animal", "cat");
+ response.setLocale(Locale.CANADA);
+ response.setBufferSize(1024);
+
+ request.getRequestDispatcher("/s2").include(request, response);
+ }
+ };
+
+ Servlet servlet2 = new BaseServlet() {
+ private static final long serialVersionUID = 1L;
+
+ @Override
+ protected void service(HttpServletRequest request, HttpServletResponse response)
+ throws ServletException, IOException {
+
+ response.addCookie(new Cookie("foo","baz"));
+ response.addDateHeader("X-date", date2);
+ response.addHeader("X-colour", "green");
+ response.addIntHeader("X-size", 30);
+ response.setCharacterEncoding("UTF-16");
+ response.setContentType("text/json");
+ response.setHeader("X-animal", "bog");
+ response.setLocale(Locale.US);
+ response.setBufferSize(0);
+ }
+ };
+
+ Dictionary<String, Object> props = new Hashtable<String, Object>();
+ props.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_SERVLET_PATTERN, "/s1/*");
+ registrations.add(getBundleContext().registerService(Servlet.class, servlet1, props));
+
+ props = new Hashtable<String, Object>();
+ props.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_SERVLET_PATTERN, "/s2/*");
+ registrations.add(getBundleContext().registerService(Servlet.class, servlet2, props));
+
+ Map<String, List<String>> response = requestAdvisor.request("s1", null);
+
+ Assert.assertNotNull(response.get("Set-Cookie"));
+ Assert.assertEquals("foo=bar", response.get("Set-Cookie").get(0));
+ Assert.assertNotNull(response.get("X-date"));
+ Assert.assertEquals(format.format(new Date(date1)), response.get("X-date").get(0));
+ Assert.assertNotNull(response.get("X-colour"));
+ Assert.assertEquals("blue", response.get("X-colour").get(0));
+ Assert.assertNotNull(response.get("X-size"));
+ Assert.assertEquals("20", response.get("X-size").get(0));
+
+ String contentType = response.get("Content-Type").get(0);
+
+ Assert.assertTrue(contentType.contains("text/plain;"));
+ Assert.assertTrue(contentType.toLowerCase().contains("charset=utf-8"));
+ Assert.assertEquals("en-CA", response.get("Content-Language").get(0));
+ Assert.assertNotNull(response.get("X-animal"));
+ Assert.assertEquals("cat", response.get("X-animal").get(0));
+ }
+
+ @Test
+ public void test_headers_forward() throws Exception {
+ SimpleDateFormat format = new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss zzz");
+ format.setTimeZone(TimeZone.getTimeZone("GMT"));
+ final long date1 = System.currentTimeMillis() - (1000*60*60*24*365*30);
+ final long date2 = System.currentTimeMillis() - (1000*60*60*24*365*40);
+
+ Servlet servlet1 = new BaseServlet() {
+ private static final long serialVersionUID = 1L;
+
+ @Override
+ protected void service(HttpServletRequest request, HttpServletResponse response)
+ throws ServletException, IOException {
+
+ response.addCookie(new Cookie("foo","bar"));
+ response.addDateHeader("X-date", date1);
+ response.addHeader("X-colour", "blue");
+ response.addIntHeader("X-size", 20);
+ response.setCharacterEncoding("UTF-8");
+ response.setContentType("text/plain");
+ response.setHeader("X-animal", "cat");
+ response.setLocale(Locale.CANADA);
+ response.setBufferSize(1024);
+
+ request.getRequestDispatcher("/s2").forward(request, response);
+ }
+ };
+
+ Servlet servlet2 = new BaseServlet() {
+ private static final long serialVersionUID = 1L;
+
+ @Override
+ protected void service(HttpServletRequest request, HttpServletResponse response)
+ throws ServletException, IOException {
+
+ response.addCookie(new Cookie("foo","baz"));
+ response.addDateHeader("X-date", date2);
+ response.addHeader("X-colour", "green");
+ response.addIntHeader("X-size", 30);
+ response.setCharacterEncoding("UTF-16");
+ response.setContentType("text/json");
+ response.setHeader("X-animal", "dog");
+ response.setLocale(Locale.US);
+ response.setBufferSize(0);
+ }
+ };
+
+ Dictionary<String, Object> props = new Hashtable<String, Object>();
+ props.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_SERVLET_PATTERN, "/s1/*");
+ registrations.add(getBundleContext().registerService(Servlet.class, servlet1, props));
+
+ props = new Hashtable<String, Object>();
+ props.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_SERVLET_PATTERN, "/s2/*");
+ registrations.add(getBundleContext().registerService(Servlet.class, servlet2, props));
+
+ Map<String, List<String>> response = requestAdvisor.request("s1", null);
+
+ Assert.assertNotNull(response.get("Set-Cookie"));
+ Assert.assertEquals("foo=baz", response.get("Set-Cookie").get(0));
+ Assert.assertNotNull(response.get("X-date"));
+ Assert.assertEquals(format.format(new Date(date2)), response.get("X-date").get(0));
+ Assert.assertNotNull(response.get("X-colour"));
+ Assert.assertEquals("green", response.get("X-colour").get(0));
+ Assert.assertNotNull(response.get("X-size"));
+ Assert.assertEquals("30", response.get("X-size").get(0));
+
+ String contentType = response.get("Content-Type").get(0);
+
+ Assert.assertTrue(contentType.contains("text/json;"));
+ Assert.assertTrue(contentType.toLowerCase().contains("charset=utf-16"));
+ Assert.assertEquals("en-US", response.get("Content-Language").get(0));
+ Assert.assertNotNull(response.get("X-animal"));
+ Assert.assertEquals("dog", response.get("X-animal").get(0));
+ }
+
} \ No newline at end of file
diff --git a/bundles/org.eclipse.equinox.http.servlet/src/org/eclipse/equinox/http/servlet/internal/context/DispatchTargets.java b/bundles/org.eclipse.equinox.http.servlet/src/org/eclipse/equinox/http/servlet/internal/context/DispatchTargets.java
index f98512250..9db1bbfff 100644
--- a/bundles/org.eclipse.equinox.http.servlet/src/org/eclipse/equinox/http/servlet/internal/context/DispatchTargets.java
+++ b/bundles/org.eclipse.equinox.http.servlet/src/org/eclipse/equinox/http/servlet/internal/context/DispatchTargets.java
@@ -104,7 +104,9 @@ public class DispatchTargets {
HttpServletRequest request = originalRequest;
HttpServletRequestWrapperImpl requestWrapper = HttpServletRequestWrapperImpl.findHttpRuntimeRequest(originalRequest);
- HttpServletResponse responseWrapper = HttpServletResponseWrapperImpl.findHttpRuntimeResponse(response);
+ HttpServletResponseWrapper responseWrapper = HttpServletResponseWrapperImpl.findHttpRuntimeResponse(response);
+
+ boolean includeWrapperAdded = false;
try {
if (requestWrapper == null) {
@@ -119,18 +121,10 @@ public class DispatchTargets {
requestWrapper.push(this);
- if (dispatcherType == DispatcherType.INCLUDE) {
- HttpServletResponse previous = null;
- HttpServletResponse next = response;
-
- while (next instanceof HttpServletResponseWrapper) {
- previous = next;
- next = (HttpServletResponse) ((HttpServletResponseWrapper) next).getResponse();
- }
-
- IncludeDispatchResponseWrapper includeResponse = new IncludeDispatchResponseWrapper(next);
-
- ((HttpServletResponseWrapper) previous).setResponse(includeResponse);
+ if ((dispatcherType == DispatcherType.INCLUDE) && !(responseWrapper.getResponse() instanceof IncludeDispatchResponseWrapper)) {
+ // add the include wrapper to avoid header and status writes
+ responseWrapper.setResponse(new IncludeDispatchResponseWrapper((HttpServletResponse)responseWrapper.getResponse()));
+ includeWrapperAdded = true;
}
ResponseStateHandler responseStateHandler = new ResponseStateHandler(request, response, this);
@@ -138,6 +132,11 @@ public class DispatchTargets {
responseStateHandler.processRequest();
}
finally {
+ if ((dispatcherType == DispatcherType.INCLUDE) && (responseWrapper.getResponse() instanceof IncludeDispatchResponseWrapper) && includeWrapperAdded) {
+ // remove the include wrapper we added
+ responseWrapper.setResponse(((IncludeDispatchResponseWrapper)responseWrapper.getResponse()).getResponse());
+ }
+
requestWrapper.pop();
setter.close();

Back to the top