Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
25 changes: 21 additions & 4 deletions src/libstore/filetransfer.cc
Original file line number Diff line number Diff line change
Expand Up @@ -1046,16 +1046,33 @@ struct curlFileTransfer : public FileTransfer
return ItemHandle(item.get_ptr());
}

ItemHandle enqueueFileTransfer(const FileTransferRequest & request, Callback<FileTransferResult> callback) override
inline ref<TransferItem>
makeTransferItem(const FileTransferRequest & request, Callback<FileTransferResult> callback)
{
/* Handle s3:// URIs by converting to HTTPS and optionally adding auth */
if (request.uri.scheme() == "s3") {
auto modifiedRequest = request;
modifiedRequest.setupForS3();
return enqueueItem(make_ref<TransferItem>(*this, std::move(modifiedRequest), std::move(callback)));
return make_ref<TransferItem>(*this, std::move(modifiedRequest), std::move(callback));
} else {
return make_ref<TransferItem>(*this, request, std::move(callback));
}
}

ItemHandle
enqueueFileTransfer(const FileTransferRequest & request, Callback<FileTransferResult> callback) noexcept override
{
const auto item = makeTransferItem(request, std::move(callback));

return enqueueItem(make_ref<TransferItem>(*this, request, std::move(callback)));
try {
return enqueueItem(item);
} catch (const nix::BaseError & e) {
// NOTE(cole-h): catches both nix::Error and nix::Interrupted -- enqueueItem calls
// writeFull which may throw nix::Interrupted, and the rest of enqueueItem may throw
// nix::Error
item->fail(e);
return ItemHandle(item.get_ptr());
}
Comment thread
cole-h marked this conversation as resolved.
}

void unpauseTransfer(std::weak_ptr<Item> item)
Expand Down Expand Up @@ -1133,7 +1150,7 @@ void FileTransferRequest::setupForS3()
#endif
}

std::future<FileTransferResult> FileTransfer::enqueueFileTransfer(const FileTransferRequest & request)
std::future<FileTransferResult> FileTransfer::enqueueFileTransfer(const FileTransferRequest & request) noexcept
{
auto promise = std::make_shared<std::promise<FileTransferResult>>();
enqueueFileTransfer(request, {[promise](std::future<FileTransferResult> fut) {
Expand Down
4 changes: 2 additions & 2 deletions src/libstore/include/nix/store/filetransfer.hh
Original file line number Diff line number Diff line change
Expand Up @@ -354,14 +354,14 @@ public:
* exception.
*/
virtual ItemHandle
enqueueFileTransfer(const FileTransferRequest & request, Callback<FileTransferResult> callback) = 0;
enqueueFileTransfer(const FileTransferRequest & request, Callback<FileTransferResult> callback) noexcept = 0;

/**
* Unpause a transfer that has been previously paused by a dataCallback.
*/
virtual void unpauseTransfer(ItemHandle handle) = 0;

std::future<FileTransferResult> enqueueFileTransfer(const FileTransferRequest & request);
std::future<FileTransferResult> enqueueFileTransfer(const FileTransferRequest & request) noexcept;

/**
* Synchronously download a file.
Expand Down
Loading