Esempio n. 1
0
        /// <summary>
        ///     Append an header to the end of the dynamic table.
        /// </summary>
        /// <param name="name">Header name</param>
        /// <param name="value">Header value</param>
        /// <remarks>
        ///     <para>
        ///         Will evict entires per HPACK specification Section 4.4 if required.
        ///     </para>
        /// </remarks>
        /// <exception cref="ArgumentNullException">name; value</exception>
        public int Append(string name, string value)
        {
            if (name == null)
            {
                throw new ArgumentNullException(nameof(name));
            }
            if (value == null)
            {
                throw new ArgumentNullException(nameof(value));
            }

            var header = new IndexedHeader(name, value);

            /*Before a new entry is added to the dynamic table, entries are evicted from the
             * end of the dynamic table until the size of the dynamic table is less than or
             * equal to (maximum size - new entry size) or until the table is empty.
             */
            var newSize = _maxSize - header.Size;

            while (_currentSize > newSize)
            {
                var size = _headers[_headers.Count - 1].Size;
                _headers.RemoveAt(_headers.Count - 1);
                _currentSize -= size;
            }

            _headers.Add(header);
            _currentSize += header.Size;
            return(StaticTable.Count);
        }
Esempio n. 2
0
        public bool TryGetIndex(string name, string wantedValue, out IndexedHeader header)
        {
            //value is not interesting, get us the first possible header.
            if (wantedValue == null)
            {
                for (var i = 0; i < _headers.Count; i++)
                {
                    if (!_headers[i].Name.Equals(name))
                    {
                        continue;
                    }

                    header = _headers[i];
                    header.IndexPosition = _headers.Count - i + StaticTable.Count;
                    return(true);
                }
            }


            var index = -1;

            // ReSharper disable once ForCanBeConvertedToForeach
            for (var i = 0; i < _headers.Count; i++)
            {
                if (!_headers[i].Name.Equals(name))
                {
                    continue;
                }

                if (_headers[i].Value.Equals(wantedValue))
                {
                    index = i;
                    break;
                }

                if (index == -1)
                {
                    index = i;
                }
            }

            if (index == -1)
            {
                header = null;
                return(false);
            }

            header = _headers[index];
            header.IndexPosition = _headers.Count - index + StaticTable.Count;
            return(true);
        }
Esempio n. 3
0
        public static bool TryGetIndex(string name, string wantedValue, out IndexedHeader header)
        {
            if (wantedValue == null)
            {
                int index;
                if (_nameIndex.TryGetValue(name, out index))
                {
                    header = Headers[index];
                    return(true);
                }

                header = null;
                return(false);
            }

            var firstIndex = -1;

            // ReSharper disable once ForCanBeConvertedToForeach
            for (int i = 0; i < Headers.Length; i++)
            {
                if (!Headers[i].Name.Equals(name))
                {
                    continue;
                }

                if (Headers[i].Value.Equals(wantedValue))
                {
                    header = Headers[i];
                    return(true);
                }
                if (firstIndex == -1)
                {
                    firstIndex = i;
                }
            }

            if (firstIndex != -1)
            {
                header = Headers[firstIndex];
                return(true);
            }

            header = null;
            return(false);
        }