private bool EncodeDynamicHeader(Span <byte> buffer, int staticTableIndex, string name, string value, out int bytesWritten) { EncoderHeaderEntry?headerField = GetEntry(name, value); if (headerField != null) { // Already exists in dynamic table. Write index. int index = CalculateDynamicTableIndex(headerField.Index); return(EncodeIndexedHeaderField(index, buffer, out bytesWritten)); } else { // Doesn't exist in dynamic table. Add new entry to dynamic table. uint headerSize = (uint)HeaderField.GetLength(name.Length, value.Length); int index = ResolveDynamicTableIndex(staticTableIndex, name); bool success = index == -1 ? EncodeLiteralHeaderFieldIndexingNewName(name, value, buffer, out bytesWritten) : EncodeLiteralHeaderFieldIndexing(index, value, buffer, out bytesWritten); if (success) { EnsureCapacity(headerSize); AddHeaderEntry(name, value, headerSize); } return(success); } }
public bool EncodeHeader(Span <byte> buffer, int staticTableIndex, HeaderEncodingHint encodingHint, string name, string value, out int bytesWritten) { Debug.Assert(!_pendingTableSizeUpdate, "Dynamic table size update should be encoded before headers."); // Never index sensitive value. if (encodingHint == HeaderEncodingHint.NeverIndex) { int index = ResolveDynamicTableIndex(staticTableIndex, name); return(index == -1 ? EncodeLiteralHeaderFieldNeverIndexingNewName(name, value, buffer, out bytesWritten) : EncodeLiteralHeaderFieldNeverIndexing(index, value, buffer, out bytesWritten)); } // No dynamic table. Only use the static table. if (!_allowDynamicCompression || _maxHeaderTableSize == 0 || encodingHint == HeaderEncodingHint.IgnoreIndex) { return(staticTableIndex == -1 ? EncodeLiteralHeaderFieldWithoutIndexingNewName(name, value, buffer, out bytesWritten) : EncodeLiteralHeaderFieldWithoutIndexing(staticTableIndex, value, buffer, out bytesWritten)); } // Header is greater than the maximum table size. // Don't attempt to add dynamic header as all existing dynamic headers will be removed. if (HeaderField.GetLength(name.Length, value.Length) > _maxHeaderTableSize) { int index = ResolveDynamicTableIndex(staticTableIndex, name); return(index == -1 ? EncodeLiteralHeaderFieldWithoutIndexingNewName(name, value, buffer, out bytesWritten) : EncodeLiteralHeaderFieldWithoutIndexing(index, value, buffer, out bytesWritten)); } return(EncodeDynamicHeader(buffer, staticTableIndex, name, value, out bytesWritten)); }
public uint CalculateSize() { return((uint)HeaderField.GetLength(Name.Length, Value.Length)); }