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: dev-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org