SLING-2347 - use response.setStatus to avoid triggering the container's error pages during startup
git-svn-id: https://svn.apache.org/repos/asf/sling/trunk@1229187 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/src/main/java/org/apache/sling/startupfilter/impl/StartupFilterImpl.java b/src/main/java/org/apache/sling/startupfilter/impl/StartupFilterImpl.java
index 149fc84..a26395f 100644
--- a/src/main/java/org/apache/sling/startupfilter/impl/StartupFilterImpl.java
+++ b/src/main/java/org/apache/sling/startupfilter/impl/StartupFilterImpl.java
@@ -72,7 +72,7 @@
private String defaultMessage;
/** @inheritDoc */
- public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
+ public void doFilter(ServletRequest request, ServletResponse sr, FilterChain chain) throws IOException, ServletException {
updateProviders();
final StringBuilder sb = new StringBuilder();
@@ -81,7 +81,15 @@
sb.append('\n');
sb.append(p.getProgressInfo());
}
- ((HttpServletResponse)response).sendError(HttpServletResponse.SC_SERVICE_UNAVAILABLE, sb.toString());
+
+ // Do not use setError to avoid triggering the container's error page,
+ // as that might cascade other errors during startup
+ final HttpServletResponse response = (HttpServletResponse)sr;
+ response.setStatus(HttpServletResponse.SC_SERVICE_UNAVAILABLE);
+ response.setContentType("text/plain");
+ response.setCharacterEncoding("UTF-8");
+ response.getWriter().write(sb.toString());
+ response.getWriter().flush();
}
@Override
diff --git a/src/test/java/org/apache/sling/startupfilter/impl/StartupFilterImplTest.java b/src/test/java/org/apache/sling/startupfilter/impl/StartupFilterImplTest.java
index 7d89f90..329dae8 100644
--- a/src/test/java/org/apache/sling/startupfilter/impl/StartupFilterImplTest.java
+++ b/src/test/java/org/apache/sling/startupfilter/impl/StartupFilterImplTest.java
@@ -20,6 +20,8 @@
import static org.junit.Assert.assertEquals;
+import java.io.PrintWriter;
+import java.io.StringWriter;
import java.util.Dictionary;
import java.util.Hashtable;
import java.util.concurrent.atomic.AtomicInteger;
@@ -116,7 +118,7 @@
private HttpServletResponse response;
private FilterChain chain;
private int lastReturnedStatus;
- private String lastReturnedMessage;
+ private StringWriter messageWriter;
private AtomicInteger activeFilterCount;
private ServiceRegistration serviceRegistration;
@@ -135,17 +137,19 @@
final BundleContext bundleContext = mockery.mock(BundleContext.class);
final ComponentContext componentContext = mockery.mock(ComponentContext.class);
- final Action storeResponse = new Action() {
+ final Action storeStatus = new Action() {
public void describeTo(Description d) {
d.appendText("Store HTTP response values");
}
public Object invoke(Invocation invocation) throws Throwable {
lastReturnedStatus = (Integer)invocation.getParameter(0);
- lastReturnedMessage = (String)invocation.getParameter(1);
return null;
}
};
+
+ messageWriter = new StringWriter();
+ final PrintWriter responseWriter = new PrintWriter(messageWriter);
final Dictionary<String, Object> props = new Hashtable<String, Object>();
props.put(StartupFilterImpl.ACTIVE_BY_DEFAULT_PROP, Boolean.TRUE);
@@ -173,8 +177,14 @@
returnValue(serviceRegistration)
));
- allowing(response).sendError(with(any(Integer.class)), with(any(String.class)));
- will(storeResponse);
+ allowing(response).setStatus((with(any(Integer.class))));
+ will(storeStatus);
+
+ allowing(response).setContentType("text/plain");
+
+ allowing(response).getWriter();
+ will(returnValue(responseWriter));
+ allowing(response).setCharacterEncoding(with(any(String.class)));
allowing(serviceRegistration).unregister();
will(new ChangeInteger(activeFilterCount, false));
@@ -184,16 +194,17 @@
}
private void assertRequest(final int expectedStatus, final String expectedMessage) throws Exception {
- lastReturnedMessage = null;
lastReturnedStatus = -1;
filter.doFilter(request, response, chain);
+ final String responseText = messageWriter.toString();
+
// status 0 means we expect the request to go through
assertEquals("Expecting status to match",
expectedStatus, lastReturnedStatus);
assertEquals("Expecting message to match",
- expectedMessage, lastReturnedMessage);
+ expectedMessage, responseText);
}
@Test
@@ -224,4 +235,4 @@
filter.disable();
assertEquals("Expecting filter service to be gone", 0, activeFilterCount.get());
}
-}
+}
\ No newline at end of file