/// <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); }
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); }
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); }