Ejemplo n.º 1
0
        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));
        }
Ejemplo n.º 2
0
        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);
        }
Ejemplo n.º 3
0
        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);
        }