Nix 2.26.3
Nix, the purely functional package manager; unstable internal interfaces
 
Loading...
Searching...
No Matches
filetransfer.hh
Go to the documentation of this file.
1#pragma once
3
4#include <string>
5#include <future>
6
7#include "logging.hh"
8#include "types.hh"
9#include "ref.hh"
10#include "config.hh"
11#include "serialise.hh"
12
13namespace nix {
14
15struct FileTransferSettings : Config
16{
17 Setting<bool> enableHttp2{this, true, "http2",
18 "Whether to enable HTTP/2 support."};
19
20 Setting<std::string> userAgentSuffix{this, "", "user-agent-suffix",
21 "String appended to the user agent in HTTP requests."};
22
23 Setting<size_t> httpConnections{
24 this, 25, "http-connections",
25 R"(
26 The maximum number of parallel TCP connections used to fetch
27 files from binary caches and by other downloads. It defaults
28 to 25. 0 means no limit.
29 )",
30 {"binary-caches-parallel-connections"}};
31
32 Setting<unsigned long> connectTimeout{
33 this, 0, "connect-timeout",
34 R"(
35 The timeout (in seconds) for establishing connections in the
36 binary cache substituter. It corresponds to `curl`’s
37 `--connect-timeout` option. A value of 0 means no limit.
38 )"};
39
40 Setting<unsigned long> stalledDownloadTimeout{
41 this, 300, "stalled-download-timeout",
42 R"(
43 The timeout (in seconds) for receiving data from servers
44 during download. Nix cancels idle downloads after this
45 timeout's duration.
46 )"};
47
48 Setting<unsigned int> tries{this, 5, "download-attempts",
49 "How often Nix will attempt to download a file before giving up."};
50
51 Setting<size_t> downloadBufferSize{this, 64 * 1024 * 1024, "download-buffer-size",
52 R"(
53 The size of Nix's internal download buffer in bytes during `curl` transfers. If data is
54 not processed quickly enough to exceed the size of this buffer, downloads may stall.
55 The default is 67108864 (64 MiB).
56 )"};
57};
58
59extern FileTransferSettings fileTransferSettings;
60
61struct FileTransferRequest
62{
63 std::string uri;
64 Headers headers;
65 std::string expectedETag;
66 bool verifyTLS = true;
67 bool head = false;
68 size_t tries = fileTransferSettings.tries;
69 unsigned int baseRetryTimeMs = 250;
70 ActivityId parentAct;
71 bool decompress = true;
72 std::optional<std::string> data;
73 std::string mimeType;
74 std::function<void(std::string_view data)> dataCallback;
75
76 FileTransferRequest(std::string_view uri)
77 : uri(uri), parentAct(getCurActivity()) { }
78
79 std::string verb()
80 {
81 return data ? "upload" : "download";
82 }
83};
84
86{
91 bool cached = false;
92
96 std::string etag;
97
101 std::vector<std::string> urls;
102
106 std::string data;
107
108 uint64_t bodySize = 0;
109
115 std::optional<std::string> immutableUrl;
116};
117
118class Store;
119
121{
122 virtual ~FileTransfer() { }
123
129 virtual void enqueueFileTransfer(const FileTransferRequest & request,
130 Callback<FileTransferResult> callback) = 0;
131
132 std::future<FileTransferResult> enqueueFileTransfer(const FileTransferRequest & request);
133
138
143
148 void download(
149 FileTransferRequest && request,
150 Sink & sink,
151 std::function<void(FileTransferResult)> resultCallback = {});
152
153 enum Error { NotFound, Forbidden, Misc, Transient, Interrupted };
154};
155
162ref<FileTransfer> getFileTransfer();
163
169ref<FileTransfer> makeFileTransfer();
170
171class FileTransferError : public Error
172{
173public:
174 FileTransfer::Error error;
176 std::optional<std::string> response;
177
178 template<typename... Args>
179 FileTransferError(FileTransfer::Error error, std::optional<std::string> response, const Args & ... args);
180};
181
182}
Definition args.hh:28
Definition callback.hh:17
std::optional< std::string > response
intentionally optional
Definition filetransfer.hh:176
Definition config.hh:320
Definition store-api.hh:169
Definition ref.hh:15
std::vector< Expr * > args
Definition lexer.l:6126
Definition filetransfer.hh:62
Definition filetransfer.hh:86
std::string data
Definition filetransfer.hh:106
std::vector< std::string > urls
Definition filetransfer.hh:101
bool cached
Definition filetransfer.hh:91
std::optional< std::string > immutableUrl
Definition filetransfer.hh:115
std::string etag
Definition filetransfer.hh:96
Definition filetransfer.hh:16
Definition filetransfer.hh:121
FileTransferResult download(const FileTransferRequest &request)
Definition filetransfer.cc:831
virtual void enqueueFileTransfer(const FileTransferRequest &request, Callback< FileTransferResult > callback)=0
FileTransferResult upload(const FileTransferRequest &request)
Definition filetransfer.cc:836
Definition serialise.hh:20