From afe5ed879f7015e62bcf431f0bdf70093af63ca5 Mon Sep 17 00:00:00 2001 From: Bernardo Meurer Costa Date: Tue, 21 Oct 2025 09:02:36 +0000 Subject: [PATCH] feat(libstore): add DELETE method support to FileTransfer Add support for HTTP DELETE requests to FileTransfer infrastructure: This enables S3 multipart upload abort functionality via DELETE requests to S3 endpoints. --- src/libstore/filetransfer.cc | 8 ++++++++ src/libstore/include/nix/store/filetransfer.hh | 8 ++++++++ 2 files changed, 16 insertions(+) diff --git a/src/libstore/filetransfer.cc b/src/libstore/filetransfer.cc index c2c2a86c4..9fd7a967b 100644 --- a/src/libstore/filetransfer.cc +++ b/src/libstore/filetransfer.cc @@ -387,6 +387,9 @@ struct curlFileTransfer : public FileTransfer if (request.method == HttpMethod::HEAD) curl_easy_setopt(req, CURLOPT_NOBODY, 1); + if (request.method == HttpMethod::DELETE) + curl_easy_setopt(req, CURLOPT_CUSTOMREQUEST, "DELETE"); + if (request.data) { if (request.method == HttpMethod::POST) { curl_easy_setopt(req, CURLOPT_POST, 1L); @@ -919,6 +922,11 @@ FileTransferResult FileTransfer::upload(const FileTransferRequest & request) return enqueueFileTransfer(request).get(); } +FileTransferResult FileTransfer::deleteResource(const FileTransferRequest & request) +{ + return enqueueFileTransfer(request).get(); +} + void FileTransfer::download( FileTransferRequest && request, Sink & sink, std::function resultCallback) { diff --git a/src/libstore/include/nix/store/filetransfer.hh b/src/libstore/include/nix/store/filetransfer.hh index a9ed05dc8..402ee4900 100644 --- a/src/libstore/include/nix/store/filetransfer.hh +++ b/src/libstore/include/nix/store/filetransfer.hh @@ -90,6 +90,7 @@ enum struct HttpMethod { GET, HEAD, POST, + DELETE, }; /** @@ -148,6 +149,8 @@ struct FileTransferRequest return "download"; case HttpMethod::POST: return "upload"; + case HttpMethod::DELETE: + return "delet"; } unreachable(); } @@ -221,6 +224,11 @@ struct FileTransfer */ FileTransferResult upload(const FileTransferRequest & request); + /** + * Synchronously delete a resource. + */ + FileTransferResult deleteResource(const FileTransferRequest & request); + /** * Download a file, writing its data to a sink. The sink will be * invoked on the thread of the caller.