Example #1
0
        /// <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);
                }
            }
        }
Example #2
0
 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);
 }
Example #3
0
        int GetNameIndex(ICharSequence name)
        {
            int index = HpackStaticTable.GetIndex(name);

            if (index == -1)
            {
                index = GetIndex(name);
                if (index >= 0)
                {
                    index += HpackStaticTable.Length;
                }
            }

            return(index);
        }
Example #4
0
        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);
        }