in lib/src/hpack/hpack.dart [175:220]
List<int> encode(List<Header> headers) {
var bytesBuilder = BytesBuilder();
var currentByte = 0;
void writeInteger(int prefixBits, int value) {
assert(prefixBits <= 8);
if (value < (1 << prefixBits) - 1) {
currentByte |= value;
bytesBuilder.addByte(currentByte);
} else {
// Length encodeded.
currentByte |= (1 << prefixBits) - 1;
value -= (1 << prefixBits) - 1;
bytesBuilder.addByte(currentByte);
var done = false;
while (!done) {
currentByte = value & 0x7f;
value = value >> 7;
done = value == 0;
if (!done) currentByte |= 0x80;
bytesBuilder.addByte(currentByte);
}
}
currentByte = 0;
}
void writeStringLiteral(List<int> bytes) {
// TODO: Support huffman encoding.
currentByte = 0; // 1 would be huffman encoding
writeInteger(7, bytes.length);
bytesBuilder.add(bytes);
}
void writeLiteralHeaderWithoutIndexing(Header header) {
bytesBuilder.addByte(0);
writeStringLiteral(header.name);
writeStringLiteral(header.value);
}
for (var header in headers) {
writeLiteralHeaderWithoutIndexing(header);
}
return bytesBuilder.takeBytes();
}