You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tomcat.apache.org by ma...@apache.org on 2015/05/21 10:52:02 UTC

svn commit: r1680766 - in /tomcat/trunk/java/org/apache/coyote/http2: Http2UpgradeHandler.java LocalStrings.properties

Author: markt
Date: Thu May 21 08:52:02 2015
New Revision: 1680766

URL: http://svn.apache.org/r1680766
Log:
Add support for responding to incoming pings

Modified:
    tomcat/trunk/java/org/apache/coyote/http2/Http2UpgradeHandler.java
    tomcat/trunk/java/org/apache/coyote/http2/LocalStrings.properties

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=1680766&r1=1680765&r2=1680766&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/coyote/http2/Http2UpgradeHandler.java (original)
+++ tomcat/trunk/java/org/apache/coyote/http2/Http2UpgradeHandler.java Thu May 21 08:52:02 2015
@@ -68,11 +68,14 @@ public class Http2UpgradeHandler extends
     private static final int FRAME_TYPE_HEADERS = 1;
     private static final int FRAME_TYPE_PRIORITY = 2;
     private static final int FRAME_TYPE_SETTINGS = 4;
+    private static final int FRAME_TYPE_PING = 6;
     private static final int FRAME_TYPE_WINDOW_UPDATE = 8;
     private static final int FRAME_TYPE_CONTINUATION = 9;
 
-    private static final byte[] SETTINGS_EMPTY = { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00 };
+    private static final byte[] PING_ACK = { 0x00, 0x00, 0x08, 0x06, 0x01, 0x00, 0x00, 0x00, 0x00 };
+
     private static final byte[] SETTINGS_ACK = { 0x00, 0x00, 0x00, 0x04, 0x01, 0x00, 0x00, 0x00, 0x00 };
+    private static final byte[] SETTINGS_EMPTY = { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00 };
 
     private static final byte[] GOAWAY = { 0x07, 0x00, 0x00, 0x00, 0x00 };
 
@@ -274,6 +277,9 @@ public class Http2UpgradeHandler extends
         case FRAME_TYPE_SETTINGS:
             processFrameSettings(flags, streamId, payloadSize);
             break;
+        case FRAME_TYPE_PING:
+            processFramePing(flags, streamId, payloadSize);
+            break;
         case FRAME_TYPE_WINDOW_UPDATE:
             processFrameWindowUpdate(flags, streamId, payloadSize);
             break;
@@ -461,6 +467,38 @@ public class Http2UpgradeHandler extends
     }
 
 
+    private void processFramePing(int flags, int streamId, int payloadSize)
+            throws IOException {
+        if (log.isDebugEnabled()) {
+            log.debug(sm.getString("upgradeHandler.processFrame",
+                    Long.toString(connectionId), Integer.toString(streamId),
+                    Integer.toString(flags), Integer.toString(payloadSize)));
+        }
+        // Validate the frame
+        if (streamId != 0) {
+            throw new Http2Exception(sm.getString("upgradeHandler.processFramePing.invalidStream",
+                    Integer.toString(streamId)), 0, Http2Exception.FRAME_SIZE_ERROR);
+        }
+        if (payloadSize != 8) {
+            throw new Http2Exception(sm.getString("upgradeHandler.processFramePing.invalidPayloadSize",
+                    Integer.toString(payloadSize)), 0, Http2Exception.FRAME_SIZE_ERROR);
+        }
+        if ((flags & 0x1) == 0) {
+            // Read the payload
+            byte[] payload = new byte[8];
+            readFully(payload);
+            // Echo it back
+            socketWrapper.write(true, PING_ACK, 0, PING_ACK.length);
+            socketWrapper.write(true, payload, 0, payload.length);
+            socketWrapper.flush(true);
+        } else {
+            // This is an ACK.
+            // NO-OP (until such time this implementation decides in initiate
+            // pings)
+        }
+    }
+
+
     private void processFrameWindowUpdate(int flags, int streamId, int payloadSize)
             throws IOException {
         if (log.isDebugEnabled()) {

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=1680766&r1=1680765&r2=1680766&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/coyote/http2/LocalStrings.properties (original)
+++ tomcat/trunk/java/org/apache/coyote/http2/LocalStrings.properties Thu May 21 08:52:02 2015
@@ -44,6 +44,8 @@ upgradeHandler.processFrame=Connection [
 upgradeHandler.processFrameHeaders.invalidStream=Headers frame received for stream [0]
 upgradeHandler.processFrameHeaders.decodingFailed=There was an error during the HPACK decoding of HTTP headers
 upgradeHandler.processFrameHeaders.decodingDataLeft=Data left over after HPACK decoding - it should have been consumed
+upgradeHandler.processFramePing.invalidPayloadSize=Settings frame received with an invalid payload size of [{0}] (should be 8)
+upgradeHandler.processFramePing.invalidStream=Ping frame received for stream [{0}]
 upgradeHandler.processFramePriority.invalidPayloadSize=Priority frame received with an invalid payload size of [{0}] (should be 5)
 upgradeHandler.processFramePriority.invalidStream=Priority frame received for stream [0]
 upgradeHandler.processFrameSettings.ackWithNonZeroPayload=Settings frame received with the ACK flag set and payload present



---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@tomcat.apache.org
For additional commands, e-mail: dev-help@tomcat.apache.org