Author: markt Date: Wed Jun 10 14:23:48 2015 New Revision: 1684682 URL: http://svn.apache.org/r1684682 Log: HTTP/2 5.1.2 requires active streams to be counted. Add an active flag (currently unused) to Stream. Try a different format for State enum constructors. Uses more space but I think it is clearer.
Modified: tomcat/trunk/java/org/apache/coyote/http2/StreamStateMachine.java Modified: tomcat/trunk/java/org/apache/coyote/http2/StreamStateMachine.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/coyote/http2/StreamStateMachine.java?rev=1684682&r1=1684681&r2=1684682&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/coyote/http2/StreamStateMachine.java (original) +++ tomcat/trunk/java/org/apache/coyote/http2/StreamStateMachine.java Wed Jun 10 14:23:48 2015 @@ -125,35 +125,58 @@ public class StreamStateMachine { } + public synchronized boolean isActive() { + return state.isActive(); + } + + private enum State { - IDLE (true, Http2Error.PROTOCOL_ERROR, FrameType.HEADERS, FrameType.PRIORITY), - OPEN (true, Http2Error.PROTOCOL_ERROR, FrameType.DATA, FrameType.HEADERS, - FrameType.PRIORITY, FrameType.RST, FrameType.PUSH_PROMISE, - FrameType.WINDOW_UPDATE), - RESERVED_LOCAL (true, Http2Error.PROTOCOL_ERROR, FrameType.PRIORITY, FrameType.RST, - FrameType.WINDOW_UPDATE), - RESERVED_REMOTE (true, Http2Error.PROTOCOL_ERROR, FrameType.HEADERS, FrameType.PRIORITY, - FrameType.RST), - HALF_CLOSED_LOCAL (true, Http2Error.PROTOCOL_ERROR, FrameType.DATA, FrameType.HEADERS, - FrameType.PRIORITY, FrameType.RST, FrameType.PUSH_PROMISE, - FrameType.WINDOW_UPDATE), - HALF_CLOSED_REMOTE (true, Http2Error.STREAM_CLOSED, FrameType.PRIORITY, FrameType.RST, - FrameType.WINDOW_UPDATE), - CLOSED_RX (true, Http2Error.STREAM_CLOSED, FrameType.PRIORITY), - CLOSED_TX (true, Http2Error.STREAM_CLOSED, FrameType.PRIORITY, FrameType.RST, - FrameType.WINDOW_UPDATE), - CLOSED_RST_RX (false, Http2Error.STREAM_CLOSED, FrameType.PRIORITY), - CLOSED_RST_TX (false, Http2Error.STREAM_CLOSED, FrameType.DATA, FrameType.HEADERS, - FrameType.PRIORITY, FrameType.RST, FrameType.PUSH_PROMISE, - FrameType.WINDOW_UPDATE), - CLOSED_FINAL (true, Http2Error.PROTOCOL_ERROR, FrameType.PRIORITY); + IDLE (false, true, Http2Error.PROTOCOL_ERROR, FrameType.HEADERS, + FrameType.PRIORITY), + OPEN (true, true, Http2Error.PROTOCOL_ERROR, FrameType.DATA, + FrameType.HEADERS, + FrameType.PRIORITY, + FrameType.RST, + FrameType.PUSH_PROMISE, + FrameType.WINDOW_UPDATE), + RESERVED_LOCAL (false, true, Http2Error.PROTOCOL_ERROR, FrameType.PRIORITY, + FrameType.RST, + FrameType.WINDOW_UPDATE), + RESERVED_REMOTE (false, true, Http2Error.PROTOCOL_ERROR, FrameType.HEADERS, + FrameType.PRIORITY, + FrameType.RST), + HALF_CLOSED_LOCAL (true, true, Http2Error.PROTOCOL_ERROR, FrameType.DATA, + FrameType.HEADERS, + FrameType.PRIORITY, + FrameType.RST, + FrameType.PUSH_PROMISE, + FrameType.WINDOW_UPDATE), + HALF_CLOSED_REMOTE (true, true, Http2Error.STREAM_CLOSED, FrameType.PRIORITY, + FrameType.RST, + FrameType.WINDOW_UPDATE), + CLOSED_RX (false, true, Http2Error.STREAM_CLOSED, FrameType.PRIORITY), + CLOSED_TX (false, true, Http2Error.STREAM_CLOSED, FrameType.PRIORITY, + FrameType.RST, + FrameType.WINDOW_UPDATE), + CLOSED_RST_RX (false, false, Http2Error.STREAM_CLOSED, FrameType.PRIORITY), + CLOSED_RST_TX (false, false, Http2Error.STREAM_CLOSED, FrameType.DATA, + FrameType.HEADERS, + FrameType.PRIORITY, + FrameType.RST, + FrameType.PUSH_PROMISE, + FrameType.WINDOW_UPDATE), + // TODO: This state may end up being removed and replaced by the stream + // being removed from the map in the upgrade handler. + CLOSED_FINAL (false, true, Http2Error.PROTOCOL_ERROR, FrameType.PRIORITY); + private final boolean active; private final boolean connectionErrorForInvalidFrame; private final Http2Error errorCodeForInvalidFrame; private final Set<FrameType> frameTypesPermitted = new HashSet<>(); - private State(boolean connectionErrorForInvalidFrame, Http2Error errorCode, - FrameType... frameTypes) { + private State(boolean active, boolean connectionErrorForInvalidFrame, + Http2Error errorCode, FrameType... frameTypes) { + this.active = active; this.connectionErrorForInvalidFrame = connectionErrorForInvalidFrame; this.errorCodeForInvalidFrame = errorCode; for (FrameType frameType : frameTypes) { @@ -161,6 +184,10 @@ public class StreamStateMachine { } } + public boolean isActive() { + return active; + } + public boolean isFrameTypePermitted(FrameType frameType) { return frameTypesPermitted.contains(frameType); } --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org