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