S3BinaryCacheStore: Set Content-Type

This is necessary for serving log files to browsers.
This commit is contained in:
Eelco Dolstra 2017-03-14 15:26:01 +01:00
parent 8b1d65bebe
commit 45c70382ac
No known key found for this signature in database
GPG key ID: 8170B4726D7198DE
5 changed files with 25 additions and 13 deletions

View file

@ -97,7 +97,7 @@ void BinaryCacheStore::init()
auto cacheInfo = getFile(cacheInfoFile); auto cacheInfo = getFile(cacheInfoFile);
if (!cacheInfo) { if (!cacheInfo) {
upsertFile(cacheInfoFile, "StoreDir: " + storeDir + "\n"); upsertFile(cacheInfoFile, "StoreDir: " + storeDir + "\n", "text/x-nix-cache-info");
} else { } else {
for (auto & line : tokenizeString<Strings>(*cacheInfo, "\n")) { for (auto & line : tokenizeString<Strings>(*cacheInfo, "\n")) {
size_t colon = line.find(':'); size_t colon = line.find(':');
@ -224,7 +224,7 @@ void BinaryCacheStore::addToStore(const ValidPathInfo & info, const ref<std::str
} }
} }
upsertFile(storePathToHash(info.path) + ".ls.xz", *compress("xz", jsonOut.str())); upsertFile(storePathToHash(info.path) + ".ls.xz", *compress("xz", jsonOut.str()), "application/x-nix-nar-listing");
} }
else { else {
@ -254,7 +254,7 @@ void BinaryCacheStore::addToStore(const ValidPathInfo & info, const ref<std::str
""); "");
if (repair || !fileExists(narInfo->url)) { if (repair || !fileExists(narInfo->url)) {
stats.narWrite++; stats.narWrite++;
upsertFile(narInfo->url, *narCompressed); upsertFile(narInfo->url, *narCompressed, "application/x-nix-nar");
} else } else
stats.narWriteAverted++; stats.narWriteAverted++;
@ -265,7 +265,7 @@ void BinaryCacheStore::addToStore(const ValidPathInfo & info, const ref<std::str
/* Atomically write the NAR info file.*/ /* Atomically write the NAR info file.*/
if (secretKey) narInfo->sign(*secretKey); if (secretKey) narInfo->sign(*secretKey);
upsertFile(narInfoFile, narInfo->to_string()); upsertFile(narInfoFile, narInfo->to_string(), "text/x-nix-narinfo");
auto hashPart = storePathToHash(narInfo->path); auto hashPart = storePathToHash(narInfo->path);

View file

@ -31,7 +31,9 @@ public:
virtual bool fileExists(const std::string & path) = 0; virtual bool fileExists(const std::string & path) = 0;
virtual void upsertFile(const std::string & path, const std::string & data) = 0; virtual void upsertFile(const std::string & path,
const std::string & data,
const std::string & mimeType) = 0;
/* Return the contents of the specified file, or null if it /* Return the contents of the specified file, or null if it
doesn't exist. */ doesn't exist. */

View file

@ -64,7 +64,9 @@ protected:
} }
} }
void upsertFile(const std::string & path, const std::string & data) override void upsertFile(const std::string & path,
const std::string & data,
const std::string & mimeType) override
{ {
throw UploadToHTTP("uploading to an HTTP binary cache is not supported"); throw UploadToHTTP("uploading to an HTTP binary cache is not supported");
} }

View file

@ -30,7 +30,9 @@ protected:
bool fileExists(const std::string & path) override; bool fileExists(const std::string & path) override;
void upsertFile(const std::string & path, const std::string & data) override; void upsertFile(const std::string & path,
const std::string & data,
const std::string & mimeType) override;
void getFile(const std::string & path, void getFile(const std::string & path,
std::function<void(std::shared_ptr<std::string>)> success, std::function<void(std::shared_ptr<std::string>)> success,
@ -83,7 +85,9 @@ bool LocalBinaryCacheStore::fileExists(const std::string & path)
return pathExists(binaryCacheDir + "/" + path); return pathExists(binaryCacheDir + "/" + path);
} }
void LocalBinaryCacheStore::upsertFile(const std::string & path, const std::string & data) void LocalBinaryCacheStore::upsertFile(const std::string & path,
const std::string & data,
const std::string & mimeType)
{ {
atomicWrite(binaryCacheDir + "/" + path, data); atomicWrite(binaryCacheDir + "/" + path, data);
} }

View file

@ -148,7 +148,7 @@ struct S3BinaryCacheStoreImpl : public S3BinaryCacheStore
: S3BinaryCacheStore(params) : S3BinaryCacheStore(params)
, bucketName(bucketName) , bucketName(bucketName)
, s3Helper(get(params, "aws-region", Aws::Region::US_EAST_1)) , s3Helper(get(params, "aws-region", Aws::Region::US_EAST_1))
, textCompression(get(params, "text-compression", "gzip")) , textCompression(get(params, "text-compression", ""))
, logCompression(get(params, "log-compression", textCompression)) , logCompression(get(params, "log-compression", textCompression))
{ {
diskCache = getNarInfoDiskCache(); diskCache = getNarInfoDiskCache();
@ -229,6 +229,7 @@ struct S3BinaryCacheStoreImpl : public S3BinaryCacheStore
} }
void uploadFile(const std::string & path, const std::string & data, void uploadFile(const std::string & path, const std::string & data,
const std::string & mimeType,
const std::string & contentEncoding) const std::string & contentEncoding)
{ {
auto request = auto request =
@ -236,6 +237,8 @@ struct S3BinaryCacheStoreImpl : public S3BinaryCacheStore
.WithBucket(bucketName) .WithBucket(bucketName)
.WithKey(path); .WithKey(path);
request.SetContentType(mimeType);
if (contentEncoding != "") if (contentEncoding != "")
request.SetContentEncoding(contentEncoding); request.SetContentEncoding(contentEncoding);
@ -261,14 +264,15 @@ struct S3BinaryCacheStoreImpl : public S3BinaryCacheStore
stats.putTimeMs += duration; stats.putTimeMs += duration;
} }
void upsertFile(const std::string & path, const std::string & data) override void upsertFile(const std::string & path, const std::string & data,
const std::string & mimeType) override
{ {
if (path.find(".narinfo") != std::string::npos) if (path.find(".narinfo") != std::string::npos)
uploadFile(path, *compress(textCompression, data), textCompression); uploadFile(path, *compress(textCompression, data), mimeType, textCompression);
else if (path.find("/log") != std::string::npos) else if (path.find("/log") != std::string::npos)
uploadFile(path, *compress(logCompression, data), logCompression); uploadFile(path, *compress(logCompression, data), mimeType, logCompression);
else else
uploadFile(path, data, ""); uploadFile(path, data, mimeType, "");
} }
void getFile(const std::string & path, void getFile(const std::string & path,