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.
Source
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