userver: userver/s3api/clients/s3api.hpp Source File
Loading...
Searching...
No Matches
s3api.hpp
Go to the documentation of this file.
1#pragma once
2
3/// @file userver/s3api/clients/s3api.hpp
4/// @brief Client for any S3 api service
5
6#include <chrono>
7#include <optional>
8#include <string>
9#include <unordered_set>
10#include <vector>
11
12#include <userver/http/header_map.hpp>
13
14#include <userver/s3api/authenticators/access_key.hpp>
15#include <userver/s3api/authenticators/interface.hpp>
16#include <userver/s3api/models/errors.hpp>
17#include <userver/s3api/models/fwd.hpp>
18#include <userver/s3api/models/multipart_upload/requests.hpp>
19#include <userver/s3api/models/multipart_upload/responses.hpp>
20#include <userver/s3api/models/s3api_connection_type.hpp>
21
22USERVER_NAMESPACE_BEGIN
23
24namespace clients::http {
25class Client;
26}
27
28/// @brief Top namespace for S3 library.
29///
30/// For more information see @ref scripts/docs/en/userver/libraries/s3api.md .
31namespace s3api {
32
33/// Connection settings - retries, timeouts, and so on
35 explicit ConnectionCfg(
36 std::chrono::milliseconds s3timeout,
37 int s3retries = 1,
38 std::optional<std::string> proxy = {}
39 )
40 : timeout(s3timeout),
41 retries(s3retries),
42 proxy(proxy)
43 {}
44
45 std::chrono::milliseconds timeout{1000};
46 int retries = 1;
47 std::optional<std::string> proxy{};
48};
49
50/// https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListObjects.html
51/// may also include other fields like Owner, ETag, etc.
52struct ObjectMeta {
53 std::string key;
54 std::size_t size;
55 std::string last_modified;
56};
57
58/// Represents a connection to s3 api. This object is only forward-declared,
59/// with private implementation (mostly because it is very very ugly)
60class S3Connection;
61
62/// Create an S3Connection object. By itself, it does nothing, but you need
63/// one to create S3 client
64std::shared_ptr<S3Connection> MakeS3Connection(
65 clients::http::Client& http_client,
66 S3ConnectionType connection_type,
67 std::string server_url,
68 const ConnectionCfg& params
69);
70
71/// @ingroup userver_clients
72///
73/// Main interface for the S3 api
74class Client {
75public:
76 using CiUnorderedMap = USERVER_NAMESPACE::http::headers::HeaderMap;
77 using Meta = CiUnorderedMap;
78 using Headers = CiUnorderedMap;
79
81 HeaderDataRequest() {}
82 HeaderDataRequest(std::optional<std::unordered_set<std::string>> headers, bool need_meta)
83 : headers(std::move(headers)),
84 need_meta(need_meta)
85 {}
86 std::optional<std::unordered_set<std::string>> headers{std::nullopt};
87 bool need_meta{true};
88 };
89
91 std::optional<Headers> headers;
92 std::optional<Meta> meta;
93 };
94
95 struct Tag {
96 std::string key;
97 std::string value;
98 };
99
100 virtual ~Client() = default;
101
102 // NOLINTBEGIN(google-default-arguments)
103
104 virtual std::string PutObject(
105 std::string_view path,
106 std::string data,
107 const std::optional<Meta>& meta = std::nullopt,
108 std::string_view content_type = "text/plain",
109 const std::optional<std::string>& content_disposition = std::nullopt,
110 const std::optional<std::vector<Tag>>& tags = std::nullopt
111 ) const = 0;
112
113 virtual void DeleteObject(std::string_view path) const = 0;
114
115 virtual std::optional<std::string> GetObject(
116 std::string_view path,
117 std::optional<std::string> version = std::nullopt,
118 HeadersDataResponse* headers_data = nullptr,
119 const HeaderDataRequest& headers_request = HeaderDataRequest()
120 ) const = 0;
121
122 virtual std::string TryGetObject(
123 std::string_view path,
124 std::optional<std::string> version = std::nullopt,
125 HeadersDataResponse* headers_data = nullptr,
126 const HeaderDataRequest& headers_request = HeaderDataRequest()
127 ) const = 0;
128
129 virtual std::optional<std::string> GetPartialObject(
130 std::string_view path,
131 std::string_view range,
132 std::optional<std::string> version = std::nullopt,
133 HeadersDataResponse* headers_data = nullptr,
134 const HeaderDataRequest& headers_request = HeaderDataRequest()
135 ) const = 0;
136
137 virtual std::string TryGetPartialObject(
138 std::string_view path,
139 std::string_view range,
140 std::optional<std::string> version = std::nullopt,
141 HeadersDataResponse* headers_data = nullptr,
142 const HeaderDataRequest& headers_request = HeaderDataRequest()
143 ) const = 0;
144
145 virtual std::string CopyObject(
146 std::string_view key_from,
147 std::string_view bucket_to,
148 std::string_view key_to,
149 const std::optional<Meta>& meta = std::nullopt
150 ) = 0;
151
152 virtual std::string CopyObject(
153 std::string_view key_from,
154 std::string_view key_to,
155 const std::optional<Meta>& meta = std::nullopt
156 ) = 0;
157
158 virtual std::optional<HeadersDataResponse> GetObjectHead(
159 std::string_view path,
160 const HeaderDataRequest& request = HeaderDataRequest()
161 ) const = 0;
162
163 virtual std::string GenerateDownloadUrl(std::string_view path, time_t expires, bool use_ssl = false) const = 0;
164
165 virtual std::string GenerateDownloadUrlVirtualHostAddressing(
166 std::string_view path,
167 const std::chrono::system_clock::time_point& expires_at,
168 std::string_view protocol = "https://"
169 ) const = 0;
170
171 virtual std::string GenerateUploadUrlVirtualHostAddressing(
172 std::string_view data,
173 std::string_view content_type,
174 std::string_view path,
175 const std::chrono::system_clock::time_point& expires_at,
176 std::string_view protocol = "https://"
177 ) const = 0;
178
179 virtual std::optional<std::string> ListBucketContents(
180 std::string_view path,
181 int max_keys,
182 std::string marker = "",
183 std::string delimiter = ""
184 ) const = 0;
185
186 virtual std::vector<ObjectMeta> ListBucketContentsParsed(std::string_view path_prefix) const = 0;
187
188 virtual std::vector<std::string> ListBucketDirectories(std::string_view path_prefix) const = 0;
189
190 /// @brief Initiate a multipart upload sequence
191 /// Performs a CreateMultipartUpload S3 Action.
192 /// Returns result with `upload ID` which is used to associate all of the parts in the specific multipart upload.
193 /// You specify this `upload ID` in each of your subsequent upload part requests
194 /// For details see @ref https://docs.aws.amazon.com/AmazonS3/latest/API/API_CreateMultipartUpload.html
196 const multipart_upload::CreateMultipartUploadRequest& request
197 ) const = 0;
198
199 /// @brief Upload a part in a multipart upload sequence.
200 /// Performs an UploadPart S3 Action.
201 /// Returns ETag value which you must include in the subsequent request to complete the multipart upload.
202 /// For details see @ref https://docs.aws.amazon.com/AmazonS3/latest/API/API_UploadPart.html
203 virtual multipart_upload::UploadPartResult UploadPart(const multipart_upload::UploadPartRequest& request) const = 0;
204
205 /// @brief Complete a multipart upload by assembling previously uploaded parts.
206 /// Performs a CompleteMultipartUpload S3 Action.
207 /// For details see @ref https://docs.aws.amazon.com/AmazonS3/latest/API/API_CompleteMultipartUpload.html
209 const multipart_upload::CompleteMultipartUploadRequest& request
210 ) const = 0;
211
212 /// @brief Abort a multipart upload sequence.
213 /// Performs an AbortMultipartUpload S3 Action.
214 /// For details see @ref https://docs.aws.amazon.com/AmazonS3/latest/API/API_AbortMultipartUpload.html
215 virtual void AbortMultipartUpload(const multipart_upload::AbortMultipartUploadRequest& request) const = 0;
216
217 /// @brief List the parts that have been uploaded for a specific multipart upload.
218 /// Performs a ListParts S3 Action.
219 /// For details see @ref https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListParts.html
220 virtual multipart_upload::ListPartsResult ListParts(const multipart_upload::ListPartsRequest& request) const = 0;
221
222 /// @brief List in-progress multipart uploads in a bucket
223 /// Performs a ListMultipartUploads S3 Action.
224 /// For details see @ref https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListMultipartUploads.html
226 const multipart_upload::ListMultipartUploadsRequest& request
227 ) const = 0;
228
229 virtual void UpdateConfig(ConnectionCfg&& config) = 0;
230
231 virtual std::string_view GetBucketName() const = 0;
232
233 // NOLINTEND(google-default-arguments)
234};
235
236using ClientPtr = std::shared_ptr<Client>;
237
238ClientPtr GetS3Client(
239 std::shared_ptr<S3Connection> s3conn,
240 std::shared_ptr<authenticators::AccessKey> authenticator,
241 std::string bucket
242);
243
244ClientPtr GetS3Client(
245 std::shared_ptr<S3Connection> s3conn,
246 std::shared_ptr<authenticators::Authenticator> authenticator,
247 std::string bucket
248);
249
250} // namespace s3api
251
252USERVER_NAMESPACE_END