Package io.netty.handler.codec.http2
Class HpackEncoder
- java.lang.Object
-
- io.netty.handler.codec.http2.HpackEncoder
-
final class HpackEncoder extends java.lang.ObjectAn HPACK encoder.Implementation note: This class is security sensitive, and depends on users correctly identifying their headers as security sensitive or not. If a header is considered not sensitive, methods names "insensitive" are used which are fast, but don't provide any security guarantees.
-
-
Nested Class Summary
Nested Classes Modifier and Type Class Description private static classHpackEncoder.NameEntryprivate static classHpackEncoder.NameValueEntry
-
Field Summary
Fields Modifier and Type Field Description private bytehashMaskprivate HpackEncoder.NameValueEntryheadprivate HpackHuffmanEncoderhpackHuffmanEncoder(package private) static intHUFF_CODE_THRESHOLDprivate inthuffCodeThresholdprivate booleanignoreMaxHeaderListSizeprivate HpackEncoder.NameValueEntrylatestprivate longmaxHeaderListSizeprivate longmaxHeaderTableSizeprivate HpackEncoder.NameEntry[]nameEntriesprivate HpackEncoder.NameValueEntry[]nameValueEntries(package private) static intNOT_FOUNDprivate longsize
-
Constructor Summary
Constructors Constructor Description HpackEncoder()Creates a new encoder.HpackEncoder(boolean ignoreMaxHeaderListSize)Creates a new encoder.HpackEncoder(boolean ignoreMaxHeaderListSize, int arraySizeHint, int huffCodeThreshold)Creates a new encoder.
-
Method Summary
All Methods Static Methods Instance Methods Concrete Methods Modifier and Type Method Description private voidaddNameEntry(java.lang.CharSequence name, int nameHash, int nextCounter)private voidaddNameValueEntry(java.lang.CharSequence name, java.lang.CharSequence value, int nameHash, int valueHash, int nextCounter)private intbucket(int h)Returns the bucket of the hash table for the hash code h.private voidencodeAndAddEntries(ByteBuf out, java.lang.CharSequence name, int nameHash, java.lang.CharSequence value, int valueHash)private voidencodeHeader(ByteBuf out, java.lang.CharSequence name, java.lang.CharSequence value, boolean sensitive, long headerSize)Encode the header field into the header block.voidencodeHeaders(int streamId, ByteBuf out, Http2Headers headers, Http2HeadersEncoder.SensitivityDetector sensitivityDetector)Encode the header field into the header block.private voidencodeHeadersEnforceMaxHeaderListSize(int streamId, ByteBuf out, Http2Headers headers, Http2HeadersEncoder.SensitivityDetector sensitivityDetector)private voidencodeHeadersIgnoreMaxHeaderListSize(ByteBuf out, Http2Headers headers, Http2HeadersEncoder.SensitivityDetector sensitivityDetector)private static voidencodeInteger(ByteBuf out, int mask, int n, int i)Encode integer according to Section 5.1.private static voidencodeInteger(ByteBuf out, int mask, int n, long i)Encode integer according to Section 5.1.private voidencodeLiteral(ByteBuf out, java.lang.CharSequence name, java.lang.CharSequence value, HpackUtil.IndexType indexType, int nameIndex)Encode literal header field according to Section 6.2.private voidencodeStringLiteral(ByteBuf out, java.lang.CharSequence string)Encode string literal according to Section 5.2.private voidensureCapacity(long headerSize)Ensure that the dynamic table has enough room to hold 'headerSize' more bytes.private HpackEncoder.NameEntrygetEntry(java.lang.CharSequence name, int nameHash)Returns the lowest index value for the header field name in the dynamic table.private HpackEncoder.NameValueEntrygetEntryInsensitive(java.lang.CharSequence name, int nameHash, java.lang.CharSequence value, int valueHash)Returns the header entry with the lowest index value for the header field.(package private) HpackHeaderFieldgetHeaderField(int index)Return the header field at the given index.private intgetIndex(int counter)Compute the index into the dynamic table given the counter in the header entry.private intgetIndexPlusOffset(int counter)longgetMaxHeaderListSize()longgetMaxHeaderTableSize()Return the maximum table size.private intgetNameIndex(java.lang.CharSequence name)private static inthash(int nameHash, int valueHash)private booleanisEmpty()private intlatestCounter()(package private) intlength()Return the number of header fields in the dynamic table.private voidremove()Remove the oldest header field from the dynamic table.private voidremoveNameEntryMatchingCounter(java.lang.CharSequence name, int counter)private voidremoveNameValueEntry(HpackEncoder.NameValueEntry eldest)voidsetMaxHeaderListSize(long maxHeaderListSize)voidsetMaxHeaderTableSize(ByteBuf out, long maxHeaderTableSize)Set the maximum table size.(package private) longsize()Return the size of the dynamic table.
-
-
-
Field Detail
-
NOT_FOUND
static final int NOT_FOUND
- See Also:
- Constant Field Values
-
HUFF_CODE_THRESHOLD
static final int HUFF_CODE_THRESHOLD
- See Also:
- Constant Field Values
-
nameEntries
private final HpackEncoder.NameEntry[] nameEntries
-
nameValueEntries
private final HpackEncoder.NameValueEntry[] nameValueEntries
-
head
private final HpackEncoder.NameValueEntry head
-
latest
private HpackEncoder.NameValueEntry latest
-
hpackHuffmanEncoder
private final HpackHuffmanEncoder hpackHuffmanEncoder
-
hashMask
private final byte hashMask
-
ignoreMaxHeaderListSize
private final boolean ignoreMaxHeaderListSize
-
huffCodeThreshold
private final int huffCodeThreshold
-
size
private long size
-
maxHeaderTableSize
private long maxHeaderTableSize
-
maxHeaderListSize
private long maxHeaderListSize
-
-
Method Detail
-
encodeHeaders
public void encodeHeaders(int streamId, ByteBuf out, Http2Headers headers, Http2HeadersEncoder.SensitivityDetector sensitivityDetector) throws Http2ExceptionEncode the header field into the header block.The given
CharSequences must be immutable!- Throws:
Http2Exception
-
encodeHeadersEnforceMaxHeaderListSize
private void encodeHeadersEnforceMaxHeaderListSize(int streamId, ByteBuf out, Http2Headers headers, Http2HeadersEncoder.SensitivityDetector sensitivityDetector) throws Http2Exception- Throws:
Http2Exception
-
encodeHeadersIgnoreMaxHeaderListSize
private void encodeHeadersIgnoreMaxHeaderListSize(ByteBuf out, Http2Headers headers, Http2HeadersEncoder.SensitivityDetector sensitivityDetector)
-
encodeHeader
private void encodeHeader(ByteBuf out, java.lang.CharSequence name, java.lang.CharSequence value, boolean sensitive, long headerSize)
Encode the header field into the header block.The given
CharSequences must be immutable!
-
encodeAndAddEntries
private void encodeAndAddEntries(ByteBuf out, java.lang.CharSequence name, int nameHash, java.lang.CharSequence value, int valueHash)
-
setMaxHeaderTableSize
public void setMaxHeaderTableSize(ByteBuf out, long maxHeaderTableSize) throws Http2Exception
Set the maximum table size.- Throws:
Http2Exception
-
getMaxHeaderTableSize
public long getMaxHeaderTableSize()
Return the maximum table size.
-
setMaxHeaderListSize
public void setMaxHeaderListSize(long maxHeaderListSize) throws Http2Exception- Throws:
Http2Exception
-
getMaxHeaderListSize
public long getMaxHeaderListSize()
-
encodeInteger
private static void encodeInteger(ByteBuf out, int mask, int n, int i)
Encode integer according to Section 5.1.
-
encodeInteger
private static void encodeInteger(ByteBuf out, int mask, int n, long i)
Encode integer according to Section 5.1.
-
encodeStringLiteral
private void encodeStringLiteral(ByteBuf out, java.lang.CharSequence string)
Encode string literal according to Section 5.2.
-
encodeLiteral
private void encodeLiteral(ByteBuf out, java.lang.CharSequence name, java.lang.CharSequence value, HpackUtil.IndexType indexType, int nameIndex)
Encode literal header field according to Section 6.2.
-
getNameIndex
private int getNameIndex(java.lang.CharSequence name)
-
ensureCapacity
private void ensureCapacity(long headerSize)
Ensure that the dynamic table has enough room to hold 'headerSize' more bytes. Removes the oldest entry from the dynamic table until sufficient space is available.
-
length
int length()
Return the number of header fields in the dynamic table. Exposed for testing.
-
size
long size()
Return the size of the dynamic table. Exposed for testing.
-
getHeaderField
HpackHeaderField getHeaderField(int index)
Return the header field at the given index. Exposed for testing.
-
getEntryInsensitive
private HpackEncoder.NameValueEntry getEntryInsensitive(java.lang.CharSequence name, int nameHash, java.lang.CharSequence value, int valueHash)
Returns the header entry with the lowest index value for the header field. Returns null if header field is not in the dynamic table.
-
getEntry
private HpackEncoder.NameEntry getEntry(java.lang.CharSequence name, int nameHash)
Returns the lowest index value for the header field name in the dynamic table. Returns -1 if the header field name is not in the dynamic table.
-
getIndexPlusOffset
private int getIndexPlusOffset(int counter)
-
getIndex
private int getIndex(int counter)
Compute the index into the dynamic table given the counter in the header entry.
-
latestCounter
private int latestCounter()
-
addNameEntry
private void addNameEntry(java.lang.CharSequence name, int nameHash, int nextCounter)
-
addNameValueEntry
private void addNameValueEntry(java.lang.CharSequence name, java.lang.CharSequence value, int nameHash, int valueHash, int nextCounter)
-
remove
private void remove()
Remove the oldest header field from the dynamic table.
-
isEmpty
private boolean isEmpty()
-
removeNameValueEntry
private void removeNameValueEntry(HpackEncoder.NameValueEntry eldest)
-
removeNameEntryMatchingCounter
private void removeNameEntryMatchingCounter(java.lang.CharSequence name, int counter)
-
bucket
private int bucket(int h)
Returns the bucket of the hash table for the hash code h.
-
hash
private static int hash(int nameHash, int valueHash)
-
-