aboutsummaryrefslogtreecommitdiff
path: root/src/libstore/http-binary-cache-store.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/libstore/http-binary-cache-store.cc')
-rw-r--r--src/libstore/http-binary-cache-store.cc49
1 files changed, 37 insertions, 12 deletions
diff --git a/src/libstore/http-binary-cache-store.cc b/src/libstore/http-binary-cache-store.cc
index 1d707c043..92d94aeea 100644
--- a/src/libstore/http-binary-cache-store.cc
+++ b/src/libstore/http-binary-cache-store.cc
@@ -1,6 +1,7 @@
#include "binary-cache-store.hh"
#include "download.hh"
#include "globals.hh"
+#include "nar-info-disk-cache.hh"
namespace nix {
@@ -10,25 +11,37 @@ private:
Path cacheUri;
- ref<Downloader> downloader;
+ Pool<Downloader> downloaders;
public:
HttpBinaryCacheStore(std::shared_ptr<Store> localStore,
- const Path & secretKeyFile, const Path & _cacheUri)
- : BinaryCacheStore(localStore, secretKeyFile)
+ const StoreParams & params, const Path & _cacheUri)
+ : BinaryCacheStore(localStore, params)
, cacheUri(_cacheUri)
- , downloader(makeDownloader())
+ , downloaders(
+ std::numeric_limits<size_t>::max(),
+ []() { return makeDownloader(); })
{
if (cacheUri.back() == '/')
cacheUri.pop_back();
+
+ diskCache = getNarInfoDiskCache();
+ }
+
+ std::string getUri() override
+ {
+ return cacheUri;
}
void init() override
{
// FIXME: do this lazily?
- if (!fileExists("nix-cache-info"))
- throw Error(format("ā€˜%sā€™ does not appear to be a binary cache") % cacheUri);
+ if (!diskCache->cacheExists(cacheUri)) {
+ if (!fileExists("nix-cache-info"))
+ throw Error(format("ā€˜%sā€™ does not appear to be a binary cache") % cacheUri);
+ diskCache->createCache(cacheUri);
+ }
}
protected:
@@ -36,13 +49,16 @@ protected:
bool fileExists(const std::string & path) override
{
try {
+ auto downloader(downloaders.get());
DownloadOptions options;
options.showProgress = DownloadOptions::no;
options.head = true;
downloader->download(cacheUri + "/" + path, options);
return true;
} catch (DownloadError & e) {
- if (e.error == Downloader::NotFound)
+ /* S3 buckets return 403 if a file doesn't exist and the
+ bucket is unlistable, so treat 403 as 404. */
+ if (e.error == Downloader::NotFound || e.error == Downloader::Forbidden)
return false;
throw;
}
@@ -53,21 +69,30 @@ protected:
throw Error("uploading to an HTTP binary cache is not supported");
}
- std::string getFile(const std::string & path) override
+ std::shared_ptr<std::string> getFile(const std::string & path) override
{
+ auto downloader(downloaders.get());
DownloadOptions options;
options.showProgress = DownloadOptions::no;
- return downloader->download(cacheUri + "/" + path, options).data;
+ try {
+ return downloader->download(cacheUri + "/" + path, options).data;
+ } catch (DownloadError & e) {
+ if (e.error == Downloader::NotFound || e.error == Downloader::Forbidden)
+ return 0;
+ throw;
+ }
}
};
-static RegisterStoreImplementation regStore([](const std::string & uri) -> std::shared_ptr<Store> {
+static RegisterStoreImplementation regStore([](
+ const std::string & uri, const StoreParams & params)
+ -> std::shared_ptr<Store>
+{
if (std::string(uri, 0, 7) != "http://" &&
std::string(uri, 0, 8) != "https://") return 0;
auto store = std::make_shared<HttpBinaryCacheStore>(std::shared_ptr<Store>(0),
- settings.get("binary-cache-secret-key-file", string("")),
- uri);
+ params, uri);
store->init();
return store;
});