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())) {