diff options
author | Raymond Auge | 2016-05-13 19:43:36 +0000 |
---|---|---|
committer | Raymond Auge | 2016-05-13 19:43:36 +0000 |
commit | 455f9cefc23966584335cfe679a09e45ecf3a93d (patch) | |
tree | a47b78b1e812fede7a62d991f8f8e97e4fdaf8cf | |
parent | 1593ffc5311c0257888cb9272ffb05f075eee717 (diff) | |
download | rt.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>
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(); |