You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tomcat.apache.org by ma...@apache.org on 2014/06/05 12:04:46 UTC
svn commit: r1600580 - in /tomcat/trunk/java/org/apache/catalina:
connector/Response.java core/StandardWrapperValve.java
valves/ErrorReportValve.java
Author: markt
Date: Thu Jun 5 10:04:45 2014
New Revision: 1600580
URL: http://svn.apache.org/r1600580
Log:
Fix further regressions in the error handling changes
(r1600449 and r1600495)
Modified:
tomcat/trunk/java/org/apache/catalina/connector/Response.java
tomcat/trunk/java/org/apache/catalina/core/StandardWrapperValve.java
tomcat/trunk/java/org/apache/catalina/valves/ErrorReportValve.java
Modified: tomcat/trunk/java/org/apache/catalina/connector/Response.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/connector/Response.java?rev=1600580&r1=1600579&r2=1600580&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/connector/Response.java (original)
+++ tomcat/trunk/java/org/apache/catalina/connector/Response.java Thu Jun 5 10:04:45 2014
@@ -198,6 +198,7 @@ public class Response
* The error flag.
*/
protected boolean error = false;
+ private boolean errorAfterCommit = false;
/**
@@ -239,6 +240,7 @@ public class Response
appCommitted = false;
included = false;
error = false;
+ errorAfterCommit = false;
isCharacterEncodingSet = false;
if (Globals.IS_SECURITY_ENABLED || Connector.RECYCLE_FACADES) {
@@ -388,6 +390,7 @@ public class Response
public void setError() {
if (!error) {
error = true;
+ errorAfterCommit = coyoteResponse.isCommitted();
Wrapper wrapper = getRequest().getWrapper();
if (wrapper != null) {
wrapper.incrementErrorCount();
@@ -404,6 +407,11 @@ public class Response
}
+ public boolean isErrorAfterCommit() {
+ return errorAfterCommit;
+ }
+
+
/**
* Perform whatever actions are required to flush and close the output
* stream or writer, in a single operation.
@@ -1775,7 +1783,4 @@ public class Response
return (sb.toString());
}
-
-
}
-
Modified: tomcat/trunk/java/org/apache/catalina/core/StandardWrapperValve.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/core/StandardWrapperValve.java?rev=1600580&r1=1600579&r2=1600580&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/core/StandardWrapperValve.java (original)
+++ tomcat/trunk/java/org/apache/catalina/core/StandardWrapperValve.java Thu Jun 5 10:04:45 2014
@@ -508,7 +508,7 @@ final class StandardWrapperValve
Throwable exception) {
request.setAttribute(RequestDispatcher.ERROR_EXCEPTION, exception);
response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
-
+ response.setError();
}
public long getProcessingTime() {
Modified: tomcat/trunk/java/org/apache/catalina/valves/ErrorReportValve.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/valves/ErrorReportValve.java?rev=1600580&r1=1600579&r2=1600580&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/valves/ErrorReportValve.java (original)
+++ tomcat/trunk/java/org/apache/catalina/valves/ErrorReportValve.java Thu Jun 5 10:04:45 2014
@@ -78,25 +78,21 @@ public class ErrorReportValve extends Va
// Perform the request
getNext().invoke(request, response);
- // Check the response for an error
- Throwable throwable = (Throwable) request.getAttribute(RequestDispatcher.ERROR_EXCEPTION);
-
- if (response.getStatus() < 400 && throwable == null && !response.isError() ||
- request.isAsyncDispatching()) {
+ if (response.isCommitted()) {
+ if (response.isErrorAfterCommit()) {
+ // Flush any data that is still to be written to the client
+ response.flushBuffer();
+ // Close immediately to signal to the client that something went
+ // wrong
+ response.getCoyoteResponse().action(ActionCode.CLOSE_NOW, null);
+ }
return;
}
- // If we get this far then there has been an error
+ Throwable throwable = (Throwable) request.getAttribute(RequestDispatcher.ERROR_EXCEPTION);
- if (response.isCommitted()) {
- // Flush any data that is still to be written to the client
- response.flushBuffer();
- // Mark the response as in error
- response.setError();
- response.getCoyoteResponse().setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
- // Close immediately to signal to the client that something went
- // wrong
- response.getCoyoteResponse().action(ActionCode.CLOSE_NOW, null);
+ if (request.isAsyncStarted() && ((response.getStatus() < 400 &&
+ throwable == null) || request.isAsyncDispatching())) {
return;
}
@@ -142,6 +138,12 @@ public class ErrorReportValve extends Va
int statusCode = response.getStatus();
+ // Do nothing on a 1xx, 2xx and 3xx status
+ // Do nothing if anything has been written already
+ // Do nothing if the response hasn't been explicitly marked as in error
+ if (statusCode < 400 || response.getContentWritten() > 0 || !response.isError()) {
+ return;
+ }
String message = RequestUtil.filter(response.getMessage());
if (message == null) {
if (throwable != null) {
---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@tomcat.apache.org
For additional commands, e-mail: dev-help@tomcat.apache.org