/// <summary> /// Encode the header field into the header block. /// The given <see cref="ICharSequence"/>s must be immutable! /// </summary> /// <param name="output"></param> /// <param name="name"></param> /// <param name="value"></param> /// <param name="sensitive"></param> /// <param name="headerSize"></param> void EncodeHeader(IByteBuffer output, ICharSequence name, ICharSequence value, bool sensitive, long headerSize) { // If the header value is sensitive then it must never be indexed if (sensitive) { int nameIndex = GetNameIndex(name); EncodeLiteral(output, name, value, HpackUtil.IndexType.Never, nameIndex); return; } // If the peer will only use the static table if (0ul >= (ulong)_maxHeaderTableSize) { int staticTableIndex = HpackStaticTable.GetIndexInsensitive(name, value); if (staticTableIndex == -1) { int nameIndex = HpackStaticTable.GetIndex(name); EncodeLiteral(output, name, value, HpackUtil.IndexType.None, nameIndex); } else { EncodeInteger(output, 0x80, 7, staticTableIndex); } return; } // If the headerSize is greater than the max table size then it must be encoded literally if (headerSize > _maxHeaderTableSize) { int nameIndex = GetNameIndex(name); EncodeLiteral(output, name, value, HpackUtil.IndexType.None, nameIndex); return; } HeaderEntry headerField = GetEntryInsensitive(name, value); if (headerField is object) { int index = GetIndex(headerField.Index) + HpackStaticTable.Length; // Section 6.1. Indexed Header Field Representation EncodeInteger(output, 0x80, 7, index); } else { int staticTableIndex = HpackStaticTable.GetIndexInsensitive(name, value); if (staticTableIndex != -1) { // Section 6.1. Indexed Header Field Representation EncodeInteger(output, 0x80, 7, staticTableIndex); } else { EnsureCapacity(headerSize); EncodeLiteral(output, name, value, HpackUtil.IndexType.Incremental, GetNameIndex(name)); Add(name, value, headerSize); } } }
private HpackHeaderField GetIndexedHeader(int index) { if ((uint)index <= (uint)HpackStaticTable.Length) { return(HpackStaticTable.GetEntry(index)); } if ((uint)(index - HpackStaticTable.Length) <= (uint)_hpackDynamicTable.Length()) { return(_hpackDynamicTable.GetEntry(index - HpackStaticTable.Length)); } ThrowHelper.ThrowHttp2Exception_IndexHeaderIllegalIndexValue(); return(null); }
int GetNameIndex(ICharSequence name) { int index = HpackStaticTable.GetIndex(name); if (index == -1) { index = GetIndex(name); if (index >= 0) { index += HpackStaticTable.Length; } } return(index); }
private ICharSequence ReadName(int index) { if ((uint)index <= (uint)HpackStaticTable.Length) { HpackHeaderField hpackHeaderField = HpackStaticTable.GetEntry(index); return(hpackHeaderField._name); } if ((uint)(index - HpackStaticTable.Length) <= (uint)_hpackDynamicTable.Length()) { HpackHeaderField hpackHeaderField = _hpackDynamicTable.GetEntry(index - HpackStaticTable.Length); return(hpackHeaderField._name); } ThrowHelper.ThrowHttp2Exception_ReadNameIllegalIndexValue(); return(null); }