Stores the data associated with a HeaderMap entry. Only the first value is
included in this struct. If a header name has more than one associated
value, all extra values are stored in the extra_values vector. A doubly
linked list of entries is maintained. The doubly linked list is used so that
removing a value is constant time. This also has the nice property of
enabling double ended iteration.
Hash values are limited to u16 as well. While fast_hash and Hasher
return usize hash codes, limiting the effective hash code to the lower 16
bits is fine since we know that the indices vector will never grow beyond
that size.
Tracks the header map danger level! This relates to the adaptive hashing
algorithm. A HeaderMap starts in the βgreenβ state, when a large number of
collisions are detected, it transitions to the yellow state. At this point,
the header map will either grow and switch back to the green state OR it
will transition to the red state.
A header value node is either linked to another node in the extra_values
list or it points to an entry in entries. The entry in entries is the
start of the list and holds the associated header name.