Home / Class/ QpackEncoderHandler Class — netty Architecture

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;

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