Home / Class/ OldDefaultHttp2FrameWriter Class — netty Architecture

OldDefaultHttp2FrameWriter Class — netty Architecture

Architecture documentation for the OldDefaultHttp2FrameWriter class in Http2FrameWriterDataBenchmark.java from the netty codebase.

Entity Profile

Dependency Diagram

graph TD
  4df6ecc7_4589_1651_bd44_4cd5d0011fd8["OldDefaultHttp2FrameWriter"]
  e1e4d882_21be_606e_52ad_16ef439ff80f["Http2FrameWriterDataBenchmark.java"]
  4df6ecc7_4589_1651_bd44_4cd5d0011fd8 -->|defined in| e1e4d882_21be_606e_52ad_16ef439ff80f
  0791d501_8dec_ab00_6a1b_1a1805e56f9e["ChannelFuture()"]
  4df6ecc7_4589_1651_bd44_4cd5d0011fd8 -->|method| 0791d501_8dec_ab00_6a1b_1a1805e56f9e
  bc380697_dac6_22ad_7f28_26620f02fe36["paddingBytes()"]
  4df6ecc7_4589_1651_bd44_4cd5d0011fd8 -->|method| bc380697_dac6_22ad_7f28_26620f02fe36
  a5f21c86_e796_6cbb_1c79_52d9f91f15db["writePaddingLength()"]
  4df6ecc7_4589_1651_bd44_4cd5d0011fd8 -->|method| a5f21c86_e796_6cbb_1c79_52d9f91f15db

Relationship Graph

Source Code

microbench/src/main/java/io/netty/handler/codec/http2/Http2FrameWriterDataBenchmark.java lines 115–241

    private static final class OldDefaultHttp2FrameWriter implements Http2DataWriter {
        private static final ByteBuf ZERO_BUFFER =
                unreleasableBuffer(directBuffer(MAX_UNSIGNED_BYTE).writeZero(MAX_UNSIGNED_BYTE)).asReadOnly();
        private final int maxFrameSize = DEFAULT_MAX_FRAME_SIZE;
        @Override
        public ChannelFuture writeData(ChannelHandlerContext ctx, int streamId, ByteBuf data,
                                       int padding, boolean endStream, ChannelPromise promise) {
            final Http2CodecUtil.SimpleChannelPromiseAggregator promiseAggregator =
                    new Http2CodecUtil.SimpleChannelPromiseAggregator(promise, ctx.channel(), ctx.executor());
            final DataFrameHeader header = new DataFrameHeader(ctx, streamId);
            boolean needToReleaseHeaders = true;
            boolean needToReleaseData = true;
            try {
                checkPositive(streamId, "streamId");
                verifyPadding(padding);

                boolean lastFrame;
                int remainingData = data.readableBytes();
                do {
                    // Determine how much data and padding to write in this frame. Put all padding at the end.
                    int frameDataBytes = min(remainingData, maxFrameSize);
                    int framePaddingBytes = min(padding, max(0, (maxFrameSize - 1) - frameDataBytes));

                    // Decrement the remaining counters.
                    padding -= framePaddingBytes;
                    remainingData -= frameDataBytes;

                    // Determine whether or not this is the last frame to be sent.
                    lastFrame = remainingData == 0 && padding == 0;

                    // Only the last frame is not retained. Until then, the outer finally must release.
                    ByteBuf frameHeader = header.slice(frameDataBytes, framePaddingBytes, lastFrame && endStream);
                    needToReleaseHeaders = !lastFrame;
                    ctx.write(lastFrame ? frameHeader : frameHeader.retain(), promiseAggregator.newPromise());

                    // Write the frame data.
                    ByteBuf frameData = data.readSlice(frameDataBytes);
                    // Only the last frame is not retained. Until then, the outer finally must release.
                    needToReleaseData = !lastFrame;
                    ctx.write(lastFrame ? frameData : frameData.retain(), promiseAggregator.newPromise());

                    // Write the frame padding.
                    if (paddingBytes(framePaddingBytes) > 0) {
                        ctx.write(ZERO_BUFFER.slice(0, paddingBytes(framePaddingBytes)),
                                promiseAggregator.newPromise());
                    }
                } while (!lastFrame);
            } catch (Throwable t) {
                try {
                    if (needToReleaseHeaders) {
                        header.release();
                    }
                    if (needToReleaseData) {
                        data.release();
                    }
                } finally {
                    promiseAggregator.setFailure(t);
                    promiseAggregator.doneAllocatingPromises();
                }
                return promiseAggregator;
            }
            return promiseAggregator.doneAllocatingPromises();
        }

        private static int paddingBytes(int padding) {
            // The padding parameter contains the 1 byte pad length field as well as the trailing padding bytes.
            // Subtract 1, so to only get the number of padding bytes that need to be appended to the end of a frame.
            return padding - 1;
        }

        private static void writePaddingLength(ByteBuf buf, int padding) {
            if (padding > 0) {
                // It is assumed that the padding length has been bounds checked before this
                // Minus 1, as the pad length field is included in the padding parameter and is 1 byte wide.
                buf.writeByte(padding - 1);
            }
        }

        /**
         * Utility class that manages the creation of frame header buffers for {@code DATA} frames. Attempts
         * to reuse the same buffer repeatedly when splitting data into multiple frames.

Frequently Asked Questions

What is the OldDefaultHttp2FrameWriter class?
OldDefaultHttp2FrameWriter is a class in the netty codebase, defined in microbench/src/main/java/io/netty/handler/codec/http2/Http2FrameWriterDataBenchmark.java.
Where is OldDefaultHttp2FrameWriter defined?
OldDefaultHttp2FrameWriter is defined in microbench/src/main/java/io/netty/handler/codec/http2/Http2FrameWriterDataBenchmark.java at line 115.

Analyze Your Own Codebase

Get architecture documentation, dependency graphs, and domain analysis for your codebase in minutes.

Try Supermodel Free