Package io.netty.handler.codec.http2
Class HpackEncoder
- java.lang.Object
-
- io.netty.handler.codec.http2.HpackEncoder
-
final class HpackEncoder extends java.lang.Object
An 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 class
HpackEncoder.NameEntry
private static class
HpackEncoder.NameValueEntry
-
Field Summary
Fields Modifier and Type Field Description private byte
hashMask
private HpackEncoder.NameValueEntry
head
private HpackHuffmanEncoder
hpackHuffmanEncoder
(package private) static int
HUFF_CODE_THRESHOLD
private int
huffCodeThreshold
private boolean
ignoreMaxHeaderListSize
private HpackEncoder.NameValueEntry
latest
private long
maxHeaderListSize
private long
maxHeaderTableSize
private HpackEncoder.NameEntry[]
nameEntries
private HpackEncoder.NameValueEntry[]
nameValueEntries
(package private) static int
NOT_FOUND
private long
size
-
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 void
addNameEntry(java.lang.CharSequence name, int nameHash, int nextCounter)
private void
addNameValueEntry(java.lang.CharSequence name, java.lang.CharSequence value, int nameHash, int valueHash, int nextCounter)
private int
bucket(int h)
Returns the bucket of the hash table for the hash code h.private void
encodeAndAddEntries(ByteBuf out, java.lang.CharSequence name, int nameHash, java.lang.CharSequence value, int valueHash)
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.void
encodeHeaders(int streamId, ByteBuf out, Http2Headers headers, Http2HeadersEncoder.SensitivityDetector sensitivityDetector)
Encode the header field into the header block.private void
encodeHeadersEnforceMaxHeaderListSize(int streamId, ByteBuf out, Http2Headers headers, Http2HeadersEncoder.SensitivityDetector sensitivityDetector)
private void
encodeHeadersIgnoreMaxHeaderListSize(ByteBuf out, Http2Headers headers, Http2HeadersEncoder.SensitivityDetector sensitivityDetector)
private static void
encodeInteger(ByteBuf out, int mask, int n, int i)
Encode integer according to Section 5.1.private static void
encodeInteger(ByteBuf out, int mask, int n, long i)
Encode integer according to Section 5.1.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.private void
encodeStringLiteral(ByteBuf out, java.lang.CharSequence string)
Encode string literal according to Section 5.2.private void
ensureCapacity(long headerSize)
Ensure that the dynamic table has enough room to hold 'headerSize' more bytes.private HpackEncoder.NameEntry
getEntry(java.lang.CharSequence name, int nameHash)
Returns the lowest index value for the header field name in the dynamic table.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.(package private) HpackHeaderField
getHeaderField(int index)
Return the header field at the given index.private int
getIndex(int counter)
Compute the index into the dynamic table given the counter in the header entry.private int
getIndexPlusOffset(int counter)
long
getMaxHeaderListSize()
long
getMaxHeaderTableSize()
Return the maximum table size.private int
getNameIndex(java.lang.CharSequence name)
private static int
hash(int nameHash, int valueHash)
private boolean
isEmpty()
private int
latestCounter()
(package private) int
length()
Return the number of header fields in the dynamic table.private void
remove()
Remove the oldest header field from the dynamic table.private void
removeNameEntryMatchingCounter(java.lang.CharSequence name, int counter)
private void
removeNameValueEntry(HpackEncoder.NameValueEntry eldest)
void
setMaxHeaderListSize(long maxHeaderListSize)
void
setMaxHeaderTableSize(ByteBuf out, long maxHeaderTableSize)
Set the maximum table size.(package private) long
size()
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 Http2Exception
Encode the header field into the header block.The given
CharSequence
s 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
CharSequence
s 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)
-
-