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");


Reply via email to