Home / Function/ encodeHeaders() — netty Function Reference

encodeHeaders() — netty Function Reference

Architecture documentation for the encodeHeaders() function in QpackEncoder.java from the netty codebase.

Entity Profile

Dependency Diagram

graph TD
  c02c31bf_f073_98b8_7f17_f6cd7211e31c["encodeHeaders()"]
  9e578dbc_12be_4439_554b_24e265961ea5["QpackEncoder"]
  c02c31bf_f073_98b8_7f17_f6cd7211e31c -->|defined in| 9e578dbc_12be_4439_554b_24e265961ea5
  4290254a_d002_4407_68f0_95045618c5ff["encodeHeader()"]
  c02c31bf_f073_98b8_7f17_f6cd7211e31c -->|calls| 4290254a_d002_4407_68f0_95045618c5ff
  a8642bed_b3de_8bb7_a79f_f18b39f7cc89["add()"]
  c02c31bf_f073_98b8_7f17_f6cd7211e31c -->|calls| a8642bed_b3de_8bb7_a79f_f18b39f7cc89
  style c02c31bf_f073_98b8_7f17_f6cd7211e31c fill:#6366f1,stroke:#818cf8,color:#fff

Relationship Graph

Source Code

codec-http3/src/main/java/io/netty/handler/codec/http3/QpackEncoder.java lines 63–114

    void encodeHeaders(QpackAttributes qpackAttributes, ByteBuf out, ByteBufAllocator allocator, long streamId,
                       Http3Headers headers) {
        final int base = dynamicTable.insertCount();
        // Allocate a new buffer as we have to go back and write a variable length base and required insert count
        // later.
        ByteBuf tmp = allocator.buffer();
        try {
            int maxDynamicTblIdx = -1;
            int requiredInsertCount = 0;
            Indices dynamicTableIndices = null;
            for (Map.Entry<CharSequence, CharSequence> header : headers) {
                CharSequence name = header.getKey();
                CharSequence value = header.getValue();
                int dynamicTblIdx = encodeHeader(qpackAttributes, tmp, base, name, value);
                if (dynamicTblIdx >= 0) {
                    int req = dynamicTable.addReferenceToEntry(name, value, dynamicTblIdx);
                    if (dynamicTblIdx > maxDynamicTblIdx) {
                        maxDynamicTblIdx = dynamicTblIdx;
                        requiredInsertCount = req;
                    }
                    if (dynamicTableIndices == null) {
                        dynamicTableIndices = new Indices();
                    }
                    dynamicTableIndices.add(dynamicTblIdx);
                }
            }

            // Track all the indices that we need to ack later.
            if (dynamicTableIndices != null) {
                assert streamSectionTrackers != null;
                streamSectionTrackers.computeIfAbsent(streamId, __ -> new ArrayDeque<>())
                        .add(dynamicTableIndices);
            }

            // https://www.rfc-editor.org/rfc/rfc9204.html#name-encoded-field-section-prefi
            //   0   1   2   3   4   5   6   7
            // +---+---+---+---+---+---+---+---+
            // |   Required Insert Count (8+)  |
            // +---+---------------------------+
            // | S |      Delta Base (7+)      |
            // +---+---------------------------+
            encodePrefixedInteger(out, (byte) 0b0, 8, dynamicTable.encodedRequiredInsertCount(requiredInsertCount));
            if (base >= requiredInsertCount) {
                encodePrefixedInteger(out, (byte) 0b0, 7, base - requiredInsertCount);
            } else {
                encodePrefixedInteger(out, (byte) 0b1000_0000, 7, requiredInsertCount - base - 1);
            }
            out.writeBytes(tmp);
        } finally {
            tmp.release();
        }
    }

Domain

Subdomains

Frequently Asked Questions

What does encodeHeaders() do?
encodeHeaders() is a function in the netty codebase, defined in codec-http3/src/main/java/io/netty/handler/codec/http3/QpackEncoder.java.
Where is encodeHeaders() defined?
encodeHeaders() is defined in codec-http3/src/main/java/io/netty/handler/codec/http3/QpackEncoder.java at line 63.
What does encodeHeaders() call?
encodeHeaders() calls 2 function(s): add, encodeHeader.

Analyze Your Own Codebase

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

Try Supermodel Free