Author: markt
Date: Thu Oct 1 13:33:25 2015
New Revision: 1706246
URL: http://svn.apache.org/viewvc?rev=1706246&view=rev
Log:
First pass at differentiating between errors that are fatal to a multiplexed
stream vs fatal to a multiplexed connection.
Modified:
tomcat/trunk/java/org/apache/coyote/AbstractProcessor.java
tomcat/trunk/java/org/apache/coyote/ErrorState.java
tomcat/trunk/java/org/apache/coyote/ajp/AjpProcessor.java
tomcat/trunk/java/org/apache/coyote/http11/Http11Processor.java
tomcat/trunk/java/org/apache/coyote/http2/StreamProcessor.java
Modified: tomcat/trunk/java/org/apache/coyote/AbstractProcessor.java
URL:
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/coyote/AbstractProcessor.java?rev=1706246&r1=1706245&r2=1706246&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/coyote/AbstractProcessor.java (original)
+++ tomcat/trunk/java/org/apache/coyote/AbstractProcessor.java Thu Oct 1
13:33:25 2015
@@ -237,7 +237,7 @@ public abstract class AbstractProcessor
setErrorState(ErrorState.CLOSE_NOW, null);
}
} catch (InterruptedIOException e) {
- setErrorState(ErrorState.CLOSE_NOW, e);
+ setErrorState(ErrorState.CLOSE_CONNECTION_NOW, e);
} catch (Throwable t) {
ExceptionUtils.handleThrowable(t);
setErrorState(ErrorState.CLOSE_NOW, t);
Modified: tomcat/trunk/java/org/apache/coyote/ErrorState.java
URL:
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/coyote/ErrorState.java?rev=1706246&r1=1706245&r2=1706246&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/coyote/ErrorState.java (original)
+++ tomcat/trunk/java/org/apache/coyote/ErrorState.java Thu Oct 1 13:33:25 2015
@@ -21,7 +21,7 @@ public enum ErrorState {
/**
* Not in an error state.
*/
- NONE(false, 0, true),
+ NONE(false, 0, true, true),
/**
* The current request/response is in an error state and while it is safe
to
@@ -29,22 +29,36 @@ public enum ErrorState {
* existing connection which must be closed once the response has been
* completed.
*/
- CLOSE_CLEAN(true, 1, true),
+ CLOSE_CLEAN(true, 1, true, true),
/**
* The current request/response is in an error state and it is not safe to
- * continue to use the existing connection which must be closed
immediately.
+ * continue to use them. For multiplexed protocols (such as HTTP/2) the
+ * stream/channel must be closed immediately but the connection may
+ * continue. For non-multiplexed protocols (AJP, HTTP/1.x) the current
+ * connection must be closed.
*/
- CLOSE_NOW(true, 2, false);
+ CLOSE_NOW(true, 2, false, true),
+
+ /**
+ * An error has been detected that impacts the underlying network
+ * connection. It is not safe to continue using the network connection
which
+ * must be closed immediately. For multiplexed protocols (such as HTTP/2)
+ * this impacts all multiplexed channels.
+ */
+ CLOSE_CONNECTION_NOW(true, 3, false, false);
private final boolean error;
private final int severity;
private final boolean ioAllowed;
+ private final boolean connectionIoAllowed;
- private ErrorState(boolean error, int severity, boolean ioAllowed) {
+ private ErrorState(boolean error, int severity, boolean ioAllowed,
+ boolean connectionIoAllowed) {
this.error = error;
this.severity = severity;
this.ioAllowed = ioAllowed;
+ this.connectionIoAllowed = connectionIoAllowed;
}
public boolean isError() {
@@ -71,4 +85,8 @@ public enum ErrorState {
public boolean isIoAllowed() {
return ioAllowed;
}
+
+ public boolean isConnectionIoAllowed() {
+ return connectionIoAllowed;
+ }
}
Modified: tomcat/trunk/java/org/apache/coyote/ajp/AjpProcessor.java
URL:
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/coyote/ajp/AjpProcessor.java?rev=1706246&r1=1706245&r2=1706246&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/coyote/ajp/AjpProcessor.java (original)
+++ tomcat/trunk/java/org/apache/coyote/ajp/AjpProcessor.java Thu Oct 1
13:33:25 2015
@@ -337,7 +337,7 @@ public class AjpProcessor extends Abstra
// Validate and write response headers
prepareResponse();
} catch (IOException e) {
- setErrorState(ErrorState.CLOSE_NOW, e);
+ setErrorState(ErrorState.CLOSE_CONNECTION_NOW, e);
}
}
break;
@@ -347,7 +347,7 @@ public class AjpProcessor extends Abstra
try {
finish();
} catch (IOException e) {
- setErrorState(ErrorState.CLOSE_NOW, e);
+ setErrorState(ErrorState.CLOSE_CONNECTION_NOW, e);
}
break;
}
@@ -360,7 +360,7 @@ public class AjpProcessor extends Abstra
try {
flush();
} catch (IOException e) {
- setErrorState(ErrorState.CLOSE_NOW, e);
+ setErrorState(ErrorState.CLOSE_CONNECTION_NOW, e);
}
break;
}
@@ -675,7 +675,7 @@ public class AjpProcessor extends Abstra
socketWrapper.write(true, pongMessageArray, 0,
pongMessageArray.length);
socketWrapper.flush(true);
} catch (IOException e) {
- setErrorState(ErrorState.CLOSE_NOW, e);
+ setErrorState(ErrorState.CLOSE_CONNECTION_NOW, e);
}
recycle();
continue;
@@ -685,13 +685,13 @@ public class AjpProcessor extends Abstra
if (getLog().isDebugEnabled()) {
getLog().debug("Unexpected message: " + type);
}
- setErrorState(ErrorState.CLOSE_NOW, null);
+ setErrorState(ErrorState.CLOSE_CONNECTION_NOW, null);
break;
}
keptAlive = true;
request.setStartTime(System.currentTimeMillis());
} catch (IOException e) {
- setErrorState(ErrorState.CLOSE_NOW, e);
+ setErrorState(ErrorState.CLOSE_CONNECTION_NOW, e);
break;
} catch (Throwable t) {
ExceptionUtils.handleThrowable(t);
@@ -731,7 +731,7 @@ public class AjpProcessor extends Abstra
rp.setStage(org.apache.coyote.Constants.STAGE_SERVICE);
getAdapter().service(request, response);
} catch (InterruptedIOException e) {
- setErrorState(ErrorState.CLOSE_NOW, e);
+ setErrorState(ErrorState.CLOSE_CONNECTION_NOW, e);
} catch (Throwable t) {
ExceptionUtils.handleThrowable(t);
getLog().error(sm.getString("ajpprocessor.request.process"), t);
@@ -750,6 +750,8 @@ public class AjpProcessor extends Abstra
if (!finished && getErrorState().isIoAllowed()) {
try {
finish();
+ } catch (IOException ioe){
+ setErrorState(ErrorState.CLOSE_CONNECTION_NOW, ioe);
} catch (Throwable t) {
ExceptionUtils.handleThrowable(t);
setErrorState(ErrorState.CLOSE_NOW, t);
@@ -1541,7 +1543,7 @@ public class AjpProcessor extends Abstra
try {
prepareResponse();
} catch (IOException e) {
- setErrorState(ErrorState.CLOSE_NOW, e);
+ setErrorState(ErrorState.CLOSE_CONNECTION_NOW, e);
}
}
Modified: tomcat/trunk/java/org/apache/coyote/http11/Http11Processor.java
URL:
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/coyote/http11/Http11Processor.java?rev=1706246&r1=1706245&r2=1706246&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/coyote/http11/Http11Processor.java (original)
+++ tomcat/trunk/java/org/apache/coyote/http11/Http11Processor.java Thu Oct 1
13:33:25 2015
@@ -654,7 +654,7 @@ public class Http11Processor extends Abs
prepareResponse();
outputBuffer.commit();
} catch (IOException e) {
- setErrorState(ErrorState.CLOSE_NOW, e);
+ setErrorState(ErrorState.CLOSE_CONNECTION_NOW, e);
}
}
break;
@@ -664,7 +664,7 @@ public class Http11Processor extends Abs
try {
outputBuffer.endRequest();
} catch (IOException e) {
- setErrorState(ErrorState.CLOSE_NOW, e);
+ setErrorState(ErrorState.CLOSE_CONNECTION_NOW, e);
}
break;
}
@@ -677,7 +677,7 @@ public class Http11Processor extends Abs
try {
outputBuffer.sendAck();
} catch (IOException e) {
- setErrorState(ErrorState.CLOSE_NOW, e);
+ setErrorState(ErrorState.CLOSE_CONNECTION_NOW, e);
}
}
break;
@@ -687,7 +687,7 @@ public class Http11Processor extends Abs
try {
outputBuffer.flush();
} catch (IOException e) {
- setErrorState(ErrorState.CLOSE_NOW, e);
+ setErrorState(ErrorState.CLOSE_CONNECTION_NOW, e);
response.setErrorException(e);
}
break;
@@ -1002,7 +1002,7 @@ public class Http11Processor extends Abs
if (log.isDebugEnabled()) {
log.debug(sm.getString("http11processor.header.parse"), e);
}
- setErrorState(ErrorState.CLOSE_NOW, e);
+ setErrorState(ErrorState.CLOSE_CONNECTION_NOW, e);
break;
} catch (Throwable t) {
ExceptionUtils.handleThrowable(t);
@@ -1094,7 +1094,7 @@ public class Http11Processor extends Abs
setErrorState(ErrorState.CLOSE_CLEAN, null);
}
} catch (InterruptedIOException e) {
- setErrorState(ErrorState.CLOSE_NOW, e);
+ setErrorState(ErrorState.CLOSE_CONNECTION_NOW, e);
} catch (HeadersTooLargeException e) {
// The response should not have been committed but check it
// anyway to be safe
@@ -1760,7 +1760,7 @@ public class Http11Processor extends Abs
try {
inputBuffer.endRequest();
} catch (IOException e) {
- setErrorState(ErrorState.CLOSE_NOW, e);
+ setErrorState(ErrorState.CLOSE_CONNECTION_NOW, e);
} catch (Throwable t) {
ExceptionUtils.handleThrowable(t);
// 500 - Internal Server Error
@@ -1775,7 +1775,7 @@ public class Http11Processor extends Abs
try {
outputBuffer.endRequest();
} catch (IOException e) {
- setErrorState(ErrorState.CLOSE_NOW, e);
+ setErrorState(ErrorState.CLOSE_CONNECTION_NOW, e);
} catch (Throwable t) {
ExceptionUtils.handleThrowable(t);
setErrorState(ErrorState.CLOSE_NOW, t);
@@ -1809,7 +1809,7 @@ public class Http11Processor extends Abs
if (log.isDebugEnabled()) {
log.debug(sm.getString("http11processor.sendfile.error"));
}
- setErrorState(ErrorState.CLOSE_NOW, null);
+ setErrorState(ErrorState.CLOSE_CONNECTION_NOW, null);
return true;
}
}
Modified: tomcat/trunk/java/org/apache/coyote/http2/StreamProcessor.java
URL:
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/coyote/http2/StreamProcessor.java?rev=1706246&r1=1706245&r2=1706246&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/coyote/http2/StreamProcessor.java (original)
+++ tomcat/trunk/java/org/apache/coyote/http2/StreamProcessor.java Thu Oct 1
13:33:25 2015
@@ -390,6 +390,8 @@ public class StreamProcessor extends Abs
public SocketState process(SocketWrapperBase<?> socket) throws IOException
{
try {
adapter.service(request, response);
+ } catch (IOException ioe) {
+ setErrorState(ErrorState.CLOSE_CONNECTION_NOW, ioe);
} catch (Exception e) {
setErrorState(ErrorState.CLOSE_NOW, e);
}
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]