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