Author: bdelacretaz
Date: Mon Jun 16 06:15:55 2008
New Revision: 668150
URL: http://svn.apache.org/viewvc?rev=668150&view=rev
Log:
SLING-515 - DefaultErrorHandlerServlet outputs error info even if response is
already committed, without changing response status
Modified:
incubator/sling/trunk/launchpad/webapp/src/test/java/org/apache/sling/launchpad/webapp/integrationtest/IncludeTest.java
incubator/sling/trunk/servlets/resolver/src/main/java/org/apache/sling/servlets/resolver/defaults/DefaultErrorHandlerServlet.java
Modified:
incubator/sling/trunk/launchpad/webapp/src/test/java/org/apache/sling/launchpad/webapp/integrationtest/IncludeTest.java
URL:
http://svn.apache.org/viewvc/incubator/sling/trunk/launchpad/webapp/src/test/java/org/apache/sling/launchpad/webapp/integrationtest/IncludeTest.java?rev=668150&r1=668149&r2=668150&view=diff
==============================================================================
---
incubator/sling/trunk/launchpad/webapp/src/test/java/org/apache/sling/launchpad/webapp/integrationtest/IncludeTest.java
(original)
+++
incubator/sling/trunk/launchpad/webapp/src/test/java/org/apache/sling/launchpad/webapp/integrationtest/IncludeTest.java
Mon Jun 16 06:15:55 2008
@@ -123,15 +123,17 @@
public void testInfiniteLoopDetection() throws IOException {
// Node C has a property that causes an infinite include loop,
- // Sling must return an error 500 in this case
+ // Sling must indicate the problem in its response
final GetMethod get = new GetMethod(nodeUrlC + ".html");
httpClient.executeMethod(get);
final String content = get.getResponseBodyAsString();
assertTrue("Response contains infinite loop error message",
content.contains("InfiniteIncludeLoopException"));
- final int status = get.getStatusCode();
- assertEquals("Status is 500 for infinite
loop",HttpServletResponse.SC_INTERNAL_SERVER_ERROR, status);
+ // TODO: SLING-515, status is 500 when running the tests as part of
the maven build
+ // but 200 if running tests against a separate instance started with
mvn jetty:run
+ // final int status = get.getStatusCode();
+ // assertEquals("Status is 500 for infinite
loop",HttpServletResponse.SC_INTERNAL_SERVER_ERROR, status);
}
public void testForcedResourceType() throws IOException {
Modified:
incubator/sling/trunk/servlets/resolver/src/main/java/org/apache/sling/servlets/resolver/defaults/DefaultErrorHandlerServlet.java
URL:
http://svn.apache.org/viewvc/incubator/sling/trunk/servlets/resolver/src/main/java/org/apache/sling/servlets/resolver/defaults/DefaultErrorHandlerServlet.java?rev=668150&r1=668149&r2=668150&view=diff
==============================================================================
---
incubator/sling/trunk/servlets/resolver/src/main/java/org/apache/sling/servlets/resolver/defaults/DefaultErrorHandlerServlet.java
(original)
+++
incubator/sling/trunk/servlets/resolver/src/main/java/org/apache/sling/servlets/resolver/defaults/DefaultErrorHandlerServlet.java
Mon Jun 16 06:15:55 2008
@@ -28,12 +28,18 @@
import javax.servlet.http.HttpServletResponse;
import org.apache.sling.api.SlingConstants;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
/**
* The <code>DefaultErrorHandlerServlet</code> TODO
*/
[EMAIL PROTECTED]("serial")
public class DefaultErrorHandlerServlet extends GenericServlet {
+ /** default log */
+ private static final Logger log =
LoggerFactory.getLogger(DefaultErrorHandlerServlet.class);
+
@Override
public void service(ServletRequest req, ServletResponse res)
throws IOException {
@@ -106,16 +112,22 @@
throws IOException {
// set the status code and content type in the response
- response.setStatus(statusCode);
- response.setContentType("text/html; charset=UTF-8");
-
- PrintWriter pw = response.getWriter();
- pw.println("<!DOCTYPE HTML PUBLIC \"-//IETF//DTD HTML 2.0//EN\">");
- pw.println("<html>");
- pw.println("<head>");
- pw.println("<title>" + statusCode + " " + statusMessage + "</title>");
- pw.println("</head>");
- pw.println("<body>");
+ final PrintWriter pw = response.getWriter();
+ if(!response.isCommitted()) {
+ response.setStatus(statusCode);
+ response.setContentType("text/html; charset=UTF-8");
+
+ pw.println("<!DOCTYPE HTML PUBLIC \"-//IETF//DTD HTML 2.0//EN\">");
+ pw.println("<html>");
+ pw.println("<head>");
+ pw.println("<title>" + statusCode + " " + statusMessage +
"</title>");
+ pw.println("</head>");
+ pw.println("<body>");
+ } else {
+ // Response already committed: don't change status or write HTML
prolog, but report
+ // the error inline and warn about that
+ log.warn("Response already committed, unable to change status,
output might not be well formed");
+ }
pw.println("<h1>" + statusMessage + " (" + statusCode + ")</h1>");
pw.print("<p>The requested URL " + requestUri
+ " resulted in an error");