private void CompressNonIndexed(string headerName, string headerValue, IndexationType headerType, byte prefix, SizedHeadersList useHeadersTable) { int index = useHeadersTable.FindIndex(kv => kv.Key == headerName); byte nameLenBinary = 0; // headers cant be more then 255 characters length byte[] nameBinary = new byte[0]; //It's necessary to form result array because partial writeToOutput stream can cause problems because of multithreading using (var stream = new MemoryStream(64)) { byte[] indexBinary; byte valueLenBinary; byte[] valueBinary; if (index != -1) { indexBinary = (index + 1).ToUVarInt(prefix); } else { indexBinary = 0.ToUVarInt(prefix); nameBinary = Encoding.UTF8.GetBytes(headerName); nameLenBinary = (byte)nameBinary.Length; } //Set without index type indexBinary[0] |= (byte)headerType; valueBinary = Encoding.UTF8.GetBytes(headerValue); valueLenBinary = (byte)valueBinary.Length; stream.Write(indexBinary, 0, indexBinary.Length); //write replaced index. It's equal with the found index in our case if (headerType == IndexationType.Substitution) { stream.Write(indexBinary, 0, indexBinary.Length); } if (index == -1) { stream.WriteByte(nameLenBinary); stream.Write(nameBinary, 0, nameBinary.Length); } stream.WriteByte(valueLenBinary); stream.Write(valueBinary, 0, valueBinary.Length); WriteToOutput(stream.GetBuffer(), 0, (int)stream.Position); } ModifyTable(headerName, headerValue, headerType, useHeadersTable, index); }
private void CompressIndexed(KeyValuePair<string, string> header, SizedHeadersList useHeadersTable) { int index = useHeadersTable.FindIndex(kv => kv.Key == header.Key && kv.Value == header.Value); const byte prefix = 7; var bytes = index.ToUVarInt(prefix); //Set indexed type bytes[0] |= (byte) IndexationType.Indexed; WriteToOutput(bytes, 0, bytes.Length); }