1
0
Fork 0
mirror of https://github.com/NixOS/nix synced 2025-06-25 23:11:16 +02:00

S3BinaryCacheStore: Support compression of narinfo and log files

You can now set the store parameter "text-compression=br" to compress
textual files in the binary cache (i.e. narinfo and logs) using
Brotli. This sets the Content-Encoding header; the extension of
compressed files is unchanged.

You can separately specify the compression of log files using
"log-compression=br". This is useful when you don't want to compress
narinfo files for backward compatibility.
This commit is contained in:
Eelco Dolstra 2017-03-14 15:03:53 +01:00
parent 2691498b5c
commit 8b1d65bebe
No known key found for this signature in database
GPG key ID: 8170B4726D7198DE
5 changed files with 71 additions and 8 deletions

View file

@ -91,6 +91,7 @@ static ref<std::string> decompressBzip2(const std::string & in)
static ref<std::string> decompressBrotli(const std::string & in)
{
// FIXME: use libbrotli
return make_ref<std::string>(runProgram(BRO, true, {"-d"}, in));
}
@ -266,6 +267,34 @@ struct BzipSink : CompressionSink
}
};
struct BrotliSink : CompressionSink
{
Sink & nextSink;
std::string data;
BrotliSink(Sink & nextSink) : nextSink(nextSink)
{
}
~BrotliSink()
{
}
// FIXME: use libbrotli
void finish() override
{
flush();
nextSink(runProgram(BRO, true, {}, data));
}
void write(const unsigned char * data, size_t len) override
{
checkInterrupt();
this->data.append((const char *) data, len);
}
};
ref<CompressionSink> makeCompressionSink(const std::string & method, Sink & nextSink)
{
if (method == "none")
@ -274,6 +303,8 @@ ref<CompressionSink> makeCompressionSink(const std::string & method, Sink & next
return make_ref<XzSink>(nextSink);
else if (method == "bzip2")
return make_ref<BzipSink>(nextSink);
else if (method == "br")
return make_ref<BrotliSink>(nextSink);
else
throw UnknownCompressionMethod(format("unknown compression method %s") % method);
}