コード例 #1
0
ファイル: Hpack.cs プロジェクト: anthrax3/Channels.Http2
        public static void WriteValueString(WritableBuffer buffer, string value, HeaderOptions options)
        {
            switch (options & HeaderOptions.ValueCompressionMask)
            {
            case HeaderOptions.ValueCompressionAutomatic:
                var len = HuffmanCode.GetByteCount(value);
                if (len < value.Length)
                {
                    WriteUInt32(buffer, (uint)len, 0x80, 7);
                    HuffmanCode.Write(buffer, value);
                }
                else
                {
                    WriteUInt32(buffer, (uint)value.Length, 0, 7);
                    buffer.WriteAsciiString(value);
                }
                break;

            case HeaderOptions.ValueCompressionOn:
                len = HuffmanCode.GetByteCount(value);
                WriteUInt32(buffer, (uint)len, 0x80, 7);
                HuffmanCode.Write(buffer, value);
                break;

            case HeaderOptions.ValueCompressionOff:
                WriteUInt32(buffer, (uint)value.Length, 0, 7);
                buffer.WriteAsciiString(value);
                break;

            default:
                throw new InvalidOperationException("Invalid value compression: " + options);
            }
        }
コード例 #2
0
ファイル: Hpack.cs プロジェクト: anthrax3/Channels.Http2
        public static string ReadString(ref ReadableBuffer buffer, out bool compressed)
        {
            int header = buffer.Peek();

            if (header < 0)
            {
                ThrowEndOfStreamException();
            }

            compressed = (header & 0x80) != 0;
            buffer     = buffer.Slice(1);
            int    len = checked ((int)ReadUInt64(ref buffer, header, 7));
            string result;

            if (compressed)
            {
                result = HuffmanCode.ReadString(buffer.Slice(0, len));
            }
            else
            {
                result = buffer.Slice(0, len).GetAsciiString();
            }

            buffer = buffer.Slice(len);
            return(result);
        }
コード例 #3
0
        private static unsafe string ReadString(ReadableBuffer buffer, char *c, int maxLen)
        {
            var reader = new HuffmanCode(buffer);

            for (int i = 0; i < maxLen; i++)
            {
                int next = reader.ReadNext();
                if (next < 0)
                {
                    return(i == 0 ? "" : new string(c, 0, i));
                }

                c[i] = (char)next;
            }
            if (reader.ReadNext() < 0)
            {
                return(new string(c, 0, maxLen));
            }

            throw new EndOfStreamException();
        }