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