QpackEncoderHandler Class — netty Architecture
Architecture documentation for the QpackEncoderHandler class in QpackEncoderHandler.java from the netty codebase.
Entity Profile
Dependency Diagram
graph TD 11e6398c_ef5c_d1f6_7673_0efaf04b0086["QpackEncoderHandler"] 6a05af68_436c_ca41_455a_eb8d1ca31951["QpackEncoderHandler.java"] 11e6398c_ef5c_d1f6_7673_0efaf04b0086 -->|defined in| 6a05af68_436c_ca41_455a_eb8d1ca31951 4b255270_c979_a975_3649_eecf9979bd29["QpackEncoderHandler()"] 11e6398c_ef5c_d1f6_7673_0efaf04b0086 -->|method| 4b255270_c979_a975_3649_eecf9979bd29 086b858f_1c2b_8983_bdf4_54198c4b3940["decode()"] 11e6398c_ef5c_d1f6_7673_0efaf04b0086 -->|method| 086b858f_1c2b_8983_bdf4_54198c4b3940 2853dd28_0438_018f_df16_4fa8c2a80500["channelReadComplete()"] 11e6398c_ef5c_d1f6_7673_0efaf04b0086 -->|method| 2853dd28_0438_018f_df16_4fa8c2a80500 8664b7b3_84af_be89_bc6d_889a37b643ec["userEventTriggered()"] 11e6398c_ef5c_d1f6_7673_0efaf04b0086 -->|method| 8664b7b3_84af_be89_bc6d_889a37b643ec 02f23da5_b05f_9087_5cc4_eb53e825aa74["channelInactive()"] 11e6398c_ef5c_d1f6_7673_0efaf04b0086 -->|method| 02f23da5_b05f_9087_5cc4_eb53e825aa74 f180b347_49d9_5c42_8aff_a8f0538274d8["handleDecodeFailure()"] 11e6398c_ef5c_d1f6_7673_0efaf04b0086 -->|method| f180b347_49d9_5c42_8aff_a8f0538274d8 64bcc6c7_2235_7bfb_14f4_31ed2137f9be["CharSequence()"] 11e6398c_ef5c_d1f6_7673_0efaf04b0086 -->|method| 64bcc6c7_2235_7bfb_14f4_31ed2137f9be
Relationship Graph
Source Code
codec-http3/src/main/java/io/netty/handler/codec/http3/QpackEncoderHandler.java lines 34–247
final class QpackEncoderHandler extends ByteToMessageDecoder {
private final QpackHuffmanDecoder huffmanDecoder;
private final QpackDecoder qpackDecoder;
private boolean discard;
QpackEncoderHandler(@Nullable Long maxTableCapacity, QpackDecoder qpackDecoder) {
checkInRange(maxTableCapacity == null ? 0 : maxTableCapacity, 0, MAX_UNSIGNED_INT, "maxTableCapacity");
huffmanDecoder = new QpackHuffmanDecoder();
this.qpackDecoder = qpackDecoder;
}
@Override
protected void decode(ChannelHandlerContext ctx, ByteBuf in, List<Object> __) throws Exception {
if (!in.isReadable()) {
return;
}
if (discard) {
in.skipBytes(in.readableBytes());
return;
}
byte b = in.getByte(in.readerIndex());
// 4.3.1. Set Dynamic Table Capacity
//
// 0 1 2 3 4 5 6 7
//+---+---+---+---+---+---+---+---+
//| 0 | 0 | 1 | Capacity (5+) |
//+---+---+---+-------------------+
if ((b & 0b1110_0000) == 0b0010_0000) {
// new capacity
long capacity = QpackUtil.decodePrefixedInteger(in, 5);
if (capacity < 0) {
// Not enough readable bytes
return;
}
try {
qpackDecoder.setDynamicTableCapacity(capacity);
} catch (QpackException e) {
handleDecodeFailure(ctx, e, "setDynamicTableCapacity failed.");
}
return;
}
final QpackAttributes qpackAttributes = Http3.getQpackAttributes(ctx.channel().parent());
assert qpackAttributes != null;
if (!qpackAttributes.dynamicTableDisabled() && !qpackAttributes.decoderStreamAvailable()) {
// We need the decoder stream to update the decoder with these instructions.
return;
}
final QuicStreamChannel decoderStream = qpackAttributes.decoderStream();
// 4.3.2. Insert With Name Reference
//
// 0 1 2 3 4 5 6 7
// +---+---+---+---+---+---+---+---+
// | 1 | T | Name Index (6+) |
// +---+---+-----------------------+
// | H | Value Length (7+) |
// +---+---------------------------+
// | Value String (Length bytes) |
// +-------------------------------+
if ((b & 0b1000_0000) == 0b1000_0000) {
int readerIndex = in.readerIndex();
// T == 1 implies static table index.
// https://www.rfc-editor.org/rfc/rfc9204.html#name-insert-with-name-reference
final boolean isStaticTableIndex = QpackUtil.firstByteEquals(in, (byte) 0b1100_0000);
final int nameIdx = decodePrefixedIntegerAsInt(in, 6);
if (nameIdx < 0) {
// Not enough readable bytes
return;
}
CharSequence value = decodeLiteralValue(in);
if (value == null) {
// Reset readerIndex
in.readerIndex(readerIndex);
// Not enough readable bytes
return;
Source
Frequently Asked Questions
What is the QpackEncoderHandler class?
QpackEncoderHandler is a class in the netty codebase, defined in codec-http3/src/main/java/io/netty/handler/codec/http3/QpackEncoderHandler.java.
Where is QpackEncoderHandler defined?
QpackEncoderHandler is defined in codec-http3/src/main/java/io/netty/handler/codec/http3/QpackEncoderHandler.java at line 34.
Analyze Your Own Codebase
Get architecture documentation, dependency graphs, and domain analysis for your codebase in minutes.
Try Supermodel Free