diff --git a/src/libstore/filetransfer.cc b/src/libstore/filetransfer.cc index 6b9c6602b..304984d99 100644 --- a/src/libstore/filetransfer.cc +++ b/src/libstore/filetransfer.cc @@ -394,9 +394,11 @@ struct curlFileTransfer : public FileTransfer if (request.method == HttpMethod::POST) { curl_easy_setopt(req, CURLOPT_POST, 1L); curl_easy_setopt(req, CURLOPT_POSTFIELDSIZE_LARGE, (curl_off_t) request.data->length()); - } else { + } else if (request.method == HttpMethod::PUT) { curl_easy_setopt(req, CURLOPT_UPLOAD, 1L); curl_easy_setopt(req, CURLOPT_INFILESIZE_LARGE, (curl_off_t) request.data->length()); + } else { + unreachable(); } curl_easy_setopt(req, CURLOPT_READFUNCTION, readCallbackWrapper); curl_easy_setopt(req, CURLOPT_READDATA, this); diff --git a/src/libstore/http-binary-cache-store.cc b/src/libstore/http-binary-cache-store.cc index 1f9ee4100..4b8276572 100644 --- a/src/libstore/http-binary-cache-store.cc +++ b/src/libstore/http-binary-cache-store.cc @@ -141,7 +141,7 @@ void HttpBinaryCacheStore::upsertFile( uint64_t sizeHint) { auto req = makeRequest(path); - + req.method = HttpMethod::PUT; auto data = StreamToSourceAdapter(istream).drain(); auto compressionMethod = getCompressionMethod(path); diff --git a/src/libstore/include/nix/store/filetransfer.hh b/src/libstore/include/nix/store/filetransfer.hh index 305c33af1..08a2b6329 100644 --- a/src/libstore/include/nix/store/filetransfer.hh +++ b/src/libstore/include/nix/store/filetransfer.hh @@ -88,6 +88,7 @@ extern const unsigned int RETRY_TIME_MS_DEFAULT; */ enum struct HttpMethod { GET, + PUT, HEAD, POST, DELETE, @@ -147,7 +148,9 @@ struct FileTransferRequest case HttpMethod::HEAD: case HttpMethod::GET: return "download"; + case HttpMethod::PUT: case HttpMethod::POST: + assert(data); return "upload"; case HttpMethod::DELETE: return "delet"; diff --git a/src/libstore/s3-binary-cache-store.cc b/src/libstore/s3-binary-cache-store.cc index 828e75b7c..417355b68 100644 --- a/src/libstore/s3-binary-cache-store.cc +++ b/src/libstore/s3-binary-cache-store.cc @@ -101,6 +101,7 @@ std::string S3BinaryCacheStore::uploadPart(std::string_view key, std::string_view uploadId, uint64_t partNumber, std::string data) { auto req = makeRequest(key); + req.method = HttpMethod::PUT; req.setupForS3(); auto url = req.uri.parsed();