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

Reply via email to