You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by cz...@apache.org on 2022/11/27 13:30:30 UTC

[sling-org-apache-sling-servlets-resolver] branch master updated: SLING-11703 : DefaultErrorHandlerServlet should not write if response is already committed

This is an automated email from the ASF dual-hosted git repository.

cziegeler pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/sling-org-apache-sling-servlets-resolver.git


The following commit(s) were added to refs/heads/master by this push:
     new 4dbd96b  SLING-11703 : DefaultErrorHandlerServlet should not write if response is already committed
4dbd96b is described below

commit 4dbd96bf6dc8656b97d07223ac4c720151069387
Author: Carsten Ziegeler <cz...@apache.org>
AuthorDate: Sun Nov 27 14:30:23 2022 +0100

    SLING-11703 : DefaultErrorHandlerServlet should not write if response is already committed
---
 .../defaults/DefaultErrorHandlerServlet.java       | 33 +++++++++++-----------
 1 file changed, 17 insertions(+), 16 deletions(-)

diff --git a/src/main/java/org/apache/sling/servlets/resolver/internal/defaults/DefaultErrorHandlerServlet.java b/src/main/java/org/apache/sling/servlets/resolver/internal/defaults/DefaultErrorHandlerServlet.java
index a4e9498..726b483 100644
--- a/src/main/java/org/apache/sling/servlets/resolver/internal/defaults/DefaultErrorHandlerServlet.java
+++ b/src/main/java/org/apache/sling/servlets/resolver/internal/defaults/DefaultErrorHandlerServlet.java
@@ -80,13 +80,21 @@ public class DefaultErrorHandlerServlet extends GenericServlet {
             statusMessage = statusToString(statusCode);
         }
 
-        //properly consider the 'Accept' header conditions to decide whether to send json or html back
-        if (req instanceof HttpServletRequest &&
-                JSON_CONTENT_TYPE.equals(new MediaRangeList((HttpServletRequest)req).prefer(HTML_CONTENT_TYPE, JSON_CONTENT_TYPE))) {
-            renderJson(req, res, statusMessage, requestUri, servletName, statusCode);
+        if (!res.isCommitted()) {
+            res.reset();
+
+            //properly consider the 'Accept' header conditions to decide whether to send json or html back
+            if (req instanceof HttpServletRequest &&
+                    JSON_CONTENT_TYPE.equals(new MediaRangeList((HttpServletRequest)req).prefer(HTML_CONTENT_TYPE, JSON_CONTENT_TYPE))) {
+                renderJson(req, res, statusMessage, requestUri, servletName, statusCode);
+            } else {
+                //default to HTML rendering
+                renderHtml(req, res, statusMessage, requestUri, servletName, statusCode);
+            }
         } else {
-            //default to HTML rendering
-            renderHtml(req, res, statusMessage, requestUri, servletName, statusCode);
+            // Response already committed: don't change status, but report
+            // the error inline and warn about that
+            log.warn("Response already committed, unable to change status or write error response for " + statusMessage);
         }
     }
 
@@ -135,16 +143,9 @@ public class DefaultErrorHandlerServlet extends GenericServlet {
     protected void renderJson(ServletRequest req, ServletResponse res, String statusMessage, String requestUri,
             String servletName, int statusCode) throws IOException {
         HttpServletResponse response = (HttpServletResponse)res;
-        if (!response.isCommitted()) {
-            response.reset();
-            response.setStatus(statusCode);
-            response.setContentType(JSON_CONTENT_TYPE);
-            response.setCharacterEncoding("UTF-8");
-        } else {
-            // Response already committed: don't change status, but report
-            // the error inline and warn about that
-            log.warn("Response already committed, unable to change status, output might not be well formed");
-        }
+        response.setStatus(statusCode);
+        response.setContentType(JSON_CONTENT_TYPE);
+        response.setCharacterEncoding("UTF-8");
 
         // send the error as JSON
         try (JsonGenerator jsonGenerator = Json.createGenerator(res.getWriter())) {