response.h 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488
  1. // MinIO C++ Library for Amazon S3 Compatible Cloud Storage
  2. // Copyright 2022 MinIO, Inc.
  3. //
  4. // Licensed under the Apache License, Version 2.0 (the "License");
  5. // you may not use this file except in compliance with the License.
  6. // You may obtain a copy of the License at
  7. //
  8. // http://www.apache.org/licenses/LICENSE-2.0
  9. //
  10. // Unless required by applicable law or agreed to in writing, software
  11. // distributed under the License is distributed on an "AS IS" BASIS,
  12. // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13. // See the License for the specific language governing permissions and
  14. // limitations under the License.
  15. #ifndef _MINIO_S3_RESPONSE_H
  16. #define _MINIO_S3_RESPONSE_H
  17. #include "types.h"
  18. #include <pugixml.hpp>
  19. namespace minio {
  20. namespace s3 {
  21. struct Response {
  22. int status_code = 0;
  23. utils::Multimap headers;
  24. std::string data;
  25. std::string code;
  26. std::string message;
  27. std::string resource;
  28. std::string request_id;
  29. std::string host_id;
  30. std::string bucket_name;
  31. std::string object_name;
  32. Response() {}
  33. Response(error::Error err) { this->err_ = err; }
  34. Response(const Response& resp) {
  35. this->err_ = resp.err_;
  36. this->status_code = resp.status_code;
  37. this->headers = resp.headers;
  38. this->data = resp.data;
  39. this->code = resp.code;
  40. this->message = resp.message;
  41. this->resource = resp.resource;
  42. this->request_id = resp.request_id;
  43. this->host_id = resp.host_id;
  44. this->bucket_name = resp.bucket_name;
  45. this->object_name = resp.object_name;
  46. }
  47. operator bool() const {
  48. return !err_ && code.empty() && message.empty() &&
  49. (status_code == 0 || status_code >= 200 && status_code <= 299);
  50. }
  51. error::Error Error() {
  52. if (err_) return err_;
  53. if (!code.empty()) return error::Error(code + ": " + message);
  54. if (status_code && (status_code < 200 || status_code > 299)) {
  55. return error::Error("failed with HTTP status code " +
  56. std::to_string(status_code));
  57. }
  58. return error::SUCCESS;
  59. }
  60. static Response ParseXML(std::string_view data, int status_code,
  61. utils::Multimap headers);
  62. private:
  63. error::Error err_;
  64. }; // struct Response
  65. struct GetRegionResponse : public Response {
  66. std::string region;
  67. GetRegionResponse(std::string region) { this->region = region; }
  68. GetRegionResponse(error::Error err) : Response(err) {}
  69. GetRegionResponse(const Response& resp) : Response(resp) {}
  70. }; // struct GetRegionResponse
  71. using MakeBucketResponse = Response;
  72. struct ListBucketsResponse : public Response {
  73. std::list<Bucket> buckets;
  74. ListBucketsResponse(std::list<Bucket> buckets) { this->buckets = buckets; }
  75. ListBucketsResponse(error::Error err) : Response(err) {}
  76. ListBucketsResponse(const Response& resp) : Response(resp) {}
  77. static ListBucketsResponse ParseXML(std::string_view data);
  78. }; // struct ListBucketsResponse
  79. struct BucketExistsResponse : public Response {
  80. bool exist = false;
  81. BucketExistsResponse(bool exist) { this->exist = exist; }
  82. BucketExistsResponse(error::Error err) : Response(err) {}
  83. BucketExistsResponse(const Response& resp) : Response(resp) {}
  84. }; // struct BucketExistsResponse
  85. using RemoveBucketResponse = Response;
  86. using AbortMultipartUploadResponse = Response;
  87. struct CompleteMultipartUploadResponse : public Response {
  88. std::string location;
  89. std::string etag;
  90. std::string version_id;
  91. CompleteMultipartUploadResponse() {}
  92. CompleteMultipartUploadResponse(error::Error err) : Response(err) {}
  93. CompleteMultipartUploadResponse(const Response& resp) : Response(resp) {}
  94. static CompleteMultipartUploadResponse ParseXML(std::string_view data,
  95. std::string version_id);
  96. }; // struct CompleteMultipartUploadResponse
  97. struct CreateMultipartUploadResponse : public Response {
  98. std::string upload_id;
  99. CreateMultipartUploadResponse(std::string upload_id) {
  100. this->upload_id = upload_id;
  101. }
  102. CreateMultipartUploadResponse(error::Error err) : Response(err) {}
  103. CreateMultipartUploadResponse(const Response& resp) : Response(resp) {}
  104. }; // struct CreateMultipartUploadResponse
  105. struct PutObjectResponse : public Response {
  106. std::string etag;
  107. std::string version_id;
  108. PutObjectResponse() {}
  109. PutObjectResponse(const Response& resp) : Response(resp) {}
  110. PutObjectResponse(error::Error err) : Response(err) {}
  111. }; // struct PutObjectResponse
  112. using UploadPartResponse = PutObjectResponse;
  113. using UploadPartCopyResponse = PutObjectResponse;
  114. struct StatObjectResponse : public Response {
  115. std::string version_id;
  116. std::string etag;
  117. size_t size = 0;
  118. utils::Time last_modified;
  119. RetentionMode retention_mode;
  120. utils::Time retention_retain_until_date;
  121. LegalHold legal_hold;
  122. bool delete_marker;
  123. utils::Multimap user_metadata;
  124. StatObjectResponse() {}
  125. StatObjectResponse(error::Error err) : Response(err) {}
  126. StatObjectResponse(const Response& resp) : Response(resp) {}
  127. }; // struct StatObjectResponse
  128. using RemoveObjectResponse = Response;
  129. using DownloadObjectResponse = Response;
  130. using GetObjectResponse = Response;
  131. struct Item : public Response {
  132. std::string etag; // except DeleteMarker
  133. std::string name;
  134. utils::Time last_modified;
  135. std::string owner_id;
  136. std::string owner_name;
  137. size_t size = 0; // except DeleteMarker
  138. std::string storage_class;
  139. bool is_latest = false; // except ListObjects V1/V2
  140. std::string version_id; // except ListObjects V1/V2
  141. std::map<std::string, std::string> user_metadata;
  142. bool is_prefix = false;
  143. bool is_delete_marker = false;
  144. std::string encoding_type;
  145. Item() {}
  146. Item(error::Error err) : Response(err) {}
  147. Item(const Response& resp) : Response(resp) {}
  148. }; // struct Item
  149. struct ListObjectsResponse : public Response {
  150. // Common
  151. std::string name;
  152. std::string encoding_type;
  153. std::string prefix;
  154. std::string delimiter;
  155. bool is_truncated;
  156. unsigned int max_keys;
  157. std::list<Item> contents;
  158. // ListObjectsV1
  159. std::string marker;
  160. std::string next_marker;
  161. // ListObjectsV2
  162. unsigned int key_count;
  163. std::string start_after;
  164. std::string continuation_token;
  165. std::string next_continuation_token;
  166. // ListObjectVersions
  167. std::string key_marker;
  168. std::string next_key_marker;
  169. std::string version_id_marker;
  170. std::string next_version_id_marker;
  171. ListObjectsResponse() {}
  172. ListObjectsResponse(error::Error err) : Response(err) {}
  173. ListObjectsResponse(const Response& resp) : Response(resp) {}
  174. static ListObjectsResponse ParseXML(std::string_view data, bool version);
  175. }; // struct ListObjectsResponse
  176. using CopyObjectResponse = PutObjectResponse;
  177. using ComposeObjectResponse = PutObjectResponse;
  178. using UploadObjectResponse = PutObjectResponse;
  179. struct DeletedObject : public Response {
  180. std::string name;
  181. std::string version_id;
  182. bool delete_marker;
  183. std::string delete_marker_version_id;
  184. }; // struct DeletedObject
  185. struct DeleteError : public Response {
  186. std::string version_id;
  187. DeleteError() {}
  188. DeleteError(error::Error err) : Response(err) {}
  189. DeleteError(const Response& resp) : Response(resp) {}
  190. }; // struct DeleteError
  191. struct RemoveObjectsResponse : public Response {
  192. std::list<DeletedObject> objects;
  193. std::list<DeleteError> errors;
  194. RemoveObjectsResponse() {}
  195. RemoveObjectsResponse(error::Error err) : Response(err) {}
  196. RemoveObjectsResponse(const Response& resp) : Response(resp) {}
  197. static RemoveObjectsResponse ParseXML(std::string_view data);
  198. }; // struct RemoveObjectsResponse
  199. using SelectObjectContentResponse = Response;
  200. using ListenBucketNotificationResponse = Response;
  201. using DeleteBucketPolicyResponse = Response;
  202. struct GetBucketPolicyResponse : public Response {
  203. std::string policy;
  204. GetBucketPolicyResponse(std::string policy) { this->policy = policy; }
  205. GetBucketPolicyResponse(error::Error err) : Response(err) {}
  206. GetBucketPolicyResponse(const Response& resp) : Response(resp) {}
  207. }; // struct GetBucketPolicyResponse
  208. using SetBucketPolicyResponse = Response;
  209. using DeleteBucketNotificationResponse = Response;
  210. struct GetBucketNotificationResponse : public Response {
  211. NotificationConfig config;
  212. GetBucketNotificationResponse(NotificationConfig config) {
  213. this->config = config;
  214. }
  215. GetBucketNotificationResponse(error::Error err) : Response(err) {}
  216. GetBucketNotificationResponse(const Response& resp) : Response(resp) {}
  217. static GetBucketNotificationResponse ParseXML(std::string_view data);
  218. }; // struct GetBucketNotificationResponse
  219. using SetBucketNotificationResponse = Response;
  220. using DeleteBucketEncryptionResponse = Response;
  221. struct GetBucketEncryptionResponse : public Response {
  222. SseConfig config;
  223. GetBucketEncryptionResponse(SseConfig config) { this->config = config; }
  224. GetBucketEncryptionResponse(error::Error err) : Response(err) {}
  225. GetBucketEncryptionResponse(const Response& resp) : Response(resp) {}
  226. static GetBucketEncryptionResponse ParseXML(std::string_view data);
  227. }; // struct GetBucketEncryptionResponse
  228. using SetBucketEncryptionResponse = Response;
  229. struct GetBucketVersioningResponse : public Response {
  230. Boolean status;
  231. Boolean mfa_delete;
  232. GetBucketVersioningResponse() {}
  233. GetBucketVersioningResponse(error::Error err) : Response(err) {}
  234. GetBucketVersioningResponse(const Response& resp) : Response(resp) {}
  235. std::string Status() {
  236. if (!status) return "Off";
  237. return status.Get() ? "Enabled" : "Suspended";
  238. }
  239. std::string MfaDelete() {
  240. if (!mfa_delete) return "";
  241. return mfa_delete.Get() ? "Enabled" : "Disabled";
  242. }
  243. }; // struct GetBucketVersioningResponse
  244. using SetBucketVersioningResponse = Response;
  245. using DeleteBucketReplicationResponse = Response;
  246. struct GetBucketReplicationResponse : public Response {
  247. ReplicationConfig config;
  248. GetBucketReplicationResponse(ReplicationConfig config) {
  249. this->config = config;
  250. }
  251. GetBucketReplicationResponse(error::Error err) : Response(err) {}
  252. GetBucketReplicationResponse(const Response& resp) : Response(resp) {}
  253. static GetBucketReplicationResponse ParseXML(std::string_view data);
  254. }; // struct GetBucketReplicationResponse
  255. using SetBucketReplicationResponse = Response;
  256. using DeleteBucketLifecycleResponse = Response;
  257. struct GetBucketLifecycleResponse : public Response {
  258. LifecycleConfig config;
  259. GetBucketLifecycleResponse(LifecycleConfig config) { this->config = config; }
  260. GetBucketLifecycleResponse(error::Error err) : Response(err) {}
  261. GetBucketLifecycleResponse(const Response& resp) : Response(resp) {}
  262. static GetBucketLifecycleResponse ParseXML(std::string_view data);
  263. }; // struct GetBucketLifecycleResponse
  264. using SetBucketLifecycleResponse = Response;
  265. using DeleteBucketTagsResponse = Response;
  266. struct GetBucketTagsResponse : public Response {
  267. std::map<std::string, std::string> tags;
  268. GetBucketTagsResponse(std::map<std::string, std::string> tags) {
  269. this->tags = tags;
  270. }
  271. GetBucketTagsResponse(error::Error err) : Response(err) {}
  272. GetBucketTagsResponse(const Response& resp) : Response(resp) {}
  273. static GetBucketTagsResponse ParseXML(std::string_view data);
  274. }; // struct GetBucketTagsResponse
  275. using SetBucketTagsResponse = Response;
  276. using DeleteObjectLockConfigResponse = Response;
  277. struct GetObjectLockConfigResponse : public Response {
  278. ObjectLockConfig config;
  279. GetObjectLockConfigResponse(ObjectLockConfig config) {
  280. this->config = config;
  281. }
  282. GetObjectLockConfigResponse(error::Error err) : Response(err) {}
  283. GetObjectLockConfigResponse(const Response& resp) : Response(resp) {}
  284. }; // struct GetObjectLockConfigResponse
  285. using SetObjectLockConfigResponse = Response;
  286. using DeleteObjectTagsResponse = Response;
  287. struct GetObjectTagsResponse : public Response {
  288. std::map<std::string, std::string> tags;
  289. GetObjectTagsResponse(std::map<std::string, std::string> tags) {
  290. this->tags = tags;
  291. }
  292. GetObjectTagsResponse(error::Error err) : Response(err) {}
  293. GetObjectTagsResponse(const Response& resp) : Response(resp) {}
  294. static GetObjectTagsResponse ParseXML(std::string_view data);
  295. }; // struct GetObjectTagsResponse
  296. using SetObjectTagsResponse = Response;
  297. using EnableObjectLegalHoldResponse = Response;
  298. using DisableObjectLegalHoldResponse = Response;
  299. struct IsObjectLegalHoldEnabledResponse : public Response {
  300. bool enabled = false;
  301. IsObjectLegalHoldEnabledResponse(bool enabled) { this->enabled = enabled; }
  302. IsObjectLegalHoldEnabledResponse(error::Error err) : Response(err) {}
  303. IsObjectLegalHoldEnabledResponse(const Response& resp) : Response(resp) {}
  304. }; // struct IsObjectLegalHoldEnabledResponse
  305. struct GetObjectRetentionResponse : public Response {
  306. RetentionMode retention_mode;
  307. utils::Time retain_until_date;
  308. GetObjectRetentionResponse() {}
  309. GetObjectRetentionResponse(error::Error err) : Response(err) {}
  310. GetObjectRetentionResponse(const Response& resp) : Response(resp) {}
  311. }; // struct GetObjectRetentionResponse
  312. using SetObjectRetentionResponse = Response;
  313. struct GetPresignedObjectUrlResponse : public Response {
  314. std::string url;
  315. GetPresignedObjectUrlResponse(std::string url) { this->url = url; }
  316. GetPresignedObjectUrlResponse(error::Error err) : Response(err) {}
  317. GetPresignedObjectUrlResponse(const Response& resp) : Response(resp) {}
  318. }; // struct GetPresignedObjectUrlResponse
  319. struct GetPresignedPostFormDataResponse : public Response {
  320. std::map<std::string, std::string> form_data;
  321. GetPresignedPostFormDataResponse(
  322. std::map<std::string, std::string> form_data) {
  323. this->form_data = form_data;
  324. }
  325. GetPresignedPostFormDataResponse(error::Error err) : Response(err) {}
  326. GetPresignedPostFormDataResponse(const Response& resp) : Response(resp) {}
  327. }; // struct GetPresignedPostFormDataResponse
  328. } // namespace s3
  329. } // namespace minio
  330. #endif // #ifndef _MINIO_S3_RESPONSE_H