public static int EncodeHeader(Span <byte> buffer, int nameValueIdx, QPackFlags flags = QPackFlags.StaticIndex) { byte prefix, prefixMask; switch (flags & FlagsIndexMask) { case QPackFlags.StaticIndex: prefix = 0b1100_0000; prefixMask = 0b1100_0000; break; case QPackFlags.DynamicIndex: prefix = 0b1000_0000; prefixMask = 0b1100_0000; break; case QPackFlags.DynamicIndexPostBase: prefix = 0b0001_0000; prefixMask = 0b1111_0000; break; default: Debug.Fail($"Invalid {nameof(QPackFlags)}."); throw new Exception(); } return(EncodeInteger(buffer, nameValueIdx, prefix, prefixMask)); }
public static int EncodeHeader(Span <byte> buffer, string name, string value, Encoding valueEncoding, QPackFlags flags = QPackFlags.None) { byte[] data = Encoding.ASCII.GetBytes(name); byte prefix; if (!flags.HasFlag(QPackFlags.HuffmanEncodeName)) { prefix = 0b0010_0000; } else { int len = HuffmanEncoder.GetEncodedLength(data); byte[] huffmanData = new byte[len]; HuffmanEncoder.Encode(data, huffmanData); data = huffmanData; prefix = 0b0010_1000; } if (flags.HasFlag(QPackFlags.NeverIndexed)) { prefix |= 0b0001_0000; } int bytesGenerated = 0; // write name string header. bytesGenerated += EncodeInteger(buffer, data.Length, prefix, 0b1111_1000); // write name string. data.AsSpan().CopyTo(buffer.Slice(bytesGenerated)); bytesGenerated += data.Length; // write value string. bytesGenerated += EncodeString(buffer.Slice(bytesGenerated), value, valueEncoding, flags.HasFlag(QPackFlags.HuffmanEncodeValue)); return(bytesGenerated); }
public static int EncodeHeader(Span <byte> buffer, int nameIdx, string value, Encoding valueEncoding, QPackFlags flags = QPackFlags.StaticIndex) { byte prefix, prefixMask; switch (flags & FlagsIndexMask) { case QPackFlags.StaticIndex: prefix = 0b0101_0000; prefixMask = 0b1111_0000; if (flags.HasFlag(QPackFlags.NeverIndexed)) { prefix |= 0b0010_0000; } break; case QPackFlags.DynamicIndex: prefix = 0b0100_0000; prefixMask = 0b1111_0000; if (flags.HasFlag(QPackFlags.NeverIndexed)) { prefix |= 0b0010_0000; } break; case QPackFlags.DynamicIndexPostBase: prefix = 0b0000_0000; prefixMask = 0b1111_1000; if (flags.HasFlag(QPackFlags.NeverIndexed)) { prefix |= 0b0000_1000; } break; default: Debug.Fail($"Invalid {nameof(QPackFlags)}."); throw new Exception(); } int nameLen = EncodeInteger(buffer, nameIdx, prefix, prefixMask); int valueLen = EncodeString(buffer.Slice(nameLen), value, valueEncoding, flags.HasFlag(QPackFlags.HuffmanEncodeValue)); return(nameLen + valueLen); }