This is an automated email from the ASF dual-hosted git repository.

markt pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/tomcat.git

commit 02c202aae1789ac532e63894a9317bcda7f1fcec
Author: Mark Thomas <ma...@apache.org>
AuthorDate: Mon Mar 15 18:50:29 2021 +0000

    Add frameTypeId parameter to swallowedPayload()
---
 java/org/apache/coyote/http2/FrameType.java        |  5 +++
 java/org/apache/coyote/http2/Http2AsyncParser.java | 11 ++++---
 java/org/apache/coyote/http2/Http2Parser.java      | 38 ++++++++++++----------
 3 files changed, 33 insertions(+), 21 deletions(-)

diff --git a/java/org/apache/coyote/http2/FrameType.java 
b/java/org/apache/coyote/http2/FrameType.java
index 0f17f6f..8734944 100644
--- a/java/org/apache/coyote/http2/FrameType.java
+++ b/java/org/apache/coyote/http2/FrameType.java
@@ -53,6 +53,11 @@ enum FrameType {
     }
 
 
+    int getId() {
+        return id;
+    }
+
+
     byte getIdByte() {
         return (byte) id;
     }
diff --git a/java/org/apache/coyote/http2/Http2AsyncParser.java 
b/java/org/apache/coyote/http2/Http2AsyncParser.java
index ad2ba10..754cc96 100644
--- a/java/org/apache/coyote/http2/Http2AsyncParser.java
+++ b/java/org/apache/coyote/http2/Http2AsyncParser.java
@@ -106,7 +106,7 @@ class Http2AsyncParser extends Http2Parser {
                 payload.flip();
                 try {
                     if (streamException) {
-                        swallowPayload(streamId, payloadSize, false, payload);
+                        swallowPayload(streamId, frameTypeId, payloadSize, 
false, payload);
                     } else {
                         readSettingsFrame(flags, payloadSize, payload);
                     }
@@ -170,6 +170,7 @@ class Http2AsyncParser extends Http2Parser {
         private boolean validated = false;
         private CompletionState state = null;
         protected int payloadSize;
+        protected int frameTypeId;
         protected FrameType frameType;
         protected int flags;
         protected int streamId;
@@ -202,7 +203,8 @@ class Http2AsyncParser extends Http2Parser {
                 }
                 parsedFrameHeader = true;
                 payloadSize = ByteUtil.getThreeBytes(frameHeaderBuffer, 0);
-                frameType = 
FrameType.valueOf(ByteUtil.getOneByte(frameHeaderBuffer, 3));
+                frameTypeId = ByteUtil.getOneByte(frameHeaderBuffer, 3);
+                frameType = FrameType.valueOf(frameTypeId);
                 flags = ByteUtil.getOneByte(frameHeaderBuffer, 4);
                 streamId = ByteUtil.get31Bits(frameHeaderBuffer, 5);
             }
@@ -239,7 +241,7 @@ class Http2AsyncParser extends Http2Parser {
                     do {
                         continueParsing = false;
                         if (streamException) {
-                            swallowPayload(streamId, payloadSize, false, 
payload);
+                            swallowPayload(streamId, frameTypeId, payloadSize, 
false, payload);
                         } else {
                             switch (frameType) {
                             case DATA:
@@ -280,7 +282,8 @@ class Http2AsyncParser extends Http2Parser {
                         if (payload.remaining() >= 9) {
                             int position = payload.position();
                             payloadSize = ByteUtil.getThreeBytes(payload, 
position);
-                            frameType = 
FrameType.valueOf(ByteUtil.getOneByte(payload, position + 3));
+                            frameTypeId = ByteUtil.getOneByte(payload, 
position + 3);
+                            frameType = FrameType.valueOf(frameTypeId);
                             flags = ByteUtil.getOneByte(payload, position + 4);
                             streamId = ByteUtil.get31Bits(payload, position + 
5);
                             streamException = false;
diff --git a/java/org/apache/coyote/http2/Http2Parser.java 
b/java/org/apache/coyote/http2/Http2Parser.java
index a90028a..b1c8e15 100644
--- a/java/org/apache/coyote/http2/Http2Parser.java
+++ b/java/org/apache/coyote/http2/Http2Parser.java
@@ -80,14 +80,15 @@ class Http2Parser {
         }
 
         int payloadSize = ByteUtil.getThreeBytes(frameHeaderBuffer, 0);
-        FrameType frameType = 
FrameType.valueOf(ByteUtil.getOneByte(frameHeaderBuffer, 3));
+        int frameTypeId = ByteUtil.getOneByte(frameHeaderBuffer, 3);
+        FrameType frameType = FrameType.valueOf(frameTypeId);
         int flags = ByteUtil.getOneByte(frameHeaderBuffer, 4);
         int streamId = ByteUtil.get31Bits(frameHeaderBuffer, 5);
 
         try {
             validateFrame(expected, frameType, streamId, flags, payloadSize);
         } catch (StreamException se) {
-            swallowPayload(streamId, payloadSize, false, null);
+            swallowPayload(streamId, frameTypeId, payloadSize, false, null);
             throw se;
         }
 
@@ -171,11 +172,11 @@ class Http2Parser {
 
         ByteBuffer dest = output.startRequestBodyFrame(streamId, payloadSize, 
endOfStream);
         if (dest == null) {
-            swallowPayload(streamId, dataLength, false, buffer);
+            swallowPayload(streamId, FrameType.DATA.getId(), dataLength, 
false, buffer);
             // Process padding before sending any notifications in case padding
             // is invalid.
             if (padLength > 0) {
-                swallowPayload(streamId, padLength, true, buffer);
+                swallowPayload(streamId, FrameType.DATA.getId(), padLength, 
true, buffer);
             }
             if (endOfStream) {
                 output.receivedEndOfStream(streamId);
@@ -183,7 +184,7 @@ class Http2Parser {
         } else {
             synchronized (dest) {
                 if (dest.remaining() < dataLength) {
-                    swallowPayload(streamId, dataLength, false, buffer);
+                    swallowPayload(streamId, FrameType.DATA.getId(), 
dataLength, false, buffer);
                     // Client has sent more data than permitted by Window size
                     throw new 
StreamException(sm.getString("http2Parser.processFrameData.window", 
connectionId),
                             Http2Error.FLOW_CONTROL_ERROR, streamId);
@@ -199,7 +200,7 @@ class Http2Parser {
                 // Process padding before sending any notifications in case
                 // padding is invalid.
                 if (padLength > 0) {
-                    swallowPayload(streamId, padLength, true, buffer);
+                    swallowPayload(streamId, FrameType.DATA.getId(), 
padLength, true, buffer);
                 }
                 if (endOfStream) {
                     output.receivedEndOfStream(streamId);
@@ -224,7 +225,7 @@ class Http2Parser {
         try {
             hpackDecoder.setHeaderEmitter(output.headersStart(streamId, 
headersEndStream));
         } catch (StreamException se) {
-            swallowPayload(streamId, payloadSize, false, buffer);
+            swallowPayload(streamId, FrameType.HEADERS.getId(), payloadSize, 
false, buffer);
             throw se;
         }
 
@@ -268,7 +269,7 @@ class Http2Parser {
 
         readHeaderPayload(streamId, payloadSize, buffer);
 
-        swallowPayload(streamId, padLength, true, buffer);
+        swallowPayload(streamId, FrameType.HEADERS.getId(), padLength, true, 
buffer);
 
         if (Flags.isEndOfHeaders(flags)) {
             onHeadersComplete(streamId);
@@ -518,7 +519,7 @@ class Http2Parser {
     protected void readUnknownFrame(int streamId, FrameType frameType, int 
flags, int payloadSize, ByteBuffer buffer)
             throws IOException {
         try {
-            swallowPayload(streamId, payloadSize, false, buffer);
+            swallowPayload(streamId, frameType.getId(), payloadSize, false, 
buffer);
         } catch (ConnectionException e) {
             // Will never happen because swallow() is called with mustBeZero 
set
             // to false
@@ -528,19 +529,22 @@ class Http2Parser {
 
 
     /**
-     * Swallow bytes.
+     * Swallow some or all of the bytes from the payload of an HTTP/2 frame.
      *
-     * @param streamId   Stream being swallowed
-     * @param len        Number of bytes to swallow
-     * @param mustBeZero Are the bytes required to have value zero
-     * @param byteBuffer Unused for non-async parser
+     * @param streamId      Stream being swallowed
+     * @param frameTypeId   Type of HTTP/2 frame for which the bytes will be
+     *                      swallowed
+     * @param len           Number of bytes to swallow
+     * @param isPadding     Are the bytes to be swallowed padding bytes?
+     * @param byteBuffer    Used with {@link Http2AsyncParser} to access the
+     *                      data that has already been read
      *
      * @throws IOException If an I/O error occurs reading additional bytes into
      *                     the input buffer.
      * @throws ConnectionException If the swallowed bytes are expected to have 
a
      *                             value of zero but do not
      */
-    protected void swallowPayload(int streamId, int len, boolean mustBeZero, 
ByteBuffer byteBuffer)
+    protected void swallowPayload(int streamId, int frameTypeId, int len, 
boolean isPadding, ByteBuffer byteBuffer)
             throws IOException, ConnectionException {
         if (log.isDebugEnabled()) {
             log.debug(sm.getString("http2Parser.swallow.debug", connectionId,
@@ -549,7 +553,7 @@ class Http2Parser {
         if (len == 0) {
             return;
         }
-        if (!mustBeZero && byteBuffer != null) {
+        if (!isPadding && byteBuffer != null) {
             byteBuffer.position(byteBuffer.position() + len);
         } else {
             int read = 0;
@@ -561,7 +565,7 @@ class Http2Parser {
                 } else {
                     byteBuffer.get(buffer, 0, thisTime);
                 }
-                if (mustBeZero) {
+                if (isPadding) {
                     // Validate the padding is zero since receiving non-zero 
padding
                     // is a strong indication of either a faulty client or a 
server
                     // side bug.


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

Reply via email to