Home / Class/ QpackDecoderDynamicTable Class — netty Architecture

QpackDecoderDynamicTable Class — netty Architecture

Architecture documentation for the QpackDecoderDynamicTable class in QpackDecoderDynamicTable.java from the netty codebase.

Entity Profile

Dependency Diagram

graph TD
  e47c8f6a_f830_eebc_e4ee_95298d931d9b["QpackDecoderDynamicTable"]
  7658afa3_30e9_bd3d_d69c_cbe6267655d7["QpackDecoderDynamicTable.java"]
  e47c8f6a_f830_eebc_e4ee_95298d931d9b -->|defined in| 7658afa3_30e9_bd3d_d69c_cbe6267655d7
  1f6a7e02_7b7f_03ac_277e_7d22f1c6c754["length()"]
  e47c8f6a_f830_eebc_e4ee_95298d931d9b -->|method| 1f6a7e02_7b7f_03ac_277e_7d22f1c6c754
  1e6af6e0_4855_264b_3a7c_3548b306fafd["size()"]
  e47c8f6a_f830_eebc_e4ee_95298d931d9b -->|method| 1e6af6e0_4855_264b_3a7c_3548b306fafd
  4e9cca99_6765_25ab_3154_b282e9444648["insertCount()"]
  e47c8f6a_f830_eebc_e4ee_95298d931d9b -->|method| 4e9cca99_6765_25ab_3154_b282e9444648
  68a9130a_0b2d_84fa_42a5_cd40dec5746a["QpackHeaderField()"]
  e47c8f6a_f830_eebc_e4ee_95298d931d9b -->|method| 68a9130a_0b2d_84fa_42a5_cd40dec5746a
  a8aff9fc_1cee_9c01_5d46_68cddd0f42ce["add()"]
  e47c8f6a_f830_eebc_e4ee_95298d931d9b -->|method| a8aff9fc_1cee_9c01_5d46_68cddd0f42ce
  4fb10322_8b7c_4864_4e5b_818a8cf7ffb7["remove()"]
  e47c8f6a_f830_eebc_e4ee_95298d931d9b -->|method| 4fb10322_8b7c_4864_4e5b_818a8cf7ffb7
  9fc1bf62_2458_6e20_caac_74cc5b46ef22["clear()"]
  e47c8f6a_f830_eebc_e4ee_95298d931d9b -->|method| 9fc1bf62_2458_6e20_caac_74cc5b46ef22
  fc3a2afd_f371_ac06_cae3_179d416e4835["setCapacity()"]
  e47c8f6a_f830_eebc_e4ee_95298d931d9b -->|method| fc3a2afd_f371_ac06_cae3_179d416e4835
  a6743275_9f96_2d8f_bb06_17df2f330934["getAndIncrementHead()"]
  e47c8f6a_f830_eebc_e4ee_95298d931d9b -->|method| a6743275_9f96_2d8f_bb06_17df2f330934
  bd8ab1d6_10d4_2f03_f7b1_df7bdaa8dbfb["getAndIncrementTail()"]
  e47c8f6a_f830_eebc_e4ee_95298d931d9b -->|method| bd8ab1d6_10d4_2f03_f7b1_df7bdaa8dbfb
  4cd4c61f_74ff_0bbf_6048_b6c0ee591c46["safeIncrementIndex()"]
  e47c8f6a_f830_eebc_e4ee_95298d931d9b -->|method| 4cd4c61f_74ff_0bbf_6048_b6c0ee591c46
  e0dde965_5dc4_e40d_3826_f68bba4d2f37["moduloIndex()"]
  e47c8f6a_f830_eebc_e4ee_95298d931d9b -->|method| e0dde965_5dc4_e40d_3826_f68bba4d2f37

Relationship Graph

Source Code

codec-http3/src/main/java/io/netty/handler/codec/http3/QpackDecoderDynamicTable.java lines 27–170

final class QpackDecoderDynamicTable {
    private static final QpackException GET_ENTRY_ILLEGAL_INDEX_VALUE =
            QpackException.newStatic(QpackDecoderDynamicTable.class, "getEntry(...)",
                    "QPACK - illegal decoder dynamic table index value");
    private static final QpackException HEADER_TOO_LARGE =
            QpackException.newStatic(QpackDecoderDynamicTable.class, "add(...)", "QPACK - header entry too large.");

    // a circular queue of header fields
    private QpackHeaderField[] fields;
    private int head;
    private int tail;
    private long size;
    private long capacity = -1; // ensure setCapacity creates the array
    private int insertCount;

    int length() {
        return head < tail ? fields.length - tail + head : head - tail;
    }

    long size() {
        return size;
    }

    int insertCount() {
        return insertCount;
    }

    QpackHeaderField getEntry(int index) throws QpackException {
        if (index < 0 || fields == null || index >= fields.length) {
            throw GET_ENTRY_ILLEGAL_INDEX_VALUE;
        }
        QpackHeaderField entry = fields[index];
        if (entry == null) {
            throw GET_ENTRY_ILLEGAL_INDEX_VALUE;
        }
        return entry;
    }

    QpackHeaderField getEntryRelativeEncodedField(int index) throws QpackException {
        // https://www.rfc-editor.org/rfc/rfc9204.html#name-relative-indexing
        return getEntry(moduloIndex(index));
    }

    QpackHeaderField getEntryRelativeEncoderInstructions(int index) throws QpackException {
        // https://www.rfc-editor.org/rfc/rfc9204.html#name-relative-indexing
        // Name index is the relative index, relative to the last added entry.
        return getEntry(index > tail ? fields.length - index + tail : tail - index);
    }

    void add(QpackHeaderField header) throws QpackException {
        long headerSize = header.size();
        if (headerSize > capacity) {
            throw HEADER_TOO_LARGE;
        }
        while (capacity - size < headerSize) {
            remove();
        }
        insertCount++;
        fields[getAndIncrementHead()] = header;
        size += headerSize;
    }

    private void remove() {
        QpackHeaderField removed = fields[tail];
        if (removed == null) {
            return;
        }
        size -= removed.size();
        fields[getAndIncrementTail()] = null;
    }

    void clear() {
        if (fields != null) {
            Arrays.fill(fields, null);
        }
        head = 0;
        tail = 0;
        size = 0;
    }

    void setCapacity(long capacity) throws QpackException {

Frequently Asked Questions

What is the QpackDecoderDynamicTable class?
QpackDecoderDynamicTable is a class in the netty codebase, defined in codec-http3/src/main/java/io/netty/handler/codec/http3/QpackDecoderDynamicTable.java.
Where is QpackDecoderDynamicTable defined?
QpackDecoderDynamicTable is defined in codec-http3/src/main/java/io/netty/handler/codec/http3/QpackDecoderDynamicTable.java at line 27.

Analyze Your Own Codebase

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

Try Supermodel Free