Author: markt
Date: Thu Oct 1 14:32:56 2015
New Revision: 1706264
URL: http://svn.apache.org/viewvc?rev=1706264&view=rev
Log:
Complete some error handling TODOs
Modified:
tomcat/trunk/java/org/apache/coyote/http2/Http2UpgradeHandler.java
tomcat/trunk/java/org/apache/coyote/http2/LocalStrings.properties
tomcat/trunk/java/org/apache/coyote/http2/Stream.java
tomcat/trunk/java/org/apache/coyote/http2/StreamProcessor.java
Modified: tomcat/trunk/java/org/apache/coyote/http2/Http2UpgradeHandler.java
URL:
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/coyote/http2/Http2UpgradeHandler.java?rev=1706264&r1=1706263&r2=1706264&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/coyote/http2/Http2UpgradeHandler.java
(original)
+++ tomcat/trunk/java/org/apache/coyote/http2/Http2UpgradeHandler.java Thu Oct
1 14:32:56 2015
@@ -402,7 +402,7 @@ public class Http2UpgradeHandler extends
}
- private void closeStream(StreamException se) throws ConnectionException,
IOException {
+ void closeStream(StreamException se) throws ConnectionException,
IOException {
if (log.isDebugEnabled()) {
log.debug(sm.getString("upgradeHandler.rst.debug", connectionId,
@@ -433,7 +433,7 @@ public class Http2UpgradeHandler extends
}
- private void closeConnection(Http2Exception ce) {
+ void closeConnection(Http2Exception ce) {
// Write a GOAWAY frame.
byte[] fixedPayload = new byte[8];
ByteUtil.set31Bits(fixedPayload, 0, maxProcessedStreamId);
Modified: tomcat/trunk/java/org/apache/coyote/http2/LocalStrings.properties
URL:
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/coyote/http2/LocalStrings.properties?rev=1706264&r1=1706263&r2=1706264&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/coyote/http2/LocalStrings.properties (original)
+++ tomcat/trunk/java/org/apache/coyote/http2/LocalStrings.properties Thu Oct
1 14:32:56 2015
@@ -72,6 +72,8 @@ stream.write=Connection [{0}], Stream [{
stream.outputBuffer.flush.debug=Connection [{0}], Stream [{1}], flushing
output with buffer at position [{2}], writeInProgress [{3}] and closed [{4}]
+streamProcessor.error.connection=Connection [{0}], Stream [{1}], An error
occurred during processing that was fatal to the connection
+streamProcessor.error.stream=Connection [{0}], Stream [{1}], An error occurred
during processing that was fatal to the stream
streamProcessor.httpupgrade.notsupported=HTTP upgrade is not supported within
HTTP/2 streams
streamProcessor.process.loopend=Connection [{0}], Stream [{1}], loop end,
state [{2}], dispatches [{3}]
streamProcessor.process.loopstart=Connection [{0}], Stream [{1}], loop start,
status [{2}], dispatches [{3}]
Modified: tomcat/trunk/java/org/apache/coyote/http2/Stream.java
URL:
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/coyote/http2/Stream.java?rev=1706264&r1=1706263&r2=1706264&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/coyote/http2/Stream.java (original)
+++ tomcat/trunk/java/org/apache/coyote/http2/Stream.java Thu Oct 1 14:32:56
2015
@@ -338,6 +338,25 @@ public class Stream extends AbstractStre
return !state.isFrameTypePermitted(FrameType.DATA);
}
+
+ void close(Http2Exception http2Exception) {
+ if (http2Exception instanceof StreamException) {
+ try {
+ handler.closeStream((StreamException) http2Exception);
+ } catch (ConnectionException ce) {
+ handler.closeConnection(ce);
+ } catch (IOException ioe) {
+ // TODO i18n
+ ConnectionException ce = new ConnectionException("",
Http2Error.PROTOCOL_ERROR);
+ ce.initCause(ioe);
+ handler.closeConnection(ce);
+ }
+ } else {
+ handler.closeConnection(http2Exception);
+ }
+ }
+
+
class StreamOutputBuffer implements OutputBuffer {
private final ByteBuffer buffer = ByteBuffer.allocate(8 * 1024);
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=1706264&r1=1706263&r2=1706264&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/coyote/http2/StreamProcessor.java (original)
+++ tomcat/trunk/java/org/apache/coyote/http2/StreamProcessor.java Thu Oct 1
14:32:56 2015
@@ -74,15 +74,19 @@ public class StreamProcessor extends Abs
log.debug(sm.getString("streamProcessor.process.loopstart",
stream.getConnectionId(), stream.getIdentifier(),
status, dispatches));
}
- // TODO CLOSE_NOW ?
- if (dispatches != null) {
+ if (status == SocketStatus.CLOSE_NOW) {
+ setErrorState(ErrorState.CLOSE_NOW, null);
+ state = SocketState.CLOSED;
+ } else if (dispatches != null) {
DispatchType nextDispatch = dispatches.next();
state = dispatch(nextDispatch.getSocketStatus());
- // TODO DISCONNECT ?
} else if (isAsync()) {
state = dispatch(status);
} else if (state == SocketState.ASYNC_END) {
state = dispatch(status);
+ } else if (status == SocketStatus.DISCONNECT) {
+ // Should never happen
+ throw new IllegalStateException();
} else {
state = process((SocketWrapperBase<?>) null);
}
@@ -104,11 +108,25 @@ public class StreamProcessor extends Abs
dispatches != null && state != SocketState.CLOSED);
if (state == SocketState.CLOSED) {
- // TODO
+ if (!getErrorState().isConnectionIoAllowed()) {
+ ConnectionException ce = new
ConnectionException(sm.getString(
+ "streamProcessor.error.connection",
stream.getConnectionId(),
+ stream.getIdentifier()),
Http2Error.INTERNAL_ERROR);
+ stream.close(ce);
+ } else if (!getErrorState().isIoAllowed()) {
+ StreamException se = new StreamException(sm.getString(
+ "streamProcessor.error.stream",
stream.getConnectionId(),
+ stream.getIdentifier()), Http2Error.INTERNAL_ERROR,
+ stream.getIdentifier().intValue());
+ stream.close(se);
+ }
}
} catch (Exception e) {
- // TODO
- e.printStackTrace();
+ ConnectionException ce = new ConnectionException(sm.getString(
+ "streamProcessor.error.connection",
stream.getConnectionId(),
+ stream.getIdentifier()), Http2Error.INTERNAL_ERROR);
+ ce.initCause(e);
+ stream.close(ce);
} finally {
ContainerThreadMarker.clear();
}
@@ -125,7 +143,7 @@ public class StreamProcessor extends Abs
response.setCommitted(true);
stream.writeHeaders();
} catch (IOException ioe) {
- // TODO: Handle this
+ setErrorState(ErrorState.CLOSE_CONNECTION_NOW, ioe);
}
}
break;
@@ -135,7 +153,7 @@ public class StreamProcessor extends Abs
try {
stream.getOutputBuffer().close();
} catch (IOException ioe) {
- // TODO
+ setErrorState(ErrorState.CLOSE_CONNECTION_NOW, ioe);
}
break;
}
@@ -144,7 +162,7 @@ public class StreamProcessor extends Abs
try {
stream.writeAck();
} catch (IOException ioe) {
- // TODO
+ setErrorState(ErrorState.CLOSE_CONNECTION_NOW, ioe);
}
}
break;
@@ -155,7 +173,7 @@ public class StreamProcessor extends Abs
stream.flushData();
} catch (IOException ioe) {
response.setErrorException(ioe);
- // TODO: Shut stream down?
+ setErrorState(ErrorState.CLOSE_CONNECTION_NOW, ioe);
}
break;
}
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]