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