6 #include "azure/core/context.hpp"
7 #include "azure/core/http/http.hpp"
8 #include "azure/core/http/pipeline.hpp"
9 #include "azure/core/nullable.hpp"
10 #include "azure/core/response.hpp"
11 #include "azure/storage/common/storage_common.hpp"
12 #include "azure/storage/common/storage_error.hpp"
13 #include "azure/storage/common/xml_wrapper.hpp"
21 #include <type_traits>
24 namespace Azure {
namespace Storage {
namespace Blobs {
26 constexpr
static const char* c_ApiVersion =
"2019-12-12";
54 inline std::string AccessTierToString(
const AccessTier& access_tier)
58 case AccessTier::Unknown:
90 case AccessTier::Cool:
92 case AccessTier::Archive:
99 inline AccessTier AccessTierFromString(
const std::string& access_tier)
101 if (access_tier ==
"")
103 return AccessTier::Unknown;
105 if (access_tier ==
"P1")
107 return AccessTier::P1;
109 if (access_tier ==
"P2")
111 return AccessTier::P2;
113 if (access_tier ==
"P3")
115 return AccessTier::P3;
117 if (access_tier ==
"P4")
119 return AccessTier::P4;
121 if (access_tier ==
"P6")
123 return AccessTier::P6;
125 if (access_tier ==
"P10")
127 return AccessTier::P10;
129 if (access_tier ==
"P15")
131 return AccessTier::P15;
133 if (access_tier ==
"P20")
135 return AccessTier::P20;
137 if (access_tier ==
"P30")
139 return AccessTier::P30;
141 if (access_tier ==
"P40")
143 return AccessTier::P40;
145 if (access_tier ==
"P50")
147 return AccessTier::P50;
149 if (access_tier ==
"P60")
151 return AccessTier::P60;
153 if (access_tier ==
"P70")
155 return AccessTier::P70;
157 if (access_tier ==
"P80")
159 return AccessTier::P80;
161 if (access_tier ==
"Hot")
163 return AccessTier::Hot;
165 if (access_tier ==
"Cool")
167 return AccessTier::Cool;
169 if (access_tier ==
"Archive")
171 return AccessTier::Archive;
173 throw std::runtime_error(
"cannot convert " + access_tier +
" to AccessTier");
176 enum class AccountKind
186 inline std::string AccountKindToString(
const AccountKind& account_kind)
188 switch (account_kind)
190 case AccountKind::Unknown:
192 case AccountKind::Storage:
194 case AccountKind::BlobStorage:
195 return "BlobStorage";
196 case AccountKind::StorageV2:
198 case AccountKind::FileStorage:
199 return "FileStorage";
200 case AccountKind::BlockBlobStorage:
201 return "BlockBlobStorage";
203 return std::string();
207 inline AccountKind AccountKindFromString(
const std::string& account_kind)
209 if (account_kind ==
"")
211 return AccountKind::Unknown;
213 if (account_kind ==
"Storage")
215 return AccountKind::Storage;
217 if (account_kind ==
"BlobStorage")
219 return AccountKind::BlobStorage;
221 if (account_kind ==
"StorageV2")
223 return AccountKind::StorageV2;
225 if (account_kind ==
"FileStorage")
227 return AccountKind::FileStorage;
229 if (account_kind ==
"BlockBlobStorage")
231 return AccountKind::BlockBlobStorage;
233 throw std::runtime_error(
"cannot convert " + account_kind +
" to AccountKind");
239 std::string LastModified;
246 std::string LastModified;
253 std::string LastModified;
254 Azure::Core::Nullable<std::string> TransactionalContentMd5;
255 Azure::Core::Nullable<std::string> TransactionalContentCrc64;
256 int64_t AppendOffset = 0;
257 int64_t CommittedBlockCount = 0;
258 Azure::Core::Nullable<bool> ServerEncrypted;
259 Azure::Core::Nullable<std::string> EncryptionKeySha256;
260 Azure::Core::Nullable<std::string> EncryptionScope;
266 std::string LastModified;
267 Azure::Core::Nullable<std::string> TransactionalContentMd5;
268 Azure::Core::Nullable<std::string> TransactionalContentCrc64;
269 int64_t AppendOffset = 0;
270 int64_t CommittedBlockCount = 0;
271 Azure::Core::Nullable<bool> ServerEncrypted;
272 Azure::Core::Nullable<std::string> EncryptionKeySha256;
273 Azure::Core::Nullable<std::string> EncryptionScope;
276 enum class BlobArchiveStatus
279 RehydratePendingToHot,
280 RehydratePendingToCool,
283 inline std::string BlobArchiveStatusToString(
const BlobArchiveStatus& blob_archive_status)
285 switch (blob_archive_status)
287 case BlobArchiveStatus::Unknown:
289 case BlobArchiveStatus::RehydratePendingToHot:
290 return "rehydrate-pending-to-hot";
291 case BlobArchiveStatus::RehydratePendingToCool:
292 return "rehydrate-pending-to-cool";
294 return std::string();
298 inline BlobArchiveStatus BlobArchiveStatusFromString(
const std::string& blob_archive_status)
300 if (blob_archive_status ==
"")
302 return BlobArchiveStatus::Unknown;
304 if (blob_archive_status ==
"rehydrate-pending-to-hot")
306 return BlobArchiveStatus::RehydratePendingToHot;
308 if (blob_archive_status ==
"rehydrate-pending-to-cool")
310 return BlobArchiveStatus::RehydratePendingToCool;
312 throw std::runtime_error(
"cannot convert " + blob_archive_status +
" to BlobArchiveStatus");
323 std::string AllowedOrigins;
324 std::string AllowedMethods;
325 std::string AllowedHeaders;
326 std::string ExposedHeaders;
327 int32_t MaxAgeInSeconds = 0;
330 enum class BlobGeoReplicationStatus
338 inline std::string BlobGeoReplicationStatusToString(
339 const BlobGeoReplicationStatus& blob_geo_replication_status)
341 switch (blob_geo_replication_status)
343 case BlobGeoReplicationStatus::Unknown:
345 case BlobGeoReplicationStatus::Live:
347 case BlobGeoReplicationStatus::Bootstrap:
349 case BlobGeoReplicationStatus::Unavailable:
350 return "unavailable";
352 return std::string();
356 inline BlobGeoReplicationStatus BlobGeoReplicationStatusFromString(
357 const std::string& blob_geo_replication_status)
359 if (blob_geo_replication_status ==
"")
361 return BlobGeoReplicationStatus::Unknown;
363 if (blob_geo_replication_status ==
"live")
365 return BlobGeoReplicationStatus::Live;
367 if (blob_geo_replication_status ==
"bootstrap")
369 return BlobGeoReplicationStatus::Bootstrap;
371 if (blob_geo_replication_status ==
"unavailable")
373 return BlobGeoReplicationStatus::Unavailable;
375 throw std::runtime_error(
376 "cannot convert " + blob_geo_replication_status +
" to BlobGeoReplicationStatus");
381 std::string ContentType;
382 std::string ContentEncoding;
383 std::string ContentLanguage;
384 std::string ContentMd5;
385 std::string CacheControl;
386 std::string ContentDisposition;
389 enum class BlobLeaseState
398 inline std::string BlobLeaseStateToString(
const BlobLeaseState& blob_lease_state)
400 switch (blob_lease_state)
402 case BlobLeaseState::Available:
404 case BlobLeaseState::Leased:
406 case BlobLeaseState::Expired:
408 case BlobLeaseState::Breaking:
410 case BlobLeaseState::Broken:
413 return std::string();
417 inline BlobLeaseState BlobLeaseStateFromString(
const std::string& blob_lease_state)
419 if (blob_lease_state ==
"available")
421 return BlobLeaseState::Available;
423 if (blob_lease_state ==
"leased")
425 return BlobLeaseState::Leased;
427 if (blob_lease_state ==
"expired")
429 return BlobLeaseState::Expired;
431 if (blob_lease_state ==
"breaking")
433 return BlobLeaseState::Breaking;
435 if (blob_lease_state ==
"broken")
437 return BlobLeaseState::Broken;
439 throw std::runtime_error(
"cannot convert " + blob_lease_state +
" to BlobLeaseState");
442 enum class BlobLeaseStatus
448 inline std::string BlobLeaseStatusToString(
const BlobLeaseStatus& blob_lease_status)
450 switch (blob_lease_status)
452 case BlobLeaseStatus::Locked:
454 case BlobLeaseStatus::Unlocked:
457 return std::string();
461 inline BlobLeaseStatus BlobLeaseStatusFromString(
const std::string& blob_lease_status)
463 if (blob_lease_status ==
"locked")
465 return BlobLeaseStatus::Locked;
467 if (blob_lease_status ==
"unlocked")
469 return BlobLeaseStatus::Unlocked;
471 throw std::runtime_error(
"cannot convert " + blob_lease_status +
" to BlobLeaseStatus");
481 bool Enabled =
false;
482 Azure::Core::Nullable<int32_t> Days;
488 std::string StartsOn;
489 std::string ExpiresOn;
490 std::string Permissions;
495 bool Enabled =
false;
496 Azure::Core::Nullable<std::string> IndexDocument;
497 Azure::Core::Nullable<std::string> DefaultIndexDocumentPath;
498 Azure::Core::Nullable<std::string> ErrorDocument404Path;
509 inline std::string BlobTypeToString(
const BlobType& blob_type)
513 case BlobType::Unknown:
515 case BlobType::BlockBlob:
517 case BlobType::PageBlob:
519 case BlobType::AppendBlob:
522 return std::string();
526 inline BlobType BlobTypeFromString(
const std::string& blob_type)
530 return BlobType::Unknown;
532 if (blob_type ==
"BlockBlob")
534 return BlobType::BlockBlob;
536 if (blob_type ==
"PageBlob")
538 return BlobType::PageBlob;
540 if (blob_type ==
"AppendBlob")
542 return BlobType::AppendBlob;
544 throw std::runtime_error(
"cannot convert " + blob_type +
" to BlobType");
547 enum class BlockListTypeOption
554 inline std::string BlockListTypeOptionToString(
const BlockListTypeOption& block_list_type_option)
556 switch (block_list_type_option)
558 case BlockListTypeOption::Committed:
560 case BlockListTypeOption::Uncommitted:
561 return "uncommitted";
562 case BlockListTypeOption::All:
565 return std::string();
569 inline BlockListTypeOption BlockListTypeOptionFromString(
570 const std::string& block_list_type_option)
572 if (block_list_type_option ==
"committed")
574 return BlockListTypeOption::Committed;
576 if (block_list_type_option ==
"uncommitted")
578 return BlockListTypeOption::Uncommitted;
580 if (block_list_type_option ==
"all")
582 return BlockListTypeOption::All;
584 throw std::runtime_error(
585 "cannot convert " + block_list_type_option +
" to BlockListTypeOption");
595 inline std::string BlockTypeToString(
const BlockType& block_type)
599 case BlockType::Committed:
601 case BlockType::Uncommitted:
602 return "Uncommitted";
603 case BlockType::Latest:
606 return std::string();
610 inline BlockType BlockTypeFromString(
const std::string& block_type)
612 if (block_type ==
"Committed")
614 return BlockType::Committed;
616 if (block_type ==
"Uncommitted")
618 return BlockType::Uncommitted;
620 if (block_type ==
"Latest")
622 return BlockType::Latest;
624 throw std::runtime_error(
"cannot convert " + block_type +
" to BlockType");
630 std::string LastModified;
631 int32_t LeaseTime = 0;
637 std::string LastModified;
638 int32_t LeaseTime = 0;
644 std::string LastModified;
651 std::string LastModified;
658 std::string LastModified;
659 int64_t SequenceNumber = 0;
660 Azure::Core::Nullable<bool> ServerEncrypted;
661 Azure::Core::Nullable<std::string> EncryptionKeySha256;
662 Azure::Core::Nullable<std::string> EncryptionScope;
668 std::string LastModified;
669 Azure::Core::Nullable<std::string> VersionId;
670 Azure::Core::Nullable<bool> ServerEncrypted;
671 Azure::Core::Nullable<std::string> EncryptionKeySha256;
672 Azure::Core::Nullable<std::string> EncryptionScope;
673 Azure::Core::Nullable<std::string> TransactionalContentMd5;
674 Azure::Core::Nullable<std::string> TransactionalContentCrc64;
677 enum class CopyStatus
684 inline std::string CopyStatusToString(
const CopyStatus& copy_status)
688 case CopyStatus::Unknown:
690 case CopyStatus::Success:
692 case CopyStatus::Pending:
695 return std::string();
699 inline CopyStatus CopyStatusFromString(
const std::string& copy_status)
701 if (copy_status ==
"")
703 return CopyStatus::Unknown;
705 if (copy_status ==
"success")
707 return CopyStatus::Success;
709 if (copy_status ==
"pending")
711 return CopyStatus::Pending;
713 throw std::runtime_error(
"cannot convert " + copy_status +
" to CopyStatus");
719 std::string LastModified;
720 Azure::Core::Nullable<std::string> VersionId;
721 Azure::Core::Nullable<bool> ServerEncrypted;
722 Azure::Core::Nullable<std::string> EncryptionKeySha256;
723 Azure::Core::Nullable<std::string> EncryptionScope;
728 std::string Snapshot;
730 std::string LastModified;
731 Azure::Core::Nullable<std::string> VersionId;
732 Azure::Core::Nullable<bool> ServerEncrypted;
733 Azure::Core::Nullable<std::string> EncryptionKeySha256;
734 Azure::Core::Nullable<std::string> EncryptionScope;
740 std::string LastModified;
746 std::string LastModified;
747 Azure::Core::Nullable<std::string> VersionId;
748 Azure::Core::Nullable<bool> ServerEncrypted;
749 Azure::Core::Nullable<std::string> EncryptionKeySha256;
750 Azure::Core::Nullable<std::string> EncryptionScope;
751 Azure::Core::Nullable<int64_t> SequenceNumber;
762 enum class DeleteSnapshotsOption
769 inline std::string DeleteSnapshotsOptionToString(
770 const DeleteSnapshotsOption& delete_snapshots_option)
772 switch (delete_snapshots_option)
774 case DeleteSnapshotsOption::None:
776 case DeleteSnapshotsOption::IncludeSnapshots:
778 case DeleteSnapshotsOption::Only:
781 return std::string();
785 inline DeleteSnapshotsOption DeleteSnapshotsOptionFromString(
786 const std::string& delete_snapshots_option)
788 if (delete_snapshots_option ==
"")
790 return DeleteSnapshotsOption::None;
792 if (delete_snapshots_option ==
"include")
794 return DeleteSnapshotsOption::IncludeSnapshots;
796 if (delete_snapshots_option ==
"only")
798 return DeleteSnapshotsOption::Only;
800 throw std::runtime_error(
801 "cannot convert " + delete_snapshots_option +
" to DeleteSnapshotsOption");
804 enum class EncryptionAlgorithmType
810 inline std::string EncryptionAlgorithmTypeToString(
811 const EncryptionAlgorithmType& encryption_algorithm_type)
813 switch (encryption_algorithm_type)
815 case EncryptionAlgorithmType::Unknown:
817 case EncryptionAlgorithmType::Aes256:
820 return std::string();
824 inline EncryptionAlgorithmType EncryptionAlgorithmTypeFromString(
825 const std::string& encryption_algorithm_type)
827 if (encryption_algorithm_type ==
"")
829 return EncryptionAlgorithmType::Unknown;
831 if (encryption_algorithm_type ==
"AES256")
833 return EncryptionAlgorithmType::Aes256;
835 throw std::runtime_error(
836 "cannot convert " + encryption_algorithm_type +
" to EncryptionAlgorithmType");
841 std::string BlobName;
842 std::string ContainerName;
843 std::string TagValue;
848 std::map<std::string, std::string> Tags;
854 std::string LastModified;
855 int64_t BlobContentLength = 0;
856 std::vector<std::pair<int64_t, int64_t>> PageRanges;
857 std::vector<std::pair<int64_t, int64_t>> ClearRanges;
862 std::string SignedObjectId;
863 std::string SignedTenantId;
864 std::string SignedStartsOn;
865 std::string SignedExpiresOn;
866 std::string SignedService;
867 std::string SignedVersion;
871 enum class ListBlobContainersIncludeItem
878 inline ListBlobContainersIncludeItem operator|(
879 ListBlobContainersIncludeItem lhs,
880 ListBlobContainersIncludeItem rhs)
882 using type = std::underlying_type_t<ListBlobContainersIncludeItem>;
883 return static_cast<ListBlobContainersIncludeItem
>(
884 static_cast<type
>(lhs) |
static_cast<type
>(rhs));
887 inline ListBlobContainersIncludeItem& operator|=(
888 ListBlobContainersIncludeItem& lhs,
889 ListBlobContainersIncludeItem rhs)
895 inline ListBlobContainersIncludeItem operator&(
896 ListBlobContainersIncludeItem lhs,
897 ListBlobContainersIncludeItem rhs)
899 using type = std::underlying_type_t<ListBlobContainersIncludeItem>;
900 return static_cast<ListBlobContainersIncludeItem
>(
901 static_cast<type
>(lhs) &
static_cast<type
>(rhs));
904 inline ListBlobContainersIncludeItem& operator&=(
905 ListBlobContainersIncludeItem& lhs,
906 ListBlobContainersIncludeItem rhs)
912 inline std::string ListBlobContainersIncludeItemToString(
const ListBlobContainersIncludeItem& val)
914 ListBlobContainersIncludeItem value_list[] = {
915 ListBlobContainersIncludeItem::Metadata,
916 ListBlobContainersIncludeItem::Deleted,
918 const char* string_list[] = {
923 for (std::size_t i = 0; i <
sizeof(value_list) /
sizeof(ListBlobContainersIncludeItem); ++i)
925 if ((val & value_list[i]) == value_list[i])
931 ret += string_list[i];
937 enum class ListBlobsIncludeItem
945 UncomittedBlobs = 32,
948 inline ListBlobsIncludeItem operator|(ListBlobsIncludeItem lhs, ListBlobsIncludeItem rhs)
950 using type = std::underlying_type_t<ListBlobsIncludeItem>;
951 return static_cast<ListBlobsIncludeItem
>(
static_cast<type
>(lhs) |
static_cast<type
>(rhs));
954 inline ListBlobsIncludeItem& operator|=(ListBlobsIncludeItem& lhs, ListBlobsIncludeItem rhs)
960 inline ListBlobsIncludeItem operator&(ListBlobsIncludeItem lhs, ListBlobsIncludeItem rhs)
962 using type = std::underlying_type_t<ListBlobsIncludeItem>;
963 return static_cast<ListBlobsIncludeItem
>(
static_cast<type
>(lhs) &
static_cast<type
>(rhs));
966 inline ListBlobsIncludeItem& operator&=(ListBlobsIncludeItem& lhs, ListBlobsIncludeItem rhs)
972 inline std::string ListBlobsIncludeItemToString(
const ListBlobsIncludeItem& val)
974 ListBlobsIncludeItem value_list[] = {
975 ListBlobsIncludeItem::Copy,
976 ListBlobsIncludeItem::Deleted,
977 ListBlobsIncludeItem::Metadata,
978 ListBlobsIncludeItem::Snapshots,
979 ListBlobsIncludeItem::Versions,
980 ListBlobsIncludeItem::UncomittedBlobs,
982 const char* string_list[] = {
991 for (std::size_t i = 0; i <
sizeof(value_list) /
sizeof(ListBlobsIncludeItem); ++i)
993 if ((val & value_list[i]) == value_list[i])
999 ret += string_list[i];
1005 enum class ObjectReplicationStatus
1012 inline std::string ObjectReplicationStatusToString(
1013 const ObjectReplicationStatus& object_replication_status)
1015 switch (object_replication_status)
1017 case ObjectReplicationStatus::Unknown:
1019 case ObjectReplicationStatus::Complete:
1021 case ObjectReplicationStatus::Failed:
1024 return std::string();
1028 inline ObjectReplicationStatus ObjectReplicationStatusFromString(
1029 const std::string& object_replication_status)
1031 if (object_replication_status ==
"")
1033 return ObjectReplicationStatus::Unknown;
1035 if (object_replication_status ==
"complete")
1037 return ObjectReplicationStatus::Complete;
1039 if (object_replication_status ==
"failed")
1041 return ObjectReplicationStatus::Failed;
1043 throw std::runtime_error(
1044 "cannot convert " + object_replication_status +
" to ObjectReplicationStatus");
1047 enum class PublicAccessType
1054 inline std::string PublicAccessTypeToString(
const PublicAccessType& public_access_type)
1056 switch (public_access_type)
1058 case PublicAccessType::Container:
1060 case PublicAccessType::Blob:
1062 case PublicAccessType::Private:
1065 return std::string();
1069 inline PublicAccessType PublicAccessTypeFromString(
const std::string& public_access_type)
1071 if (public_access_type ==
"container")
1073 return PublicAccessType::Container;
1075 if (public_access_type ==
"blob")
1077 return PublicAccessType::Blob;
1079 if (public_access_type ==
"")
1081 return PublicAccessType::Private;
1083 throw std::runtime_error(
"cannot convert " + public_access_type +
" to PublicAccessType");
1086 enum class RehydratePriority
1093 inline std::string RehydratePriorityToString(
const RehydratePriority& rehydrate_priority)
1095 switch (rehydrate_priority)
1097 case RehydratePriority::Unknown:
1099 case RehydratePriority::High:
1101 case RehydratePriority::Standard:
1104 return std::string();
1108 inline RehydratePriority RehydratePriorityFromString(
const std::string& rehydrate_priority)
1110 if (rehydrate_priority ==
"")
1112 return RehydratePriority::Unknown;
1114 if (rehydrate_priority ==
"High")
1116 return RehydratePriority::High;
1118 if (rehydrate_priority ==
"Standard")
1120 return RehydratePriority::Standard;
1122 throw std::runtime_error(
"cannot convert " + rehydrate_priority +
" to RehydratePriority");
1128 std::string LastModified;
1129 Azure::Core::Nullable<int64_t> SequenceNumber;
1135 std::string LastModified;
1141 std::string LastModified;
1142 std::string LeaseId;
1148 std::string LastModified;
1149 std::string LeaseId;
1155 std::string LastModified;
1156 int64_t SequenceNumber = 0;
1162 std::string LastModified;
1163 bool IsSealed =
true;
1173 std::string LastModified;
1174 Azure::Core::Nullable<int64_t> SequenceNumber;
1180 std::string LastModified;
1181 Azure::Core::Nullable<int64_t> SequenceNumber;
1191 std::string LastModified;
1197 std::string LastModified;
1217 inline std::string SkuNameToString(
const SkuName& sku_name)
1221 case SkuName::Unknown:
1223 case SkuName::StandardLrs:
1224 return "Standard_LRS";
1225 case SkuName::StandardGrs:
1226 return "Standard_GRS";
1227 case SkuName::StandardRagrs:
1228 return "Standard_RAGRS";
1229 case SkuName::StandardZrs:
1230 return "Standard_ZRS";
1231 case SkuName::PremiumLrs:
1232 return "Premium_LRS";
1233 case SkuName::PremiumZrs:
1234 return "Premium_ZRS";
1235 case SkuName::StandardGzrs:
1236 return "Standard_GZRS";
1237 case SkuName::StandardRagzrs:
1238 return "Standard_RAGZRS";
1240 return std::string();
1244 inline SkuName SkuNameFromString(
const std::string& sku_name)
1248 return SkuName::Unknown;
1250 if (sku_name ==
"Standard_LRS")
1252 return SkuName::StandardLrs;
1254 if (sku_name ==
"Standard_GRS")
1256 return SkuName::StandardGrs;
1258 if (sku_name ==
"Standard_RAGRS")
1260 return SkuName::StandardRagrs;
1262 if (sku_name ==
"Standard_ZRS")
1264 return SkuName::StandardZrs;
1266 if (sku_name ==
"Premium_LRS")
1268 return SkuName::PremiumLrs;
1270 if (sku_name ==
"Premium_ZRS")
1272 return SkuName::PremiumZrs;
1274 if (sku_name ==
"Standard_GZRS")
1276 return SkuName::StandardGzrs;
1278 if (sku_name ==
"Standard_RAGZRS")
1280 return SkuName::StandardRagzrs;
1282 throw std::runtime_error(
"cannot convert " + sku_name +
" to SkuName");
1287 Azure::Core::Nullable<std::string> TransactionalContentMd5;
1288 Azure::Core::Nullable<std::string> TransactionalContentCrc64;
1289 Azure::Core::Nullable<bool> ServerEncrypted;
1290 Azure::Core::Nullable<std::string> EncryptionKeySha256;
1291 Azure::Core::Nullable<std::string> EncryptionScope;
1296 Azure::Core::Nullable<std::string> TransactionalContentMd5;
1297 Azure::Core::Nullable<std::string> TransactionalContentCrc64;
1298 Azure::Core::Nullable<bool> ServerEncrypted;
1299 Azure::Core::Nullable<std::string> EncryptionKeySha256;
1300 Azure::Core::Nullable<std::string> EncryptionScope;
1305 std::string ContentType;
1319 std::string LastModified;
1320 Azure::Core::Nullable<std::string> VersionId;
1321 Azure::Core::Nullable<bool> ServerEncrypted;
1322 Azure::Core::Nullable<std::string> EncryptionKeySha256;
1323 Azure::Core::Nullable<std::string> EncryptionScope;
1324 Azure::Core::Nullable<std::string> TransactionalContentMd5;
1325 Azure::Core::Nullable<std::string> TransactionalContentCrc64;
1331 std::string LastModified;
1332 Azure::Core::Nullable<std::string> TransactionalContentMd5;
1333 Azure::Core::Nullable<std::string> TransactionalContentCrc64;
1334 int64_t SequenceNumber = 0;
1335 Azure::Core::Nullable<bool> ServerEncrypted;
1336 Azure::Core::Nullable<std::string> EncryptionKeySha256;
1337 Azure::Core::Nullable<std::string> EncryptionScope;
1343 std::string LastModified;
1344 Azure::Core::Nullable<std::string> TransactionalContentMd5;
1345 Azure::Core::Nullable<std::string> TransactionalContentCrc64;
1346 int64_t SequenceNumber = 0;
1347 Azure::Core::Nullable<bool> ServerEncrypted;
1348 Azure::Core::Nullable<std::string> EncryptionKeySha256;
1349 Azure::Core::Nullable<std::string> EncryptionScope;
1354 std::string Version;
1355 bool Delete =
false;
1365 std::string LastModified;
1366 std::map<std::string, std::string> Metadata;
1367 PublicAccessType AccessType = PublicAccessType::Private;
1368 bool HasImmutabilityPolicy =
false;
1369 bool HasLegalHold =
false;
1370 Azure::Core::Nullable<std::string> LeaseDuration;
1371 BlobLeaseState LeaseState = BlobLeaseState::Available;
1372 BlobLeaseStatus LeaseStatus = BlobLeaseStatus::Unlocked;
1373 std::string DefaultEncryptionScope;
1374 bool PreventEncryptionScopeOverride =
false;
1375 bool IsDeleted =
false;
1376 Azure::Core::Nullable<std::string> VersionId;
1377 Azure::Core::Nullable<std::string> DeletedTime;
1378 Azure::Core::Nullable<int32_t> RemainingRetentionDays;
1383 BlobGeoReplicationStatus Status = BlobGeoReplicationStatus::Unknown;
1384 Azure::Core::Nullable<std::string> LastSyncTime;
1389 std::string Version;
1390 bool Enabled =
false;
1392 Azure::Core::Nullable<bool> IncludeApis;
1397 std::string ServiceEndpoint;
1399 std::string NextMarker;
1400 std::vector<FilterBlobItem> Items;
1405 Blobs::SkuName SkuName = Blobs::SkuName::Unknown;
1406 Blobs::AccountKind AccountKind = Blobs::AccountKind::Unknown;
1412 std::string LastModified;
1413 std::string ContentType;
1414 int64_t ContentLength = 0;
1415 std::vector<BlobBlock> CommittedBlocks;
1416 std::vector<BlobBlock> UncommittedBlocks;
1421 PublicAccessType AccessType = PublicAccessType::Private;
1423 std::string LastModified;
1424 std::vector<BlobSignedIdentifier> SignedIdentifiers;
1430 std::string LastModified;
1431 std::map<std::string, std::string> Metadata;
1432 PublicAccessType AccessType = PublicAccessType::Private;
1433 bool HasImmutabilityPolicy =
false;
1434 bool HasLegalHold =
false;
1435 Azure::Core::Nullable<std::string> LeaseDuration;
1436 BlobLeaseState LeaseState = BlobLeaseState::Available;
1437 BlobLeaseStatus LeaseStatus = BlobLeaseStatus::Unlocked;
1438 std::string DefaultEncryptionScope;
1439 bool PreventEncryptionScopeOverride =
false;
1445 ObjectReplicationStatus ReplicationStatus = ObjectReplicationStatus::Unknown;
1451 std::string LastModified;
1453 Blobs::CopyStatus CopyStatus = Blobs::CopyStatus::Unknown;
1454 Azure::Core::Nullable<std::string> VersionId;
1460 std::string LastModified;
1462 Blobs::CopyStatus CopyStatus = Blobs::CopyStatus::Unknown;
1463 Azure::Core::Nullable<std::string> VersionId;
1471 std::vector<BlobCorsRule> Cors;
1472 std::string DefaultServiceVersion;
1482 std::vector<BlobCorsRule> Cors;
1483 std::string DefaultServiceVersion;
1495 std::string ServiceEndpoint;
1498 std::string NextMarker;
1499 std::vector<BlobContainerItem> Items;
1504 std::string PolicyId;
1505 std::vector<ObjectReplicationRule> Rules;
1511 bool Deleted =
false;
1512 std::string Snapshot;
1513 Azure::Core::Nullable<std::string> VersionId;
1514 Azure::Core::Nullable<bool> IsCurrentVersion;
1516 std::map<std::string, std::string> Metadata;
1517 std::string CreationTime;
1518 std::string LastModified;
1520 int64_t ContentLength = 0;
1521 Blobs::BlobType BlobType = Blobs::BlobType::Unknown;
1522 Azure::Core::Nullable<AccessTier> Tier;
1523 Azure::Core::Nullable<bool> AccessTierInferred;
1524 BlobLeaseStatus LeaseStatus = BlobLeaseStatus::Unlocked;
1525 BlobLeaseState LeaseState = BlobLeaseState::Available;
1526 Azure::Core::Nullable<std::string> LeaseDuration;
1527 Azure::Core::Nullable<bool> ServerEncrypted;
1528 Azure::Core::Nullable<std::string> EncryptionKeySha256;
1529 Azure::Core::Nullable<std::string> EncryptionScope;
1530 Azure::Core::Nullable<int64_t> SequenceNumber;
1531 Azure::Core::Nullable<bool> IsSealed;
1532 std::vector<ObjectReplicationPolicy>
1533 ObjectReplicationSourceProperties;
1538 std::unique_ptr<Azure::Core::Http::BodyStream> BodyStream;
1540 std::string LastModified;
1541 Azure::Core::Nullable<std::string> ContentRange;
1543 std::map<std::string, std::string> Metadata;
1544 Azure::Core::Nullable<int64_t> SequenceNumber;
1545 Azure::Core::Nullable<int64_t> CommittedBlockCount;
1546 Azure::Core::Nullable<bool> IsSealed;
1547 Blobs::BlobType BlobType = Blobs::BlobType::Unknown;
1548 Azure::Core::Nullable<std::string> TransactionalContentMd5;
1549 Azure::Core::Nullable<std::string> TransactionalContentCrc64;
1550 Azure::Core::Nullable<std::string> LeaseDuration;
1551 Azure::Core::Nullable<BlobLeaseState> LeaseState;
1552 Azure::Core::Nullable<BlobLeaseStatus> LeaseStatus;
1553 Azure::Core::Nullable<bool> ServerEncrypted;
1554 Azure::Core::Nullable<std::string> EncryptionKeySha256;
1555 Azure::Core::Nullable<std::string> EncryptionScope;
1556 Azure::Core::Nullable<std::string>
1557 ObjectReplicationDestinationPolicyId;
1558 std::vector<ObjectReplicationPolicy>
1559 ObjectReplicationSourceProperties;
1565 std::string LastModified;
1566 std::string CreationTime;
1567 std::map<std::string, std::string> Metadata;
1568 Blobs::BlobType BlobType = Blobs::BlobType::Unknown;
1569 Azure::Core::Nullable<std::string> LeaseDuration;
1570 Azure::Core::Nullable<BlobLeaseState> LeaseState;
1571 Azure::Core::Nullable<BlobLeaseStatus> LeaseStatus;
1572 int64_t ContentLength = 0;
1574 Azure::Core::Nullable<int64_t> SequenceNumber;
1575 Azure::Core::Nullable<int32_t> CommittedBlockCount;
1576 Azure::Core::Nullable<bool> IsSealed;
1577 Azure::Core::Nullable<bool> ServerEncrypted;
1578 Azure::Core::Nullable<std::string> EncryptionKeySha256;
1579 Azure::Core::Nullable<std::string> EncryptionScope;
1580 Azure::Core::Nullable<AccessTier> Tier;
1581 Azure::Core::Nullable<bool> AccessTierInferred;
1582 Azure::Core::Nullable<BlobArchiveStatus> ArchiveStatus;
1583 Azure::Core::Nullable<std::string> AccessTierChangeTime;
1584 Azure::Core::Nullable<std::string> CopyId;
1585 Azure::Core::Nullable<std::string> CopySource;
1586 Azure::Core::Nullable<Blobs::CopyStatus> CopyStatus;
1587 Azure::Core::Nullable<std::string> CopyProgress;
1588 Azure::Core::Nullable<std::string> CopyCompletionTime;
1589 Azure::Core::Nullable<std::string>
1590 ObjectReplicationDestinationPolicyId;
1591 std::vector<ObjectReplicationPolicy>
1592 ObjectReplicationSourceProperties;
1597 std::string ServiceEndpoint;
1598 std::string Container;
1600 std::string Delimiter;
1602 std::string NextMarker;
1603 std::vector<BlobItem> Items;
1604 std::vector<BlobPrefix> BlobPrefixes;
1609 std::string ServiceEndpoint;
1610 std::string Container;
1613 std::string NextMarker;
1614 std::vector<BlobItem> Items;
1623 Azure::Core::Nullable<int32_t> Timeout;
1624 Azure::Core::Nullable<std::string> Prefix;
1625 Azure::Core::Nullable<std::string> Marker;
1626 Azure::Core::Nullable<int32_t> MaxResults;
1627 ListBlobContainersIncludeItem Include = ListBlobContainersIncludeItem::None;
1630 static Azure::Core::Response<ListContainersSegmentResult> ListBlobContainers(
1631 const Azure::Core::Context& context,
1632 Azure::Core::Http::HttpPipeline& pipeline,
1633 const Azure::Core::Http::Url& url,
1637 auto request = Azure::Core::Http::Request(Azure::Core::Http::HttpMethod::Get, url);
1638 request.AddHeader(
"x-ms-version", c_ApiVersion);
1639 if (options.Timeout.HasValue())
1641 request.GetUrl().AppendQuery(
"timeout", std::to_string(options.Timeout.GetValue()));
1643 request.GetUrl().AppendQuery(
"comp",
"list");
1644 if (options.Prefix.HasValue())
1646 request.GetUrl().AppendQuery(
"prefix", options.Prefix.GetValue());
1648 if (options.Marker.HasValue())
1650 request.GetUrl().AppendQuery(
"marker", options.Marker.GetValue());
1652 if (options.MaxResults.HasValue())
1654 request.GetUrl().AppendQuery(
"maxresults", std::to_string(options.MaxResults.GetValue()));
1656 std::string list_blob_containers_include_item
1657 = ListBlobContainersIncludeItemToString(options.Include);
1658 if (!list_blob_containers_include_item.empty())
1660 request.GetUrl().AppendQuery(
"include", list_blob_containers_include_item);
1662 auto pHttpResponse = pipeline.Send(context, request);
1663 Azure::Core::Http::RawResponse& httpResponse = *pHttpResponse;
1664 ListContainersSegmentResult response;
1665 auto http_status_code
1666 =
static_cast<std::underlying_type<Azure::Core::Http::HttpStatusCode>::type
>(
1667 httpResponse.GetStatusCode());
1668 if (!(http_status_code == 200))
1670 throw StorageError::CreateFromResponse(std::move(pHttpResponse));
1673 const auto& httpResponseBody = httpResponse.GetBody();
1675 reinterpret_cast<const char*
>(httpResponseBody.data()), httpResponseBody.size());
1676 response = ListContainersSegmentResultFromXml(reader);
1678 return Azure::Core::Response<ListContainersSegmentResult>(
1679 std::move(response), std::move(pHttpResponse));
1684 Azure::Core::Nullable<int32_t> Timeout;
1685 std::string StartsOn;
1686 std::string ExpiresOn;
1689 static Azure::Core::Response<GetUserDelegationKeyResult> GetUserDelegationKey(
1690 const Azure::Core::Context& context,
1691 Azure::Core::Http::HttpPipeline& pipeline,
1692 const Azure::Core::Http::Url& url,
1696 std::string xml_body;
1699 GetUserDelegationKeyOptionsToXml(writer, options);
1700 xml_body = writer.GetDocument();
1701 writer.Write(XmlNode{XmlNodeType::End});
1703 Azure::Core::Http::MemoryBodyStream xml_body_stream(
1704 reinterpret_cast<const uint8_t*
>(xml_body.data()), xml_body.length());
1705 auto request = Azure::Core::Http::Request(
1706 Azure::Core::Http::HttpMethod::Post, url, &xml_body_stream);
1707 request.AddHeader(
"Content-Length", std::to_string(xml_body_stream.Length()));
1708 request.GetUrl().AppendQuery(
"restype",
"service");
1709 request.GetUrl().AppendQuery(
"comp",
"userdelegationkey");
1710 request.AddHeader(
"x-ms-version", c_ApiVersion);
1711 if (options.Timeout.HasValue())
1713 request.GetUrl().AppendQuery(
"timeout", std::to_string(options.Timeout.GetValue()));
1715 auto pHttpResponse = pipeline.Send(context, request);
1716 Azure::Core::Http::RawResponse& httpResponse = *pHttpResponse;
1717 GetUserDelegationKeyResult response;
1718 auto http_status_code
1719 =
static_cast<std::underlying_type<Azure::Core::Http::HttpStatusCode>::type
>(
1720 httpResponse.GetStatusCode());
1721 if (!(http_status_code == 200))
1723 throw StorageError::CreateFromResponse(std::move(pHttpResponse));
1726 const auto& httpResponseBody = httpResponse.GetBody();
1728 reinterpret_cast<const char*
>(httpResponseBody.data()), httpResponseBody.size());
1729 response = GetUserDelegationKeyResultFromXml(reader);
1731 return Azure::Core::Response<GetUserDelegationKeyResult>(
1732 std::move(response), std::move(pHttpResponse));
1737 Azure::Core::Nullable<int32_t> Timeout;
1740 static Azure::Core::Response<GetServicePropertiesResult> GetProperties(
1741 const Azure::Core::Context& context,
1742 Azure::Core::Http::HttpPipeline& pipeline,
1743 const Azure::Core::Http::Url& url,
1747 auto request = Azure::Core::Http::Request(Azure::Core::Http::HttpMethod::Get, url);
1748 request.GetUrl().AppendQuery(
"restype",
"service");
1749 request.GetUrl().AppendQuery(
"comp",
"properties");
1750 request.AddHeader(
"x-ms-version", c_ApiVersion);
1751 if (options.Timeout.HasValue())
1753 request.GetUrl().AppendQuery(
"timeout", std::to_string(options.Timeout.GetValue()));
1755 auto pHttpResponse = pipeline.Send(context, request);
1756 Azure::Core::Http::RawResponse& httpResponse = *pHttpResponse;
1758 auto http_status_code
1759 =
static_cast<std::underlying_type<Azure::Core::Http::HttpStatusCode>::type
>(
1760 httpResponse.GetStatusCode());
1761 if (!(http_status_code == 200))
1763 throw StorageError::CreateFromResponse(std::move(pHttpResponse));
1766 const auto& httpResponseBody = httpResponse.GetBody();
1768 reinterpret_cast<const char*
>(httpResponseBody.data()), httpResponseBody.size());
1769 response = GetServicePropertiesResultFromXml(reader);
1771 return Azure::Core::Response<GetServicePropertiesResult>(
1772 std::move(response), std::move(pHttpResponse));
1777 Azure::Core::Nullable<int32_t> Timeout;
1781 static Azure::Core::Response<SetServicePropertiesResult> SetProperties(
1782 const Azure::Core::Context& context,
1783 Azure::Core::Http::HttpPipeline& pipeline,
1784 const Azure::Core::Http::Url& url,
1788 std::string xml_body;
1791 SetServicePropertiesOptionsToXml(writer, options);
1792 xml_body = writer.GetDocument();
1793 writer.Write(XmlNode{XmlNodeType::End});
1795 Azure::Core::Http::MemoryBodyStream xml_body_stream(
1796 reinterpret_cast<const uint8_t*
>(xml_body.data()), xml_body.length());
1798 = Azure::Core::Http::Request(Azure::Core::Http::HttpMethod::Put, url, &xml_body_stream);
1799 request.AddHeader(
"Content-Length", std::to_string(xml_body_stream.Length()));
1800 request.GetUrl().AppendQuery(
"restype",
"service");
1801 request.GetUrl().AppendQuery(
"comp",
"properties");
1802 request.AddHeader(
"x-ms-version", c_ApiVersion);
1803 if (options.Timeout.HasValue())
1805 request.GetUrl().AppendQuery(
"timeout", std::to_string(options.Timeout.GetValue()));
1807 auto pHttpResponse = pipeline.Send(context, request);
1808 Azure::Core::Http::RawResponse& httpResponse = *pHttpResponse;
1809 SetServicePropertiesResult response;
1810 auto http_status_code
1811 =
static_cast<std::underlying_type<Azure::Core::Http::HttpStatusCode>::type
>(
1812 httpResponse.GetStatusCode());
1813 if (!(http_status_code == 202))
1815 throw StorageError::CreateFromResponse(std::move(pHttpResponse));
1817 return Azure::Core::Response<SetServicePropertiesResult>(
1818 std::move(response), std::move(pHttpResponse));
1823 Azure::Core::Nullable<int32_t> Timeout;
1826 static Azure::Core::Response<GetAccountInfoResult> GetAccountInfo(
1827 const Azure::Core::Context& context,
1828 Azure::Core::Http::HttpPipeline& pipeline,
1829 const Azure::Core::Http::Url& url,
1833 auto request = Azure::Core::Http::Request(Azure::Core::Http::HttpMethod::Head, url);
1834 request.GetUrl().AppendQuery(
"restype",
"account");
1835 request.GetUrl().AppendQuery(
"comp",
"properties");
1836 request.AddHeader(
"x-ms-version", c_ApiVersion);
1837 if (options.Timeout.HasValue())
1839 request.GetUrl().AppendQuery(
"timeout", std::to_string(options.Timeout.GetValue()));
1841 auto pHttpResponse = pipeline.Send(context, request);
1842 Azure::Core::Http::RawResponse& httpResponse = *pHttpResponse;
1844 auto http_status_code
1845 =
static_cast<std::underlying_type<Azure::Core::Http::HttpStatusCode>::type
>(
1846 httpResponse.GetStatusCode());
1847 if (!(http_status_code == 200))
1849 throw StorageError::CreateFromResponse(std::move(pHttpResponse));
1851 response.SkuName = SkuNameFromString(httpResponse.GetHeaders().at(
"x-ms-sku-name"));
1852 response.AccountKind
1853 = AccountKindFromString(httpResponse.GetHeaders().at(
"x-ms-account-kind"));
1854 return Azure::Core::Response<GetAccountInfoResult>(
1855 std::move(response), std::move(pHttpResponse));
1860 Azure::Core::Nullable<int32_t> Timeout;
1863 static Azure::Core::Response<GetServiceStatisticsResult> GetStatistics(
1864 const Azure::Core::Context& context,
1865 Azure::Core::Http::HttpPipeline& pipeline,
1866 const Azure::Core::Http::Url& url,
1870 auto request = Azure::Core::Http::Request(Azure::Core::Http::HttpMethod::Get, url);
1871 request.GetUrl().AppendQuery(
"restype",
"service");
1872 request.GetUrl().AppendQuery(
"comp",
"stats");
1873 request.AddHeader(
"x-ms-version", c_ApiVersion);
1874 if (options.Timeout.HasValue())
1876 request.GetUrl().AppendQuery(
"timeout", std::to_string(options.Timeout.GetValue()));
1878 auto pHttpResponse = pipeline.Send(context, request);
1879 Azure::Core::Http::RawResponse& httpResponse = *pHttpResponse;
1881 auto http_status_code
1882 =
static_cast<std::underlying_type<Azure::Core::Http::HttpStatusCode>::type
>(
1883 httpResponse.GetStatusCode());
1884 if (!(http_status_code == 200))
1886 throw StorageError::CreateFromResponse(std::move(pHttpResponse));
1889 const auto& httpResponseBody = httpResponse.GetBody();
1891 reinterpret_cast<const char*
>(httpResponseBody.data()), httpResponseBody.size());
1892 response = GetServiceStatisticsResultFromXml(reader);
1894 return Azure::Core::Response<GetServiceStatisticsResult>(
1895 std::move(response), std::move(pHttpResponse));
1900 Azure::Core::Nullable<int32_t> Timeout;
1902 Azure::Core::Nullable<std::string> Marker;
1903 Azure::Core::Nullable<int32_t> MaxResults;
1906 static Azure::Core::Response<FilterBlobsSegmentResult> FilterBlobs(
1907 const Azure::Core::Context& context,
1908 Azure::Core::Http::HttpPipeline& pipeline,
1909 const Azure::Core::Http::Url& url,
1913 auto request = Azure::Core::Http::Request(Azure::Core::Http::HttpMethod::Get, url);
1914 request.AddHeader(
"x-ms-version", c_ApiVersion);
1915 if (options.Timeout.HasValue())
1917 request.GetUrl().AppendQuery(
"timeout", std::to_string(options.Timeout.GetValue()));
1919 request.GetUrl().AppendQuery(
"comp",
"blobs");
1920 request.GetUrl().AppendQuery(
"where", options.Where);
1921 if (options.Marker.HasValue())
1923 request.GetUrl().AppendQuery(
"marker", options.Marker.GetValue());
1925 if (options.MaxResults.HasValue())
1927 request.GetUrl().AppendQuery(
"maxresults", std::to_string(options.MaxResults.GetValue()));
1929 auto pHttpResponse = pipeline.Send(context, request);
1930 Azure::Core::Http::RawResponse& httpResponse = *pHttpResponse;
1931 FilterBlobsSegmentResult response;
1932 auto http_status_code
1933 =
static_cast<std::underlying_type<Azure::Core::Http::HttpStatusCode>::type
>(
1934 httpResponse.GetStatusCode());
1935 if (!(http_status_code == 200))
1937 throw StorageError::CreateFromResponse(std::move(pHttpResponse));
1940 const auto& httpResponseBody = httpResponse.GetBody();
1942 reinterpret_cast<const char*
>(httpResponseBody.data()), httpResponseBody.size());
1943 response = FilterBlobsSegmentResultFromXml(reader);
1945 return Azure::Core::Response<FilterBlobsSegmentResult>(
1946 std::move(response), std::move(pHttpResponse));
1950 static FilterBlobsSegmentResult FilterBlobsSegmentResultFromXml(XmlReader& reader)
1952 FilterBlobsSegmentResult ret;
1953 enum class XmlTagName
1955 k_EnumerationResults,
1962 std::vector<XmlTagName> path;
1965 auto node = reader.Read();
1966 if (node.Type == XmlNodeType::End)
1970 else if (node.Type == XmlNodeType::EndTag)
1972 if (path.size() > 0)
1981 else if (node.Type == XmlNodeType::StartTag)
1983 if (std::strcmp(node.Name,
"EnumerationResults") == 0)
1985 path.emplace_back(XmlTagName::k_EnumerationResults);
1987 else if (std::strcmp(node.Name,
"Where") == 0)
1989 path.emplace_back(XmlTagName::k_Where);
1991 else if (std::strcmp(node.Name,
"NextMarker") == 0)
1993 path.emplace_back(XmlTagName::k_NextMarker);
1995 else if (std::strcmp(node.Name,
"Blobs") == 0)
1997 path.emplace_back(XmlTagName::k_Blobs);
1999 else if (std::strcmp(node.Name,
"Blob") == 0)
2001 path.emplace_back(XmlTagName::k_Blob);
2005 path.emplace_back(XmlTagName::k_Unknown);
2007 if (path.size() == 3 && path[0] == XmlTagName::k_EnumerationResults
2008 && path[1] == XmlTagName::k_Blobs && path[2] == XmlTagName::k_Blob)
2010 ret.Items.emplace_back(FilterBlobItemFromXml(reader));
2014 else if (node.Type == XmlNodeType::Text)
2016 if (path.size() == 2 && path[0] == XmlTagName::k_EnumerationResults
2017 && path[1] == XmlTagName::k_Where)
2019 ret.Where = node.Value;
2022 path.size() == 2 && path[0] == XmlTagName::k_EnumerationResults
2023 && path[1] == XmlTagName::k_NextMarker)
2025 ret.NextMarker = node.Value;
2028 else if (node.Type == XmlNodeType::Attribute)
2030 if (path.size() == 1 && path[0] == XmlTagName::k_EnumerationResults
2031 && std::strcmp(node.Name,
"ServiceEndpoint") == 0)
2033 ret.ServiceEndpoint = node.Value;
2040 static GetServicePropertiesResult GetServicePropertiesResultFromXml(XmlReader& reader)
2042 GetServicePropertiesResult ret;
2043 enum class XmlTagName
2045 k_StorageServiceProperties,
2051 k_DefaultServiceVersion,
2052 k_DeleteRetentionPolicy,
2056 std::vector<XmlTagName> path;
2059 auto node = reader.Read();
2060 if (node.Type == XmlNodeType::End)
2064 else if (node.Type == XmlNodeType::EndTag)
2066 if (path.size() > 0)
2075 else if (node.Type == XmlNodeType::StartTag)
2077 if (std::strcmp(node.Name,
"StorageServiceProperties") == 0)
2079 path.emplace_back(XmlTagName::k_StorageServiceProperties);
2081 else if (std::strcmp(node.Name,
"Logging") == 0)
2083 path.emplace_back(XmlTagName::k_Logging);
2085 else if (std::strcmp(node.Name,
"HourMetrics") == 0)
2087 path.emplace_back(XmlTagName::k_HourMetrics);
2089 else if (std::strcmp(node.Name,
"MinuteMetrics") == 0)
2091 path.emplace_back(XmlTagName::k_MinuteMetrics);
2093 else if (std::strcmp(node.Name,
"Cors") == 0)
2095 path.emplace_back(XmlTagName::k_Cors);
2097 else if (std::strcmp(node.Name,
"CorsRule") == 0)
2099 path.emplace_back(XmlTagName::k_CorsRule);
2101 else if (std::strcmp(node.Name,
"DefaultServiceVersion") == 0)
2103 path.emplace_back(XmlTagName::k_DefaultServiceVersion);
2105 else if (std::strcmp(node.Name,
"DeleteRetentionPolicy") == 0)
2107 path.emplace_back(XmlTagName::k_DeleteRetentionPolicy);
2109 else if (std::strcmp(node.Name,
"StaticWebsite") == 0)
2111 path.emplace_back(XmlTagName::k_StaticWebsite);
2115 path.emplace_back(XmlTagName::k_Unknown);
2117 if (path.size() == 2 && path[0] == XmlTagName::k_StorageServiceProperties
2118 && path[1] == XmlTagName::k_Logging)
2120 ret.Logging = BlobAnalyticsLoggingFromXml(reader);
2124 path.size() == 2 && path[0] == XmlTagName::k_StorageServiceProperties
2125 && path[1] == XmlTagName::k_HourMetrics)
2127 ret.HourMetrics = BlobMetricsFromXml(reader);
2131 path.size() == 2 && path[0] == XmlTagName::k_StorageServiceProperties
2132 && path[1] == XmlTagName::k_MinuteMetrics)
2134 ret.MinuteMetrics = BlobMetricsFromXml(reader);
2138 path.size() == 3 && path[0] == XmlTagName::k_StorageServiceProperties
2139 && path[1] == XmlTagName::k_Cors && path[2] == XmlTagName::k_CorsRule)
2141 ret.Cors.emplace_back(BlobCorsRuleFromXml(reader));
2145 path.size() == 2 && path[0] == XmlTagName::k_StorageServiceProperties
2146 && path[1] == XmlTagName::k_DeleteRetentionPolicy)
2148 ret.DeleteRetentionPolicy = BlobRetentionPolicyFromXml(reader);
2152 path.size() == 2 && path[0] == XmlTagName::k_StorageServiceProperties
2153 && path[1] == XmlTagName::k_StaticWebsite)
2155 ret.StaticWebsite = BlobStaticWebsiteFromXml(reader);
2159 else if (node.Type == XmlNodeType::Text)
2161 if (path.size() == 2 && path[0] == XmlTagName::k_StorageServiceProperties
2162 && path[1] == XmlTagName::k_DefaultServiceVersion)
2164 ret.DefaultServiceVersion = node.Value;
2171 static GetServiceStatisticsResult GetServiceStatisticsResultFromXml(XmlReader& reader)
2173 GetServiceStatisticsResult ret;
2174 enum class XmlTagName
2176 k_StorageServiceStats,
2180 std::vector<XmlTagName> path;
2183 auto node = reader.Read();
2184 if (node.Type == XmlNodeType::End)
2188 else if (node.Type == XmlNodeType::EndTag)
2190 if (path.size() > 0)
2199 else if (node.Type == XmlNodeType::StartTag)
2201 if (std::strcmp(node.Name,
"StorageServiceStats") == 0)
2203 path.emplace_back(XmlTagName::k_StorageServiceStats);
2205 else if (std::strcmp(node.Name,
"GeoReplication") == 0)
2207 path.emplace_back(XmlTagName::k_GeoReplication);
2211 path.emplace_back(XmlTagName::k_Unknown);
2213 if (path.size() == 2 && path[0] == XmlTagName::k_StorageServiceStats
2214 && path[1] == XmlTagName::k_GeoReplication)
2216 ret.GeoReplication = BlobGeoReplicationFromXml(reader);
2220 else if (node.Type == XmlNodeType::Text)
2227 static GetUserDelegationKeyResult GetUserDelegationKeyResultFromXml(XmlReader& reader)
2229 GetUserDelegationKeyResult ret;
2230 enum class XmlTagName
2232 k_UserDelegationKey,
2242 std::vector<XmlTagName> path;
2245 auto node = reader.Read();
2246 if (node.Type == XmlNodeType::End)
2250 else if (node.Type == XmlNodeType::EndTag)
2252 if (path.size() > 0)
2261 else if (node.Type == XmlNodeType::StartTag)
2263 if (std::strcmp(node.Name,
"UserDelegationKey") == 0)
2265 path.emplace_back(XmlTagName::k_UserDelegationKey);
2267 else if (std::strcmp(node.Name,
"SignedOid") == 0)
2269 path.emplace_back(XmlTagName::k_SignedOid);
2271 else if (std::strcmp(node.Name,
"SignedTid") == 0)
2273 path.emplace_back(XmlTagName::k_SignedTid);
2275 else if (std::strcmp(node.Name,
"SignedStart") == 0)
2277 path.emplace_back(XmlTagName::k_SignedStart);
2279 else if (std::strcmp(node.Name,
"SignedExpiry") == 0)
2281 path.emplace_back(XmlTagName::k_SignedExpiry);
2283 else if (std::strcmp(node.Name,
"SignedService") == 0)
2285 path.emplace_back(XmlTagName::k_SignedService);
2287 else if (std::strcmp(node.Name,
"SignedVersion") == 0)
2289 path.emplace_back(XmlTagName::k_SignedVersion);
2291 else if (std::strcmp(node.Name,
"Value") == 0)
2293 path.emplace_back(XmlTagName::k_Value);
2297 path.emplace_back(XmlTagName::k_Unknown);
2300 else if (node.Type == XmlNodeType::Text)
2302 if (path.size() == 2 && path[0] == XmlTagName::k_UserDelegationKey
2303 && path[1] == XmlTagName::k_SignedOid)
2305 ret.SignedObjectId = node.Value;
2308 path.size() == 2 && path[0] == XmlTagName::k_UserDelegationKey
2309 && path[1] == XmlTagName::k_SignedTid)
2311 ret.SignedTenantId = node.Value;
2314 path.size() == 2 && path[0] == XmlTagName::k_UserDelegationKey
2315 && path[1] == XmlTagName::k_SignedStart)
2317 ret.SignedStartsOn = node.Value;
2320 path.size() == 2 && path[0] == XmlTagName::k_UserDelegationKey
2321 && path[1] == XmlTagName::k_SignedExpiry)
2323 ret.SignedExpiresOn = node.Value;
2326 path.size() == 2 && path[0] == XmlTagName::k_UserDelegationKey
2327 && path[1] == XmlTagName::k_SignedService)
2329 ret.SignedService = node.Value;
2332 path.size() == 2 && path[0] == XmlTagName::k_UserDelegationKey
2333 && path[1] == XmlTagName::k_SignedVersion)
2335 ret.SignedVersion = node.Value;
2338 path.size() == 2 && path[0] == XmlTagName::k_UserDelegationKey
2339 && path[1] == XmlTagName::k_Value)
2341 ret.Value = node.Value;
2348 static ListContainersSegmentResult ListContainersSegmentResultFromXml(XmlReader& reader)
2350 ListContainersSegmentResult ret;
2351 enum class XmlTagName
2353 k_EnumerationResults,
2361 std::vector<XmlTagName> path;
2364 auto node = reader.Read();
2365 if (node.Type == XmlNodeType::End)
2369 else if (node.Type == XmlNodeType::EndTag)
2371 if (path.size() > 0)
2380 else if (node.Type == XmlNodeType::StartTag)
2382 if (std::strcmp(node.Name,
"EnumerationResults") == 0)
2384 path.emplace_back(XmlTagName::k_EnumerationResults);
2386 else if (std::strcmp(node.Name,
"Prefix") == 0)
2388 path.emplace_back(XmlTagName::k_Prefix);
2390 else if (std::strcmp(node.Name,
"Marker") == 0)
2392 path.emplace_back(XmlTagName::k_Marker);
2394 else if (std::strcmp(node.Name,
"NextMarker") == 0)
2396 path.emplace_back(XmlTagName::k_NextMarker);
2398 else if (std::strcmp(node.Name,
"Containers") == 0)
2400 path.emplace_back(XmlTagName::k_Containers);
2402 else if (std::strcmp(node.Name,
"Container") == 0)
2404 path.emplace_back(XmlTagName::k_Container);
2408 path.emplace_back(XmlTagName::k_Unknown);
2410 if (path.size() == 3 && path[0] == XmlTagName::k_EnumerationResults
2411 && path[1] == XmlTagName::k_Containers && path[2] == XmlTagName::k_Container)
2413 ret.Items.emplace_back(BlobContainerItemFromXml(reader));
2417 else if (node.Type == XmlNodeType::Text)
2419 if (path.size() == 2 && path[0] == XmlTagName::k_EnumerationResults
2420 && path[1] == XmlTagName::k_Prefix)
2422 ret.Prefix = node.Value;
2425 path.size() == 2 && path[0] == XmlTagName::k_EnumerationResults
2426 && path[1] == XmlTagName::k_Marker)
2428 ret.Marker = node.Value;
2431 path.size() == 2 && path[0] == XmlTagName::k_EnumerationResults
2432 && path[1] == XmlTagName::k_NextMarker)
2434 ret.NextMarker = node.Value;
2437 else if (node.Type == XmlNodeType::Attribute)
2439 if (path.size() == 1 && path[0] == XmlTagName::k_EnumerationResults
2440 && std::strcmp(node.Name,
"ServiceEndpoint") == 0)
2442 ret.ServiceEndpoint = node.Value;
2449 static BlobAnalyticsLogging BlobAnalyticsLoggingFromXml(XmlReader& reader)
2451 BlobAnalyticsLogging ret;
2452 enum class XmlTagName
2461 std::vector<XmlTagName> path;
2464 auto node = reader.Read();
2465 if (node.Type == XmlNodeType::End)
2469 else if (node.Type == XmlNodeType::EndTag)
2471 if (path.size() > 0)
2480 else if (node.Type == XmlNodeType::StartTag)
2482 if (std::strcmp(node.Name,
"Version") == 0)
2484 path.emplace_back(XmlTagName::k_Version);
2486 else if (std::strcmp(node.Name,
"Delete") == 0)
2488 path.emplace_back(XmlTagName::k_Delete);
2490 else if (std::strcmp(node.Name,
"Read") == 0)
2492 path.emplace_back(XmlTagName::k_Read);
2494 else if (std::strcmp(node.Name,
"Write") == 0)
2496 path.emplace_back(XmlTagName::k_Write);
2498 else if (std::strcmp(node.Name,
"RetentionPolicy") == 0)
2500 path.emplace_back(XmlTagName::k_RetentionPolicy);
2504 path.emplace_back(XmlTagName::k_Unknown);
2506 if (path.size() == 1 && path[0] == XmlTagName::k_RetentionPolicy)
2508 ret.RetentionPolicy = BlobRetentionPolicyFromXml(reader);
2512 else if (node.Type == XmlNodeType::Text)
2514 if (path.size() == 1 && path[0] == XmlTagName::k_Version)
2516 ret.Version = node.Value;
2518 else if (path.size() == 1 && path[0] == XmlTagName::k_Delete)
2520 ret.Delete = std::strcmp(node.Value,
"true") == 0;
2522 else if (path.size() == 1 && path[0] == XmlTagName::k_Read)
2524 ret.Read = std::strcmp(node.Value,
"true") == 0;
2526 else if (path.size() == 1 && path[0] == XmlTagName::k_Write)
2528 ret.Write = std::strcmp(node.Value,
"true") == 0;
2535 static BlobContainerItem BlobContainerItemFromXml(XmlReader& reader)
2537 BlobContainerItem ret;
2538 enum class XmlTagName
2545 k_HasImmutabilityPolicy,
2550 k_DefaultEncryptionScope,
2551 k_DenyEncryptionScopeOverride,
2556 k_RemainingRetentionDays,
2559 std::vector<XmlTagName> path;
2562 auto node = reader.Read();
2563 if (node.Type == XmlNodeType::End)
2567 else if (node.Type == XmlNodeType::EndTag)
2569 if (path.size() > 0)
2578 else if (node.Type == XmlNodeType::StartTag)
2580 if (std::strcmp(node.Name,
"Name") == 0)
2582 path.emplace_back(XmlTagName::k_Name);
2584 else if (std::strcmp(node.Name,
"Properties") == 0)
2586 path.emplace_back(XmlTagName::k_Properties);
2588 else if (std::strcmp(node.Name,
"Etag") == 0)
2590 path.emplace_back(XmlTagName::k_Etag);
2592 else if (std::strcmp(node.Name,
"Last-Modified") == 0)
2594 path.emplace_back(XmlTagName::k_LastModified);
2596 else if (std::strcmp(node.Name,
"PublicAccess") == 0)
2598 path.emplace_back(XmlTagName::k_PublicAccess);
2600 else if (std::strcmp(node.Name,
"HasImmutabilityPolicy") == 0)
2602 path.emplace_back(XmlTagName::k_HasImmutabilityPolicy);
2604 else if (std::strcmp(node.Name,
"HasLegalHold") == 0)
2606 path.emplace_back(XmlTagName::k_HasLegalHold);
2608 else if (std::strcmp(node.Name,
"LeaseStatus") == 0)
2610 path.emplace_back(XmlTagName::k_LeaseStatus);
2612 else if (std::strcmp(node.Name,
"LeaseState") == 0)
2614 path.emplace_back(XmlTagName::k_LeaseState);
2616 else if (std::strcmp(node.Name,
"LeaseDuration") == 0)
2618 path.emplace_back(XmlTagName::k_LeaseDuration);
2620 else if (std::strcmp(node.Name,
"DefaultEncryptionScope") == 0)
2622 path.emplace_back(XmlTagName::k_DefaultEncryptionScope);
2624 else if (std::strcmp(node.Name,
"DenyEncryptionScopeOverride") == 0)
2626 path.emplace_back(XmlTagName::k_DenyEncryptionScopeOverride);
2628 else if (std::strcmp(node.Name,
"Metadata") == 0)
2630 path.emplace_back(XmlTagName::k_Metadata);
2632 else if (std::strcmp(node.Name,
"Deleted") == 0)
2634 path.emplace_back(XmlTagName::k_Deleted);
2636 else if (std::strcmp(node.Name,
"Version") == 0)
2638 path.emplace_back(XmlTagName::k_Version);
2640 else if (std::strcmp(node.Name,
"DeletedTime") == 0)
2642 path.emplace_back(XmlTagName::k_DeletedTime);
2644 else if (std::strcmp(node.Name,
"RemainingRetentionDays") == 0)
2646 path.emplace_back(XmlTagName::k_RemainingRetentionDays);
2650 path.emplace_back(XmlTagName::k_Unknown);
2652 if (path.size() == 1 && path[0] == XmlTagName::k_Metadata)
2654 ret.Metadata = MetadataFromXml(reader);
2658 else if (node.Type == XmlNodeType::Text)
2660 if (path.size() == 1 && path[0] == XmlTagName::k_Name)
2662 ret.Name = node.Value;
2665 path.size() == 2 && path[0] == XmlTagName::k_Properties
2666 && path[1] == XmlTagName::k_Etag)
2668 ret.ETag = node.Value;
2671 path.size() == 2 && path[0] == XmlTagName::k_Properties
2672 && path[1] == XmlTagName::k_LastModified)
2674 ret.LastModified = node.Value;
2677 path.size() == 2 && path[0] == XmlTagName::k_Properties
2678 && path[1] == XmlTagName::k_PublicAccess)
2680 ret.AccessType = PublicAccessTypeFromString(node.Value);
2683 path.size() == 2 && path[0] == XmlTagName::k_Properties
2684 && path[1] == XmlTagName::k_HasImmutabilityPolicy)
2686 ret.HasImmutabilityPolicy = std::strcmp(node.Value,
"true") == 0;
2689 path.size() == 2 && path[0] == XmlTagName::k_Properties
2690 && path[1] == XmlTagName::k_HasLegalHold)
2692 ret.HasLegalHold = std::strcmp(node.Value,
"true") == 0;
2695 path.size() == 2 && path[0] == XmlTagName::k_Properties
2696 && path[1] == XmlTagName::k_LeaseStatus)
2698 ret.LeaseStatus = BlobLeaseStatusFromString(node.Value);
2701 path.size() == 2 && path[0] == XmlTagName::k_Properties
2702 && path[1] == XmlTagName::k_LeaseState)
2704 ret.LeaseState = BlobLeaseStateFromString(node.Value);
2707 path.size() == 2 && path[0] == XmlTagName::k_Properties
2708 && path[1] == XmlTagName::k_LeaseDuration)
2710 ret.LeaseDuration = node.Value;
2713 path.size() == 2 && path[0] == XmlTagName::k_Properties
2714 && path[1] == XmlTagName::k_DefaultEncryptionScope)
2716 ret.DefaultEncryptionScope = node.Value;
2719 path.size() == 2 && path[0] == XmlTagName::k_Properties
2720 && path[1] == XmlTagName::k_DenyEncryptionScopeOverride)
2722 ret.PreventEncryptionScopeOverride = std::strcmp(node.Value,
"true") == 0;
2724 else if (path.size() == 1 && path[0] == XmlTagName::k_Deleted)
2726 ret.IsDeleted = std::strcmp(node.Value,
"true") == 0;
2728 else if (path.size() == 1 && path[0] == XmlTagName::k_Version)
2730 ret.VersionId = node.Value;
2733 path.size() == 2 && path[0] == XmlTagName::k_Properties
2734 && path[1] == XmlTagName::k_DeletedTime)
2736 ret.DeletedTime = node.Value;
2739 path.size() == 2 && path[0] == XmlTagName::k_Properties
2740 && path[1] == XmlTagName::k_RemainingRetentionDays)
2742 ret.RemainingRetentionDays = std::stoi(node.Value);
2749 static BlobCorsRule BlobCorsRuleFromXml(XmlReader& reader)
2752 enum class XmlTagName
2761 std::vector<XmlTagName> path;
2764 auto node = reader.Read();
2765 if (node.Type == XmlNodeType::End)
2769 else if (node.Type == XmlNodeType::EndTag)
2771 if (path.size() > 0)
2780 else if (node.Type == XmlNodeType::StartTag)
2782 if (std::strcmp(node.Name,
"AllowedOrigins") == 0)
2784 path.emplace_back(XmlTagName::k_AllowedOrigins);
2786 else if (std::strcmp(node.Name,
"AllowedMethods") == 0)
2788 path.emplace_back(XmlTagName::k_AllowedMethods);
2790 else if (std::strcmp(node.Name,
"MaxAgeInSeconds") == 0)
2792 path.emplace_back(XmlTagName::k_MaxAgeInSeconds);
2794 else if (std::strcmp(node.Name,
"ExposedHeaders") == 0)
2796 path.emplace_back(XmlTagName::k_ExposedHeaders);
2798 else if (std::strcmp(node.Name,
"AllowedHeaders") == 0)
2800 path.emplace_back(XmlTagName::k_AllowedHeaders);
2804 path.emplace_back(XmlTagName::k_Unknown);
2807 else if (node.Type == XmlNodeType::Text)
2809 if (path.size() == 1 && path[0] == XmlTagName::k_AllowedOrigins)
2811 ret.AllowedOrigins = node.Value;
2813 else if (path.size() == 1 && path[0] == XmlTagName::k_AllowedMethods)
2815 ret.AllowedMethods = node.Value;
2817 else if (path.size() == 1 && path[0] == XmlTagName::k_MaxAgeInSeconds)
2819 ret.MaxAgeInSeconds = std::stoi(node.Value);
2821 else if (path.size() == 1 && path[0] == XmlTagName::k_ExposedHeaders)
2823 ret.ExposedHeaders = node.Value;
2825 else if (path.size() == 1 && path[0] == XmlTagName::k_AllowedHeaders)
2827 ret.AllowedHeaders = node.Value;
2834 static BlobGeoReplication BlobGeoReplicationFromXml(XmlReader& reader)
2836 BlobGeoReplication ret;
2837 enum class XmlTagName
2843 std::vector<XmlTagName> path;
2846 auto node = reader.Read();
2847 if (node.Type == XmlNodeType::End)
2851 else if (node.Type == XmlNodeType::EndTag)
2853 if (path.size() > 0)
2862 else if (node.Type == XmlNodeType::StartTag)
2864 if (std::strcmp(node.Name,
"Status") == 0)
2866 path.emplace_back(XmlTagName::k_Status);
2868 else if (std::strcmp(node.Name,
"LastSyncTime") == 0)
2870 path.emplace_back(XmlTagName::k_LastSyncTime);
2874 path.emplace_back(XmlTagName::k_Unknown);
2877 else if (node.Type == XmlNodeType::Text)
2879 if (path.size() == 1 && path[0] == XmlTagName::k_Status)
2881 ret.Status = BlobGeoReplicationStatusFromString(node.Value);
2883 else if (path.size() == 1 && path[0] == XmlTagName::k_LastSyncTime)
2885 ret.LastSyncTime = node.Value;
2892 static BlobMetrics BlobMetricsFromXml(XmlReader& reader)
2895 enum class XmlTagName
2903 std::vector<XmlTagName> path;
2906 auto node = reader.Read();
2907 if (node.Type == XmlNodeType::End)
2911 else if (node.Type == XmlNodeType::EndTag)
2913 if (path.size() > 0)
2922 else if (node.Type == XmlNodeType::StartTag)
2924 if (std::strcmp(node.Name,
"Version") == 0)
2926 path.emplace_back(XmlTagName::k_Version);
2928 else if (std::strcmp(node.Name,
"Enabled") == 0)
2930 path.emplace_back(XmlTagName::k_Enabled);
2932 else if (std::strcmp(node.Name,
"IncludeAPIs") == 0)
2934 path.emplace_back(XmlTagName::k_IncludeAPIs);
2936 else if (std::strcmp(node.Name,
"RetentionPolicy") == 0)
2938 path.emplace_back(XmlTagName::k_RetentionPolicy);
2942 path.emplace_back(XmlTagName::k_Unknown);
2944 if (path.size() == 1 && path[0] == XmlTagName::k_RetentionPolicy)
2946 ret.RetentionPolicy = BlobRetentionPolicyFromXml(reader);
2950 else if (node.Type == XmlNodeType::Text)
2952 if (path.size() == 1 && path[0] == XmlTagName::k_Version)
2954 ret.Version = node.Value;
2956 else if (path.size() == 1 && path[0] == XmlTagName::k_Enabled)
2958 ret.Enabled = std::strcmp(node.Value,
"true") == 0;
2960 else if (path.size() == 1 && path[0] == XmlTagName::k_IncludeAPIs)
2962 ret.IncludeApis = std::strcmp(node.Value,
"true") == 0;
2969 static BlobRetentionPolicy BlobRetentionPolicyFromXml(XmlReader& reader)
2971 BlobRetentionPolicy ret;
2972 enum class XmlTagName
2978 std::vector<XmlTagName> path;
2981 auto node = reader.Read();
2982 if (node.Type == XmlNodeType::End)
2986 else if (node.Type == XmlNodeType::EndTag)
2988 if (path.size() > 0)
2997 else if (node.Type == XmlNodeType::StartTag)
2999 if (std::strcmp(node.Name,
"Enabled") == 0)
3001 path.emplace_back(XmlTagName::k_Enabled);
3003 else if (std::strcmp(node.Name,
"Days") == 0)
3005 path.emplace_back(XmlTagName::k_Days);
3009 path.emplace_back(XmlTagName::k_Unknown);
3012 else if (node.Type == XmlNodeType::Text)
3014 if (path.size() == 1 && path[0] == XmlTagName::k_Enabled)
3016 ret.Enabled = std::strcmp(node.Value,
"true") == 0;
3018 else if (path.size() == 1 && path[0] == XmlTagName::k_Days)
3020 ret.Days = std::stoi(node.Value);
3027 static BlobStaticWebsite BlobStaticWebsiteFromXml(XmlReader& reader)
3029 BlobStaticWebsite ret;
3030 enum class XmlTagName
3034 k_DefaultIndexDocumentPath,
3035 k_ErrorDocument404Path,
3038 std::vector<XmlTagName> path;
3041 auto node = reader.Read();
3042 if (node.Type == XmlNodeType::End)
3046 else if (node.Type == XmlNodeType::EndTag)
3048 if (path.size() > 0)
3057 else if (node.Type == XmlNodeType::StartTag)
3059 if (std::strcmp(node.Name,
"Enabled") == 0)
3061 path.emplace_back(XmlTagName::k_Enabled);
3063 else if (std::strcmp(node.Name,
"IndexDocument") == 0)
3065 path.emplace_back(XmlTagName::k_IndexDocument);
3067 else if (std::strcmp(node.Name,
"DefaultIndexDocumentPath") == 0)
3069 path.emplace_back(XmlTagName::k_DefaultIndexDocumentPath);
3071 else if (std::strcmp(node.Name,
"ErrorDocument404Path") == 0)
3073 path.emplace_back(XmlTagName::k_ErrorDocument404Path);
3077 path.emplace_back(XmlTagName::k_Unknown);
3080 else if (node.Type == XmlNodeType::Text)
3082 if (path.size() == 1 && path[0] == XmlTagName::k_Enabled)
3084 ret.Enabled = std::strcmp(node.Value,
"true") == 0;
3086 else if (path.size() == 1 && path[0] == XmlTagName::k_IndexDocument)
3088 ret.IndexDocument = node.Value;
3090 else if (path.size() == 1 && path[0] == XmlTagName::k_DefaultIndexDocumentPath)
3092 ret.DefaultIndexDocumentPath = node.Value;
3094 else if (path.size() == 1 && path[0] == XmlTagName::k_ErrorDocument404Path)
3096 ret.ErrorDocument404Path = node.Value;
3103 static FilterBlobItem FilterBlobItemFromXml(XmlReader& reader)
3106 enum class XmlTagName
3113 std::vector<XmlTagName> path;
3116 auto node = reader.Read();
3117 if (node.Type == XmlNodeType::End)
3121 else if (node.Type == XmlNodeType::EndTag)
3123 if (path.size() > 0)
3132 else if (node.Type == XmlNodeType::StartTag)
3134 if (std::strcmp(node.Name,
"Name") == 0)
3136 path.emplace_back(XmlTagName::k_Name);
3138 else if (std::strcmp(node.Name,
"ContainerName") == 0)
3140 path.emplace_back(XmlTagName::k_ContainerName);
3142 else if (std::strcmp(node.Name,
"TagValue") == 0)
3144 path.emplace_back(XmlTagName::k_TagValue);
3148 path.emplace_back(XmlTagName::k_Unknown);
3151 else if (node.Type == XmlNodeType::Text)
3153 if (path.size() == 1 && path[0] == XmlTagName::k_Name)
3155 ret.BlobName = node.Value;
3157 else if (path.size() == 1 && path[0] == XmlTagName::k_ContainerName)
3159 ret.ContainerName = node.Value;
3161 else if (path.size() == 1 && path[0] == XmlTagName::k_TagValue)
3163 ret.TagValue = node.Value;
3170 static std::map<std::string, std::string> MetadataFromXml(XmlReader& reader)
3172 std::map<std::string, std::string> ret;
3177 auto node = reader.Read();
3178 if (node.Type == XmlNodeType::End)
3182 else if (node.Type == XmlNodeType::StartTag)
3189 else if (node.Type == XmlNodeType::EndTag)
3196 else if (depth == 1 && node.Type == XmlNodeType::Text)
3198 ret.emplace(std::move(key), std::string(node.Value));
3204 static void GetUserDelegationKeyOptionsToXml(
3206 const GetUserDelegationKeyOptions& options)
3208 writer.Write(XmlNode{XmlNodeType::StartTag,
"KeyInfo"});
3209 writer.Write(XmlNode{XmlNodeType::StartTag,
"Start"});
3210 writer.Write(XmlNode{XmlNodeType::Text,
nullptr, options.StartsOn.data()});
3211 writer.Write(XmlNode{XmlNodeType::EndTag});
3212 writer.Write(XmlNode{XmlNodeType::StartTag,
"Expiry"});
3213 writer.Write(XmlNode{XmlNodeType::Text,
nullptr, options.ExpiresOn.data()});
3214 writer.Write(XmlNode{XmlNodeType::EndTag});
3215 writer.Write(XmlNode{XmlNodeType::EndTag});
3218 static void SetServicePropertiesOptionsToXml(
3220 const SetServicePropertiesOptions& options)
3222 writer.Write(XmlNode{XmlNodeType::StartTag,
"StorageServiceProperties"});
3223 BlobServicePropertiesToXml(writer, options.Properties);
3224 writer.Write(XmlNode{XmlNodeType::EndTag});
3227 static void BlobServicePropertiesToXml(
3229 const BlobServiceProperties& options)
3231 writer.Write(XmlNode{XmlNodeType::StartTag,
"Logging"});
3232 BlobAnalyticsLoggingToXml(writer, options.Logging);
3233 writer.Write(XmlNode{XmlNodeType::EndTag});
3234 writer.Write(XmlNode{XmlNodeType::StartTag,
"HourMetrics"});
3235 BlobMetricsToXml(writer, options.HourMetrics);
3236 writer.Write(XmlNode{XmlNodeType::EndTag});
3237 writer.Write(XmlNode{XmlNodeType::StartTag,
"MinuteMetrics"});
3238 BlobMetricsToXml(writer, options.MinuteMetrics);
3239 writer.Write(XmlNode{XmlNodeType::EndTag});
3240 writer.Write(XmlNode{XmlNodeType::StartTag,
"Cors"});
3241 for (
const auto& i : options.Cors)
3243 BlobCorsRuleToXml(writer, i);
3245 writer.Write(XmlNode{XmlNodeType::EndTag});
3246 writer.Write(XmlNode{XmlNodeType::StartTag,
"DefaultServiceVersion"});
3247 writer.Write(XmlNode{XmlNodeType::Text,
nullptr, options.DefaultServiceVersion.data()});
3248 writer.Write(XmlNode{XmlNodeType::EndTag});
3249 writer.Write(XmlNode{XmlNodeType::StartTag,
"DeleteRetentionPolicy"});
3250 BlobRetentionPolicyToXml(writer, options.DeleteRetentionPolicy);
3251 writer.Write(XmlNode{XmlNodeType::EndTag});
3252 writer.Write(XmlNode{XmlNodeType::StartTag,
"StaticWebsite"});
3253 BlobStaticWebsiteToXml(writer, options.StaticWebsite);
3254 writer.Write(XmlNode{XmlNodeType::EndTag});
3257 static void BlobAnalyticsLoggingToXml(XmlWriter& writer,
const BlobAnalyticsLogging& options)
3259 writer.Write(XmlNode{XmlNodeType::StartTag,
"Version"});
3260 writer.Write(XmlNode{XmlNodeType::Text,
nullptr, options.Version.data()});
3261 writer.Write(XmlNode{XmlNodeType::EndTag});
3262 writer.Write(XmlNode{XmlNodeType::StartTag,
"Delete"});
3263 writer.Write(XmlNode{XmlNodeType::Text,
nullptr, options.Delete ?
"true" :
"false"});
3264 writer.Write(XmlNode{XmlNodeType::EndTag});
3265 writer.Write(XmlNode{XmlNodeType::StartTag,
"Read"});
3266 writer.Write(XmlNode{XmlNodeType::Text,
nullptr, options.Read ?
"true" :
"false"});
3267 writer.Write(XmlNode{XmlNodeType::EndTag});
3268 writer.Write(XmlNode{XmlNodeType::StartTag,
"Write"});
3269 writer.Write(XmlNode{XmlNodeType::Text,
nullptr, options.Write ?
"true" :
"false"});
3270 writer.Write(XmlNode{XmlNodeType::EndTag});
3271 writer.Write(XmlNode{XmlNodeType::StartTag,
"RetentionPolicy"});
3272 BlobRetentionPolicyToXml(writer, options.RetentionPolicy);
3273 writer.Write(XmlNode{XmlNodeType::EndTag});
3276 static void BlobCorsRuleToXml(XmlWriter& writer,
const BlobCorsRule& options)
3278 writer.Write(XmlNode{XmlNodeType::StartTag,
"CorsRule"});
3279 writer.Write(XmlNode{XmlNodeType::StartTag,
"AllowedOrigins"});
3280 writer.Write(XmlNode{XmlNodeType::Text,
nullptr, options.AllowedOrigins.data()});
3281 writer.Write(XmlNode{XmlNodeType::EndTag});
3282 writer.Write(XmlNode{XmlNodeType::StartTag,
"AllowedMethods"});
3283 writer.Write(XmlNode{XmlNodeType::Text,
nullptr, options.AllowedMethods.data()});
3284 writer.Write(XmlNode{XmlNodeType::EndTag});
3285 writer.Write(XmlNode{XmlNodeType::StartTag,
"AllowedHeaders"});
3286 writer.Write(XmlNode{XmlNodeType::Text,
nullptr, options.AllowedHeaders.data()});
3287 writer.Write(XmlNode{XmlNodeType::EndTag});
3288 writer.Write(XmlNode{XmlNodeType::StartTag,
"ExposedHeaders"});
3289 writer.Write(XmlNode{XmlNodeType::Text,
nullptr, options.ExposedHeaders.data()});
3290 writer.Write(XmlNode{XmlNodeType::EndTag});
3291 writer.Write(XmlNode{XmlNodeType::StartTag,
"MaxAgeInSeconds"});
3293 XmlNode{XmlNodeType::Text,
nullptr, std::to_string(options.MaxAgeInSeconds).data()});
3294 writer.Write(XmlNode{XmlNodeType::EndTag});
3295 writer.Write(XmlNode{XmlNodeType::EndTag});
3298 static void BlobMetricsToXml(XmlWriter& writer,
const BlobMetrics& options)
3300 writer.Write(XmlNode{XmlNodeType::StartTag,
"Version"});
3301 writer.Write(XmlNode{XmlNodeType::Text,
nullptr, options.Version.data()});
3302 writer.Write(XmlNode{XmlNodeType::EndTag});
3303 writer.Write(XmlNode{XmlNodeType::StartTag,
"Enabled"});
3304 writer.Write(XmlNode{XmlNodeType::Text,
nullptr, options.Enabled ?
"true" :
"false"});
3305 writer.Write(XmlNode{XmlNodeType::EndTag});
3306 if (options.IncludeApis.HasValue())
3308 writer.Write(XmlNode{XmlNodeType::StartTag,
"IncludeAPIs"});
3309 writer.Write(XmlNode{
3310 XmlNodeType::Text,
nullptr, options.IncludeApis.GetValue() ?
"true" :
"false"});
3311 writer.Write(XmlNode{XmlNodeType::EndTag});
3313 writer.Write(XmlNode{XmlNodeType::StartTag,
"RetentionPolicy"});
3314 BlobRetentionPolicyToXml(writer, options.RetentionPolicy);
3315 writer.Write(XmlNode{XmlNodeType::EndTag});
3318 static void BlobRetentionPolicyToXml(XmlWriter& writer,
const BlobRetentionPolicy& options)
3320 writer.Write(XmlNode{XmlNodeType::StartTag,
"Enabled"});
3321 writer.Write(XmlNode{XmlNodeType::Text,
nullptr, options.Enabled ?
"true" :
"false"});
3322 writer.Write(XmlNode{XmlNodeType::EndTag});
3323 if (options.Days.HasValue())
3325 writer.Write(XmlNode{XmlNodeType::StartTag,
"Days"});
3327 XmlNode{XmlNodeType::Text,
nullptr, std::to_string(options.Days.GetValue()).data()});
3328 writer.Write(XmlNode{XmlNodeType::EndTag});
3332 static void BlobStaticWebsiteToXml(XmlWriter& writer,
const BlobStaticWebsite& options)
3334 writer.Write(XmlNode{XmlNodeType::StartTag,
"Enabled"});
3335 writer.Write(XmlNode{XmlNodeType::Text,
nullptr, options.Enabled ?
"true" :
"false"});
3336 writer.Write(XmlNode{XmlNodeType::EndTag});
3337 if (options.IndexDocument.HasValue())
3339 writer.Write(XmlNode{XmlNodeType::StartTag,
"IndexDocument"});
3341 XmlNode{XmlNodeType::Text,
nullptr, options.IndexDocument.GetValue().data()});
3342 writer.Write(XmlNode{XmlNodeType::EndTag});
3344 if (options.DefaultIndexDocumentPath.HasValue())
3346 writer.Write(XmlNode{XmlNodeType::StartTag,
"DefaultIndexDocumentPath"});
3347 writer.Write(XmlNode{
3348 XmlNodeType::Text,
nullptr, options.DefaultIndexDocumentPath.GetValue().data()});
3349 writer.Write(XmlNode{XmlNodeType::EndTag});
3351 if (options.ErrorDocument404Path.HasValue())
3353 writer.Write(XmlNode{XmlNodeType::StartTag,
"ErrorDocument404Path"});
3355 XmlNode{XmlNodeType::Text,
nullptr, options.ErrorDocument404Path.GetValue().data()});
3356 writer.Write(XmlNode{XmlNodeType::EndTag});
3366 Azure::Core::Nullable<int32_t> Timeout;
3367 Azure::Core::Nullable<PublicAccessType> AccessType;
3368 std::map<std::string, std::string> Metadata;
3369 Azure::Core::Nullable<std::string> DefaultEncryptionScope;
3370 Azure::Core::Nullable<bool> PreventEncryptionScopeOverride;
3373 static Azure::Core::Response<CreateContainerResult> Create(
3374 const Azure::Core::Context& context,
3375 Azure::Core::Http::HttpPipeline& pipeline,
3376 const Azure::Core::Http::Url& url,
3380 auto request = Azure::Core::Http::Request(Azure::Core::Http::HttpMethod::Put, url);
3381 request.AddHeader(
"Content-Length",
"0");
3382 request.GetUrl().AppendQuery(
"restype",
"container");
3383 request.AddHeader(
"x-ms-version", c_ApiVersion);
3384 if (options.Timeout.HasValue())
3386 request.GetUrl().AppendQuery(
"timeout", std::to_string(options.Timeout.GetValue()));
3388 std::set<std::string> metadataKeys;
3389 for (
const auto& pair : options.Metadata)
3391 std::string key = pair.first;
3392 std::transform(key.begin(), key.end(), key.begin(), [](
unsigned char c) {
3393 return static_cast<char>(std::tolower(c));
3395 if (metadataKeys.insert(key).second ==
false)
3397 throw std::runtime_error(
"duplicate keys in metadata");
3399 request.AddHeader(
"x-ms-meta-" + pair.first, pair.second);
3401 metadataKeys.clear();
3402 if (options.AccessType.HasValue())
3405 "x-ms-blob-public-access", PublicAccessTypeToString(options.AccessType.GetValue()));
3407 if (options.DefaultEncryptionScope.HasValue())
3410 "x-ms-default-encryption-scope", options.DefaultEncryptionScope.GetValue());
3412 if (options.PreventEncryptionScopeOverride.HasValue())
3415 "x-ms-deny-encryption-scope-override",
3416 options.PreventEncryptionScopeOverride.GetValue() ?
"true" :
"false");
3418 auto pHttpResponse = pipeline.Send(context, request);
3419 Azure::Core::Http::RawResponse& httpResponse = *pHttpResponse;
3420 CreateContainerResult response;
3421 auto http_status_code
3422 =
static_cast<std::underlying_type<Azure::Core::Http::HttpStatusCode>::type
>(
3423 httpResponse.GetStatusCode());
3424 if (!(http_status_code == 201))
3426 throw StorageError::CreateFromResponse(std::move(pHttpResponse));
3428 response.ETag = httpResponse.GetHeaders().at(
"etag");
3429 response.LastModified = httpResponse.GetHeaders().at(
"last-modified");
3430 return Azure::Core::Response<CreateContainerResult>(
3431 std::move(response), std::move(pHttpResponse));
3436 Azure::Core::Nullable<int32_t> Timeout;
3437 Azure::Core::Nullable<std::string> LeaseId;
3438 Azure::Core::Nullable<std::string> IfModifiedSince;
3439 Azure::Core::Nullable<std::string> IfUnmodifiedSince;
3442 static Azure::Core::Response<DeleteContainerResult> Delete(
3443 const Azure::Core::Context& context,
3444 Azure::Core::Http::HttpPipeline& pipeline,
3445 const Azure::Core::Http::Url& url,
3449 auto request = Azure::Core::Http::Request(Azure::Core::Http::HttpMethod::Delete, url);
3450 request.GetUrl().AppendQuery(
"restype",
"container");
3451 request.AddHeader(
"x-ms-version", c_ApiVersion);
3452 if (options.Timeout.HasValue())
3454 request.GetUrl().AppendQuery(
"timeout", std::to_string(options.Timeout.GetValue()));
3456 if (options.LeaseId.HasValue())
3458 request.AddHeader(
"x-ms-lease-id", options.LeaseId.GetValue());
3460 if (options.IfModifiedSince.HasValue())
3462 request.AddHeader(
"If-Modified-Since", options.IfModifiedSince.GetValue());
3464 if (options.IfUnmodifiedSince.HasValue())
3466 request.AddHeader(
"If-Unmodified-Since", options.IfUnmodifiedSince.GetValue());
3468 auto pHttpResponse = pipeline.Send(context, request);
3469 Azure::Core::Http::RawResponse& httpResponse = *pHttpResponse;
3470 DeleteContainerResult response;
3471 auto http_status_code
3472 =
static_cast<std::underlying_type<Azure::Core::Http::HttpStatusCode>::type
>(
3473 httpResponse.GetStatusCode());
3474 if (!(http_status_code == 202))
3476 throw StorageError::CreateFromResponse(std::move(pHttpResponse));
3478 return Azure::Core::Response<DeleteContainerResult>(
3479 std::move(response), std::move(pHttpResponse));
3484 Azure::Core::Nullable<int32_t> Timeout;
3485 std::string DeletedContainerName;
3486 std::string DeletedContainerVersion;
3489 static Azure::Core::Response<UndeleteContainerResult> Undelete(
3490 const Azure::Core::Context& context,
3491 Azure::Core::Http::HttpPipeline& pipeline,
3492 const Azure::Core::Http::Url& url,
3496 auto request = Azure::Core::Http::Request(Azure::Core::Http::HttpMethod::Put, url);
3497 request.AddHeader(
"Content-Length",
"0");
3498 request.GetUrl().AppendQuery(
"restype",
"container");
3499 request.GetUrl().AppendQuery(
"comp",
"undelete");
3500 request.AddHeader(
"x-ms-version", c_ApiVersion);
3501 if (options.Timeout.HasValue())
3503 request.GetUrl().AppendQuery(
"timeout", std::to_string(options.Timeout.GetValue()));
3505 request.AddHeader(
"x-ms-deleted-container-name", options.DeletedContainerName);
3506 request.AddHeader(
"x-ms-deleted-container-version", options.DeletedContainerVersion);
3507 auto pHttpResponse = pipeline.Send(context, request);
3508 Azure::Core::Http::RawResponse& httpResponse = *pHttpResponse;
3510 auto http_status_code
3511 =
static_cast<std::underlying_type<Azure::Core::Http::HttpStatusCode>::type
>(
3512 httpResponse.GetStatusCode());
3513 if (!(http_status_code == 201))
3515 throw StorageError::CreateFromResponse(std::move(pHttpResponse));
3517 return Azure::Core::Response<UndeleteContainerResult>(
3518 std::move(response), std::move(pHttpResponse));
3523 Azure::Core::Nullable<int32_t> Timeout;
3524 Azure::Core::Nullable<std::string> LeaseId;
3527 static Azure::Core::Response<GetContainerPropertiesResult> GetProperties(
3528 const Azure::Core::Context& context,
3529 Azure::Core::Http::HttpPipeline& pipeline,
3530 const Azure::Core::Http::Url& url,
3534 auto request = Azure::Core::Http::Request(Azure::Core::Http::HttpMethod::Head, url);
3535 request.GetUrl().AppendQuery(
"restype",
"container");
3536 request.AddHeader(
"x-ms-version", c_ApiVersion);
3537 if (options.Timeout.HasValue())
3539 request.GetUrl().AppendQuery(
"timeout", std::to_string(options.Timeout.GetValue()));
3541 if (options.LeaseId.HasValue())
3543 request.AddHeader(
"x-ms-lease-id", options.LeaseId.GetValue());
3545 auto pHttpResponse = pipeline.Send(context, request);
3546 Azure::Core::Http::RawResponse& httpResponse = *pHttpResponse;
3548 auto http_status_code
3549 =
static_cast<std::underlying_type<Azure::Core::Http::HttpStatusCode>::type
>(
3550 httpResponse.GetStatusCode());
3551 if (!(http_status_code == 200))
3553 throw StorageError::CreateFromResponse(std::move(pHttpResponse));
3555 response.ETag = httpResponse.GetHeaders().at(
"etag");
3556 response.LastModified = httpResponse.GetHeaders().at(
"last-modified");
3557 for (
auto i = httpResponse.GetHeaders().lower_bound(
"x-ms-meta-");
3558 i != httpResponse.GetHeaders().end() && i->first.substr(0, 10) ==
"x-ms-meta-";
3561 response.Metadata.emplace(i->first.substr(10), i->second);
3563 auto response_access_type_iterator
3564 = httpResponse.GetHeaders().find(
"x-ms-blob-public-access");
3565 if (response_access_type_iterator != httpResponse.GetHeaders().end())
3567 response.AccessType = PublicAccessTypeFromString(response_access_type_iterator->second);
3569 response.HasImmutabilityPolicy
3570 = httpResponse.GetHeaders().at(
"x-ms-has-immutability-policy") ==
"true";
3571 response.HasLegalHold = httpResponse.GetHeaders().at(
"x-ms-has-legal-hold") ==
"true";
3572 response.LeaseStatus
3573 = BlobLeaseStatusFromString(httpResponse.GetHeaders().at(
"x-ms-lease-status"));
3575 = BlobLeaseStateFromString(httpResponse.GetHeaders().at(
"x-ms-lease-state"));
3576 auto response_lease_duration_iterator
3577 = httpResponse.GetHeaders().find(
"x-ms-lease-duration");
3578 if (response_lease_duration_iterator != httpResponse.GetHeaders().end())
3580 response.LeaseDuration = response_lease_duration_iterator->second;
3582 response.DefaultEncryptionScope
3583 = httpResponse.GetHeaders().at(
"x-ms-default-encryption-scope");
3584 response.PreventEncryptionScopeOverride
3585 = httpResponse.GetHeaders().at(
"x-ms-deny-encryption-scope-override") ==
"true";
3586 return Azure::Core::Response<GetContainerPropertiesResult>(
3587 std::move(response), std::move(pHttpResponse));
3592 Azure::Core::Nullable<int32_t> Timeout;
3593 std::map<std::string, std::string> Metadata;
3594 Azure::Core::Nullable<std::string> LeaseId;
3595 Azure::Core::Nullable<std::string> IfModifiedSince;
3598 static Azure::Core::Response<SetContainerMetadataResult> SetMetadata(
3599 const Azure::Core::Context& context,
3600 Azure::Core::Http::HttpPipeline& pipeline,
3601 const Azure::Core::Http::Url& url,
3605 auto request = Azure::Core::Http::Request(Azure::Core::Http::HttpMethod::Put, url);
3606 request.AddHeader(
"Content-Length",
"0");
3607 request.GetUrl().AppendQuery(
"restype",
"container");
3608 request.GetUrl().AppendQuery(
"comp",
"metadata");
3609 request.AddHeader(
"x-ms-version", c_ApiVersion);
3610 if (options.Timeout.HasValue())
3612 request.GetUrl().AppendQuery(
"timeout", std::to_string(options.Timeout.GetValue()));
3614 std::set<std::string> metadataKeys;
3615 for (
const auto& pair : options.Metadata)
3617 std::string key = pair.first;
3618 std::transform(key.begin(), key.end(), key.begin(), [](
unsigned char c) {
3619 return static_cast<char>(std::tolower(c));
3621 if (metadataKeys.insert(key).second ==
false)
3623 throw std::runtime_error(
"duplicate keys in metadata");
3625 request.AddHeader(
"x-ms-meta-" + pair.first, pair.second);
3627 metadataKeys.clear();
3628 if (options.LeaseId.HasValue())
3630 request.AddHeader(
"x-ms-lease-id", options.LeaseId.GetValue());
3632 if (options.IfModifiedSince.HasValue())
3634 request.AddHeader(
"If-Modified-Since", options.IfModifiedSince.GetValue());
3636 auto pHttpResponse = pipeline.Send(context, request);
3637 Azure::Core::Http::RawResponse& httpResponse = *pHttpResponse;
3638 SetContainerMetadataResult response;
3639 auto http_status_code
3640 =
static_cast<std::underlying_type<Azure::Core::Http::HttpStatusCode>::type
>(
3641 httpResponse.GetStatusCode());
3642 if (!(http_status_code == 200))
3644 throw StorageError::CreateFromResponse(std::move(pHttpResponse));
3646 response.ETag = httpResponse.GetHeaders().at(
"etag");
3647 response.LastModified = httpResponse.GetHeaders().at(
"last-modified");
3648 return Azure::Core::Response<SetContainerMetadataResult>(
3649 std::move(response), std::move(pHttpResponse));
3654 Azure::Core::Nullable<int32_t> Timeout;
3655 Azure::Core::Nullable<std::string> Prefix;
3656 Azure::Core::Nullable<std::string> Marker;
3657 Azure::Core::Nullable<int32_t> MaxResults;
3658 ListBlobsIncludeItem Include = ListBlobsIncludeItem::None;
3661 static Azure::Core::Response<ListBlobsFlatSegmentResult> ListBlobsFlat(
3662 const Azure::Core::Context& context,
3663 Azure::Core::Http::HttpPipeline& pipeline,
3664 const Azure::Core::Http::Url& url,
3668 auto request = Azure::Core::Http::Request(Azure::Core::Http::HttpMethod::Get, url);
3669 request.AddHeader(
"x-ms-version", c_ApiVersion);
3670 if (options.Timeout.HasValue())
3672 request.GetUrl().AppendQuery(
"timeout", std::to_string(options.Timeout.GetValue()));
3674 request.GetUrl().AppendQuery(
"restype",
"container");
3675 request.GetUrl().AppendQuery(
"comp",
"list");
3676 if (options.Prefix.HasValue())
3678 request.GetUrl().AppendQuery(
"prefix", options.Prefix.GetValue());
3680 if (options.Marker.HasValue())
3682 request.GetUrl().AppendQuery(
"marker", options.Marker.GetValue());
3684 if (options.MaxResults.HasValue())
3686 request.GetUrl().AppendQuery(
"maxresults", std::to_string(options.MaxResults.GetValue()));
3688 std::string list_blobs_include_item = ListBlobsIncludeItemToString(options.Include);
3689 if (!list_blobs_include_item.empty())
3691 request.GetUrl().AppendQuery(
"include", list_blobs_include_item);
3693 auto pHttpResponse = pipeline.Send(context, request);
3694 Azure::Core::Http::RawResponse& httpResponse = *pHttpResponse;
3695 ListBlobsFlatSegmentResult response;
3696 auto http_status_code
3697 =
static_cast<std::underlying_type<Azure::Core::Http::HttpStatusCode>::type
>(
3698 httpResponse.GetStatusCode());
3699 if (!(http_status_code == 200))
3701 throw StorageError::CreateFromResponse(std::move(pHttpResponse));
3704 const auto& httpResponseBody = httpResponse.GetBody();
3706 reinterpret_cast<const char*
>(httpResponseBody.data()), httpResponseBody.size());
3707 response = ListBlobsFlatSegmentResultFromXml(reader);
3709 return Azure::Core::Response<ListBlobsFlatSegmentResult>(
3710 std::move(response), std::move(pHttpResponse));
3715 Azure::Core::Nullable<int32_t> Timeout;
3716 Azure::Core::Nullable<std::string> Prefix;
3717 Azure::Core::Nullable<std::string> Delimiter;
3718 Azure::Core::Nullable<std::string> Marker;
3719 Azure::Core::Nullable<int32_t> MaxResults;
3720 ListBlobsIncludeItem Include = ListBlobsIncludeItem::None;
3723 static Azure::Core::Response<ListBlobsByHierarchySegmentResult> ListBlobsByHierarchy(
3724 const Azure::Core::Context& context,
3725 Azure::Core::Http::HttpPipeline& pipeline,
3726 const Azure::Core::Http::Url& url,
3730 auto request = Azure::Core::Http::Request(Azure::Core::Http::HttpMethod::Get, url);
3731 request.AddHeader(
"x-ms-version", c_ApiVersion);
3732 if (options.Timeout.HasValue())
3734 request.GetUrl().AppendQuery(
"timeout", std::to_string(options.Timeout.GetValue()));
3736 request.GetUrl().AppendQuery(
"restype",
"container");
3737 request.GetUrl().AppendQuery(
"comp",
"list");
3738 if (options.Prefix.HasValue())
3740 request.GetUrl().AppendQuery(
"prefix", options.Prefix.GetValue());
3742 if (options.Delimiter.HasValue())
3744 request.GetUrl().AppendQuery(
"delimiter", options.Delimiter.GetValue());
3746 if (options.Marker.HasValue())
3748 request.GetUrl().AppendQuery(
"marker", options.Marker.GetValue());
3750 if (options.MaxResults.HasValue())
3752 request.GetUrl().AppendQuery(
"maxresults", std::to_string(options.MaxResults.GetValue()));
3754 std::string list_blobs_include_item = ListBlobsIncludeItemToString(options.Include);
3755 if (!list_blobs_include_item.empty())
3757 request.GetUrl().AppendQuery(
"include", list_blobs_include_item);
3759 auto pHttpResponse = pipeline.Send(context, request);
3760 Azure::Core::Http::RawResponse& httpResponse = *pHttpResponse;
3761 ListBlobsByHierarchySegmentResult response;
3762 auto http_status_code
3763 =
static_cast<std::underlying_type<Azure::Core::Http::HttpStatusCode>::type
>(
3764 httpResponse.GetStatusCode());
3765 if (!(http_status_code == 200))
3767 throw StorageError::CreateFromResponse(std::move(pHttpResponse));
3770 const auto& httpResponseBody = httpResponse.GetBody();
3772 reinterpret_cast<const char*
>(httpResponseBody.data()), httpResponseBody.size());
3773 response = ListBlobsByHierarchySegmentResultFromXml(reader);
3775 return Azure::Core::Response<ListBlobsByHierarchySegmentResult>(
3776 std::move(response), std::move(pHttpResponse));
3781 Azure::Core::Nullable<int32_t> Timeout;
3782 Azure::Core::Nullable<std::string> LeaseId;
3785 static Azure::Core::Response<GetContainerAccessPolicyResult> GetAccessPolicy(
3786 const Azure::Core::Context& context,
3787 Azure::Core::Http::HttpPipeline& pipeline,
3788 const Azure::Core::Http::Url& url,
3792 auto request = Azure::Core::Http::Request(Azure::Core::Http::HttpMethod::Get, url);
3793 request.AddHeader(
"x-ms-version", c_ApiVersion);
3794 if (options.Timeout.HasValue())
3796 request.GetUrl().AppendQuery(
"timeout", std::to_string(options.Timeout.GetValue()));
3798 request.GetUrl().AppendQuery(
"restype",
"container");
3799 request.GetUrl().AppendQuery(
"comp",
"acl");
3800 auto pHttpResponse = pipeline.Send(context, request);
3801 Azure::Core::Http::RawResponse& httpResponse = *pHttpResponse;
3803 auto http_status_code
3804 =
static_cast<std::underlying_type<Azure::Core::Http::HttpStatusCode>::type
>(
3805 httpResponse.GetStatusCode());
3806 if (!(http_status_code == 200))
3808 throw StorageError::CreateFromResponse(std::move(pHttpResponse));
3811 const auto& httpResponseBody = httpResponse.GetBody();
3813 reinterpret_cast<const char*
>(httpResponseBody.data()), httpResponseBody.size());
3814 response = GetContainerAccessPolicyResultFromXml(reader);
3816 response.ETag = httpResponse.GetHeaders().at(
"etag");
3817 response.LastModified = httpResponse.GetHeaders().at(
"last-modified");
3819 = PublicAccessTypeFromString(httpResponse.GetHeaders().at(
"x-ms-blob-public-access"));
3820 return Azure::Core::Response<GetContainerAccessPolicyResult>(
3821 std::move(response), std::move(pHttpResponse));
3826 Azure::Core::Nullable<int32_t> Timeout;
3827 Azure::Core::Nullable<PublicAccessType> AccessType;
3828 Azure::Core::Nullable<std::string> LeaseId;
3829 Azure::Core::Nullable<std::string> IfModifiedSince;
3830 Azure::Core::Nullable<std::string> IfUnmodifiedSince;
3831 std::vector<BlobSignedIdentifier> SignedIdentifiers;
3834 static Azure::Core::Response<SetContainerAccessPolicyResult> SetAccessPolicy(
3835 const Azure::Core::Context& context,
3836 Azure::Core::Http::HttpPipeline& pipeline,
3837 const Azure::Core::Http::Url& url,
3841 std::string xml_body;
3844 SetContainerAccessPolicyOptionsToXml(writer, options);
3845 xml_body = writer.GetDocument();
3846 writer.Write(XmlNode{XmlNodeType::End});
3848 Azure::Core::Http::MemoryBodyStream xml_body_stream(
3849 reinterpret_cast<const uint8_t*
>(xml_body.data()), xml_body.length());
3851 = Azure::Core::Http::Request(Azure::Core::Http::HttpMethod::Put, url, &xml_body_stream);
3852 request.AddHeader(
"Content-Length", std::to_string(xml_body_stream.Length()));
3853 request.AddHeader(
"x-ms-version", c_ApiVersion);
3854 if (options.Timeout.HasValue())
3856 request.GetUrl().AppendQuery(
"timeout", std::to_string(options.Timeout.GetValue()));
3858 request.GetUrl().AppendQuery(
"restype",
"container");
3859 request.GetUrl().AppendQuery(
"comp",
"acl");
3860 if (options.AccessType.HasValue())
3863 "x-ms-blob-public-access", PublicAccessTypeToString(options.AccessType.GetValue()));
3865 if (options.LeaseId.HasValue())
3867 request.AddHeader(
"x-ms-lease-id", options.LeaseId.GetValue());
3869 if (options.IfModifiedSince.HasValue())
3871 request.AddHeader(
"If-Modified-Since", options.IfModifiedSince.GetValue());
3873 if (options.IfUnmodifiedSince.HasValue())
3875 request.AddHeader(
"If-Unmodified-Since", options.IfUnmodifiedSince.GetValue());
3877 auto pHttpResponse = pipeline.Send(context, request);
3878 Azure::Core::Http::RawResponse& httpResponse = *pHttpResponse;
3879 SetContainerAccessPolicyResult response;
3880 auto http_status_code
3881 =
static_cast<std::underlying_type<Azure::Core::Http::HttpStatusCode>::type
>(
3882 httpResponse.GetStatusCode());
3883 if (!(http_status_code == 200))
3885 throw StorageError::CreateFromResponse(std::move(pHttpResponse));
3887 response.ETag = httpResponse.GetHeaders().at(
"etag");
3888 response.LastModified = httpResponse.GetHeaders().at(
"last-modified");
3889 return Azure::Core::Response<SetContainerAccessPolicyResult>(
3890 std::move(response), std::move(pHttpResponse));
3895 Azure::Core::Nullable<int32_t> Timeout;
3896 int32_t LeaseDuration = -1;
3897 Azure::Core::Nullable<std::string> ProposedLeaseId;
3898 Azure::Core::Nullable<std::string> IfModifiedSince;
3899 Azure::Core::Nullable<std::string> IfUnmodifiedSince;
3902 static Azure::Core::Response<AcquireContainerLeaseResult> AcquireLease(
3903 const Azure::Core::Context& context,
3904 Azure::Core::Http::HttpPipeline& pipeline,
3905 const Azure::Core::Http::Url& url,
3909 auto request = Azure::Core::Http::Request(Azure::Core::Http::HttpMethod::Put, url);
3910 request.AddHeader(
"Content-Length",
"0");
3911 request.AddHeader(
"x-ms-version", c_ApiVersion);
3912 if (options.Timeout.HasValue())
3914 request.GetUrl().AppendQuery(
"timeout", std::to_string(options.Timeout.GetValue()));
3916 request.GetUrl().AppendQuery(
"restype",
"container");
3917 request.GetUrl().AppendQuery(
"comp",
"lease");
3918 request.AddHeader(
"x-ms-lease-action",
"acquire");
3919 request.AddHeader(
"x-ms-lease-duration", std::to_string(options.LeaseDuration));
3920 if (options.ProposedLeaseId.HasValue())
3922 request.AddHeader(
"x-ms-proposed-lease-id", options.ProposedLeaseId.GetValue());
3924 if (options.IfModifiedSince.HasValue())
3926 request.AddHeader(
"If-Modified-Since", options.IfModifiedSince.GetValue());
3928 if (options.IfUnmodifiedSince.HasValue())
3930 request.AddHeader(
"If-Unmodified-Since", options.IfUnmodifiedSince.GetValue());
3932 auto pHttpResponse = pipeline.Send(context, request);
3933 Azure::Core::Http::RawResponse& httpResponse = *pHttpResponse;
3934 AcquireContainerLeaseResult response;
3935 auto http_status_code
3936 =
static_cast<std::underlying_type<Azure::Core::Http::HttpStatusCode>::type
>(
3937 httpResponse.GetStatusCode());
3938 if (!(http_status_code == 201))
3940 throw StorageError::CreateFromResponse(std::move(pHttpResponse));
3942 response.ETag = httpResponse.GetHeaders().at(
"etag");
3943 response.LastModified = httpResponse.GetHeaders().at(
"last-modified");
3944 response.LeaseId = httpResponse.GetHeaders().at(
"x-ms-lease-id");
3945 return Azure::Core::Response<AcquireContainerLeaseResult>(
3946 std::move(response), std::move(pHttpResponse));
3951 Azure::Core::Nullable<int32_t> Timeout;
3952 std::string LeaseId;
3953 Azure::Core::Nullable<std::string> IfModifiedSince;
3954 Azure::Core::Nullable<std::string> IfUnmodifiedSince;
3957 static Azure::Core::Response<RenewContainerLeaseResult> RenewLease(
3958 const Azure::Core::Context& context,
3959 Azure::Core::Http::HttpPipeline& pipeline,
3960 const Azure::Core::Http::Url& url,
3964 auto request = Azure::Core::Http::Request(Azure::Core::Http::HttpMethod::Put, url);
3965 request.AddHeader(
"Content-Length",
"0");
3966 request.AddHeader(
"x-ms-version", c_ApiVersion);
3967 if (options.Timeout.HasValue())
3969 request.GetUrl().AppendQuery(
"timeout", std::to_string(options.Timeout.GetValue()));
3971 request.GetUrl().AppendQuery(
"restype",
"container");
3972 request.GetUrl().AppendQuery(
"comp",
"lease");
3973 request.AddHeader(
"x-ms-lease-action",
"renew");
3974 request.AddHeader(
"x-ms-lease-id", options.LeaseId);
3975 if (options.IfModifiedSince.HasValue())
3977 request.AddHeader(
"If-Modified-Since", options.IfModifiedSince.GetValue());
3979 if (options.IfUnmodifiedSince.HasValue())
3981 request.AddHeader(
"If-Unmodified-Since", options.IfUnmodifiedSince.GetValue());
3983 auto pHttpResponse = pipeline.Send(context, request);
3984 Azure::Core::Http::RawResponse& httpResponse = *pHttpResponse;
3985 RenewContainerLeaseResult response;
3986 auto http_status_code
3987 =
static_cast<std::underlying_type<Azure::Core::Http::HttpStatusCode>::type
>(
3988 httpResponse.GetStatusCode());
3989 if (!(http_status_code == 200))
3991 throw StorageError::CreateFromResponse(std::move(pHttpResponse));
3993 response.ETag = httpResponse.GetHeaders().at(
"etag");
3994 response.LastModified = httpResponse.GetHeaders().at(
"last-modified");
3995 response.LeaseId = httpResponse.GetHeaders().at(
"x-ms-lease-id");
3996 return Azure::Core::Response<RenewContainerLeaseResult>(
3997 std::move(response), std::move(pHttpResponse));
4002 Azure::Core::Nullable<int32_t> Timeout;
4003 std::string LeaseId;
4004 std::string ProposedLeaseId;
4005 Azure::Core::Nullable<std::string> IfModifiedSince;
4006 Azure::Core::Nullable<std::string> IfUnmodifiedSince;
4009 static Azure::Core::Response<ChangeContainerLeaseResult> ChangeLease(
4010 const Azure::Core::Context& context,
4011 Azure::Core::Http::HttpPipeline& pipeline,
4012 const Azure::Core::Http::Url& url,
4016 auto request = Azure::Core::Http::Request(Azure::Core::Http::HttpMethod::Put, url);
4017 request.AddHeader(
"Content-Length",
"0");
4018 request.AddHeader(
"x-ms-version", c_ApiVersion);
4019 if (options.Timeout.HasValue())
4021 request.GetUrl().AppendQuery(
"timeout", std::to_string(options.Timeout.GetValue()));
4023 request.GetUrl().AppendQuery(
"restype",
"container");
4024 request.GetUrl().AppendQuery(
"comp",
"lease");
4025 request.AddHeader(
"x-ms-lease-action",
"change");
4026 request.AddHeader(
"x-ms-lease-id", options.LeaseId);
4027 request.AddHeader(
"x-ms-proposed-lease-id", options.ProposedLeaseId);
4028 if (options.IfModifiedSince.HasValue())
4030 request.AddHeader(
"If-Modified-Since", options.IfModifiedSince.GetValue());
4032 if (options.IfUnmodifiedSince.HasValue())
4034 request.AddHeader(
"If-Unmodified-Since", options.IfUnmodifiedSince.GetValue());
4036 auto pHttpResponse = pipeline.Send(context, request);
4037 Azure::Core::Http::RawResponse& httpResponse = *pHttpResponse;
4038 ChangeContainerLeaseResult response;
4039 auto http_status_code
4040 =
static_cast<std::underlying_type<Azure::Core::Http::HttpStatusCode>::type
>(
4041 httpResponse.GetStatusCode());
4042 if (!(http_status_code == 200))
4044 throw StorageError::CreateFromResponse(std::move(pHttpResponse));
4046 response.ETag = httpResponse.GetHeaders().at(
"etag");
4047 response.LastModified = httpResponse.GetHeaders().at(
"last-modified");
4048 response.LeaseId = httpResponse.GetHeaders().at(
"x-ms-lease-id");
4049 return Azure::Core::Response<ChangeContainerLeaseResult>(
4050 std::move(response), std::move(pHttpResponse));
4055 Azure::Core::Nullable<int32_t> Timeout;
4056 std::string LeaseId;
4057 Azure::Core::Nullable<std::string> IfModifiedSince;
4058 Azure::Core::Nullable<std::string> IfUnmodifiedSince;
4061 static Azure::Core::Response<ReleaseContainerLeaseResult> ReleaseLease(
4062 const Azure::Core::Context& context,
4063 Azure::Core::Http::HttpPipeline& pipeline,
4064 const Azure::Core::Http::Url& url,
4068 auto request = Azure::Core::Http::Request(Azure::Core::Http::HttpMethod::Put, url);
4069 request.AddHeader(
"Content-Length",
"0");
4070 request.AddHeader(
"x-ms-version", c_ApiVersion);
4071 if (options.Timeout.HasValue())
4073 request.GetUrl().AppendQuery(
"timeout", std::to_string(options.Timeout.GetValue()));
4075 request.GetUrl().AppendQuery(
"restype",
"container");
4076 request.GetUrl().AppendQuery(
"comp",
"lease");
4077 request.AddHeader(
"x-ms-lease-action",
"release");
4078 request.AddHeader(
"x-ms-lease-id", options.LeaseId);
4079 if (options.IfModifiedSince.HasValue())
4081 request.AddHeader(
"If-Modified-Since", options.IfModifiedSince.GetValue());
4083 if (options.IfUnmodifiedSince.HasValue())
4085 request.AddHeader(
"If-Unmodified-Since", options.IfUnmodifiedSince.GetValue());
4087 auto pHttpResponse = pipeline.Send(context, request);
4088 Azure::Core::Http::RawResponse& httpResponse = *pHttpResponse;
4089 ReleaseContainerLeaseResult response;
4090 auto http_status_code
4091 =
static_cast<std::underlying_type<Azure::Core::Http::HttpStatusCode>::type
>(
4092 httpResponse.GetStatusCode());
4093 if (!(http_status_code == 200))
4095 throw StorageError::CreateFromResponse(std::move(pHttpResponse));
4097 response.ETag = httpResponse.GetHeaders().at(
"etag");
4098 response.LastModified = httpResponse.GetHeaders().at(
"last-modified");
4099 return Azure::Core::Response<ReleaseContainerLeaseResult>(
4100 std::move(response), std::move(pHttpResponse));
4105 Azure::Core::Nullable<int32_t> Timeout;
4106 Azure::Core::Nullable<int32_t> BreakPeriod;
4107 Azure::Core::Nullable<std::string> IfModifiedSince;
4108 Azure::Core::Nullable<std::string> IfUnmodifiedSince;
4111 static Azure::Core::Response<BreakContainerLeaseResult> BreakLease(
4112 const Azure::Core::Context& context,
4113 Azure::Core::Http::HttpPipeline& pipeline,
4114 const Azure::Core::Http::Url& url,
4118 auto request = Azure::Core::Http::Request(Azure::Core::Http::HttpMethod::Put, url);
4119 request.AddHeader(
"Content-Length",
"0");
4120 request.AddHeader(
"x-ms-version", c_ApiVersion);
4121 if (options.Timeout.HasValue())
4123 request.GetUrl().AppendQuery(
"timeout", std::to_string(options.Timeout.GetValue()));
4125 request.GetUrl().AppendQuery(
"restype",
"container");
4126 request.GetUrl().AppendQuery(
"comp",
"lease");
4127 request.AddHeader(
"x-ms-lease-action",
"break");
4128 if (options.BreakPeriod.HasValue())
4131 "x-ms-lease-break-period", std::to_string(options.BreakPeriod.GetValue()));
4133 if (options.IfModifiedSince.HasValue())
4135 request.AddHeader(
"If-Modified-Since", options.IfModifiedSince.GetValue());
4137 if (options.IfUnmodifiedSince.HasValue())
4139 request.AddHeader(
"If-Unmodified-Since", options.IfUnmodifiedSince.GetValue());
4141 auto pHttpResponse = pipeline.Send(context, request);
4142 Azure::Core::Http::RawResponse& httpResponse = *pHttpResponse;
4143 BreakContainerLeaseResult response;
4144 auto http_status_code
4145 =
static_cast<std::underlying_type<Azure::Core::Http::HttpStatusCode>::type
>(
4146 httpResponse.GetStatusCode());
4147 if (!(http_status_code == 202))
4149 throw StorageError::CreateFromResponse(std::move(pHttpResponse));
4151 response.ETag = httpResponse.GetHeaders().at(
"etag");
4152 response.LastModified = httpResponse.GetHeaders().at(
"last-modified");
4153 response.LeaseTime = std::stoi(httpResponse.GetHeaders().at(
"x-ms-lease-time"));
4154 return Azure::Core::Response<BreakContainerLeaseResult>(
4155 std::move(response), std::move(pHttpResponse));
4159 static GetContainerAccessPolicyResult GetContainerAccessPolicyResultFromXml(XmlReader& reader)
4161 GetContainerAccessPolicyResult ret;
4162 enum class XmlTagName
4164 k_SignedIdentifiers,
4168 std::vector<XmlTagName> path;
4171 auto node = reader.Read();
4172 if (node.Type == XmlNodeType::End)
4176 else if (node.Type == XmlNodeType::EndTag)
4178 if (path.size() > 0)
4187 else if (node.Type == XmlNodeType::StartTag)
4189 if (std::strcmp(node.Name,
"SignedIdentifiers") == 0)
4191 path.emplace_back(XmlTagName::k_SignedIdentifiers);
4193 else if (std::strcmp(node.Name,
"SignedIdentifier") == 0)
4195 path.emplace_back(XmlTagName::k_SignedIdentifier);
4199 path.emplace_back(XmlTagName::k_Unknown);
4201 if (path.size() == 2 && path[0] == XmlTagName::k_SignedIdentifiers
4202 && path[1] == XmlTagName::k_SignedIdentifier)
4204 ret.SignedIdentifiers.emplace_back(BlobSignedIdentifierFromXml(reader));
4208 else if (node.Type == XmlNodeType::Text)
4215 static ListBlobsByHierarchySegmentResult ListBlobsByHierarchySegmentResultFromXml(
4218 ListBlobsByHierarchySegmentResult ret;
4219 enum class XmlTagName
4221 k_EnumerationResults,
4231 std::vector<XmlTagName> path;
4234 auto node = reader.Read();
4235 if (node.Type == XmlNodeType::End)
4239 else if (node.Type == XmlNodeType::EndTag)
4241 if (path.size() > 0)
4250 else if (node.Type == XmlNodeType::StartTag)
4252 if (std::strcmp(node.Name,
"EnumerationResults") == 0)
4254 path.emplace_back(XmlTagName::k_EnumerationResults);
4256 else if (std::strcmp(node.Name,
"Prefix") == 0)
4258 path.emplace_back(XmlTagName::k_Prefix);
4260 else if (std::strcmp(node.Name,
"Delimiter") == 0)
4262 path.emplace_back(XmlTagName::k_Delimiter);
4264 else if (std::strcmp(node.Name,
"Marker") == 0)
4266 path.emplace_back(XmlTagName::k_Marker);
4268 else if (std::strcmp(node.Name,
"NextMarker") == 0)
4270 path.emplace_back(XmlTagName::k_NextMarker);
4272 else if (std::strcmp(node.Name,
"Blobs") == 0)
4274 path.emplace_back(XmlTagName::k_Blobs);
4276 else if (std::strcmp(node.Name,
"Blob") == 0)
4278 path.emplace_back(XmlTagName::k_Blob);
4280 else if (std::strcmp(node.Name,
"BlobPrefix") == 0)
4282 path.emplace_back(XmlTagName::k_BlobPrefix);
4286 path.emplace_back(XmlTagName::k_Unknown);
4288 if (path.size() == 3 && path[0] == XmlTagName::k_EnumerationResults
4289 && path[1] == XmlTagName::k_Blobs && path[2] == XmlTagName::k_Blob)
4291 ret.Items.emplace_back(BlobItemFromXml(reader));
4295 path.size() == 3 && path[0] == XmlTagName::k_EnumerationResults
4296 && path[1] == XmlTagName::k_Blobs && path[2] == XmlTagName::k_BlobPrefix)
4298 ret.BlobPrefixes.emplace_back(BlobPrefixFromXml(reader));
4302 else if (node.Type == XmlNodeType::Text)
4304 if (path.size() == 2 && path[0] == XmlTagName::k_EnumerationResults
4305 && path[1] == XmlTagName::k_Prefix)
4307 ret.Prefix = node.Value;
4310 path.size() == 2 && path[0] == XmlTagName::k_EnumerationResults
4311 && path[1] == XmlTagName::k_Delimiter)
4313 ret.Delimiter = node.Value;
4316 path.size() == 2 && path[0] == XmlTagName::k_EnumerationResults
4317 && path[1] == XmlTagName::k_Marker)
4319 ret.Marker = node.Value;
4322 path.size() == 2 && path[0] == XmlTagName::k_EnumerationResults
4323 && path[1] == XmlTagName::k_NextMarker)
4325 ret.NextMarker = node.Value;
4328 else if (node.Type == XmlNodeType::Attribute)
4330 if (path.size() == 1 && path[0] == XmlTagName::k_EnumerationResults
4331 && std::strcmp(node.Name,
"ServiceEndpoint") == 0)
4333 ret.ServiceEndpoint = node.Value;
4336 path.size() == 1 && path[0] == XmlTagName::k_EnumerationResults
4337 && std::strcmp(node.Name,
"ContainerName") == 0)
4339 ret.Container = node.Value;
4346 static ListBlobsFlatSegmentResult ListBlobsFlatSegmentResultFromXml(XmlReader& reader)
4348 ListBlobsFlatSegmentResult ret;
4349 enum class XmlTagName
4351 k_EnumerationResults,
4359 std::vector<XmlTagName> path;
4362 auto node = reader.Read();
4363 if (node.Type == XmlNodeType::End)
4367 else if (node.Type == XmlNodeType::EndTag)
4369 if (path.size() > 0)
4378 else if (node.Type == XmlNodeType::StartTag)
4380 if (std::strcmp(node.Name,
"EnumerationResults") == 0)
4382 path.emplace_back(XmlTagName::k_EnumerationResults);
4384 else if (std::strcmp(node.Name,
"Prefix") == 0)
4386 path.emplace_back(XmlTagName::k_Prefix);
4388 else if (std::strcmp(node.Name,
"Marker") == 0)
4390 path.emplace_back(XmlTagName::k_Marker);
4392 else if (std::strcmp(node.Name,
"NextMarker") == 0)
4394 path.emplace_back(XmlTagName::k_NextMarker);
4396 else if (std::strcmp(node.Name,
"Blobs") == 0)
4398 path.emplace_back(XmlTagName::k_Blobs);
4400 else if (std::strcmp(node.Name,
"Blob") == 0)
4402 path.emplace_back(XmlTagName::k_Blob);
4406 path.emplace_back(XmlTagName::k_Unknown);
4408 if (path.size() == 3 && path[0] == XmlTagName::k_EnumerationResults
4409 && path[1] == XmlTagName::k_Blobs && path[2] == XmlTagName::k_Blob)
4411 ret.Items.emplace_back(BlobItemFromXml(reader));
4415 else if (node.Type == XmlNodeType::Text)
4417 if (path.size() == 2 && path[0] == XmlTagName::k_EnumerationResults
4418 && path[1] == XmlTagName::k_Prefix)
4420 ret.Prefix = node.Value;
4423 path.size() == 2 && path[0] == XmlTagName::k_EnumerationResults
4424 && path[1] == XmlTagName::k_Marker)
4426 ret.Marker = node.Value;
4429 path.size() == 2 && path[0] == XmlTagName::k_EnumerationResults
4430 && path[1] == XmlTagName::k_NextMarker)
4432 ret.NextMarker = node.Value;
4435 else if (node.Type == XmlNodeType::Attribute)
4437 if (path.size() == 1 && path[0] == XmlTagName::k_EnumerationResults
4438 && std::strcmp(node.Name,
"ServiceEndpoint") == 0)
4440 ret.ServiceEndpoint = node.Value;
4443 path.size() == 1 && path[0] == XmlTagName::k_EnumerationResults
4444 && std::strcmp(node.Name,
"ContainerName") == 0)
4446 ret.Container = node.Value;
4453 static BlobItem BlobItemFromXml(XmlReader& reader)
4456 enum class XmlTagName
4469 k_ContentDisposition,
4476 k_AccessTierInferred,
4481 k_EncryptionKeySHA256,
4483 k_xmsblobsequencenumber,
4488 std::vector<XmlTagName> path;
4491 auto node = reader.Read();
4492 if (node.Type == XmlNodeType::End)
4496 else if (node.Type == XmlNodeType::EndTag)
4498 if (path.size() > 0)
4507 else if (node.Type == XmlNodeType::StartTag)
4509 if (std::strcmp(node.Name,
"Name") == 0)
4511 path.emplace_back(XmlTagName::k_Name);
4513 else if (std::strcmp(node.Name,
"Deleted") == 0)
4515 path.emplace_back(XmlTagName::k_Deleted);
4517 else if (std::strcmp(node.Name,
"Snapshot") == 0)
4519 path.emplace_back(XmlTagName::k_Snapshot);
4521 else if (std::strcmp(node.Name,
"VersionId") == 0)
4523 path.emplace_back(XmlTagName::k_VersionId);
4525 else if (std::strcmp(node.Name,
"IsCurrentVersion") == 0)
4527 path.emplace_back(XmlTagName::k_IsCurrentVersion);
4529 else if (std::strcmp(node.Name,
"Properties") == 0)
4531 path.emplace_back(XmlTagName::k_Properties);
4533 else if (std::strcmp(node.Name,
"Content-Type") == 0)
4535 path.emplace_back(XmlTagName::k_ContentType);
4537 else if (std::strcmp(node.Name,
"Content-Encoding") == 0)
4539 path.emplace_back(XmlTagName::k_ContentEncoding);
4541 else if (std::strcmp(node.Name,
"Content-Language") == 0)
4543 path.emplace_back(XmlTagName::k_ContentLanguage);
4545 else if (std::strcmp(node.Name,
"Content-MD5") == 0)
4547 path.emplace_back(XmlTagName::k_ContentMD5);
4549 else if (std::strcmp(node.Name,
"Cache-Control") == 0)
4551 path.emplace_back(XmlTagName::k_CacheControl);
4553 else if (std::strcmp(node.Name,
"Content-Disposition") == 0)
4555 path.emplace_back(XmlTagName::k_ContentDisposition);
4557 else if (std::strcmp(node.Name,
"Creation-Time") == 0)
4559 path.emplace_back(XmlTagName::k_CreationTime);
4561 else if (std::strcmp(node.Name,
"Last-Modified") == 0)
4563 path.emplace_back(XmlTagName::k_LastModified);
4565 else if (std::strcmp(node.Name,
"Etag") == 0)
4567 path.emplace_back(XmlTagName::k_Etag);
4569 else if (std::strcmp(node.Name,
"Content-Length") == 0)
4571 path.emplace_back(XmlTagName::k_ContentLength);
4573 else if (std::strcmp(node.Name,
"BlobType") == 0)
4575 path.emplace_back(XmlTagName::k_BlobType);
4577 else if (std::strcmp(node.Name,
"AccessTier") == 0)
4579 path.emplace_back(XmlTagName::k_AccessTier);
4581 else if (std::strcmp(node.Name,
"AccessTierInferred") == 0)
4583 path.emplace_back(XmlTagName::k_AccessTierInferred);
4585 else if (std::strcmp(node.Name,
"LeaseStatus") == 0)
4587 path.emplace_back(XmlTagName::k_LeaseStatus);
4589 else if (std::strcmp(node.Name,
"LeaseState") == 0)
4591 path.emplace_back(XmlTagName::k_LeaseState);
4593 else if (std::strcmp(node.Name,
"LeaseDuration") == 0)
4595 path.emplace_back(XmlTagName::k_LeaseDuration);
4597 else if (std::strcmp(node.Name,
"ServerEncrypted") == 0)
4599 path.emplace_back(XmlTagName::k_ServerEncrypted);
4601 else if (std::strcmp(node.Name,
"EncryptionKeySHA256") == 0)
4603 path.emplace_back(XmlTagName::k_EncryptionKeySHA256);
4605 else if (std::strcmp(node.Name,
"Sealed") == 0)
4607 path.emplace_back(XmlTagName::k_Sealed);
4609 else if (std::strcmp(node.Name,
"x-ms-blob-sequence-number") == 0)
4611 path.emplace_back(XmlTagName::k_xmsblobsequencenumber);
4613 else if (std::strcmp(node.Name,
"Metadata") == 0)
4615 path.emplace_back(XmlTagName::k_Metadata);
4617 else if (std::strcmp(node.Name,
"OrMetadata") == 0)
4619 path.emplace_back(XmlTagName::k_OrMetadata);
4623 path.emplace_back(XmlTagName::k_Unknown);
4625 if (path.size() == 1 && path[0] == XmlTagName::k_Metadata)
4627 ret.Metadata = MetadataFromXml(reader);
4630 else if (path.size() == 1 && path[0] == XmlTagName::k_OrMetadata)
4632 ret.ObjectReplicationSourceProperties
4633 = ObjectReplicationSourcePropertiesFromXml(reader);
4637 else if (node.Type == XmlNodeType::Text)
4639 if (path.size() == 1 && path[0] == XmlTagName::k_Name)
4641 ret.Name = node.Value;
4643 else if (path.size() == 1 && path[0] == XmlTagName::k_Deleted)
4645 ret.Deleted = std::strcmp(node.Value,
"true") == 0;
4647 else if (path.size() == 1 && path[0] == XmlTagName::k_Snapshot)
4649 ret.Snapshot = node.Value;
4651 else if (path.size() == 1 && path[0] == XmlTagName::k_VersionId)
4653 ret.VersionId = node.Value;
4655 else if (path.size() == 1 && path[0] == XmlTagName::k_IsCurrentVersion)
4657 ret.IsCurrentVersion = std::strcmp(node.Value,
"true") == 0;
4660 path.size() == 2 && path[0] == XmlTagName::k_Properties
4661 && path[1] == XmlTagName::k_ContentType)
4663 ret.HttpHeaders.ContentType = node.Value;
4666 path.size() == 2 && path[0] == XmlTagName::k_Properties
4667 && path[1] == XmlTagName::k_ContentEncoding)
4669 ret.HttpHeaders.ContentEncoding = node.Value;
4672 path.size() == 2 && path[0] == XmlTagName::k_Properties
4673 && path[1] == XmlTagName::k_ContentLanguage)
4675 ret.HttpHeaders.ContentLanguage = node.Value;
4678 path.size() == 2 && path[0] == XmlTagName::k_Properties
4679 && path[1] == XmlTagName::k_ContentMD5)
4681 ret.HttpHeaders.ContentMd5 = node.Value;
4684 path.size() == 2 && path[0] == XmlTagName::k_Properties
4685 && path[1] == XmlTagName::k_CacheControl)
4687 ret.HttpHeaders.CacheControl = node.Value;
4690 path.size() == 2 && path[0] == XmlTagName::k_Properties
4691 && path[1] == XmlTagName::k_ContentDisposition)
4693 ret.HttpHeaders.ContentDisposition = node.Value;
4696 path.size() == 2 && path[0] == XmlTagName::k_Properties
4697 && path[1] == XmlTagName::k_CreationTime)
4699 ret.CreationTime = node.Value;
4702 path.size() == 2 && path[0] == XmlTagName::k_Properties
4703 && path[1] == XmlTagName::k_LastModified)
4705 ret.LastModified = node.Value;
4708 path.size() == 2 && path[0] == XmlTagName::k_Properties
4709 && path[1] == XmlTagName::k_Etag)
4711 ret.ETag = node.Value;
4714 path.size() == 2 && path[0] == XmlTagName::k_Properties
4715 && path[1] == XmlTagName::k_ContentLength)
4717 ret.ContentLength = std::stoll(node.Value);
4720 path.size() == 2 && path[0] == XmlTagName::k_Properties
4721 && path[1] == XmlTagName::k_BlobType)
4723 ret.BlobType = BlobTypeFromString(node.Value);
4726 path.size() == 2 && path[0] == XmlTagName::k_Properties
4727 && path[1] == XmlTagName::k_AccessTier)
4729 ret.Tier = AccessTierFromString(node.Value);
4732 path.size() == 2 && path[0] == XmlTagName::k_Properties
4733 && path[1] == XmlTagName::k_AccessTierInferred)
4735 ret.AccessTierInferred = std::strcmp(node.Value,
"true") == 0;
4738 path.size() == 2 && path[0] == XmlTagName::k_Properties
4739 && path[1] == XmlTagName::k_LeaseStatus)
4741 ret.LeaseStatus = BlobLeaseStatusFromString(node.Value);
4744 path.size() == 2 && path[0] == XmlTagName::k_Properties
4745 && path[1] == XmlTagName::k_LeaseState)
4747 ret.LeaseState = BlobLeaseStateFromString(node.Value);
4750 path.size() == 2 && path[0] == XmlTagName::k_Properties
4751 && path[1] == XmlTagName::k_LeaseDuration)
4753 ret.LeaseDuration = node.Value;
4756 path.size() == 2 && path[0] == XmlTagName::k_Properties
4757 && path[1] == XmlTagName::k_ServerEncrypted)
4759 ret.ServerEncrypted = std::strcmp(node.Value,
"true") == 0;
4762 path.size() == 2 && path[0] == XmlTagName::k_Properties
4763 && path[1] == XmlTagName::k_EncryptionKeySHA256)
4765 ret.EncryptionKeySha256 = node.Value;
4768 path.size() == 2 && path[0] == XmlTagName::k_Properties
4769 && path[1] == XmlTagName::k_Sealed)
4771 ret.IsSealed = std::strcmp(node.Value,
"true") == 0;
4774 path.size() == 2 && path[0] == XmlTagName::k_Properties
4775 && path[1] == XmlTagName::k_xmsblobsequencenumber)
4777 ret.SequenceNumber = std::stoll(node.Value);
4784 static BlobPrefix BlobPrefixFromXml(XmlReader& reader)
4787 enum class XmlTagName
4792 std::vector<XmlTagName> path;
4795 auto node = reader.Read();
4796 if (node.Type == XmlNodeType::End)
4800 else if (node.Type == XmlNodeType::EndTag)
4802 if (path.size() > 0)
4811 else if (node.Type == XmlNodeType::StartTag)
4813 if (std::strcmp(node.Name,
"Name") == 0)
4815 path.emplace_back(XmlTagName::k_Name);
4819 path.emplace_back(XmlTagName::k_Unknown);
4822 else if (node.Type == XmlNodeType::Text)
4824 if (path.size() == 1 && path[0] == XmlTagName::k_Name)
4826 ret.Name = node.Value;
4833 static BlobSignedIdentifier BlobSignedIdentifierFromXml(XmlReader& reader)
4835 BlobSignedIdentifier ret;
4836 enum class XmlTagName
4845 std::vector<XmlTagName> path;
4848 auto node = reader.Read();
4849 if (node.Type == XmlNodeType::End)
4853 else if (node.Type == XmlNodeType::EndTag)
4855 if (path.size() > 0)
4864 else if (node.Type == XmlNodeType::StartTag)
4866 if (std::strcmp(node.Name,
"Id") == 0)
4868 path.emplace_back(XmlTagName::k_Id);
4870 else if (std::strcmp(node.Name,
"AccessPolicy") == 0)
4872 path.emplace_back(XmlTagName::k_AccessPolicy);
4874 else if (std::strcmp(node.Name,
"Start") == 0)
4876 path.emplace_back(XmlTagName::k_Start);
4878 else if (std::strcmp(node.Name,
"Expiry") == 0)
4880 path.emplace_back(XmlTagName::k_Expiry);
4882 else if (std::strcmp(node.Name,
"Permission") == 0)
4884 path.emplace_back(XmlTagName::k_Permission);
4888 path.emplace_back(XmlTagName::k_Unknown);
4891 else if (node.Type == XmlNodeType::Text)
4893 if (path.size() == 1 && path[0] == XmlTagName::k_Id)
4895 ret.Id = node.Value;
4898 path.size() == 2 && path[0] == XmlTagName::k_AccessPolicy
4899 && path[1] == XmlTagName::k_Start)
4901 ret.StartsOn = node.Value;
4904 path.size() == 2 && path[0] == XmlTagName::k_AccessPolicy
4905 && path[1] == XmlTagName::k_Expiry)
4907 ret.ExpiresOn = node.Value;
4910 path.size() == 2 && path[0] == XmlTagName::k_AccessPolicy
4911 && path[1] == XmlTagName::k_Permission)
4913 ret.Permissions = node.Value;
4920 static std::map<std::string, std::string> MetadataFromXml(XmlReader& reader)
4922 std::map<std::string, std::string> ret;
4927 auto node = reader.Read();
4928 if (node.Type == XmlNodeType::End)
4932 else if (node.Type == XmlNodeType::StartTag)
4939 else if (node.Type == XmlNodeType::EndTag)
4946 else if (depth == 1 && node.Type == XmlNodeType::Text)
4948 ret.emplace(std::move(key), std::string(node.Value));
4954 static std::vector<ObjectReplicationPolicy> ObjectReplicationSourcePropertiesFromXml(
4958 std::map<std::string, std::vector<ObjectReplicationRule>> orPropertiesMap;
4959 std::string policyId;
4963 auto node = reader.Read();
4964 if (node.Type == XmlNodeType::End)
4968 else if (node.Type == XmlNodeType::StartTag)
4971 std::string startTagName = node.Name;
4972 if (startTagName.substr(0, 3) ==
"or-")
4974 auto underscorePos = startTagName.find(
'_', 3);
4976 = std::string(startTagName.begin() + 3, startTagName.begin() + underscorePos);
4977 ruleId = startTagName.substr(underscorePos + 1);
4980 else if (node.Type == XmlNodeType::EndTag)
4987 if (depth == 1 && node.Type == XmlNodeType::Text)
4989 ObjectReplicationRule rule;
4990 rule.RuleId = std::move(ruleId);
4991 rule.ReplicationStatus = ObjectReplicationStatusFromString(node.Value);
4992 orPropertiesMap[policyId].emplace_back(std::move(rule));
4995 std::vector<ObjectReplicationPolicy> ret;
4996 for (
auto& property : orPropertiesMap)
4998 ObjectReplicationPolicy policy;
4999 policy.PolicyId =
property.first;
5000 policy.Rules = std::move(property.second);
5001 ret.emplace_back(std::move(policy));
5006 static void SetContainerAccessPolicyOptionsToXml(
5008 const SetContainerAccessPolicyOptions& options)
5010 writer.Write(XmlNode{XmlNodeType::StartTag,
"SignedIdentifiers"});
5011 for (
const auto& i : options.SignedIdentifiers)
5013 BlobSignedIdentifierToXml(writer, i);
5015 writer.Write(XmlNode{XmlNodeType::EndTag});
5018 static void BlobSignedIdentifierToXml(XmlWriter& writer,
const BlobSignedIdentifier& options)
5020 writer.Write(XmlNode{XmlNodeType::StartTag,
"SignedIdentifier"});
5021 writer.Write(XmlNode{XmlNodeType::StartTag,
"Id"});
5022 writer.Write(XmlNode{XmlNodeType::Text,
nullptr, options.Id.data()});
5023 writer.Write(XmlNode{XmlNodeType::EndTag});
5024 writer.Write(XmlNode{XmlNodeType::StartTag,
"AccessPolicy"});
5025 writer.Write(XmlNode{XmlNodeType::StartTag,
"Start"});
5026 writer.Write(XmlNode{XmlNodeType::Text,
nullptr, options.StartsOn.data()});
5027 writer.Write(XmlNode{XmlNodeType::EndTag});
5028 writer.Write(XmlNode{XmlNodeType::StartTag,
"Expiry"});
5029 writer.Write(XmlNode{XmlNodeType::Text,
nullptr, options.ExpiresOn.data()});
5030 writer.Write(XmlNode{XmlNodeType::EndTag});
5031 writer.Write(XmlNode{XmlNodeType::StartTag,
"Permission"});
5032 writer.Write(XmlNode{XmlNodeType::Text,
nullptr, options.Permissions.data()});
5033 writer.Write(XmlNode{XmlNodeType::EndTag});
5034 writer.Write(XmlNode{XmlNodeType::EndTag});
5035 writer.Write(XmlNode{XmlNodeType::EndTag});
5044 Azure::Core::Nullable<int32_t> Timeout;
5045 Azure::Core::Nullable<std::pair<int64_t, int64_t>> Range;
5047 Azure::Core::Nullable<std::string> EncryptionKeySha256;
5048 Azure::Core::Nullable<EncryptionAlgorithmType> EncryptionAlgorithm;
5049 Azure::Core::Nullable<std::string> LeaseId;
5050 Azure::Core::Nullable<std::string> IfModifiedSince;
5051 Azure::Core::Nullable<std::string> IfUnmodifiedSince;
5052 Azure::Core::Nullable<std::string> IfMatch;
5053 Azure::Core::Nullable<std::string> IfNoneMatch;
5054 Azure::Core::Nullable<std::string> IfTags;
5057 static Azure::Core::Response<DownloadBlobResult> Download(
5058 const Azure::Core::Context& context,
5059 Azure::Core::Http::HttpPipeline& pipeline,
5060 const Azure::Core::Http::Url& url,
5064 auto request = Azure::Core::Http::Request(Azure::Core::Http::HttpMethod::Get, url,
true);
5065 request.AddHeader(
"x-ms-version", c_ApiVersion);
5066 if (options.Timeout.HasValue())
5068 request.GetUrl().AppendQuery(
"timeout", std::to_string(options.Timeout.GetValue()));
5070 if (options.Range.HasValue())
5072 auto startOffset = options.Range.GetValue().first;
5073 auto endOffset = options.Range.GetValue().second;
5074 if (endOffset != std::numeric_limits<decltype(endOffset)>::max())
5078 "bytes=" + std::to_string(startOffset) +
"-" + std::to_string(endOffset));
5082 request.AddHeader(
"x-ms-range",
"bytes=" + std::to_string(startOffset) +
"-");
5085 if (options.EncryptionKey.HasValue())
5087 request.AddHeader(
"x-ms-encryption-key", options.EncryptionKey.GetValue());
5089 if (options.EncryptionKeySha256.HasValue())
5091 request.AddHeader(
"x-ms-encryption-key-sha256", options.EncryptionKeySha256.GetValue());
5093 if (options.EncryptionAlgorithm.HasValue())
5096 "x-ms-encryption-algorithm",
5097 EncryptionAlgorithmTypeToString(options.EncryptionAlgorithm.GetValue()));
5099 if (options.IfModifiedSince.HasValue())
5101 request.AddHeader(
"If-Modified-Since", options.IfModifiedSince.GetValue());
5103 if (options.IfUnmodifiedSince.HasValue())
5105 request.AddHeader(
"If-Unmodified-Since", options.IfUnmodifiedSince.GetValue());
5107 if (options.IfMatch.HasValue())
5109 request.AddHeader(
"If-Match", options.IfMatch.GetValue());
5111 if (options.IfNoneMatch.HasValue())
5113 request.AddHeader(
"If-None-Match", options.IfNoneMatch.GetValue());
5115 if (options.IfTags.HasValue())
5117 request.AddHeader(
"x-ms-if-tags", options.IfTags.GetValue());
5119 if (options.LeaseId.HasValue())
5121 request.AddHeader(
"x-ms-lease-id", options.LeaseId.GetValue());
5123 auto pHttpResponse = pipeline.Send(context, request);
5124 Azure::Core::Http::RawResponse& httpResponse = *pHttpResponse;
5125 DownloadBlobResult response;
5126 auto http_status_code
5127 =
static_cast<std::underlying_type<Azure::Core::Http::HttpStatusCode>::type
>(
5128 httpResponse.GetStatusCode());
5129 if (!(http_status_code == 200 || http_status_code == 206))
5131 throw StorageError::CreateFromResponse(std::move(pHttpResponse));
5133 response.BodyStream = httpResponse.GetBodyStream();
5134 response.ETag = httpResponse.GetHeaders().at(
"etag");
5135 response.LastModified = httpResponse.GetHeaders().at(
"last-modified");
5136 auto response_transactional_content_md5_iterator
5137 = httpResponse.GetHeaders().find(
"content-md5");
5138 if (response_transactional_content_md5_iterator != httpResponse.GetHeaders().end())
5140 response.TransactionalContentMd5 = response_transactional_content_md5_iterator->second;
5142 auto response_transactional_content_crc64_iterator
5143 = httpResponse.GetHeaders().find(
"x-ms-content-crc64");
5144 if (response_transactional_content_crc64_iterator != httpResponse.GetHeaders().end())
5146 response.TransactionalContentCrc64
5147 = response_transactional_content_crc64_iterator->second;
5149 auto response_http_headers_content_type_iterator
5150 = httpResponse.GetHeaders().find(
"content-type");
5151 if (response_http_headers_content_type_iterator != httpResponse.GetHeaders().end())
5153 response.HttpHeaders.ContentType = response_http_headers_content_type_iterator->second;
5155 auto response_http_headers_content_encoding_iterator
5156 = httpResponse.GetHeaders().find(
"content-encoding");
5157 if (response_http_headers_content_encoding_iterator != httpResponse.GetHeaders().end())
5159 response.HttpHeaders.ContentEncoding
5160 = response_http_headers_content_encoding_iterator->second;
5162 auto response_http_headers_content_language_iterator
5163 = httpResponse.GetHeaders().find(
"content-language");
5164 if (response_http_headers_content_language_iterator != httpResponse.GetHeaders().end())
5166 response.HttpHeaders.ContentLanguage
5167 = response_http_headers_content_language_iterator->second;
5169 auto response_http_headers_cache_control_iterator
5170 = httpResponse.GetHeaders().find(
"cache-control");
5171 if (response_http_headers_cache_control_iterator != httpResponse.GetHeaders().end())
5173 response.HttpHeaders.CacheControl = response_http_headers_cache_control_iterator->second;
5175 auto response_http_headers_content_md5_iterator
5176 = httpResponse.GetHeaders().find(
"content-md5");
5177 if (response_http_headers_content_md5_iterator != httpResponse.GetHeaders().end())
5179 response.HttpHeaders.ContentMd5 = response_http_headers_content_md5_iterator->second;
5181 auto x_ms_blob_content_md5_iterator
5182 = httpResponse.GetHeaders().find(
"x-ms-blob-content-md5");
5183 if (x_ms_blob_content_md5_iterator != httpResponse.GetHeaders().end())
5185 response.HttpHeaders.ContentMd5 = x_ms_blob_content_md5_iterator->second;
5187 auto response_http_headers_content_disposition_iterator
5188 = httpResponse.GetHeaders().find(
"content-disposition");
5189 if (response_http_headers_content_disposition_iterator != httpResponse.GetHeaders().end())
5191 response.HttpHeaders.ContentDisposition
5192 = response_http_headers_content_disposition_iterator->second;
5194 for (
auto i = httpResponse.GetHeaders().lower_bound(
"x-ms-meta-");
5195 i != httpResponse.GetHeaders().end() && i->first.substr(0, 10) ==
"x-ms-meta-";
5198 response.Metadata.emplace(i->first.substr(10), i->second);
5200 auto response_server_encrypted_iterator
5201 = httpResponse.GetHeaders().find(
"x-ms-server-encrypted");
5202 if (response_server_encrypted_iterator != httpResponse.GetHeaders().end())
5204 response.ServerEncrypted = response_server_encrypted_iterator->second ==
"true";
5206 auto response_encryption_key_sha256_iterator
5207 = httpResponse.GetHeaders().find(
"x-ms-encryption-key-sha256");
5208 if (response_encryption_key_sha256_iterator != httpResponse.GetHeaders().end())
5210 response.EncryptionKeySha256 = response_encryption_key_sha256_iterator->second;
5212 auto response_encryption_scope_iterator
5213 = httpResponse.GetHeaders().find(
"x-ms-encryption-scope");
5214 if (response_encryption_scope_iterator != httpResponse.GetHeaders().end())
5216 response.EncryptionScope = response_encryption_scope_iterator->second;
5218 auto response_lease_status_iterator = httpResponse.GetHeaders().find(
"x-ms-lease-status");
5219 if (response_lease_status_iterator != httpResponse.GetHeaders().end())
5221 response.LeaseStatus = BlobLeaseStatusFromString(response_lease_status_iterator->second);
5223 auto response_lease_state_iterator = httpResponse.GetHeaders().find(
"x-ms-lease-state");
5224 if (response_lease_state_iterator != httpResponse.GetHeaders().end())
5226 response.LeaseState = BlobLeaseStateFromString(response_lease_state_iterator->second);
5228 auto response_lease_duration_iterator
5229 = httpResponse.GetHeaders().find(
"x-ms-lease-duration");
5230 if (response_lease_duration_iterator != httpResponse.GetHeaders().end())
5232 response.LeaseDuration = response_lease_duration_iterator->second;
5234 auto response_content_range_iterator = httpResponse.GetHeaders().find(
"content-range");
5235 if (response_content_range_iterator != httpResponse.GetHeaders().end())
5237 response.ContentRange = response_content_range_iterator->second;
5239 auto response_sequence_number_iterator
5240 = httpResponse.GetHeaders().find(
"x-ms-blob-sequence-number");
5241 if (response_sequence_number_iterator != httpResponse.GetHeaders().end())
5243 response.SequenceNumber = std::stoll(response_sequence_number_iterator->second);
5245 auto response_committed_block_count_iterator
5246 = httpResponse.GetHeaders().find(
"x-ms-blob-committed-block-count");
5247 if (response_committed_block_count_iterator != httpResponse.GetHeaders().end())
5249 response.CommittedBlockCount
5250 = std::stoll(response_committed_block_count_iterator->second);
5252 auto response_is_sealed_iterator = httpResponse.GetHeaders().find(
"x-ms-blob-sealed");
5253 if (response_is_sealed_iterator != httpResponse.GetHeaders().end())
5255 response.IsSealed = response_is_sealed_iterator->second ==
"true";
5257 response.BlobType = BlobTypeFromString(httpResponse.GetHeaders().at(
"x-ms-blob-type"));
5258 auto response_object_replication_destination_policy_id_iterator
5259 = httpResponse.GetHeaders().find(
"x-ms-or-policy-id");
5260 if (response_object_replication_destination_policy_id_iterator
5261 != httpResponse.GetHeaders().end())
5263 response.ObjectReplicationDestinationPolicyId
5264 = response_object_replication_destination_policy_id_iterator->second;
5267 std::map<std::string, std::vector<ObjectReplicationRule>> orPropertiesMap;
5268 for (
auto i = httpResponse.GetHeaders().lower_bound(
"x-ms-or-");
5269 i != httpResponse.GetHeaders().end() && i->first.substr(0, 8) ==
"x-ms-or-";
5272 const std::string& header = i->first;
5273 auto underscorePos = header.find(
'_', 8);
5274 if (underscorePos == std::string::npos)
5278 std::string policyId = std::string(header.begin() + 8, header.begin() + underscorePos);
5279 std::string ruleId = header.substr(underscorePos + 1);
5281 ObjectReplicationRule rule;
5282 rule.RuleId = std::move(ruleId);
5283 rule.ReplicationStatus = ObjectReplicationStatusFromString(i->second);
5284 orPropertiesMap[policyId].emplace_back(std::move(rule));
5286 for (
auto& property : orPropertiesMap)
5288 ObjectReplicationPolicy policy;
5289 policy.PolicyId =
property.first;
5290 policy.Rules = std::move(property.second);
5291 response.ObjectReplicationSourceProperties.emplace_back(std::move(policy));
5294 return Azure::Core::Response<DownloadBlobResult>(
5295 std::move(response), std::move(pHttpResponse));
5300 Azure::Core::Nullable<int32_t> Timeout;
5301 Azure::Core::Nullable<DeleteSnapshotsOption> DeleteSnapshots;
5302 Azure::Core::Nullable<std::string> LeaseId;
5303 Azure::Core::Nullable<std::string> IfModifiedSince;
5304 Azure::Core::Nullable<std::string> IfUnmodifiedSince;
5305 Azure::Core::Nullable<std::string> IfMatch;
5306 Azure::Core::Nullable<std::string> IfNoneMatch;
5307 Azure::Core::Nullable<std::string> IfTags;
5310 static Azure::Core::Http::Request DeleteCreateMessage(
5311 const Azure::Core::Http::Url& url,
5315 auto request = Azure::Core::Http::Request(Azure::Core::Http::HttpMethod::Delete, url);
5316 request.AddHeader(
"x-ms-version", c_ApiVersion);
5317 if (options.Timeout.HasValue())
5319 request.GetUrl().AppendQuery(
"timeout", std::to_string(options.Timeout.GetValue()));
5321 if (options.DeleteSnapshots.HasValue())
5324 "x-ms-delete-snapshots",
5325 DeleteSnapshotsOptionToString(options.DeleteSnapshots.GetValue()));
5327 if (options.LeaseId.HasValue())
5329 request.AddHeader(
"x-ms-lease-id", options.LeaseId.GetValue());
5331 if (options.IfModifiedSince.HasValue())
5333 request.AddHeader(
"If-Modified-Since", options.IfModifiedSince.GetValue());
5335 if (options.IfUnmodifiedSince.HasValue())
5337 request.AddHeader(
"If-Unmodified-Since", options.IfUnmodifiedSince.GetValue());
5339 if (options.IfMatch.HasValue())
5341 request.AddHeader(
"If-Match", options.IfMatch.GetValue());
5343 if (options.IfNoneMatch.HasValue())
5345 request.AddHeader(
"If-None-Match", options.IfNoneMatch.GetValue());
5347 if (options.IfTags.HasValue())
5349 request.AddHeader(
"x-ms-if-tags", options.IfTags.GetValue());
5354 static Azure::Core::Response<DeleteBlobResult> DeleteCreateResponse(
5355 const Azure::Core::Context& context,
5356 std::unique_ptr<Azure::Core::Http::RawResponse> pHttpResponse)
5359 Azure::Core::Http::RawResponse& httpResponse = *pHttpResponse;
5360 DeleteBlobResult response;
5361 auto http_status_code
5362 =
static_cast<std::underlying_type<Azure::Core::Http::HttpStatusCode>::type
>(
5363 httpResponse.GetStatusCode());
5364 if (!(http_status_code == 202))
5366 throw StorageError::CreateFromResponse(std::move(pHttpResponse));
5368 return Azure::Core::Response<DeleteBlobResult>(
5369 std::move(response), std::move(pHttpResponse));
5372 static Azure::Core::Response<DeleteBlobResult> Delete(
5373 const Azure::Core::Context& context,
5374 Azure::Core::Http::HttpPipeline& pipeline,
5375 const Azure::Core::Http::Url& url,
5376 const DeleteBlobOptions& options)
5378 auto request = DeleteCreateMessage(url, options);
5379 auto pHttpResponse = pipeline.Send(context, request);
5380 return DeleteCreateResponse(context, std::move(pHttpResponse));
5385 Azure::Core::Nullable<int32_t> Timeout;
5388 static Azure::Core::Response<UndeleteBlobResult> Undelete(
5389 const Azure::Core::Context& context,
5390 Azure::Core::Http::HttpPipeline& pipeline,
5391 const Azure::Core::Http::Url& url,
5395 auto request = Azure::Core::Http::Request(Azure::Core::Http::HttpMethod::Put, url);
5396 request.AddHeader(
"Content-Length",
"0");
5397 request.AddHeader(
"x-ms-version", c_ApiVersion);
5398 if (options.Timeout.HasValue())
5400 request.GetUrl().AppendQuery(
"timeout", std::to_string(options.Timeout.GetValue()));
5402 request.GetUrl().AppendQuery(
"comp",
"undelete");
5403 auto pHttpResponse = pipeline.Send(context, request);
5404 Azure::Core::Http::RawResponse& httpResponse = *pHttpResponse;
5406 auto http_status_code
5407 =
static_cast<std::underlying_type<Azure::Core::Http::HttpStatusCode>::type
>(
5408 httpResponse.GetStatusCode());
5409 if (!(http_status_code == 200))
5411 throw StorageError::CreateFromResponse(std::move(pHttpResponse));
5413 return Azure::Core::Response<UndeleteBlobResult>(
5414 std::move(response), std::move(pHttpResponse));
5419 Azure::Core::Nullable<int32_t> Timeout;
5421 Azure::Core::Nullable<std::string> EncryptionKeySha256;
5422 Azure::Core::Nullable<EncryptionAlgorithmType> EncryptionAlgorithm;
5423 Azure::Core::Nullable<std::string> LeaseId;
5424 Azure::Core::Nullable<std::string> IfModifiedSince;
5425 Azure::Core::Nullable<std::string> IfUnmodifiedSince;
5426 Azure::Core::Nullable<std::string> IfMatch;
5427 Azure::Core::Nullable<std::string> IfNoneMatch;
5428 Azure::Core::Nullable<std::string> IfTags;
5431 static Azure::Core::Response<GetBlobPropertiesResult> GetProperties(
5432 const Azure::Core::Context& context,
5433 Azure::Core::Http::HttpPipeline& pipeline,
5434 const Azure::Core::Http::Url& url,
5438 auto request = Azure::Core::Http::Request(Azure::Core::Http::HttpMethod::Head, url);
5439 request.AddHeader(
"x-ms-version", c_ApiVersion);
5440 if (options.Timeout.HasValue())
5442 request.GetUrl().AppendQuery(
"timeout", std::to_string(options.Timeout.GetValue()));
5444 if (options.EncryptionKey.HasValue())
5446 request.AddHeader(
"x-ms-encryption-key", options.EncryptionKey.GetValue());
5448 if (options.EncryptionKeySha256.HasValue())
5450 request.AddHeader(
"x-ms-encryption-key-sha256", options.EncryptionKeySha256.GetValue());
5452 if (options.EncryptionAlgorithm.HasValue())
5455 "x-ms-encryption-algorithm",
5456 EncryptionAlgorithmTypeToString(options.EncryptionAlgorithm.GetValue()));
5458 if (options.LeaseId.HasValue())
5460 request.AddHeader(
"x-ms-lease-id", options.LeaseId.GetValue());
5462 if (options.IfModifiedSince.HasValue())
5464 request.AddHeader(
"If-Modified-Since", options.IfModifiedSince.GetValue());
5466 if (options.IfUnmodifiedSince.HasValue())
5468 request.AddHeader(
"If-Unmodified-Since", options.IfUnmodifiedSince.GetValue());
5470 if (options.IfMatch.HasValue())
5472 request.AddHeader(
"If-Match", options.IfMatch.GetValue());
5474 if (options.IfNoneMatch.HasValue())
5476 request.AddHeader(
"If-None-Match", options.IfNoneMatch.GetValue());
5478 if (options.IfTags.HasValue())
5480 request.AddHeader(
"x-ms-if-tags", options.IfTags.GetValue());
5482 auto pHttpResponse = pipeline.Send(context, request);
5483 Azure::Core::Http::RawResponse& httpResponse = *pHttpResponse;
5484 GetBlobPropertiesResult response;
5485 auto http_status_code
5486 =
static_cast<std::underlying_type<Azure::Core::Http::HttpStatusCode>::type
>(
5487 httpResponse.GetStatusCode());
5488 if (!(http_status_code == 200))
5490 throw StorageError::CreateFromResponse(std::move(pHttpResponse));
5492 response.ETag = httpResponse.GetHeaders().at(
"etag");
5493 response.LastModified = httpResponse.GetHeaders().at(
"last-modified");
5494 response.CreationTime = httpResponse.GetHeaders().at(
"x-ms-creation-time");
5495 for (
auto i = httpResponse.GetHeaders().lower_bound(
"x-ms-meta-");
5496 i != httpResponse.GetHeaders().end() && i->first.substr(0, 10) ==
"x-ms-meta-";
5499 response.Metadata.emplace(i->first.substr(10), i->second);
5501 response.BlobType = BlobTypeFromString(httpResponse.GetHeaders().at(
"x-ms-blob-type"));
5502 auto response_lease_status_iterator = httpResponse.GetHeaders().find(
"x-ms-lease-status");
5503 if (response_lease_status_iterator != httpResponse.GetHeaders().end())
5505 response.LeaseStatus = BlobLeaseStatusFromString(response_lease_status_iterator->second);
5507 auto response_lease_state_iterator = httpResponse.GetHeaders().find(
"x-ms-lease-state");
5508 if (response_lease_state_iterator != httpResponse.GetHeaders().end())
5510 response.LeaseState = BlobLeaseStateFromString(response_lease_state_iterator->second);
5512 auto response_lease_duration_iterator
5513 = httpResponse.GetHeaders().find(
"x-ms-lease-duration");
5514 if (response_lease_duration_iterator != httpResponse.GetHeaders().end())
5516 response.LeaseDuration = response_lease_duration_iterator->second;
5518 response.ContentLength = std::stoll(httpResponse.GetHeaders().at(
"content-length"));
5519 auto response_http_headers_content_type_iterator
5520 = httpResponse.GetHeaders().find(
"content-type");
5521 if (response_http_headers_content_type_iterator != httpResponse.GetHeaders().end())
5523 response.HttpHeaders.ContentType = response_http_headers_content_type_iterator->second;
5525 auto response_http_headers_content_encoding_iterator
5526 = httpResponse.GetHeaders().find(
"content-encoding");
5527 if (response_http_headers_content_encoding_iterator != httpResponse.GetHeaders().end())
5529 response.HttpHeaders.ContentEncoding
5530 = response_http_headers_content_encoding_iterator->second;
5532 auto response_http_headers_content_language_iterator
5533 = httpResponse.GetHeaders().find(
"content-language");
5534 if (response_http_headers_content_language_iterator != httpResponse.GetHeaders().end())
5536 response.HttpHeaders.ContentLanguage
5537 = response_http_headers_content_language_iterator->second;
5539 auto response_http_headers_cache_control_iterator
5540 = httpResponse.GetHeaders().find(
"cache-control");
5541 if (response_http_headers_cache_control_iterator != httpResponse.GetHeaders().end())
5543 response.HttpHeaders.CacheControl = response_http_headers_cache_control_iterator->second;
5545 auto response_http_headers_content_md5_iterator
5546 = httpResponse.GetHeaders().find(
"content-md5");
5547 if (response_http_headers_content_md5_iterator != httpResponse.GetHeaders().end())
5549 response.HttpHeaders.ContentMd5 = response_http_headers_content_md5_iterator->second;
5551 auto x_ms_blob_content_md5_iterator
5552 = httpResponse.GetHeaders().find(
"x-ms-blob-content-md5");
5553 if (x_ms_blob_content_md5_iterator != httpResponse.GetHeaders().end())
5555 response.HttpHeaders.ContentMd5 = x_ms_blob_content_md5_iterator->second;
5557 auto response_http_headers_content_disposition_iterator
5558 = httpResponse.GetHeaders().find(
"content-disposition");
5559 if (response_http_headers_content_disposition_iterator != httpResponse.GetHeaders().end())
5561 response.HttpHeaders.ContentDisposition
5562 = response_http_headers_content_disposition_iterator->second;
5564 auto response_sequence_number_iterator
5565 = httpResponse.GetHeaders().find(
"x-ms-blob-sequence-number");
5566 if (response_sequence_number_iterator != httpResponse.GetHeaders().end())
5568 response.SequenceNumber = std::stoll(response_sequence_number_iterator->second);
5570 auto response_committed_block_count_iterator
5571 = httpResponse.GetHeaders().find(
"x-ms-blob-committed-block-count");
5572 if (response_committed_block_count_iterator != httpResponse.GetHeaders().end())
5574 response.CommittedBlockCount = std::stoi(response_committed_block_count_iterator->second);
5576 auto response_is_sealed_iterator = httpResponse.GetHeaders().find(
"x-ms-blob-sealed");
5577 if (response_is_sealed_iterator != httpResponse.GetHeaders().end())
5579 response.IsSealed = response_is_sealed_iterator->second ==
"true";
5581 auto response_server_encrypted_iterator
5582 = httpResponse.GetHeaders().find(
"x-ms-server-encrypted");
5583 if (response_server_encrypted_iterator != httpResponse.GetHeaders().end())
5585 response.ServerEncrypted = response_server_encrypted_iterator->second ==
"true";
5587 auto response_encryption_key_sha256_iterator
5588 = httpResponse.GetHeaders().find(
"x-ms-encryption-key-sha256");
5589 if (response_encryption_key_sha256_iterator != httpResponse.GetHeaders().end())
5591 response.EncryptionKeySha256 = response_encryption_key_sha256_iterator->second;
5593 auto response_encryption_scope_iterator
5594 = httpResponse.GetHeaders().find(
"x-ms-encryption-scope");
5595 if (response_encryption_scope_iterator != httpResponse.GetHeaders().end())
5597 response.EncryptionScope = response_encryption_scope_iterator->second;
5599 auto response_tier_iterator = httpResponse.GetHeaders().find(
"x-ms-access-tier");
5600 if (response_tier_iterator != httpResponse.GetHeaders().end())
5602 response.Tier = AccessTierFromString(response_tier_iterator->second);
5604 auto response_access_tier_inferred_iterator
5605 = httpResponse.GetHeaders().find(
"x-ms-access-tier-inferred");
5606 if (response_access_tier_inferred_iterator != httpResponse.GetHeaders().end())
5608 response.AccessTierInferred = response_access_tier_inferred_iterator->second ==
"true";
5610 auto response_archive_status_iterator
5611 = httpResponse.GetHeaders().find(
"x-ms-archive-status");
5612 if (response_archive_status_iterator != httpResponse.GetHeaders().end())
5614 response.ArchiveStatus
5615 = BlobArchiveStatusFromString(response_archive_status_iterator->second);
5617 auto response_access_tier_change_time_iterator
5618 = httpResponse.GetHeaders().find(
"x-ms-access-tier-change-time");
5619 if (response_access_tier_change_time_iterator != httpResponse.GetHeaders().end())
5621 response.AccessTierChangeTime = response_access_tier_change_time_iterator->second;
5623 auto response_copy_id_iterator = httpResponse.GetHeaders().find(
"x-ms-copy-id");
5624 if (response_copy_id_iterator != httpResponse.GetHeaders().end())
5626 response.CopyId = response_copy_id_iterator->second;
5628 auto response_copy_source_iterator = httpResponse.GetHeaders().find(
"x-ms-copy-source");
5629 if (response_copy_source_iterator != httpResponse.GetHeaders().end())
5631 response.CopySource = response_copy_source_iterator->second;
5633 auto response_copy_status_iterator = httpResponse.GetHeaders().find(
"x-ms-copy-status");
5634 if (response_copy_status_iterator != httpResponse.GetHeaders().end())
5636 response.CopyStatus = CopyStatusFromString(response_copy_status_iterator->second);
5638 auto response_copy_progress_iterator = httpResponse.GetHeaders().find(
"x-ms-copy-progress");
5639 if (response_copy_progress_iterator != httpResponse.GetHeaders().end())
5641 response.CopyProgress = response_copy_progress_iterator->second;
5643 auto response_copy_completion_time_iterator
5644 = httpResponse.GetHeaders().find(
"x-ms-copy-completion-time");
5645 if (response_copy_completion_time_iterator != httpResponse.GetHeaders().end())
5647 response.CopyCompletionTime = response_copy_completion_time_iterator->second;
5649 auto response_object_replication_destination_policy_id_iterator
5650 = httpResponse.GetHeaders().find(
"x-ms-or-policy-id");
5651 if (response_object_replication_destination_policy_id_iterator
5652 != httpResponse.GetHeaders().end())
5654 response.ObjectReplicationDestinationPolicyId
5655 = response_object_replication_destination_policy_id_iterator->second;
5658 std::map<std::string, std::vector<ObjectReplicationRule>> orPropertiesMap;
5659 for (
auto i = httpResponse.GetHeaders().lower_bound(
"x-ms-or-");
5660 i != httpResponse.GetHeaders().end() && i->first.substr(0, 8) ==
"x-ms-or-";
5663 const std::string& header = i->first;
5664 auto underscorePos = header.find(
'_', 8);
5665 if (underscorePos == std::string::npos)
5669 std::string policyId = std::string(header.begin() + 8, header.begin() + underscorePos);
5670 std::string ruleId = header.substr(underscorePos + 1);
5672 ObjectReplicationRule rule;
5673 rule.RuleId = std::move(ruleId);
5674 rule.ReplicationStatus = ObjectReplicationStatusFromString(i->second);
5675 orPropertiesMap[policyId].emplace_back(std::move(rule));
5677 for (
auto& property : orPropertiesMap)
5679 ObjectReplicationPolicy policy;
5680 policy.PolicyId =
property.first;
5681 policy.Rules = std::move(property.second);
5682 response.ObjectReplicationSourceProperties.emplace_back(std::move(policy));
5685 return Azure::Core::Response<GetBlobPropertiesResult>(
5686 std::move(response), std::move(pHttpResponse));
5691 Azure::Core::Nullable<int32_t> Timeout;
5693 Azure::Core::Nullable<std::string> LeaseId;
5694 Azure::Core::Nullable<std::string> IfModifiedSince;
5695 Azure::Core::Nullable<std::string> IfUnmodifiedSince;
5696 Azure::Core::Nullable<std::string> IfMatch;
5697 Azure::Core::Nullable<std::string> IfNoneMatch;
5698 Azure::Core::Nullable<std::string> IfTags;
5701 static Azure::Core::Response<SetBlobHttpHeadersResult> SetHttpHeaders(
5702 const Azure::Core::Context& context,
5703 Azure::Core::Http::HttpPipeline& pipeline,
5704 const Azure::Core::Http::Url& url,
5708 auto request = Azure::Core::Http::Request(Azure::Core::Http::HttpMethod::Put, url);
5709 request.AddHeader(
"Content-Length",
"0");
5710 request.GetUrl().AppendQuery(
"comp",
"properties");
5711 request.AddHeader(
"x-ms-version", c_ApiVersion);
5712 if (options.Timeout.HasValue())
5714 request.GetUrl().AppendQuery(
"timeout", std::to_string(options.Timeout.GetValue()));
5716 if (!options.HttpHeaders.ContentType.empty())
5718 request.AddHeader(
"x-ms-blob-content-type", options.HttpHeaders.ContentType);
5720 if (!options.HttpHeaders.ContentEncoding.empty())
5722 request.AddHeader(
"x-ms-blob-content-encoding", options.HttpHeaders.ContentEncoding);
5724 if (!options.HttpHeaders.ContentLanguage.empty())
5726 request.AddHeader(
"x-ms-blob-content-language", options.HttpHeaders.ContentLanguage);
5728 if (!options.HttpHeaders.CacheControl.empty())
5730 request.AddHeader(
"x-ms-blob-cache-control", options.HttpHeaders.CacheControl);
5732 if (!options.HttpHeaders.ContentMd5.empty())
5734 request.AddHeader(
"x-ms-blob-content-md5", options.HttpHeaders.ContentMd5);
5736 if (!options.HttpHeaders.ContentDisposition.empty())
5739 "x-ms-blob-content-disposition", options.HttpHeaders.ContentDisposition);
5741 if (options.LeaseId.HasValue())
5743 request.AddHeader(
"x-ms-lease-id", options.LeaseId.GetValue());
5745 if (options.IfModifiedSince.HasValue())
5747 request.AddHeader(
"If-Modified-Since", options.IfModifiedSince.GetValue());
5749 if (options.IfUnmodifiedSince.HasValue())
5751 request.AddHeader(
"If-Unmodified-Since", options.IfUnmodifiedSince.GetValue());
5753 if (options.IfMatch.HasValue())
5755 request.AddHeader(
"If-Match", options.IfMatch.GetValue());
5757 if (options.IfNoneMatch.HasValue())
5759 request.AddHeader(
"If-None-Match", options.IfNoneMatch.GetValue());
5761 if (options.IfTags.HasValue())
5763 request.AddHeader(
"x-ms-if-tags", options.IfTags.GetValue());
5765 auto pHttpResponse = pipeline.Send(context, request);
5766 Azure::Core::Http::RawResponse& httpResponse = *pHttpResponse;
5767 SetBlobHttpHeadersResult response;
5768 auto http_status_code
5769 =
static_cast<std::underlying_type<Azure::Core::Http::HttpStatusCode>::type
>(
5770 httpResponse.GetStatusCode());
5771 if (!(http_status_code == 200))
5773 throw StorageError::CreateFromResponse(std::move(pHttpResponse));
5775 response.ETag = httpResponse.GetHeaders().at(
"etag");
5776 response.LastModified = httpResponse.GetHeaders().at(
"last-modified");
5777 auto response_sequence_number_iterator
5778 = httpResponse.GetHeaders().find(
"x-ms-blob-sequence-number");
5779 if (response_sequence_number_iterator != httpResponse.GetHeaders().end())
5781 response.SequenceNumber = std::stoll(response_sequence_number_iterator->second);
5783 return Azure::Core::Response<SetBlobHttpHeadersResult>(
5784 std::move(response), std::move(pHttpResponse));
5789 Azure::Core::Nullable<int32_t> Timeout;
5790 std::map<std::string, std::string> Metadata;
5792 Azure::Core::Nullable<std::string> EncryptionKeySha256;
5793 Azure::Core::Nullable<EncryptionAlgorithmType> EncryptionAlgorithm;
5794 Azure::Core::Nullable<std::string> EncryptionScope;
5795 Azure::Core::Nullable<std::string> LeaseId;
5796 Azure::Core::Nullable<std::string> IfModifiedSince;
5797 Azure::Core::Nullable<std::string> IfUnmodifiedSince;
5798 Azure::Core::Nullable<std::string> IfMatch;
5799 Azure::Core::Nullable<std::string> IfNoneMatch;
5800 Azure::Core::Nullable<std::string> IfTags;
5803 static Azure::Core::Response<SetBlobMetadataResult> SetMetadata(
5804 const Azure::Core::Context& context,
5805 Azure::Core::Http::HttpPipeline& pipeline,
5806 const Azure::Core::Http::Url& url,
5810 auto request = Azure::Core::Http::Request(Azure::Core::Http::HttpMethod::Put, url);
5811 request.AddHeader(
"Content-Length",
"0");
5812 request.GetUrl().AppendQuery(
"comp",
"metadata");
5813 request.AddHeader(
"x-ms-version", c_ApiVersion);
5814 if (options.Timeout.HasValue())
5816 request.GetUrl().AppendQuery(
"timeout", std::to_string(options.Timeout.GetValue()));
5818 std::set<std::string> metadataKeys;
5819 for (
const auto& pair : options.Metadata)
5821 std::string key = pair.first;
5822 std::transform(key.begin(), key.end(), key.begin(), [](
unsigned char c) {
5823 return static_cast<char>(std::tolower(c));
5825 if (metadataKeys.insert(key).second ==
false)
5827 throw std::runtime_error(
"duplicate keys in metadata");
5829 request.AddHeader(
"x-ms-meta-" + pair.first, pair.second);
5831 metadataKeys.clear();
5832 if (options.EncryptionKey.HasValue())
5834 request.AddHeader(
"x-ms-encryption-key", options.EncryptionKey.GetValue());
5836 if (options.EncryptionKeySha256.HasValue())
5838 request.AddHeader(
"x-ms-encryption-key-sha256", options.EncryptionKeySha256.GetValue());
5840 if (options.EncryptionAlgorithm.HasValue())
5843 "x-ms-encryption-algorithm",
5844 EncryptionAlgorithmTypeToString(options.EncryptionAlgorithm.GetValue()));
5846 if (options.EncryptionScope.HasValue())
5848 request.AddHeader(
"x-ms-encryption-scope", options.EncryptionScope.GetValue());
5850 if (options.LeaseId.HasValue())
5852 request.AddHeader(
"x-ms-lease-id", options.LeaseId.GetValue());
5854 if (options.IfModifiedSince.HasValue())
5856 request.AddHeader(
"If-Modified-Since", options.IfModifiedSince.GetValue());
5858 if (options.IfUnmodifiedSince.HasValue())
5860 request.AddHeader(
"If-Unmodified-Since", options.IfUnmodifiedSince.GetValue());
5862 if (options.IfMatch.HasValue())
5864 request.AddHeader(
"If-Match", options.IfMatch.GetValue());
5866 if (options.IfNoneMatch.HasValue())
5868 request.AddHeader(
"If-None-Match", options.IfNoneMatch.GetValue());
5870 if (options.IfTags.HasValue())
5872 request.AddHeader(
"x-ms-if-tags", options.IfTags.GetValue());
5874 auto pHttpResponse = pipeline.Send(context, request);
5875 Azure::Core::Http::RawResponse& httpResponse = *pHttpResponse;
5876 SetBlobMetadataResult response;
5877 auto http_status_code
5878 =
static_cast<std::underlying_type<Azure::Core::Http::HttpStatusCode>::type
>(
5879 httpResponse.GetStatusCode());
5880 if (!(http_status_code == 200))
5882 throw StorageError::CreateFromResponse(std::move(pHttpResponse));
5884 response.ETag = httpResponse.GetHeaders().at(
"etag");
5885 response.LastModified = httpResponse.GetHeaders().at(
"last-modified");
5886 return Azure::Core::Response<SetBlobMetadataResult>(
5887 std::move(response), std::move(pHttpResponse));
5892 Azure::Core::Nullable<int32_t> Timeout;
5893 AccessTier Tier = AccessTier::Unknown;
5894 Azure::Core::Nullable<Blobs::RehydratePriority> RehydratePriority;
5895 Azure::Core::Nullable<std::string> IfTags;
5898 static Azure::Core::Http::Request SetAccessTierCreateMessage(
5899 const Azure::Core::Http::Url& url,
5903 auto request = Azure::Core::Http::Request(Azure::Core::Http::HttpMethod::Put, url);
5904 request.AddHeader(
"Content-Length",
"0");
5905 request.GetUrl().AppendQuery(
"comp",
"tier");
5906 request.AddHeader(
"x-ms-version", c_ApiVersion);
5907 if (options.Timeout.HasValue())
5909 request.GetUrl().AppendQuery(
"timeout", std::to_string(options.Timeout.GetValue()));
5911 request.AddHeader(
"x-ms-access-tier", AccessTierToString(options.Tier));
5912 if (options.RehydratePriority.HasValue())
5915 "x-ms-rehydrate-priority",
5916 RehydratePriorityToString(options.RehydratePriority.GetValue()));
5918 if (options.IfTags.HasValue())
5920 request.AddHeader(
"x-ms-if-tags", options.IfTags.GetValue());
5925 static Azure::Core::Response<SetBlobAccessTierResult> SetAccessTierCreateResponse(
5926 const Azure::Core::Context& context,
5927 std::unique_ptr<Azure::Core::Http::RawResponse> pHttpResponse)
5930 Azure::Core::Http::RawResponse& httpResponse = *pHttpResponse;
5931 SetBlobAccessTierResult response;
5932 auto http_status_code
5933 =
static_cast<std::underlying_type<Azure::Core::Http::HttpStatusCode>::type
>(
5934 httpResponse.GetStatusCode());
5935 if (!(http_status_code == 200 || http_status_code == 202))
5937 throw StorageError::CreateFromResponse(std::move(pHttpResponse));
5939 return Azure::Core::Response<SetBlobAccessTierResult>(
5940 std::move(response), std::move(pHttpResponse));
5943 static Azure::Core::Response<SetBlobAccessTierResult> SetAccessTier(
5944 const Azure::Core::Context& context,
5945 Azure::Core::Http::HttpPipeline& pipeline,
5946 const Azure::Core::Http::Url& url,
5947 const SetBlobAccessTierOptions& options)
5949 auto request = SetAccessTierCreateMessage(url, options);
5950 auto pHttpResponse = pipeline.Send(context, request);
5951 return SetAccessTierCreateResponse(context, std::move(pHttpResponse));
5956 Azure::Core::Nullable<int32_t> Timeout;
5957 std::map<std::string, std::string> Metadata;
5958 std::string SourceUri;
5959 Azure::Core::Nullable<std::string> LeaseId;
5960 Azure::Core::Nullable<std::string> SourceLeaseId;
5961 Azure::Core::Nullable<AccessTier> Tier;
5962 Azure::Core::Nullable<Blobs::RehydratePriority> RehydratePriority;
5963 Azure::Core::Nullable<std::string> IfModifiedSince;
5964 Azure::Core::Nullable<std::string> IfUnmodifiedSince;
5965 Azure::Core::Nullable<std::string> IfMatch;
5966 Azure::Core::Nullable<std::string> IfNoneMatch;
5967 Azure::Core::Nullable<std::string> IfTags;
5968 Azure::Core::Nullable<std::string> SourceIfModifiedSince;
5969 Azure::Core::Nullable<std::string> SourceIfUnmodifiedSince;
5970 Azure::Core::Nullable<std::string> SourceIfMatch;
5971 Azure::Core::Nullable<std::string> SourceIfNoneMatch;
5972 Azure::Core::Nullable<std::string> SourceIfTags;
5973 Azure::Core::Nullable<bool> ShouldSealDestination;
5976 static Azure::Core::Response<StartCopyBlobFromUriResult> StartCopyFromUri(
5977 const Azure::Core::Context& context,
5978 Azure::Core::Http::HttpPipeline& pipeline,
5979 const Azure::Core::Http::Url& url,
5983 auto request = Azure::Core::Http::Request(Azure::Core::Http::HttpMethod::Put, url);
5984 request.AddHeader(
"Content-Length",
"0");
5985 request.AddHeader(
"x-ms-version", c_ApiVersion);
5986 if (options.Timeout.HasValue())
5988 request.GetUrl().AppendQuery(
"timeout", std::to_string(options.Timeout.GetValue()));
5990 std::set<std::string> metadataKeys;
5991 for (
const auto& pair : options.Metadata)
5993 std::string key = pair.first;
5994 std::transform(key.begin(), key.end(), key.begin(), [](
unsigned char c) {
5995 return static_cast<char>(std::tolower(c));
5997 if (metadataKeys.insert(key).second ==
false)
5999 throw std::runtime_error(
"duplicate keys in metadata");
6001 request.AddHeader(
"x-ms-meta-" + pair.first, pair.second);
6003 metadataKeys.clear();
6004 request.AddHeader(
"x-ms-copy-source", options.SourceUri);
6005 if (options.LeaseId.HasValue())
6007 request.AddHeader(
"x-ms-lease-id", options.LeaseId.GetValue());
6009 if (options.SourceLeaseId.HasValue())
6011 request.AddHeader(
"x-ms-source-lease-id", options.SourceLeaseId.GetValue());
6013 if (options.Tier.HasValue())
6015 request.AddHeader(
"x-ms-access-tier", AccessTierToString(options.Tier.GetValue()));
6017 if (options.RehydratePriority.HasValue())
6020 "x-ms-rehydrate-priority",
6021 RehydratePriorityToString(options.RehydratePriority.GetValue()));
6023 if (options.ShouldSealDestination.HasValue())
6026 "x-ms-seal-blob", options.ShouldSealDestination.GetValue() ?
"true" :
"false");
6028 if (options.IfModifiedSince.HasValue())
6030 request.AddHeader(
"If-Modified-Since", options.IfModifiedSince.GetValue());
6032 if (options.IfUnmodifiedSince.HasValue())
6034 request.AddHeader(
"If-Unmodified-Since", options.IfUnmodifiedSince.GetValue());
6036 if (options.IfMatch.HasValue())
6038 request.AddHeader(
"If-Match", options.IfMatch.GetValue());
6040 if (options.IfNoneMatch.HasValue())
6042 request.AddHeader(
"If-None-Match", options.IfNoneMatch.GetValue());
6044 if (options.IfTags.HasValue())
6046 request.AddHeader(
"x-ms-if-tags", options.IfTags.GetValue());
6048 if (options.SourceIfModifiedSince.HasValue())
6051 "x-ms-source-if-modified-since", options.SourceIfModifiedSince.GetValue());
6053 if (options.SourceIfUnmodifiedSince.HasValue())
6056 "x-ms-source-if-unmodified-since", options.SourceIfUnmodifiedSince.GetValue());
6058 if (options.SourceIfMatch.HasValue())
6060 request.AddHeader(
"x-ms-source-if-match", options.SourceIfMatch.GetValue());
6062 if (options.SourceIfNoneMatch.HasValue())
6064 request.AddHeader(
"x-ms-source-if-none-match", options.SourceIfNoneMatch.GetValue());
6066 if (options.SourceIfTags.HasValue())
6068 request.AddHeader(
"x-ms-source-if-tags", options.SourceIfTags.GetValue());
6070 auto pHttpResponse = pipeline.Send(context, request);
6071 Azure::Core::Http::RawResponse& httpResponse = *pHttpResponse;
6072 StartCopyBlobFromUriResult response;
6073 auto http_status_code
6074 =
static_cast<std::underlying_type<Azure::Core::Http::HttpStatusCode>::type
>(
6075 httpResponse.GetStatusCode());
6076 if (!(http_status_code == 202))
6078 throw StorageError::CreateFromResponse(std::move(pHttpResponse));
6080 response.ETag = httpResponse.GetHeaders().at(
"etag");
6081 response.LastModified = httpResponse.GetHeaders().at(
"last-modified");
6082 response.CopyId = httpResponse.GetHeaders().at(
"x-ms-copy-id");
6084 = CopyStatusFromString(httpResponse.GetHeaders().at(
"x-ms-copy-status"));
6085 auto response_version_id_iterator = httpResponse.GetHeaders().find(
"x-ms-version-id");
6086 if (response_version_id_iterator != httpResponse.GetHeaders().end())
6088 response.VersionId = response_version_id_iterator->second;
6090 return Azure::Core::Response<StartCopyBlobFromUriResult>(
6091 std::move(response), std::move(pHttpResponse));
6096 Azure::Core::Nullable<int32_t> Timeout;
6098 Azure::Core::Nullable<std::string> LeaseId;
6101 static Azure::Core::Response<AbortCopyBlobFromUriResult> AbortCopyFromUri(
6102 const Azure::Core::Context& context,
6103 Azure::Core::Http::HttpPipeline& pipeline,
6104 const Azure::Core::Http::Url& url,
6108 auto request = Azure::Core::Http::Request(Azure::Core::Http::HttpMethod::Put, url);
6109 request.AddHeader(
"Content-Length",
"0");
6110 request.AddHeader(
"x-ms-version", c_ApiVersion);
6111 if (options.Timeout.HasValue())
6113 request.GetUrl().AppendQuery(
"timeout", std::to_string(options.Timeout.GetValue()));
6115 request.GetUrl().AppendQuery(
"comp",
"copy");
6116 request.GetUrl().AppendQuery(
"copyid", options.CopyId);
6117 request.AddHeader(
"x-ms-copy-action",
"abort");
6118 if (options.LeaseId.HasValue())
6120 request.AddHeader(
"x-ms-lease-id", options.LeaseId.GetValue());
6122 auto pHttpResponse = pipeline.Send(context, request);
6123 Azure::Core::Http::RawResponse& httpResponse = *pHttpResponse;
6125 auto http_status_code
6126 =
static_cast<std::underlying_type<Azure::Core::Http::HttpStatusCode>::type
>(
6127 httpResponse.GetStatusCode());
6128 if (!(http_status_code == 204))
6130 throw StorageError::CreateFromResponse(std::move(pHttpResponse));
6132 return Azure::Core::Response<AbortCopyBlobFromUriResult>(
6133 std::move(response), std::move(pHttpResponse));
6138 Azure::Core::Nullable<int32_t> Timeout;
6139 std::map<std::string, std::string> Metadata;
6140 Azure::Core::Nullable<std::string> LeaseId;
6142 Azure::Core::Nullable<std::string> EncryptionKeySha256;
6143 Azure::Core::Nullable<EncryptionAlgorithmType> EncryptionAlgorithm;
6144 Azure::Core::Nullable<std::string> EncryptionScope;
6145 Azure::Core::Nullable<std::string> IfModifiedSince;
6146 Azure::Core::Nullable<std::string> IfUnmodifiedSince;
6147 Azure::Core::Nullable<std::string> IfMatch;
6148 Azure::Core::Nullable<std::string> IfNoneMatch;
6149 Azure::Core::Nullable<std::string> IfTags;
6152 static Azure::Core::Response<CreateBlobSnapshotResult> CreateSnapshot(
6153 const Azure::Core::Context& context,
6154 Azure::Core::Http::HttpPipeline& pipeline,
6155 const Azure::Core::Http::Url& url,
6159 auto request = Azure::Core::Http::Request(Azure::Core::Http::HttpMethod::Put, url);
6160 request.AddHeader(
"Content-Length",
"0");
6161 request.GetUrl().AppendQuery(
"comp",
"snapshot");
6162 request.AddHeader(
"x-ms-version", c_ApiVersion);
6163 if (options.Timeout.HasValue())
6165 request.GetUrl().AppendQuery(
"timeout", std::to_string(options.Timeout.GetValue()));
6167 if (options.EncryptionKey.HasValue())
6169 request.AddHeader(
"x-ms-encryption-key", options.EncryptionKey.GetValue());
6171 if (options.EncryptionKeySha256.HasValue())
6173 request.AddHeader(
"x-ms-encryption-key-sha256", options.EncryptionKeySha256.GetValue());
6175 if (options.EncryptionAlgorithm.HasValue())
6178 "x-ms-encryption-algorithm",
6179 EncryptionAlgorithmTypeToString(options.EncryptionAlgorithm.GetValue()));
6181 if (options.EncryptionScope.HasValue())
6183 request.AddHeader(
"x-ms-encryption-scope", options.EncryptionScope.GetValue());
6185 std::set<std::string> metadataKeys;
6186 for (
const auto& pair : options.Metadata)
6188 std::string key = pair.first;
6189 std::transform(key.begin(), key.end(), key.begin(), [](
unsigned char c) {
6190 return static_cast<char>(std::tolower(c));
6192 if (metadataKeys.insert(key).second ==
false)
6194 throw std::runtime_error(
"duplicate keys in metadata");
6196 request.AddHeader(
"x-ms-meta-" + pair.first, pair.second);
6198 metadataKeys.clear();
6199 if (options.LeaseId.HasValue())
6201 request.AddHeader(
"x-ms-lease-id", options.LeaseId.GetValue());
6203 if (options.IfModifiedSince.HasValue())
6205 request.AddHeader(
"If-Modified-Since", options.IfModifiedSince.GetValue());
6207 if (options.IfUnmodifiedSince.HasValue())
6209 request.AddHeader(
"If-Unmodified-Since", options.IfUnmodifiedSince.GetValue());
6211 if (options.IfMatch.HasValue())
6213 request.AddHeader(
"If-Match", options.IfMatch.GetValue());
6215 if (options.IfNoneMatch.HasValue())
6217 request.AddHeader(
"If-None-Match", options.IfNoneMatch.GetValue());
6219 if (options.IfTags.HasValue())
6221 request.AddHeader(
"x-ms-if-tags", options.IfTags.GetValue());
6223 auto pHttpResponse = pipeline.Send(context, request);
6224 Azure::Core::Http::RawResponse& httpResponse = *pHttpResponse;
6225 CreateBlobSnapshotResult response;
6226 auto http_status_code
6227 =
static_cast<std::underlying_type<Azure::Core::Http::HttpStatusCode>::type
>(
6228 httpResponse.GetStatusCode());
6229 if (!(http_status_code == 201))
6231 throw StorageError::CreateFromResponse(std::move(pHttpResponse));
6233 response.ETag = httpResponse.GetHeaders().at(
"etag");
6234 response.LastModified = httpResponse.GetHeaders().at(
"last-modified");
6235 auto response_server_encrypted_iterator
6236 = httpResponse.GetHeaders().find(
"x-ms-request-server-encrypted");
6237 if (response_server_encrypted_iterator != httpResponse.GetHeaders().end())
6239 response.ServerEncrypted = response_server_encrypted_iterator->second ==
"true";
6241 auto response_encryption_key_sha256_iterator
6242 = httpResponse.GetHeaders().find(
"x-ms-encryption-key-sha256");
6243 if (response_encryption_key_sha256_iterator != httpResponse.GetHeaders().end())
6245 response.EncryptionKeySha256 = response_encryption_key_sha256_iterator->second;
6247 auto response_encryption_scope_iterator
6248 = httpResponse.GetHeaders().find(
"x-ms-encryption-scope");
6249 if (response_encryption_scope_iterator != httpResponse.GetHeaders().end())
6251 response.EncryptionScope = response_encryption_scope_iterator->second;
6253 response.Snapshot = httpResponse.GetHeaders().at(
"x-ms-snapshot");
6254 auto response_version_id_iterator = httpResponse.GetHeaders().find(
"x-ms-version-id");
6255 if (response_version_id_iterator != httpResponse.GetHeaders().end())
6257 response.VersionId = response_version_id_iterator->second;
6259 return Azure::Core::Response<CreateBlobSnapshotResult>(
6260 std::move(response), std::move(pHttpResponse));
6265 Azure::Core::Nullable<int32_t> Timeout;
6266 Azure::Core::Nullable<std::string> IfTags;
6269 static Azure::Core::Response<GetBlobTagsResult> GetTags(
6270 const Azure::Core::Context& context,
6271 Azure::Core::Http::HttpPipeline& pipeline,
6272 const Azure::Core::Http::Url& url,
6276 auto request = Azure::Core::Http::Request(Azure::Core::Http::HttpMethod::Get, url);
6277 request.AddHeader(
"x-ms-version", c_ApiVersion);
6278 if (options.Timeout.HasValue())
6280 request.GetUrl().AppendQuery(
"timeout", std::to_string(options.Timeout.GetValue()));
6282 request.GetUrl().AppendQuery(
"comp",
"tags");
6283 if (options.IfTags.HasValue())
6285 request.AddHeader(
"x-ms-if-tags", options.IfTags.GetValue());
6287 auto pHttpResponse = pipeline.Send(context, request);
6288 Azure::Core::Http::RawResponse& httpResponse = *pHttpResponse;
6290 auto http_status_code
6291 =
static_cast<std::underlying_type<Azure::Core::Http::HttpStatusCode>::type
>(
6292 httpResponse.GetStatusCode());
6293 if (!(http_status_code == 200))
6295 throw StorageError::CreateFromResponse(std::move(pHttpResponse));
6298 const auto& httpResponseBody = httpResponse.GetBody();
6300 reinterpret_cast<const char*
>(httpResponseBody.data()), httpResponseBody.size());
6301 response = GetBlobTagsResultFromXml(reader);
6303 return Azure::Core::Response<GetBlobTagsResult>(
6304 std::move(response), std::move(pHttpResponse));
6309 Azure::Core::Nullable<int32_t> Timeout;
6310 std::map<std::string, std::string> Tags;
6311 Azure::Core::Nullable<std::string> IfTags;
6314 static Azure::Core::Response<SetBlobTagsResult> SetTags(
6315 const Azure::Core::Context& context,
6316 Azure::Core::Http::HttpPipeline& pipeline,
6317 const Azure::Core::Http::Url& url,
6321 std::string xml_body;
6324 SetBlobTagsOptionsToXml(writer, options);
6325 xml_body = writer.GetDocument();
6326 writer.Write(XmlNode{XmlNodeType::End});
6328 Azure::Core::Http::MemoryBodyStream xml_body_stream(
6329 reinterpret_cast<const uint8_t*
>(xml_body.data()), xml_body.length());
6331 = Azure::Core::Http::Request(Azure::Core::Http::HttpMethod::Put, url, &xml_body_stream);
6332 request.AddHeader(
"Content-Length", std::to_string(xml_body_stream.Length()));
6333 request.AddHeader(
"x-ms-version", c_ApiVersion);
6334 if (options.Timeout.HasValue())
6336 request.GetUrl().AppendQuery(
"timeout", std::to_string(options.Timeout.GetValue()));
6338 request.GetUrl().AppendQuery(
"comp",
"tags");
6339 request.AddHeader(
"Content-Type",
"application/xml; charset=UTF-8");
6340 if (options.IfTags.HasValue())
6342 request.AddHeader(
"x-ms-if-tags", options.IfTags.GetValue());
6344 auto pHttpResponse = pipeline.Send(context, request);
6345 Azure::Core::Http::RawResponse& httpResponse = *pHttpResponse;
6346 SetBlobTagsResult response;
6347 auto http_status_code
6348 =
static_cast<std::underlying_type<Azure::Core::Http::HttpStatusCode>::type
>(
6349 httpResponse.GetStatusCode());
6350 if (!(http_status_code == 204))
6352 throw StorageError::CreateFromResponse(std::move(pHttpResponse));
6354 return Azure::Core::Response<SetBlobTagsResult>(
6355 std::move(response), std::move(pHttpResponse));
6360 Azure::Core::Nullable<int32_t> Timeout;
6361 int32_t LeaseDuration = -1;
6362 Azure::Core::Nullable<std::string> ProposedLeaseId;
6363 Azure::Core::Nullable<std::string> IfModifiedSince;
6364 Azure::Core::Nullable<std::string> IfUnmodifiedSince;
6365 Azure::Core::Nullable<std::string> IfMatch;
6366 Azure::Core::Nullable<std::string> IfNoneMatch;
6367 Azure::Core::Nullable<std::string> IfTags;
6370 static Azure::Core::Response<AcquireBlobLeaseResult> AcquireLease(
6371 const Azure::Core::Context& context,
6372 Azure::Core::Http::HttpPipeline& pipeline,
6373 const Azure::Core::Http::Url& url,
6377 auto request = Azure::Core::Http::Request(Azure::Core::Http::HttpMethod::Put, url);
6378 request.AddHeader(
"Content-Length",
"0");
6379 request.AddHeader(
"x-ms-version", c_ApiVersion);
6380 if (options.Timeout.HasValue())
6382 request.GetUrl().AppendQuery(
"timeout", std::to_string(options.Timeout.GetValue()));
6384 request.GetUrl().AppendQuery(
"comp",
"lease");
6385 request.AddHeader(
"x-ms-lease-action",
"acquire");
6386 request.AddHeader(
"x-ms-lease-duration", std::to_string(options.LeaseDuration));
6387 if (options.ProposedLeaseId.HasValue())
6389 request.AddHeader(
"x-ms-proposed-lease-id", options.ProposedLeaseId.GetValue());
6391 if (options.IfModifiedSince.HasValue())
6393 request.AddHeader(
"If-Modified-Since", options.IfModifiedSince.GetValue());
6395 if (options.IfUnmodifiedSince.HasValue())
6397 request.AddHeader(
"If-Unmodified-Since", options.IfUnmodifiedSince.GetValue());
6399 if (options.IfMatch.HasValue())
6401 request.AddHeader(
"If-Match", options.IfMatch.GetValue());
6403 if (options.IfNoneMatch.HasValue())
6405 request.AddHeader(
"If-None-Match", options.IfNoneMatch.GetValue());
6407 if (options.IfTags.HasValue())
6409 request.AddHeader(
"x-ms-if-tags", options.IfTags.GetValue());
6411 auto pHttpResponse = pipeline.Send(context, request);
6412 Azure::Core::Http::RawResponse& httpResponse = *pHttpResponse;
6413 AcquireBlobLeaseResult response;
6414 auto http_status_code
6415 =
static_cast<std::underlying_type<Azure::Core::Http::HttpStatusCode>::type
>(
6416 httpResponse.GetStatusCode());
6417 if (!(http_status_code == 201))
6419 throw StorageError::CreateFromResponse(std::move(pHttpResponse));
6421 response.ETag = httpResponse.GetHeaders().at(
"etag");
6422 response.LastModified = httpResponse.GetHeaders().at(
"last-modified");
6423 response.LeaseId = httpResponse.GetHeaders().at(
"x-ms-lease-id");
6424 return Azure::Core::Response<AcquireBlobLeaseResult>(
6425 std::move(response), std::move(pHttpResponse));
6430 Azure::Core::Nullable<int32_t> Timeout;
6431 std::string LeaseId;
6432 Azure::Core::Nullable<std::string> IfModifiedSince;
6433 Azure::Core::Nullable<std::string> IfUnmodifiedSince;
6434 Azure::Core::Nullable<std::string> IfMatch;
6435 Azure::Core::Nullable<std::string> IfNoneMatch;
6436 Azure::Core::Nullable<std::string> IfTags;
6439 static Azure::Core::Response<RenewBlobLeaseResult> RenewLease(
6440 const Azure::Core::Context& context,
6441 Azure::Core::Http::HttpPipeline& pipeline,
6442 const Azure::Core::Http::Url& url,
6446 auto request = Azure::Core::Http::Request(Azure::Core::Http::HttpMethod::Put, url);
6447 request.AddHeader(
"Content-Length",
"0");
6448 request.AddHeader(
"x-ms-version", c_ApiVersion);
6449 if (options.Timeout.HasValue())
6451 request.GetUrl().AppendQuery(
"timeout", std::to_string(options.Timeout.GetValue()));
6453 request.GetUrl().AppendQuery(
"comp",
"lease");
6454 request.AddHeader(
"x-ms-lease-action",
"renew");
6455 request.AddHeader(
"x-ms-lease-id", options.LeaseId);
6456 if (options.IfModifiedSince.HasValue())
6458 request.AddHeader(
"If-Modified-Since", options.IfModifiedSince.GetValue());
6460 if (options.IfUnmodifiedSince.HasValue())
6462 request.AddHeader(
"If-Unmodified-Since", options.IfUnmodifiedSince.GetValue());
6464 if (options.IfMatch.HasValue())
6466 request.AddHeader(
"If-Match", options.IfMatch.GetValue());
6468 if (options.IfNoneMatch.HasValue())
6470 request.AddHeader(
"If-None-Match", options.IfNoneMatch.GetValue());
6472 if (options.IfTags.HasValue())
6474 request.AddHeader(
"x-ms-if-tags", options.IfTags.GetValue());
6476 auto pHttpResponse = pipeline.Send(context, request);
6477 Azure::Core::Http::RawResponse& httpResponse = *pHttpResponse;
6478 RenewBlobLeaseResult response;
6479 auto http_status_code
6480 =
static_cast<std::underlying_type<Azure::Core::Http::HttpStatusCode>::type
>(
6481 httpResponse.GetStatusCode());
6482 if (!(http_status_code == 200))
6484 throw StorageError::CreateFromResponse(std::move(pHttpResponse));
6486 response.ETag = httpResponse.GetHeaders().at(
"etag");
6487 response.LastModified = httpResponse.GetHeaders().at(
"last-modified");
6488 response.LeaseId = httpResponse.GetHeaders().at(
"x-ms-lease-id");
6489 return Azure::Core::Response<RenewBlobLeaseResult>(
6490 std::move(response), std::move(pHttpResponse));
6495 Azure::Core::Nullable<int32_t> Timeout;
6496 std::string LeaseId;
6497 std::string ProposedLeaseId;
6498 Azure::Core::Nullable<std::string> IfModifiedSince;
6499 Azure::Core::Nullable<std::string> IfUnmodifiedSince;
6500 Azure::Core::Nullable<std::string> IfMatch;
6501 Azure::Core::Nullable<std::string> IfNoneMatch;
6502 Azure::Core::Nullable<std::string> IfTags;
6505 static Azure::Core::Response<ChangeBlobLeaseResult> ChangeLease(
6506 const Azure::Core::Context& context,
6507 Azure::Core::Http::HttpPipeline& pipeline,
6508 const Azure::Core::Http::Url& url,
6512 auto request = Azure::Core::Http::Request(Azure::Core::Http::HttpMethod::Put, url);
6513 request.AddHeader(
"Content-Length",
"0");
6514 request.AddHeader(
"x-ms-version", c_ApiVersion);
6515 if (options.Timeout.HasValue())
6517 request.GetUrl().AppendQuery(
"timeout", std::to_string(options.Timeout.GetValue()));
6519 request.GetUrl().AppendQuery(
"comp",
"lease");
6520 request.AddHeader(
"x-ms-lease-action",
"change");
6521 request.AddHeader(
"x-ms-lease-id", options.LeaseId);
6522 request.AddHeader(
"x-ms-proposed-lease-id", options.ProposedLeaseId);
6523 if (options.IfModifiedSince.HasValue())
6525 request.AddHeader(
"If-Modified-Since", options.IfModifiedSince.GetValue());
6527 if (options.IfUnmodifiedSince.HasValue())
6529 request.AddHeader(
"If-Unmodified-Since", options.IfUnmodifiedSince.GetValue());
6531 if (options.IfMatch.HasValue())
6533 request.AddHeader(
"If-Match", options.IfMatch.GetValue());
6535 if (options.IfNoneMatch.HasValue())
6537 request.AddHeader(
"If-None-Match", options.IfNoneMatch.GetValue());
6539 if (options.IfTags.HasValue())
6541 request.AddHeader(
"x-ms-if-tags", options.IfTags.GetValue());
6543 auto pHttpResponse = pipeline.Send(context, request);
6544 Azure::Core::Http::RawResponse& httpResponse = *pHttpResponse;
6545 ChangeBlobLeaseResult response;
6546 auto http_status_code
6547 =
static_cast<std::underlying_type<Azure::Core::Http::HttpStatusCode>::type
>(
6548 httpResponse.GetStatusCode());
6549 if (!(http_status_code == 200))
6551 throw StorageError::CreateFromResponse(std::move(pHttpResponse));
6553 response.ETag = httpResponse.GetHeaders().at(
"etag");
6554 response.LastModified = httpResponse.GetHeaders().at(
"last-modified");
6555 response.LeaseId = httpResponse.GetHeaders().at(
"x-ms-lease-id");
6556 return Azure::Core::Response<ChangeBlobLeaseResult>(
6557 std::move(response), std::move(pHttpResponse));
6562 Azure::Core::Nullable<int32_t> Timeout;
6563 std::string LeaseId;
6564 Azure::Core::Nullable<std::string> IfModifiedSince;
6565 Azure::Core::Nullable<std::string> IfUnmodifiedSince;
6566 Azure::Core::Nullable<std::string> IfMatch;
6567 Azure::Core::Nullable<std::string> IfNoneMatch;
6568 Azure::Core::Nullable<std::string> IfTags;
6571 static Azure::Core::Response<ReleaseBlobLeaseResult> ReleaseLease(
6572 const Azure::Core::Context& context,
6573 Azure::Core::Http::HttpPipeline& pipeline,
6574 const Azure::Core::Http::Url& url,
6578 auto request = Azure::Core::Http::Request(Azure::Core::Http::HttpMethod::Put, url);
6579 request.AddHeader(
"Content-Length",
"0");
6580 request.AddHeader(
"x-ms-version", c_ApiVersion);
6581 if (options.Timeout.HasValue())
6583 request.GetUrl().AppendQuery(
"timeout", std::to_string(options.Timeout.GetValue()));
6585 request.GetUrl().AppendQuery(
"comp",
"lease");
6586 request.AddHeader(
"x-ms-lease-action",
"release");
6587 request.AddHeader(
"x-ms-lease-id", options.LeaseId);
6588 if (options.IfModifiedSince.HasValue())
6590 request.AddHeader(
"If-Modified-Since", options.IfModifiedSince.GetValue());
6592 if (options.IfUnmodifiedSince.HasValue())
6594 request.AddHeader(
"If-Unmodified-Since", options.IfUnmodifiedSince.GetValue());
6596 if (options.IfMatch.HasValue())
6598 request.AddHeader(
"If-Match", options.IfMatch.GetValue());
6600 if (options.IfNoneMatch.HasValue())
6602 request.AddHeader(
"If-None-Match", options.IfNoneMatch.GetValue());
6604 if (options.IfTags.HasValue())
6606 request.AddHeader(
"x-ms-if-tags", options.IfTags.GetValue());
6608 auto pHttpResponse = pipeline.Send(context, request);
6609 Azure::Core::Http::RawResponse& httpResponse = *pHttpResponse;
6610 ReleaseBlobLeaseResult response;
6611 auto http_status_code
6612 =
static_cast<std::underlying_type<Azure::Core::Http::HttpStatusCode>::type
>(
6613 httpResponse.GetStatusCode());
6614 if (!(http_status_code == 200))
6616 throw StorageError::CreateFromResponse(std::move(pHttpResponse));
6618 response.ETag = httpResponse.GetHeaders().at(
"etag");
6619 response.LastModified = httpResponse.GetHeaders().at(
"last-modified");
6620 auto response_sequence_number_iterator
6621 = httpResponse.GetHeaders().find(
"x-ms-blob-sequence-number");
6622 if (response_sequence_number_iterator != httpResponse.GetHeaders().end())
6624 response.SequenceNumber = std::stoll(response_sequence_number_iterator->second);
6626 return Azure::Core::Response<ReleaseBlobLeaseResult>(
6627 std::move(response), std::move(pHttpResponse));
6632 Azure::Core::Nullable<int32_t> Timeout;
6633 Azure::Core::Nullable<int32_t> BreakPeriod;
6634 Azure::Core::Nullable<std::string> IfModifiedSince;
6635 Azure::Core::Nullable<std::string> IfUnmodifiedSince;
6636 Azure::Core::Nullable<std::string> IfMatch;
6637 Azure::Core::Nullable<std::string> IfNoneMatch;
6638 Azure::Core::Nullable<std::string> IfTags;
6641 static Azure::Core::Response<BreakBlobLeaseResult> BreakLease(
6642 const Azure::Core::Context& context,
6643 Azure::Core::Http::HttpPipeline& pipeline,
6644 const Azure::Core::Http::Url& url,
6648 auto request = Azure::Core::Http::Request(Azure::Core::Http::HttpMethod::Put, url);
6649 request.AddHeader(
"Content-Length",
"0");
6650 request.AddHeader(
"x-ms-version", c_ApiVersion);
6651 if (options.Timeout.HasValue())
6653 request.GetUrl().AppendQuery(
"timeout", std::to_string(options.Timeout.GetValue()));
6655 request.GetUrl().AppendQuery(
"comp",
"lease");
6656 request.AddHeader(
"x-ms-lease-action",
"break");
6657 if (options.BreakPeriod.HasValue())
6660 "x-ms-lease-break-period", std::to_string(options.BreakPeriod.GetValue()));
6662 if (options.IfModifiedSince.HasValue())
6664 request.AddHeader(
"If-Modified-Since", options.IfModifiedSince.GetValue());
6666 if (options.IfUnmodifiedSince.HasValue())
6668 request.AddHeader(
"If-Unmodified-Since", options.IfUnmodifiedSince.GetValue());
6670 if (options.IfMatch.HasValue())
6672 request.AddHeader(
"If-Match", options.IfMatch.GetValue());
6674 if (options.IfNoneMatch.HasValue())
6676 request.AddHeader(
"If-None-Match", options.IfNoneMatch.GetValue());
6678 if (options.IfTags.HasValue())
6680 request.AddHeader(
"x-ms-if-tags", options.IfTags.GetValue());
6682 auto pHttpResponse = pipeline.Send(context, request);
6683 Azure::Core::Http::RawResponse& httpResponse = *pHttpResponse;
6684 BreakBlobLeaseResult response;
6685 auto http_status_code
6686 =
static_cast<std::underlying_type<Azure::Core::Http::HttpStatusCode>::type
>(
6687 httpResponse.GetStatusCode());
6688 if (!(http_status_code == 202))
6690 throw StorageError::CreateFromResponse(std::move(pHttpResponse));
6692 response.ETag = httpResponse.GetHeaders().at(
"etag");
6693 response.LastModified = httpResponse.GetHeaders().at(
"last-modified");
6694 response.LeaseTime = std::stoi(httpResponse.GetHeaders().at(
"x-ms-lease-time"));
6695 return Azure::Core::Response<BreakBlobLeaseResult>(
6696 std::move(response), std::move(pHttpResponse));
6700 static GetBlobTagsResult GetBlobTagsResultFromXml(XmlReader& reader)
6702 GetBlobTagsResult ret;
6703 enum class XmlTagName
6709 std::vector<XmlTagName> path;
6712 auto node = reader.Read();
6713 if (node.Type == XmlNodeType::End)
6717 else if (node.Type == XmlNodeType::EndTag)
6719 if (path.size() > 0)
6728 else if (node.Type == XmlNodeType::StartTag)
6730 if (std::strcmp(node.Name,
"Tags") == 0)
6732 path.emplace_back(XmlTagName::k_Tags);
6734 else if (std::strcmp(node.Name,
"TagSet") == 0)
6736 path.emplace_back(XmlTagName::k_TagSet);
6740 path.emplace_back(XmlTagName::k_Unknown);
6742 if (path.size() == 2 && path[0] == XmlTagName::k_Tags
6743 && path[1] == XmlTagName::k_TagSet)
6745 ret.Tags = TagsFromXml(reader);
6749 else if (node.Type == XmlNodeType::Text)
6756 static std::map<std::string, std::string> TagsFromXml(XmlReader& reader)
6758 std::map<std::string, std::string> ret;
6761 bool is_key =
false;
6762 bool is_value =
false;
6765 auto node = reader.Read();
6766 if (node.Type == XmlNodeType::End)
6770 else if (node.Type == XmlNodeType::StartTag)
6773 if (strcmp(node.Name,
"Key") == 0)
6777 else if (strcmp(node.Name,
"Value") == 0)
6782 else if (node.Type == XmlNodeType::EndTag)
6789 if (depth == 2 && node.Type == XmlNodeType::Text)
6798 ret.emplace(std::move(key), node.Value);
6806 static void SetBlobTagsOptionsToXml(XmlWriter& writer,
const SetBlobTagsOptions& options)
6808 writer.Write(XmlNode{XmlNodeType::StartTag,
"Tags"});
6809 writer.Write(XmlNode{XmlNodeType::StartTag,
"TagSet"});
6810 for (
const auto& i : options.Tags)
6812 writer.Write(XmlNode{XmlNodeType::StartTag,
"Tag"});
6813 writer.Write(XmlNode{XmlNodeType::StartTag,
"Key"});
6814 writer.Write(XmlNode{XmlNodeType::Text,
nullptr, i.first.data()});
6815 writer.Write(XmlNode{XmlNodeType::EndTag});
6816 writer.Write(XmlNode{XmlNodeType::StartTag,
"Value"});
6817 writer.Write(XmlNode{XmlNodeType::Text,
nullptr, i.second.data()});
6818 writer.Write(XmlNode{XmlNodeType::EndTag});
6819 writer.Write(XmlNode{XmlNodeType::EndTag});
6821 writer.Write(XmlNode{XmlNodeType::EndTag});
6822 writer.Write(XmlNode{XmlNodeType::EndTag});
6831 Azure::Core::Nullable<int32_t> Timeout;
6832 Azure::Core::Nullable<std::string> TransactionalContentMd5;
6833 Azure::Core::Nullable<std::string> TransactionalContentCrc64;
6835 std::map<std::string, std::string> Metadata;
6836 Azure::Core::Nullable<std::string> LeaseId;
6837 Azure::Core::Nullable<AccessTier> Tier;
6839 Azure::Core::Nullable<std::string> EncryptionKeySha256;
6840 Azure::Core::Nullable<EncryptionAlgorithmType> EncryptionAlgorithm;
6841 Azure::Core::Nullable<std::string> EncryptionScope;
6842 Azure::Core::Nullable<std::string> IfModifiedSince;
6843 Azure::Core::Nullable<std::string> IfUnmodifiedSince;
6844 Azure::Core::Nullable<std::string> IfMatch;
6845 Azure::Core::Nullable<std::string> IfNoneMatch;
6846 Azure::Core::Nullable<std::string> IfTags;
6849 static Azure::Core::Response<UploadBlockBlobResult> Upload(
6850 const Azure::Core::Context& context,
6851 Azure::Core::Http::HttpPipeline& pipeline,
6852 const Azure::Core::Http::Url& url,
6853 Azure::Core::Http::BodyStream* requestBody,
6858 = Azure::Core::Http::Request(Azure::Core::Http::HttpMethod::Put, url, requestBody);
6859 request.AddHeader(
"Content-Length", std::to_string(requestBody->Length()));
6860 request.AddHeader(
"x-ms-version", c_ApiVersion);
6861 if (options.Timeout.HasValue())
6863 request.GetUrl().AppendQuery(
"timeout", std::to_string(options.Timeout.GetValue()));
6865 if (options.EncryptionKey.HasValue())
6867 request.AddHeader(
"x-ms-encryption-key", options.EncryptionKey.GetValue());
6869 if (options.EncryptionKeySha256.HasValue())
6871 request.AddHeader(
"x-ms-encryption-key-sha256", options.EncryptionKeySha256.GetValue());
6873 if (options.EncryptionAlgorithm.HasValue())
6876 "x-ms-encryption-algorithm",
6877 EncryptionAlgorithmTypeToString(options.EncryptionAlgorithm.GetValue()));
6879 if (options.EncryptionScope.HasValue())
6881 request.AddHeader(
"x-ms-encryption-scope", options.EncryptionScope.GetValue());
6883 if (options.TransactionalContentMd5.HasValue())
6885 request.AddHeader(
"Content-MD5", options.TransactionalContentMd5.GetValue());
6887 if (options.TransactionalContentCrc64.HasValue())
6889 request.AddHeader(
"x-ms-content-crc64", options.TransactionalContentCrc64.GetValue());
6891 if (!options.HttpHeaders.ContentType.empty())
6893 request.AddHeader(
"x-ms-blob-content-type", options.HttpHeaders.ContentType);
6895 if (!options.HttpHeaders.ContentEncoding.empty())
6897 request.AddHeader(
"x-ms-blob-content-encoding", options.HttpHeaders.ContentEncoding);
6899 if (!options.HttpHeaders.ContentLanguage.empty())
6901 request.AddHeader(
"x-ms-blob-content-language", options.HttpHeaders.ContentLanguage);
6903 if (!options.HttpHeaders.CacheControl.empty())
6905 request.AddHeader(
"x-ms-blob-cache-control", options.HttpHeaders.CacheControl);
6907 if (!options.HttpHeaders.ContentMd5.empty())
6909 request.AddHeader(
"x-ms-blob-content-md5", options.HttpHeaders.ContentMd5);
6911 if (!options.HttpHeaders.ContentDisposition.empty())
6914 "x-ms-blob-content-disposition", options.HttpHeaders.ContentDisposition);
6916 std::set<std::string> metadataKeys;
6917 for (
const auto& pair : options.Metadata)
6919 std::string key = pair.first;
6920 std::transform(key.begin(), key.end(), key.begin(), [](
unsigned char c) {
6921 return static_cast<char>(std::tolower(c));
6923 if (metadataKeys.insert(key).second ==
false)
6925 throw std::runtime_error(
"duplicate keys in metadata");
6927 request.AddHeader(
"x-ms-meta-" + pair.first, pair.second);
6929 metadataKeys.clear();
6930 if (options.LeaseId.HasValue())
6932 request.AddHeader(
"x-ms-lease-id", options.LeaseId.GetValue());
6934 request.AddHeader(
"x-ms-blob-type",
"BlockBlob");
6935 if (options.Tier.HasValue())
6937 request.AddHeader(
"x-ms-access-tier", AccessTierToString(options.Tier.GetValue()));
6939 if (options.IfModifiedSince.HasValue())
6941 request.AddHeader(
"If-Modified-Since", options.IfModifiedSince.GetValue());
6943 if (options.IfUnmodifiedSince.HasValue())
6945 request.AddHeader(
"If-Unmodified-Since", options.IfUnmodifiedSince.GetValue());
6947 if (options.IfMatch.HasValue())
6949 request.AddHeader(
"If-Match", options.IfMatch.GetValue());
6951 if (options.IfNoneMatch.HasValue())
6953 request.AddHeader(
"If-None-Match", options.IfNoneMatch.GetValue());
6955 if (options.IfTags.HasValue())
6957 request.AddHeader(
"x-ms-if-tags", options.IfTags.GetValue());
6959 auto pHttpResponse = pipeline.Send(context, request);
6960 Azure::Core::Http::RawResponse& httpResponse = *pHttpResponse;
6961 UploadBlockBlobResult response;
6962 auto http_status_code
6963 =
static_cast<std::underlying_type<Azure::Core::Http::HttpStatusCode>::type
>(
6964 httpResponse.GetStatusCode());
6965 if (!(http_status_code == 201))
6967 throw StorageError::CreateFromResponse(std::move(pHttpResponse));
6969 response.ETag = httpResponse.GetHeaders().at(
"etag");
6970 response.LastModified = httpResponse.GetHeaders().at(
"last-modified");
6971 auto response_transactional_content_md5_iterator
6972 = httpResponse.GetHeaders().find(
"content-md5");
6973 if (response_transactional_content_md5_iterator != httpResponse.GetHeaders().end())
6975 response.TransactionalContentMd5 = response_transactional_content_md5_iterator->second;
6977 auto response_transactional_content_crc64_iterator
6978 = httpResponse.GetHeaders().find(
"x-ms-content-crc64");
6979 if (response_transactional_content_crc64_iterator != httpResponse.GetHeaders().end())
6981 response.TransactionalContentCrc64
6982 = response_transactional_content_crc64_iterator->second;
6984 auto response_version_id_iterator = httpResponse.GetHeaders().find(
"x-ms-version-id");
6985 if (response_version_id_iterator != httpResponse.GetHeaders().end())
6987 response.VersionId = response_version_id_iterator->second;
6989 auto response_server_encrypted_iterator
6990 = httpResponse.GetHeaders().find(
"x-ms-request-server-encrypted");
6991 if (response_server_encrypted_iterator != httpResponse.GetHeaders().end())
6993 response.ServerEncrypted = response_server_encrypted_iterator->second ==
"true";
6995 auto response_encryption_key_sha256_iterator
6996 = httpResponse.GetHeaders().find(
"x-ms-encryption-key-sha256");
6997 if (response_encryption_key_sha256_iterator != httpResponse.GetHeaders().end())
6999 response.EncryptionKeySha256 = response_encryption_key_sha256_iterator->second;
7001 auto response_encryption_scope_iterator
7002 = httpResponse.GetHeaders().find(
"x-ms-encryption-scope");
7003 if (response_encryption_scope_iterator != httpResponse.GetHeaders().end())
7005 response.EncryptionScope = response_encryption_scope_iterator->second;
7007 return Azure::Core::Response<UploadBlockBlobResult>(
7008 std::move(response), std::move(pHttpResponse));
7013 Azure::Core::Nullable<int32_t> Timeout;
7014 std::string BlockId;
7015 Azure::Core::Nullable<std::string> TransactionalContentMd5;
7016 Azure::Core::Nullable<std::string> TransactionalContentCrc64;
7017 Azure::Core::Nullable<std::string> LeaseId;
7019 Azure::Core::Nullable<std::string> EncryptionKeySha256;
7020 Azure::Core::Nullable<EncryptionAlgorithmType> EncryptionAlgorithm;
7021 Azure::Core::Nullable<std::string> EncryptionScope;
7024 static Azure::Core::Response<StageBlockResult> StageBlock(
7025 const Azure::Core::Context& context,
7026 Azure::Core::Http::HttpPipeline& pipeline,
7027 const Azure::Core::Http::Url& url,
7028 Azure::Core::Http::BodyStream* requestBody,
7033 = Azure::Core::Http::Request(Azure::Core::Http::HttpMethod::Put, url, requestBody);
7034 request.AddHeader(
"Content-Length", std::to_string(requestBody->Length()));
7035 request.GetUrl().AppendQuery(
"comp",
"block");
7036 request.GetUrl().AppendQuery(
"blockid", options.BlockId);
7037 request.AddHeader(
"x-ms-version", c_ApiVersion);
7038 if (options.Timeout.HasValue())
7040 request.GetUrl().AppendQuery(
"timeout", std::to_string(options.Timeout.GetValue()));
7042 if (options.TransactionalContentMd5.HasValue())
7044 request.AddHeader(
"Content-MD5", options.TransactionalContentMd5.GetValue());
7046 if (options.TransactionalContentCrc64.HasValue())
7048 request.AddHeader(
"x-ms-content-crc64", options.TransactionalContentCrc64.GetValue());
7050 if (options.LeaseId.HasValue())
7052 request.AddHeader(
"x-ms-lease-id", options.LeaseId.GetValue());
7054 if (options.EncryptionKey.HasValue())
7056 request.AddHeader(
"x-ms-encryption-key", options.EncryptionKey.GetValue());
7058 if (options.EncryptionKeySha256.HasValue())
7060 request.AddHeader(
"x-ms-encryption-key-sha256", options.EncryptionKeySha256.GetValue());
7062 if (options.EncryptionAlgorithm.HasValue())
7065 "x-ms-encryption-algorithm",
7066 EncryptionAlgorithmTypeToString(options.EncryptionAlgorithm.GetValue()));
7068 if (options.EncryptionScope.HasValue())
7070 request.AddHeader(
"x-ms-encryption-scope", options.EncryptionScope.GetValue());
7072 auto pHttpResponse = pipeline.Send(context, request);
7073 Azure::Core::Http::RawResponse& httpResponse = *pHttpResponse;
7074 StageBlockResult response;
7075 auto http_status_code
7076 =
static_cast<std::underlying_type<Azure::Core::Http::HttpStatusCode>::type
>(
7077 httpResponse.GetStatusCode());
7078 if (!(http_status_code == 201))
7080 throw StorageError::CreateFromResponse(std::move(pHttpResponse));
7082 auto response_transactional_content_md5_iterator
7083 = httpResponse.GetHeaders().find(
"content-md5");
7084 if (response_transactional_content_md5_iterator != httpResponse.GetHeaders().end())
7086 response.TransactionalContentMd5 = response_transactional_content_md5_iterator->second;
7088 auto response_transactional_content_crc64_iterator
7089 = httpResponse.GetHeaders().find(
"x-ms-content-crc64");
7090 if (response_transactional_content_crc64_iterator != httpResponse.GetHeaders().end())
7092 response.TransactionalContentCrc64
7093 = response_transactional_content_crc64_iterator->second;
7095 auto response_server_encrypted_iterator
7096 = httpResponse.GetHeaders().find(
"x-ms-request-server-encrypted");
7097 if (response_server_encrypted_iterator != httpResponse.GetHeaders().end())
7099 response.ServerEncrypted = response_server_encrypted_iterator->second ==
"true";
7101 auto response_encryption_key_sha256_iterator
7102 = httpResponse.GetHeaders().find(
"x-ms-encryption-key-sha256");
7103 if (response_encryption_key_sha256_iterator != httpResponse.GetHeaders().end())
7105 response.EncryptionKeySha256 = response_encryption_key_sha256_iterator->second;
7107 auto response_encryption_scope_iterator
7108 = httpResponse.GetHeaders().find(
"x-ms-encryption-scope");
7109 if (response_encryption_scope_iterator != httpResponse.GetHeaders().end())
7111 response.EncryptionScope = response_encryption_scope_iterator->second;
7113 return Azure::Core::Response<StageBlockResult>(
7114 std::move(response), std::move(pHttpResponse));
7119 Azure::Core::Nullable<int32_t> Timeout;
7120 std::string BlockId;
7121 std::string SourceUri;
7122 Azure::Core::Nullable<std::pair<int64_t, int64_t>> SourceRange;
7123 Azure::Core::Nullable<std::string> TransactionalContentMd5;
7124 Azure::Core::Nullable<std::string> TransactionalContentCrc64;
7125 Azure::Core::Nullable<std::string> LeaseId;
7127 Azure::Core::Nullable<std::string> EncryptionKeySha256;
7128 Azure::Core::Nullable<EncryptionAlgorithmType> EncryptionAlgorithm;
7129 Azure::Core::Nullable<std::string> EncryptionScope;
7130 Azure::Core::Nullable<std::string> SourceIfModifiedSince;
7131 Azure::Core::Nullable<std::string> SourceIfUnmodifiedSince;
7132 Azure::Core::Nullable<std::string> SourceIfMatch;
7133 Azure::Core::Nullable<std::string> SourceIfNoneMatch;
7136 static Azure::Core::Response<StageBlockFromUriResult> StageBlockFromUri(
7137 const Azure::Core::Context& context,
7138 Azure::Core::Http::HttpPipeline& pipeline,
7139 const Azure::Core::Http::Url& url,
7143 auto request = Azure::Core::Http::Request(Azure::Core::Http::HttpMethod::Put, url);
7144 request.AddHeader(
"Content-Length",
"0");
7145 request.GetUrl().AppendQuery(
"comp",
"block");
7146 request.GetUrl().AppendQuery(
"blockid", options.BlockId);
7147 request.AddHeader(
"x-ms-version", c_ApiVersion);
7148 if (options.Timeout.HasValue())
7150 request.GetUrl().AppendQuery(
"timeout", std::to_string(options.Timeout.GetValue()));
7152 request.AddHeader(
"x-ms-copy-source", options.SourceUri);
7153 if (options.SourceRange.HasValue())
7155 auto startOffset = options.SourceRange.GetValue().first;
7156 auto endOffset = options.SourceRange.GetValue().second;
7157 if (endOffset != std::numeric_limits<decltype(endOffset)>::max())
7160 "x-ms-source_range",
7161 "bytes=" + std::to_string(startOffset) +
"-" + std::to_string(endOffset));
7165 request.AddHeader(
"x-ms-source_range",
"bytes=" + std::to_string(startOffset) +
"-");
7168 if (options.TransactionalContentMd5.HasValue())
7170 request.AddHeader(
"x-ms-source-content-md5", options.TransactionalContentMd5.GetValue());
7172 if (options.TransactionalContentCrc64.HasValue())
7175 "x-ms-source-content-crc64", options.TransactionalContentCrc64.GetValue());
7177 if (options.LeaseId.HasValue())
7179 request.AddHeader(
"x-ms-lease-id", options.LeaseId.GetValue());
7181 if (options.EncryptionKey.HasValue())
7183 request.AddHeader(
"x-ms-encryption-key", options.EncryptionKey.GetValue());
7185 if (options.EncryptionKeySha256.HasValue())
7187 request.AddHeader(
"x-ms-encryption-key-sha256", options.EncryptionKeySha256.GetValue());
7189 if (options.EncryptionAlgorithm.HasValue())
7192 "x-ms-encryption-algorithm",
7193 EncryptionAlgorithmTypeToString(options.EncryptionAlgorithm.GetValue()));
7195 if (options.EncryptionScope.HasValue())
7197 request.AddHeader(
"x-ms-encryption-scope", options.EncryptionScope.GetValue());
7199 if (options.SourceIfModifiedSince.HasValue())
7202 "x-ms-source-if-modified-since", options.SourceIfModifiedSince.GetValue());
7204 if (options.SourceIfUnmodifiedSince.HasValue())
7207 "x-ms-source-if-unmodified-since", options.SourceIfUnmodifiedSince.GetValue());
7209 if (options.SourceIfMatch.HasValue())
7211 request.AddHeader(
"x-ms-source-if-match", options.SourceIfMatch.GetValue());
7213 if (options.SourceIfNoneMatch.HasValue())
7215 request.AddHeader(
"x-ms-source-if-none-match", options.SourceIfNoneMatch.GetValue());
7217 auto pHttpResponse = pipeline.Send(context, request);
7218 Azure::Core::Http::RawResponse& httpResponse = *pHttpResponse;
7219 StageBlockFromUriResult response;
7220 auto http_status_code
7221 =
static_cast<std::underlying_type<Azure::Core::Http::HttpStatusCode>::type
>(
7222 httpResponse.GetStatusCode());
7223 if (!(http_status_code == 201))
7225 throw StorageError::CreateFromResponse(std::move(pHttpResponse));
7227 auto response_transactional_content_md5_iterator
7228 = httpResponse.GetHeaders().find(
"content-md5");
7229 if (response_transactional_content_md5_iterator != httpResponse.GetHeaders().end())
7231 response.TransactionalContentMd5 = response_transactional_content_md5_iterator->second;
7233 auto response_transactional_content_crc64_iterator
7234 = httpResponse.GetHeaders().find(
"x-ms-content-crc64");
7235 if (response_transactional_content_crc64_iterator != httpResponse.GetHeaders().end())
7237 response.TransactionalContentCrc64
7238 = response_transactional_content_crc64_iterator->second;
7240 auto response_server_encrypted_iterator
7241 = httpResponse.GetHeaders().find(
"x-ms-request-server-encrypted");
7242 if (response_server_encrypted_iterator != httpResponse.GetHeaders().end())
7244 response.ServerEncrypted = response_server_encrypted_iterator->second ==
"true";
7246 auto response_encryption_key_sha256_iterator
7247 = httpResponse.GetHeaders().find(
"x-ms-encryption-key-sha256");
7248 if (response_encryption_key_sha256_iterator != httpResponse.GetHeaders().end())
7250 response.EncryptionKeySha256 = response_encryption_key_sha256_iterator->second;
7252 auto response_encryption_scope_iterator
7253 = httpResponse.GetHeaders().find(
"x-ms-encryption-scope");
7254 if (response_encryption_scope_iterator != httpResponse.GetHeaders().end())
7256 response.EncryptionScope = response_encryption_scope_iterator->second;
7258 return Azure::Core::Response<StageBlockFromUriResult>(
7259 std::move(response), std::move(pHttpResponse));
7264 Azure::Core::Nullable<int32_t> Timeout;
7265 std::vector<std::pair<BlockType, std::string>> BlockList;
7267 std::map<std::string, std::string> Metadata;
7268 Azure::Core::Nullable<std::string> LeaseId;
7270 Azure::Core::Nullable<std::string> EncryptionKeySha256;
7271 Azure::Core::Nullable<EncryptionAlgorithmType> EncryptionAlgorithm;
7272 Azure::Core::Nullable<std::string> EncryptionScope;
7273 Azure::Core::Nullable<std::string> IfModifiedSince;
7274 Azure::Core::Nullable<std::string> IfUnmodifiedSince;
7275 Azure::Core::Nullable<std::string> IfMatch;
7276 Azure::Core::Nullable<std::string> IfNoneMatch;
7277 Azure::Core::Nullable<std::string> IfTags;
7278 Azure::Core::Nullable<AccessTier> Tier;
7281 static Azure::Core::Response<CommitBlockListResult> CommitBlockList(
7282 const Azure::Core::Context& context,
7283 Azure::Core::Http::HttpPipeline& pipeline,
7284 const Azure::Core::Http::Url& url,
7288 std::string xml_body;
7291 CommitBlockListOptionsToXml(writer, options);
7292 xml_body = writer.GetDocument();
7293 writer.Write(XmlNode{XmlNodeType::End});
7295 Azure::Core::Http::MemoryBodyStream xml_body_stream(
7296 reinterpret_cast<const uint8_t*
>(xml_body.data()), xml_body.length());
7298 = Azure::Core::Http::Request(Azure::Core::Http::HttpMethod::Put, url, &xml_body_stream);
7299 request.AddHeader(
"Content-Length", std::to_string(xml_body_stream.Length()));
7300 request.GetUrl().AppendQuery(
"comp",
"blocklist");
7301 request.AddHeader(
"x-ms-version", c_ApiVersion);
7302 if (options.Timeout.HasValue())
7304 request.GetUrl().AppendQuery(
"timeout", std::to_string(options.Timeout.GetValue()));
7306 if (!options.HttpHeaders.ContentType.empty())
7308 request.AddHeader(
"x-ms-blob-content-type", options.HttpHeaders.ContentType);
7310 if (!options.HttpHeaders.ContentEncoding.empty())
7312 request.AddHeader(
"x-ms-blob-content-encoding", options.HttpHeaders.ContentEncoding);
7314 if (!options.HttpHeaders.ContentLanguage.empty())
7316 request.AddHeader(
"x-ms-blob-content-language", options.HttpHeaders.ContentLanguage);
7318 if (!options.HttpHeaders.CacheControl.empty())
7320 request.AddHeader(
"x-ms-blob-cache-control", options.HttpHeaders.CacheControl);
7322 if (!options.HttpHeaders.ContentMd5.empty())
7324 request.AddHeader(
"x-ms-blob-content-md5", options.HttpHeaders.ContentMd5);
7326 if (!options.HttpHeaders.ContentDisposition.empty())
7329 "x-ms-blob-content-disposition", options.HttpHeaders.ContentDisposition);
7331 std::set<std::string> metadataKeys;
7332 for (
const auto& pair : options.Metadata)
7334 std::string key = pair.first;
7335 std::transform(key.begin(), key.end(), key.begin(), [](
unsigned char c) {
7336 return static_cast<char>(std::tolower(c));
7338 if (metadataKeys.insert(key).second ==
false)
7340 throw std::runtime_error(
"duplicate keys in metadata");
7342 request.AddHeader(
"x-ms-meta-" + pair.first, pair.second);
7344 metadataKeys.clear();
7345 if (options.LeaseId.HasValue())
7347 request.AddHeader(
"x-ms-lease-id", options.LeaseId.GetValue());
7349 if (options.EncryptionKey.HasValue())
7351 request.AddHeader(
"x-ms-encryption-key", options.EncryptionKey.GetValue());
7353 if (options.EncryptionKeySha256.HasValue())
7355 request.AddHeader(
"x-ms-encryption-key-sha256", options.EncryptionKeySha256.GetValue());
7357 if (options.EncryptionAlgorithm.HasValue())
7360 "x-ms-encryption-algorithm",
7361 EncryptionAlgorithmTypeToString(options.EncryptionAlgorithm.GetValue()));
7363 if (options.EncryptionScope.HasValue())
7365 request.AddHeader(
"x-ms-encryption-scope", options.EncryptionScope.GetValue());
7367 if (options.Tier.HasValue())
7369 request.AddHeader(
"x-ms-access-tier", AccessTierToString(options.Tier.GetValue()));
7371 if (options.IfModifiedSince.HasValue())
7373 request.AddHeader(
"If-Modified-Since", options.IfModifiedSince.GetValue());
7375 if (options.IfUnmodifiedSince.HasValue())
7377 request.AddHeader(
"If-Unmodified-Since", options.IfUnmodifiedSince.GetValue());
7379 if (options.IfMatch.HasValue())
7381 request.AddHeader(
"If-Match", options.IfMatch.GetValue());
7383 if (options.IfNoneMatch.HasValue())
7385 request.AddHeader(
"If-None-Match", options.IfNoneMatch.GetValue());
7387 if (options.IfTags.HasValue())
7389 request.AddHeader(
"x-ms-if-tags", options.IfTags.GetValue());
7391 auto pHttpResponse = pipeline.Send(context, request);
7392 Azure::Core::Http::RawResponse& httpResponse = *pHttpResponse;
7393 CommitBlockListResult response;
7394 auto http_status_code
7395 =
static_cast<std::underlying_type<Azure::Core::Http::HttpStatusCode>::type
>(
7396 httpResponse.GetStatusCode());
7397 if (!(http_status_code == 201))
7399 throw StorageError::CreateFromResponse(std::move(pHttpResponse));
7401 response.ETag = httpResponse.GetHeaders().at(
"etag");
7402 response.LastModified = httpResponse.GetHeaders().at(
"last-modified");
7403 auto response_version_id_iterator = httpResponse.GetHeaders().find(
"x-ms-version-id");
7404 if (response_version_id_iterator != httpResponse.GetHeaders().end())
7406 response.VersionId = response_version_id_iterator->second;
7408 auto response_server_encrypted_iterator
7409 = httpResponse.GetHeaders().find(
"x-ms-request-server-encrypted");
7410 if (response_server_encrypted_iterator != httpResponse.GetHeaders().end())
7412 response.ServerEncrypted = response_server_encrypted_iterator->second ==
"true";
7414 auto response_encryption_key_sha256_iterator
7415 = httpResponse.GetHeaders().find(
"x-ms-encryption-key-sha256");
7416 if (response_encryption_key_sha256_iterator != httpResponse.GetHeaders().end())
7418 response.EncryptionKeySha256 = response_encryption_key_sha256_iterator->second;
7420 auto response_encryption_scope_iterator
7421 = httpResponse.GetHeaders().find(
"x-ms-encryption-scope");
7422 if (response_encryption_scope_iterator != httpResponse.GetHeaders().end())
7424 response.EncryptionScope = response_encryption_scope_iterator->second;
7426 return Azure::Core::Response<CommitBlockListResult>(
7427 std::move(response), std::move(pHttpResponse));
7432 Azure::Core::Nullable<int32_t> Timeout;
7433 Azure::Core::Nullable<BlockListTypeOption> ListType;
7434 Azure::Core::Nullable<std::string> LeaseId;
7435 Azure::Core::Nullable<std::string> IfTags;
7438 static Azure::Core::Response<GetBlockListResult> GetBlockList(
7439 const Azure::Core::Context& context,
7440 Azure::Core::Http::HttpPipeline& pipeline,
7441 const Azure::Core::Http::Url& url,
7445 auto request = Azure::Core::Http::Request(Azure::Core::Http::HttpMethod::Get, url);
7446 request.GetUrl().AppendQuery(
"comp",
"blocklist");
7447 if (options.ListType.HasValue())
7449 std::string block_list_type_option
7450 = BlockListTypeOptionToString(options.ListType.GetValue());
7451 request.GetUrl().AppendQuery(
"blocklisttype", block_list_type_option);
7453 request.AddHeader(
"x-ms-version", c_ApiVersion);
7454 if (options.Timeout.HasValue())
7456 request.GetUrl().AppendQuery(
"timeout", std::to_string(options.Timeout.GetValue()));
7458 if (options.LeaseId.HasValue())
7460 request.AddHeader(
"x-ms-lease-id", options.LeaseId.GetValue());
7462 if (options.IfTags.HasValue())
7464 request.AddHeader(
"x-ms-if-tags", options.IfTags.GetValue());
7466 auto pHttpResponse = pipeline.Send(context, request);
7467 Azure::Core::Http::RawResponse& httpResponse = *pHttpResponse;
7468 GetBlockListResult response;
7469 auto http_status_code
7470 =
static_cast<std::underlying_type<Azure::Core::Http::HttpStatusCode>::type
>(
7471 httpResponse.GetStatusCode());
7472 if (!(http_status_code == 200))
7474 throw StorageError::CreateFromResponse(std::move(pHttpResponse));
7477 const auto& httpResponseBody = httpResponse.GetBody();
7479 reinterpret_cast<const char*
>(httpResponseBody.data()), httpResponseBody.size());
7480 response = GetBlockListResultFromXml(reader);
7482 response.ETag = httpResponse.GetHeaders().at(
"etag");
7483 response.LastModified = httpResponse.GetHeaders().at(
"last-modified");
7484 response.ContentType = httpResponse.GetHeaders().at(
"content-type");
7485 response.ContentLength
7486 = std::stoll(httpResponse.GetHeaders().at(
"x-ms-blob-content-length"));
7487 return Azure::Core::Response<GetBlockListResult>(
7488 std::move(response), std::move(pHttpResponse));
7492 static GetBlockListResult GetBlockListResultFromXml(XmlReader& reader)
7494 GetBlockListResult ret;
7495 enum class XmlTagName
7500 k_UncommittedBlocks,
7503 std::vector<XmlTagName> path;
7506 auto node = reader.Read();
7507 if (node.Type == XmlNodeType::End)
7511 else if (node.Type == XmlNodeType::EndTag)
7513 if (path.size() > 0)
7522 else if (node.Type == XmlNodeType::StartTag)
7524 if (std::strcmp(node.Name,
"BlockList") == 0)
7526 path.emplace_back(XmlTagName::k_BlockList);
7528 else if (std::strcmp(node.Name,
"CommittedBlocks") == 0)
7530 path.emplace_back(XmlTagName::k_CommittedBlocks);
7532 else if (std::strcmp(node.Name,
"Block") == 0)
7534 path.emplace_back(XmlTagName::k_Block);
7536 else if (std::strcmp(node.Name,
"UncommittedBlocks") == 0)
7538 path.emplace_back(XmlTagName::k_UncommittedBlocks);
7542 path.emplace_back(XmlTagName::k_Unknown);
7544 if (path.size() == 3 && path[0] == XmlTagName::k_BlockList
7545 && path[1] == XmlTagName::k_CommittedBlocks && path[2] == XmlTagName::k_Block)
7547 ret.CommittedBlocks.emplace_back(BlobBlockFromXml(reader));
7551 path.size() == 3 && path[0] == XmlTagName::k_BlockList
7552 && path[1] == XmlTagName::k_UncommittedBlocks && path[2] == XmlTagName::k_Block)
7554 ret.UncommittedBlocks.emplace_back(BlobBlockFromXml(reader));
7558 else if (node.Type == XmlNodeType::Text)
7565 static BlobBlock BlobBlockFromXml(XmlReader& reader)
7568 enum class XmlTagName
7574 std::vector<XmlTagName> path;
7577 auto node = reader.Read();
7578 if (node.Type == XmlNodeType::End)
7582 else if (node.Type == XmlNodeType::EndTag)
7584 if (path.size() > 0)
7593 else if (node.Type == XmlNodeType::StartTag)
7595 if (std::strcmp(node.Name,
"Name") == 0)
7597 path.emplace_back(XmlTagName::k_Name);
7599 else if (std::strcmp(node.Name,
"Size") == 0)
7601 path.emplace_back(XmlTagName::k_Size);
7605 path.emplace_back(XmlTagName::k_Unknown);
7608 else if (node.Type == XmlNodeType::Text)
7610 if (path.size() == 1 && path[0] == XmlTagName::k_Name)
7612 ret.Name = node.Value;
7614 else if (path.size() == 1 && path[0] == XmlTagName::k_Size)
7616 ret.Size = std::stoll(node.Value);
7623 static void CommitBlockListOptionsToXml(
7625 const CommitBlockListOptions& options)
7627 writer.Write(XmlNode{XmlNodeType::StartTag,
"BlockList"});
7628 for (
const auto& i : options.BlockList)
7631 XmlNode{XmlNodeType::StartTag, BlockTypeToString(i.first).data(), i.second.data()});
7633 writer.Write(XmlNode{XmlNodeType::EndTag});
7642 Azure::Core::Nullable<int32_t> Timeout;
7643 int64_t BlobContentLength = -1;
7644 Azure::Core::Nullable<int64_t> SequenceNumber;
7646 std::map<std::string, std::string> Metadata;
7647 Azure::Core::Nullable<std::string> LeaseId;
7648 Azure::Core::Nullable<AccessTier> Tier;
7650 Azure::Core::Nullable<std::string> EncryptionKeySha256;
7651 Azure::Core::Nullable<EncryptionAlgorithmType> EncryptionAlgorithm;
7652 Azure::Core::Nullable<std::string> EncryptionScope;
7653 Azure::Core::Nullable<std::string> IfModifiedSince;
7654 Azure::Core::Nullable<std::string> IfUnmodifiedSince;
7655 Azure::Core::Nullable<std::string> IfMatch;
7656 Azure::Core::Nullable<std::string> IfNoneMatch;
7657 Azure::Core::Nullable<std::string> IfTags;
7660 static Azure::Core::Response<CreatePageBlobResult> Create(
7661 const Azure::Core::Context& context,
7662 Azure::Core::Http::HttpPipeline& pipeline,
7663 const Azure::Core::Http::Url& url,
7667 auto request = Azure::Core::Http::Request(Azure::Core::Http::HttpMethod::Put, url);
7668 request.AddHeader(
"Content-Length",
"0");
7669 request.AddHeader(
"x-ms-version", c_ApiVersion);
7670 if (options.Timeout.HasValue())
7672 request.GetUrl().AppendQuery(
"timeout", std::to_string(options.Timeout.GetValue()));
7674 if (!options.HttpHeaders.ContentType.empty())
7676 request.AddHeader(
"x-ms-blob-content-type", options.HttpHeaders.ContentType);
7678 if (!options.HttpHeaders.ContentEncoding.empty())
7680 request.AddHeader(
"x-ms-blob-content-encoding", options.HttpHeaders.ContentEncoding);
7682 if (!options.HttpHeaders.ContentLanguage.empty())
7684 request.AddHeader(
"x-ms-blob-content-language", options.HttpHeaders.ContentLanguage);
7686 if (!options.HttpHeaders.CacheControl.empty())
7688 request.AddHeader(
"x-ms-blob-cache-control", options.HttpHeaders.CacheControl);
7690 if (!options.HttpHeaders.ContentMd5.empty())
7692 request.AddHeader(
"x-ms-blob-content-md5", options.HttpHeaders.ContentMd5);
7694 if (!options.HttpHeaders.ContentDisposition.empty())
7697 "x-ms-blob-content-disposition", options.HttpHeaders.ContentDisposition);
7699 std::set<std::string> metadataKeys;
7700 for (
const auto& pair : options.Metadata)
7702 std::string key = pair.first;
7703 std::transform(key.begin(), key.end(), key.begin(), [](
unsigned char c) {
7704 return static_cast<char>(std::tolower(c));
7706 if (metadataKeys.insert(key).second ==
false)
7708 throw std::runtime_error(
"duplicate keys in metadata");
7710 request.AddHeader(
"x-ms-meta-" + pair.first, pair.second);
7712 metadataKeys.clear();
7713 if (options.LeaseId.HasValue())
7715 request.AddHeader(
"x-ms-lease-id", options.LeaseId.GetValue());
7717 request.AddHeader(
"x-ms-blob-type",
"PageBlob");
7718 request.AddHeader(
"x-ms-blob-content-length", std::to_string(options.BlobContentLength));
7719 if (options.SequenceNumber.HasValue())
7722 "x-ms-blob-sequence-number", std::to_string(options.SequenceNumber.GetValue()));
7724 if (options.Tier.HasValue())
7726 request.AddHeader(
"x-ms-access-tier", AccessTierToString(options.Tier.GetValue()));
7728 if (options.EncryptionKey.HasValue())
7730 request.AddHeader(
"x-ms-encryption-key", options.EncryptionKey.GetValue());
7732 if (options.EncryptionKeySha256.HasValue())
7734 request.AddHeader(
"x-ms-encryption-key-sha256", options.EncryptionKeySha256.GetValue());
7736 if (options.EncryptionAlgorithm.HasValue())
7739 "x-ms-encryption-algorithm",
7740 EncryptionAlgorithmTypeToString(options.EncryptionAlgorithm.GetValue()));
7742 if (options.EncryptionScope.HasValue())
7744 request.AddHeader(
"x-ms-encryption-scope", options.EncryptionScope.GetValue());
7746 if (options.IfModifiedSince.HasValue())
7748 request.AddHeader(
"If-Modified-Since", options.IfModifiedSince.GetValue());
7750 if (options.IfUnmodifiedSince.HasValue())
7752 request.AddHeader(
"If-Unmodified-Since", options.IfUnmodifiedSince.GetValue());
7754 if (options.IfMatch.HasValue())
7756 request.AddHeader(
"If-Match", options.IfMatch.GetValue());
7758 if (options.IfNoneMatch.HasValue())
7760 request.AddHeader(
"If-None-Match", options.IfNoneMatch.GetValue());
7762 if (options.IfTags.HasValue())
7764 request.AddHeader(
"x-ms-if-tags", options.IfTags.GetValue());
7766 auto pHttpResponse = pipeline.Send(context, request);
7767 Azure::Core::Http::RawResponse& httpResponse = *pHttpResponse;
7768 CreatePageBlobResult response;
7769 auto http_status_code
7770 =
static_cast<std::underlying_type<Azure::Core::Http::HttpStatusCode>::type
>(
7771 httpResponse.GetStatusCode());
7772 if (!(http_status_code == 201))
7774 throw StorageError::CreateFromResponse(std::move(pHttpResponse));
7776 response.ETag = httpResponse.GetHeaders().at(
"etag");
7777 response.LastModified = httpResponse.GetHeaders().at(
"last-modified");
7778 auto response_version_id_iterator = httpResponse.GetHeaders().find(
"x-ms-version-id");
7779 if (response_version_id_iterator != httpResponse.GetHeaders().end())
7781 response.VersionId = response_version_id_iterator->second;
7783 auto response_server_encrypted_iterator
7784 = httpResponse.GetHeaders().find(
"x-ms-request-server-encrypted");
7785 if (response_server_encrypted_iterator != httpResponse.GetHeaders().end())
7787 response.ServerEncrypted = response_server_encrypted_iterator->second ==
"true";
7789 auto response_encryption_key_sha256_iterator
7790 = httpResponse.GetHeaders().find(
"x-ms-encryption-key-sha256");
7791 if (response_encryption_key_sha256_iterator != httpResponse.GetHeaders().end())
7793 response.EncryptionKeySha256 = response_encryption_key_sha256_iterator->second;
7795 auto response_encryption_scope_iterator
7796 = httpResponse.GetHeaders().find(
"x-ms-encryption-scope");
7797 if (response_encryption_scope_iterator != httpResponse.GetHeaders().end())
7799 response.EncryptionScope = response_encryption_scope_iterator->second;
7801 return Azure::Core::Response<CreatePageBlobResult>(
7802 std::move(response), std::move(pHttpResponse));
7807 Azure::Core::Nullable<int32_t> Timeout;
7808 std::pair<int64_t, int64_t> Range;
7809 Azure::Core::Nullable<std::string> TransactionalContentMd5;
7810 Azure::Core::Nullable<std::string> TransactionalContentCrc64;
7811 Azure::Core::Nullable<std::string> LeaseId;
7812 Azure::Core::Nullable<int64_t> IfSequenceNumberLessThanOrEqualTo;
7813 Azure::Core::Nullable<int64_t> IfSequenceNumberLessThan;
7814 Azure::Core::Nullable<int64_t> IfSequenceNumberEqualTo;
7816 Azure::Core::Nullable<std::string> EncryptionKeySha256;
7817 Azure::Core::Nullable<EncryptionAlgorithmType> EncryptionAlgorithm;
7818 Azure::Core::Nullable<std::string> EncryptionScope;
7819 Azure::Core::Nullable<std::string> IfModifiedSince;
7820 Azure::Core::Nullable<std::string> IfUnmodifiedSince;
7821 Azure::Core::Nullable<std::string> IfMatch;
7822 Azure::Core::Nullable<std::string> IfNoneMatch;
7823 Azure::Core::Nullable<std::string> IfTags;
7826 static Azure::Core::Response<UploadPageBlobPagesResult> UploadPages(
7827 const Azure::Core::Context& context,
7828 Azure::Core::Http::HttpPipeline& pipeline,
7829 const Azure::Core::Http::Url& url,
7830 Azure::Core::Http::BodyStream* requestBody,
7835 = Azure::Core::Http::Request(Azure::Core::Http::HttpMethod::Put, url, requestBody);
7836 request.AddHeader(
"Content-Length", std::to_string(requestBody->Length()));
7837 request.GetUrl().AppendQuery(
"comp",
"page");
7838 request.AddHeader(
"x-ms-version", c_ApiVersion);
7839 if (options.Timeout.HasValue())
7841 request.GetUrl().AppendQuery(
"timeout", std::to_string(options.Timeout.GetValue()));
7845 "bytes=" + std::to_string(options.Range.first) +
"-"
7846 + std::to_string(options.Range.second));
7847 if (options.TransactionalContentMd5.HasValue())
7849 request.AddHeader(
"Content-MD5", options.TransactionalContentMd5.GetValue());
7851 if (options.TransactionalContentCrc64.HasValue())
7853 request.AddHeader(
"x-ms-content-crc64", options.TransactionalContentCrc64.GetValue());
7855 request.AddHeader(
"x-ms-page-write",
"update");
7856 if (options.LeaseId.HasValue())
7858 request.AddHeader(
"x-ms-lease-id", options.LeaseId.GetValue());
7860 if (options.IfSequenceNumberLessThanOrEqualTo.HasValue())
7863 "x-ms-if-sequence-number-le",
7864 std::to_string(options.IfSequenceNumberLessThanOrEqualTo.GetValue()));
7866 if (options.IfSequenceNumberLessThan.HasValue())
7869 "x-ms-if-sequence-number-lt",
7870 std::to_string(options.IfSequenceNumberLessThan.GetValue()));
7872 if (options.IfSequenceNumberEqualTo.HasValue())
7875 "x-ms-if-sequence-number-eq",
7876 std::to_string(options.IfSequenceNumberEqualTo.GetValue()));
7878 if (options.EncryptionKey.HasValue())
7880 request.AddHeader(
"x-ms-encryption-key", options.EncryptionKey.GetValue());
7882 if (options.EncryptionKeySha256.HasValue())
7884 request.AddHeader(
"x-ms-encryption-key-sha256", options.EncryptionKeySha256.GetValue());
7886 if (options.EncryptionAlgorithm.HasValue())
7889 "x-ms-encryption-algorithm",
7890 EncryptionAlgorithmTypeToString(options.EncryptionAlgorithm.GetValue()));
7892 if (options.EncryptionScope.HasValue())
7894 request.AddHeader(
"x-ms-encryption-scope", options.EncryptionScope.GetValue());
7896 if (options.IfModifiedSince.HasValue())
7898 request.AddHeader(
"If-Modified-Since", options.IfModifiedSince.GetValue());
7900 if (options.IfUnmodifiedSince.HasValue())
7902 request.AddHeader(
"If-Unmodified-Since", options.IfUnmodifiedSince.GetValue());
7904 if (options.IfMatch.HasValue())
7906 request.AddHeader(
"If-Match", options.IfMatch.GetValue());
7908 if (options.IfNoneMatch.HasValue())
7910 request.AddHeader(
"If-None-Match", options.IfNoneMatch.GetValue());
7912 if (options.IfTags.HasValue())
7914 request.AddHeader(
"x-ms-if-tags", options.IfTags.GetValue());
7916 auto pHttpResponse = pipeline.Send(context, request);
7917 Azure::Core::Http::RawResponse& httpResponse = *pHttpResponse;
7918 UploadPageBlobPagesResult response;
7919 auto http_status_code
7920 =
static_cast<std::underlying_type<Azure::Core::Http::HttpStatusCode>::type
>(
7921 httpResponse.GetStatusCode());
7922 if (!(http_status_code == 201))
7924 throw StorageError::CreateFromResponse(std::move(pHttpResponse));
7926 response.ETag = httpResponse.GetHeaders().at(
"etag");
7927 response.LastModified = httpResponse.GetHeaders().at(
"last-modified");
7928 auto response_transactional_content_md5_iterator
7929 = httpResponse.GetHeaders().find(
"content-md5");
7930 if (response_transactional_content_md5_iterator != httpResponse.GetHeaders().end())
7932 response.TransactionalContentMd5 = response_transactional_content_md5_iterator->second;
7934 auto response_transactional_content_crc64_iterator
7935 = httpResponse.GetHeaders().find(
"x-ms-content-crc64");
7936 if (response_transactional_content_crc64_iterator != httpResponse.GetHeaders().end())
7938 response.TransactionalContentCrc64
7939 = response_transactional_content_crc64_iterator->second;
7941 response.SequenceNumber
7942 = std::stoll(httpResponse.GetHeaders().at(
"x-ms-blob-sequence-number"));
7943 auto response_server_encrypted_iterator
7944 = httpResponse.GetHeaders().find(
"x-ms-request-server-encrypted");
7945 if (response_server_encrypted_iterator != httpResponse.GetHeaders().end())
7947 response.ServerEncrypted = response_server_encrypted_iterator->second ==
"true";
7949 auto response_encryption_key_sha256_iterator
7950 = httpResponse.GetHeaders().find(
"x-ms-encryption-key-sha256");
7951 if (response_encryption_key_sha256_iterator != httpResponse.GetHeaders().end())
7953 response.EncryptionKeySha256 = response_encryption_key_sha256_iterator->second;
7955 auto response_encryption_scope_iterator
7956 = httpResponse.GetHeaders().find(
"x-ms-encryption-scope");
7957 if (response_encryption_scope_iterator != httpResponse.GetHeaders().end())
7959 response.EncryptionScope = response_encryption_scope_iterator->second;
7961 return Azure::Core::Response<UploadPageBlobPagesResult>(
7962 std::move(response), std::move(pHttpResponse));
7967 Azure::Core::Nullable<int32_t> Timeout;
7968 std::string SourceUri;
7969 std::pair<int64_t, int64_t> SourceRange;
7970 std::pair<int64_t, int64_t> Range;
7971 Azure::Core::Nullable<std::string> TransactionalContentMd5;
7972 Azure::Core::Nullable<std::string> TransactionalContentCrc64;
7973 Azure::Core::Nullable<std::string> LeaseId;
7974 Azure::Core::Nullable<int64_t> IfSequenceNumberLessThanOrEqualTo;
7975 Azure::Core::Nullable<int64_t> IfSequenceNumberLessThan;
7976 Azure::Core::Nullable<int64_t> IfSequenceNumberEqualTo;
7978 Azure::Core::Nullable<std::string> EncryptionKeySha256;
7979 Azure::Core::Nullable<EncryptionAlgorithmType> EncryptionAlgorithm;
7980 Azure::Core::Nullable<std::string> EncryptionScope;
7981 Azure::Core::Nullable<std::string> IfModifiedSince;
7982 Azure::Core::Nullable<std::string> IfUnmodifiedSince;
7983 Azure::Core::Nullable<std::string> IfMatch;
7984 Azure::Core::Nullable<std::string> IfNoneMatch;
7985 Azure::Core::Nullable<std::string> IfTags;
7988 static Azure::Core::Response<UploadPageBlobPagesFromUriResult> UploadPagesFromUri(
7989 const Azure::Core::Context& context,
7990 Azure::Core::Http::HttpPipeline& pipeline,
7991 const Azure::Core::Http::Url& url,
7995 auto request = Azure::Core::Http::Request(Azure::Core::Http::HttpMethod::Put, url);
7996 request.AddHeader(
"Content-Length",
"0");
7997 request.GetUrl().AppendQuery(
"comp",
"page");
7998 request.AddHeader(
"x-ms-version", c_ApiVersion);
7999 if (options.Timeout.HasValue())
8001 request.GetUrl().AppendQuery(
"timeout", std::to_string(options.Timeout.GetValue()));
8005 "bytes=" + std::to_string(options.Range.first) +
"-"
8006 + std::to_string(options.Range.second));
8007 request.AddHeader(
"x-ms-copy-source", options.SourceUri);
8009 "x-ms-source-range",
8010 "bytes=" + std::to_string(options.SourceRange.first) +
"-"
8011 + std::to_string(options.SourceRange.second));
8012 if (options.TransactionalContentMd5.HasValue())
8014 request.AddHeader(
"x-ms-source-content-md5", options.TransactionalContentMd5.GetValue());
8016 if (options.TransactionalContentCrc64.HasValue())
8019 "x-ms-source-content-crc64", options.TransactionalContentCrc64.GetValue());
8021 request.AddHeader(
"x-ms-page-write",
"update");
8022 if (options.LeaseId.HasValue())
8024 request.AddHeader(
"x-ms-lease-id", options.LeaseId.GetValue());
8026 if (options.IfSequenceNumberLessThanOrEqualTo.HasValue())
8029 "x-ms-if-sequence-number-le",
8030 std::to_string(options.IfSequenceNumberLessThanOrEqualTo.GetValue()));
8032 if (options.IfSequenceNumberLessThan.HasValue())
8035 "x-ms-if-sequence-number-lt",
8036 std::to_string(options.IfSequenceNumberLessThan.GetValue()));
8038 if (options.IfSequenceNumberEqualTo.HasValue())
8041 "x-ms-if-sequence-number-eq",
8042 std::to_string(options.IfSequenceNumberEqualTo.GetValue()));
8044 if (options.EncryptionKey.HasValue())
8046 request.AddHeader(
"x-ms-encryption-key", options.EncryptionKey.GetValue());
8048 if (options.EncryptionKeySha256.HasValue())
8050 request.AddHeader(
"x-ms-encryption-key-sha256", options.EncryptionKeySha256.GetValue());
8052 if (options.EncryptionAlgorithm.HasValue())
8055 "x-ms-encryption-algorithm",
8056 EncryptionAlgorithmTypeToString(options.EncryptionAlgorithm.GetValue()));
8058 if (options.EncryptionScope.HasValue())
8060 request.AddHeader(
"x-ms-encryption-scope", options.EncryptionScope.GetValue());
8062 if (options.IfModifiedSince.HasValue())
8064 request.AddHeader(
"If-Modified-Since", options.IfModifiedSince.GetValue());
8066 if (options.IfUnmodifiedSince.HasValue())
8068 request.AddHeader(
"If-Unmodified-Since", options.IfUnmodifiedSince.GetValue());
8070 if (options.IfMatch.HasValue())
8072 request.AddHeader(
"If-Match", options.IfMatch.GetValue());
8074 if (options.IfNoneMatch.HasValue())
8076 request.AddHeader(
"If-None-Match", options.IfNoneMatch.GetValue());
8078 if (options.IfTags.HasValue())
8080 request.AddHeader(
"x-ms-if-tags", options.IfTags.GetValue());
8082 auto pHttpResponse = pipeline.Send(context, request);
8083 Azure::Core::Http::RawResponse& httpResponse = *pHttpResponse;
8084 UploadPageBlobPagesFromUriResult response;
8085 auto http_status_code
8086 =
static_cast<std::underlying_type<Azure::Core::Http::HttpStatusCode>::type
>(
8087 httpResponse.GetStatusCode());
8088 if (!(http_status_code == 201))
8090 throw StorageError::CreateFromResponse(std::move(pHttpResponse));
8092 response.ETag = httpResponse.GetHeaders().at(
"etag");
8093 response.LastModified = httpResponse.GetHeaders().at(
"last-modified");
8094 auto response_transactional_content_md5_iterator
8095 = httpResponse.GetHeaders().find(
"content-md5");
8096 if (response_transactional_content_md5_iterator != httpResponse.GetHeaders().end())
8098 response.TransactionalContentMd5 = response_transactional_content_md5_iterator->second;
8100 auto response_transactional_content_crc64_iterator
8101 = httpResponse.GetHeaders().find(
"x-ms-content-crc64");
8102 if (response_transactional_content_crc64_iterator != httpResponse.GetHeaders().end())
8104 response.TransactionalContentCrc64
8105 = response_transactional_content_crc64_iterator->second;
8107 response.SequenceNumber
8108 = std::stoll(httpResponse.GetHeaders().at(
"x-ms-blob-sequence-number"));
8109 auto response_server_encrypted_iterator
8110 = httpResponse.GetHeaders().find(
"x-ms-request-server-encrypted");
8111 if (response_server_encrypted_iterator != httpResponse.GetHeaders().end())
8113 response.ServerEncrypted = response_server_encrypted_iterator->second ==
"true";
8115 auto response_encryption_key_sha256_iterator
8116 = httpResponse.GetHeaders().find(
"x-ms-encryption-key-sha256");
8117 if (response_encryption_key_sha256_iterator != httpResponse.GetHeaders().end())
8119 response.EncryptionKeySha256 = response_encryption_key_sha256_iterator->second;
8121 auto response_encryption_scope_iterator
8122 = httpResponse.GetHeaders().find(
"x-ms-encryption-scope");
8123 if (response_encryption_scope_iterator != httpResponse.GetHeaders().end())
8125 response.EncryptionScope = response_encryption_scope_iterator->second;
8127 return Azure::Core::Response<UploadPageBlobPagesFromUriResult>(
8128 std::move(response), std::move(pHttpResponse));
8133 Azure::Core::Nullable<int32_t> Timeout;
8134 std::pair<int64_t, int64_t> Range;
8135 Azure::Core::Nullable<std::string> LeaseId;
8136 Azure::Core::Nullable<int64_t> IfSequenceNumberLessThanOrEqualTo;
8137 Azure::Core::Nullable<int64_t> IfSequenceNumberLessThan;
8138 Azure::Core::Nullable<int64_t> IfSequenceNumberEqualTo;
8140 Azure::Core::Nullable<std::string> EncryptionKeySha256;
8141 Azure::Core::Nullable<EncryptionAlgorithmType> EncryptionAlgorithm;
8142 Azure::Core::Nullable<std::string> EncryptionScope;
8143 Azure::Core::Nullable<std::string> IfModifiedSince;
8144 Azure::Core::Nullable<std::string> IfUnmodifiedSince;
8145 Azure::Core::Nullable<std::string> IfMatch;
8146 Azure::Core::Nullable<std::string> IfNoneMatch;
8147 Azure::Core::Nullable<std::string> IfTags;
8150 static Azure::Core::Response<ClearPageBlobPagesResult> ClearPages(
8151 const Azure::Core::Context& context,
8152 Azure::Core::Http::HttpPipeline& pipeline,
8153 const Azure::Core::Http::Url& url,
8157 auto request = Azure::Core::Http::Request(Azure::Core::Http::HttpMethod::Put, url);
8158 request.AddHeader(
"Content-Length",
"0");
8159 request.GetUrl().AppendQuery(
"comp",
"page");
8160 request.AddHeader(
"x-ms-version", c_ApiVersion);
8161 if (options.Timeout.HasValue())
8163 request.GetUrl().AppendQuery(
"timeout", std::to_string(options.Timeout.GetValue()));
8167 "bytes=" + std::to_string(options.Range.first) +
"-"
8168 + std::to_string(options.Range.second));
8169 request.AddHeader(
"x-ms-page-write",
"clear");
8170 if (options.LeaseId.HasValue())
8172 request.AddHeader(
"x-ms-lease-id", options.LeaseId.GetValue());
8174 if (options.IfSequenceNumberLessThanOrEqualTo.HasValue())
8177 "x-ms-if-sequence-number-le",
8178 std::to_string(options.IfSequenceNumberLessThanOrEqualTo.GetValue()));
8180 if (options.IfSequenceNumberLessThan.HasValue())
8183 "x-ms-if-sequence-number-lt",
8184 std::to_string(options.IfSequenceNumberLessThan.GetValue()));
8186 if (options.IfSequenceNumberEqualTo.HasValue())
8189 "x-ms-if-sequence-number-eq",
8190 std::to_string(options.IfSequenceNumberEqualTo.GetValue()));
8192 if (options.EncryptionKey.HasValue())
8194 request.AddHeader(
"x-ms-encryption-key", options.EncryptionKey.GetValue());
8196 if (options.EncryptionKeySha256.HasValue())
8198 request.AddHeader(
"x-ms-encryption-key-sha256", options.EncryptionKeySha256.GetValue());
8200 if (options.EncryptionAlgorithm.HasValue())
8203 "x-ms-encryption-algorithm",
8204 EncryptionAlgorithmTypeToString(options.EncryptionAlgorithm.GetValue()));
8206 if (options.EncryptionScope.HasValue())
8208 request.AddHeader(
"x-ms-encryption-scope", options.EncryptionScope.GetValue());
8210 if (options.IfModifiedSince.HasValue())
8212 request.AddHeader(
"If-Modified-Since", options.IfModifiedSince.GetValue());
8214 if (options.IfUnmodifiedSince.HasValue())
8216 request.AddHeader(
"If-Unmodified-Since", options.IfUnmodifiedSince.GetValue());
8218 if (options.IfMatch.HasValue())
8220 request.AddHeader(
"If-Match", options.IfMatch.GetValue());
8222 if (options.IfNoneMatch.HasValue())
8224 request.AddHeader(
"If-None-Match", options.IfNoneMatch.GetValue());
8226 if (options.IfTags.HasValue())
8228 request.AddHeader(
"x-ms-if-tags", options.IfTags.GetValue());
8230 auto pHttpResponse = pipeline.Send(context, request);
8231 Azure::Core::Http::RawResponse& httpResponse = *pHttpResponse;
8232 ClearPageBlobPagesResult response;
8233 auto http_status_code
8234 =
static_cast<std::underlying_type<Azure::Core::Http::HttpStatusCode>::type
>(
8235 httpResponse.GetStatusCode());
8236 if (!(http_status_code == 201))
8238 throw StorageError::CreateFromResponse(std::move(pHttpResponse));
8240 response.ETag = httpResponse.GetHeaders().at(
"etag");
8241 response.LastModified = httpResponse.GetHeaders().at(
"last-modified");
8242 response.SequenceNumber
8243 = std::stoll(httpResponse.GetHeaders().at(
"x-ms-blob-sequence-number"));
8244 auto response_server_encrypted_iterator
8245 = httpResponse.GetHeaders().find(
"x-ms-request-server-encrypted");
8246 if (response_server_encrypted_iterator != httpResponse.GetHeaders().end())
8248 response.ServerEncrypted = response_server_encrypted_iterator->second ==
"true";
8250 auto response_encryption_key_sha256_iterator
8251 = httpResponse.GetHeaders().find(
"x-ms-encryption-key-sha256");
8252 if (response_encryption_key_sha256_iterator != httpResponse.GetHeaders().end())
8254 response.EncryptionKeySha256 = response_encryption_key_sha256_iterator->second;
8256 auto response_encryption_scope_iterator
8257 = httpResponse.GetHeaders().find(
"x-ms-encryption-scope");
8258 if (response_encryption_scope_iterator != httpResponse.GetHeaders().end())
8260 response.EncryptionScope = response_encryption_scope_iterator->second;
8262 return Azure::Core::Response<ClearPageBlobPagesResult>(
8263 std::move(response), std::move(pHttpResponse));
8268 Azure::Core::Nullable<int32_t> Timeout;
8269 int64_t BlobContentLength = -1;
8270 Azure::Core::Nullable<std::string> LeaseId;
8271 Azure::Core::Nullable<int64_t> IfSequenceNumberLessThanOrEqualTo;
8272 Azure::Core::Nullable<int64_t> IfSequenceNumberLessThan;
8273 Azure::Core::Nullable<int64_t> IfSequenceNumberEqualTo;
8275 Azure::Core::Nullable<std::string> EncryptionKeySha256;
8276 Azure::Core::Nullable<EncryptionAlgorithmType> EncryptionAlgorithm;
8277 Azure::Core::Nullable<std::string> EncryptionScope;
8278 Azure::Core::Nullable<std::string> IfModifiedSince;
8279 Azure::Core::Nullable<std::string> IfUnmodifiedSince;
8280 Azure::Core::Nullable<std::string> IfMatch;
8281 Azure::Core::Nullable<std::string> IfNoneMatch;
8282 Azure::Core::Nullable<std::string> IfTags;
8285 static Azure::Core::Response<ResizePageBlobResult> Resize(
8286 const Azure::Core::Context& context,
8287 Azure::Core::Http::HttpPipeline& pipeline,
8288 const Azure::Core::Http::Url& url,
8292 auto request = Azure::Core::Http::Request(Azure::Core::Http::HttpMethod::Put, url);
8293 request.AddHeader(
"Content-Length",
"0");
8294 request.GetUrl().AppendQuery(
"comp",
"properties");
8295 request.AddHeader(
"x-ms-version", c_ApiVersion);
8296 if (options.Timeout.HasValue())
8298 request.GetUrl().AppendQuery(
"timeout", std::to_string(options.Timeout.GetValue()));
8300 request.AddHeader(
"x-ms-blob-content-length", std::to_string(options.BlobContentLength));
8301 if (options.LeaseId.HasValue())
8303 request.AddHeader(
"x-ms-lease-id", options.LeaseId.GetValue());
8305 if (options.IfSequenceNumberLessThanOrEqualTo.HasValue())
8308 "x-ms-if-sequence-number-le",
8309 std::to_string(options.IfSequenceNumberLessThanOrEqualTo.GetValue()));
8311 if (options.IfSequenceNumberLessThan.HasValue())
8314 "x-ms-if-sequence-number-lt",
8315 std::to_string(options.IfSequenceNumberLessThan.GetValue()));
8317 if (options.IfSequenceNumberEqualTo.HasValue())
8320 "x-ms-if-sequence-number-eq",
8321 std::to_string(options.IfSequenceNumberEqualTo.GetValue()));
8323 if (options.EncryptionKey.HasValue())
8325 request.AddHeader(
"x-ms-encryption-key", options.EncryptionKey.GetValue());
8327 if (options.EncryptionKeySha256.HasValue())
8329 request.AddHeader(
"x-ms-encryption-key-sha256", options.EncryptionKeySha256.GetValue());
8331 if (options.EncryptionAlgorithm.HasValue())
8334 "x-ms-encryption-algorithm",
8335 EncryptionAlgorithmTypeToString(options.EncryptionAlgorithm.GetValue()));
8337 if (options.EncryptionScope.HasValue())
8339 request.AddHeader(
"x-ms-encryption-scope", options.EncryptionScope.GetValue());
8341 if (options.IfModifiedSince.HasValue())
8343 request.AddHeader(
"If-Modified-Since", options.IfModifiedSince.GetValue());
8345 if (options.IfUnmodifiedSince.HasValue())
8347 request.AddHeader(
"If-Unmodified-Since", options.IfUnmodifiedSince.GetValue());
8349 if (options.IfMatch.HasValue())
8351 request.AddHeader(
"If-Match", options.IfMatch.GetValue());
8353 if (options.IfNoneMatch.HasValue())
8355 request.AddHeader(
"If-None-Match", options.IfNoneMatch.GetValue());
8357 if (options.IfTags.HasValue())
8359 request.AddHeader(
"x-ms-if-tags", options.IfTags.GetValue());
8361 auto pHttpResponse = pipeline.Send(context, request);
8362 Azure::Core::Http::RawResponse& httpResponse = *pHttpResponse;
8363 ResizePageBlobResult response;
8364 auto http_status_code
8365 =
static_cast<std::underlying_type<Azure::Core::Http::HttpStatusCode>::type
>(
8366 httpResponse.GetStatusCode());
8367 if (!(http_status_code == 200))
8369 throw StorageError::CreateFromResponse(std::move(pHttpResponse));
8371 response.ETag = httpResponse.GetHeaders().at(
"etag");
8372 response.LastModified = httpResponse.GetHeaders().at(
"last-modified");
8373 response.SequenceNumber
8374 = std::stoll(httpResponse.GetHeaders().at(
"x-ms-blob-sequence-number"));
8375 return Azure::Core::Response<ResizePageBlobResult>(
8376 std::move(response), std::move(pHttpResponse));
8381 Azure::Core::Nullable<int32_t> Timeout;
8382 Azure::Core::Nullable<std::string> PreviousSnapshot;
8383 Azure::Core::Nullable<std::string> PreviousSnapshotUrl;
8384 Azure::Core::Nullable<std::pair<int64_t, int64_t>> Range;
8385 Azure::Core::Nullable<std::string> LeaseId;
8386 Azure::Core::Nullable<std::string> IfModifiedSince;
8387 Azure::Core::Nullable<std::string> IfUnmodifiedSince;
8388 Azure::Core::Nullable<std::string> IfMatch;
8389 Azure::Core::Nullable<std::string> IfNoneMatch;
8390 Azure::Core::Nullable<std::string> IfTags;
8393 static Azure::Core::Response<GetPageBlobPageRangesResultInternal> GetPageRanges(
8394 const Azure::Core::Context& context,
8395 Azure::Core::Http::HttpPipeline& pipeline,
8396 const Azure::Core::Http::Url& url,
8400 auto request = Azure::Core::Http::Request(Azure::Core::Http::HttpMethod::Get, url);
8401 request.GetUrl().AppendQuery(
"comp",
"pagelist");
8402 if (options.PreviousSnapshot.HasValue())
8404 request.GetUrl().AppendQuery(
"prevsnapshot", options.PreviousSnapshot.GetValue());
8406 request.AddHeader(
"x-ms-version", c_ApiVersion);
8407 if (options.Timeout.HasValue())
8409 request.GetUrl().AppendQuery(
"timeout", std::to_string(options.Timeout.GetValue()));
8411 if (options.Range.HasValue())
8413 auto startOffset = options.Range.GetValue().first;
8414 auto endOffset = options.Range.GetValue().second;
8415 if (endOffset != std::numeric_limits<decltype(endOffset)>::max())
8419 "bytes=" + std::to_string(startOffset) +
"-" + std::to_string(endOffset));
8423 request.AddHeader(
"x-ms-range",
"bytes=" + std::to_string(startOffset) +
"-");
8426 if (options.LeaseId.HasValue())
8428 request.AddHeader(
"x-ms-lease-id", options.LeaseId.GetValue());
8430 if (options.PreviousSnapshotUrl.HasValue())
8432 request.AddHeader(
"x-ms-previous-snapshot-url", options.PreviousSnapshotUrl.GetValue());
8434 if (options.IfModifiedSince.HasValue())
8436 request.AddHeader(
"If-Modified-Since", options.IfModifiedSince.GetValue());
8438 if (options.IfUnmodifiedSince.HasValue())
8440 request.AddHeader(
"If-Unmodified-Since", options.IfUnmodifiedSince.GetValue());
8442 if (options.IfMatch.HasValue())
8444 request.AddHeader(
"If-Match", options.IfMatch.GetValue());
8446 if (options.IfNoneMatch.HasValue())
8448 request.AddHeader(
"If-None-Match", options.IfNoneMatch.GetValue());
8450 if (options.IfTags.HasValue())
8452 request.AddHeader(
"x-ms-if-tags", options.IfTags.GetValue());
8454 auto pHttpResponse = pipeline.Send(context, request);
8455 Azure::Core::Http::RawResponse& httpResponse = *pHttpResponse;
8456 GetPageBlobPageRangesResultInternal response;
8457 auto http_status_code
8458 =
static_cast<std::underlying_type<Azure::Core::Http::HttpStatusCode>::type
>(
8459 httpResponse.GetStatusCode());
8460 if (!(http_status_code == 200))
8462 throw StorageError::CreateFromResponse(std::move(pHttpResponse));
8465 const auto& httpResponseBody = httpResponse.GetBody();
8467 reinterpret_cast<const char*
>(httpResponseBody.data()), httpResponseBody.size());
8468 response = GetPageBlobPageRangesResultInternalFromXml(reader);
8470 response.ETag = httpResponse.GetHeaders().at(
"etag");
8471 response.LastModified = httpResponse.GetHeaders().at(
"last-modified");
8472 response.BlobContentLength
8473 = std::stoll(httpResponse.GetHeaders().at(
"x-ms-blob-content-length"));
8474 return Azure::Core::Response<GetPageBlobPageRangesResultInternal>(
8475 std::move(response), std::move(pHttpResponse));
8480 Azure::Core::Nullable<int32_t> Timeout;
8481 std::string CopySource;
8482 Azure::Core::Nullable<std::string> IfModifiedSince;
8483 Azure::Core::Nullable<std::string> IfUnmodifiedSince;
8484 Azure::Core::Nullable<std::string> IfMatch;
8485 Azure::Core::Nullable<std::string> IfNoneMatch;
8486 Azure::Core::Nullable<std::string> IfTags;
8489 static Azure::Core::Response<StartCopyPageBlobIncrementalResult> StartCopyIncremental(
8490 const Azure::Core::Context& context,
8491 Azure::Core::Http::HttpPipeline& pipeline,
8492 const Azure::Core::Http::Url& url,
8496 auto request = Azure::Core::Http::Request(Azure::Core::Http::HttpMethod::Put, url);
8497 request.AddHeader(
"Content-Length",
"0");
8498 request.GetUrl().AppendQuery(
"comp",
"incrementalcopy");
8499 request.AddHeader(
"x-ms-version", c_ApiVersion);
8500 if (options.Timeout.HasValue())
8502 request.GetUrl().AppendQuery(
"timeout", std::to_string(options.Timeout.GetValue()));
8504 request.AddHeader(
"x-ms-copy-source", options.CopySource);
8505 if (options.IfModifiedSince.HasValue())
8507 request.AddHeader(
"If-Modified-Since", options.IfModifiedSince.GetValue());
8509 if (options.IfUnmodifiedSince.HasValue())
8511 request.AddHeader(
"If-Unmodified-Since", options.IfUnmodifiedSince.GetValue());
8513 if (options.IfMatch.HasValue())
8515 request.AddHeader(
"If-Match", options.IfMatch.GetValue());
8517 if (options.IfNoneMatch.HasValue())
8519 request.AddHeader(
"If-None-Match", options.IfNoneMatch.GetValue());
8521 if (options.IfTags.HasValue())
8523 request.AddHeader(
"x-ms-if-tags", options.IfTags.GetValue());
8525 auto pHttpResponse = pipeline.Send(context, request);
8526 Azure::Core::Http::RawResponse& httpResponse = *pHttpResponse;
8527 StartCopyPageBlobIncrementalResult response;
8528 auto http_status_code
8529 =
static_cast<std::underlying_type<Azure::Core::Http::HttpStatusCode>::type
>(
8530 httpResponse.GetStatusCode());
8531 if (!(http_status_code == 202))
8533 throw StorageError::CreateFromResponse(std::move(pHttpResponse));
8535 response.ETag = httpResponse.GetHeaders().at(
"etag");
8536 response.LastModified = httpResponse.GetHeaders().at(
"last-modified");
8537 response.CopyId = httpResponse.GetHeaders().at(
"x-ms-copy-id");
8539 = CopyStatusFromString(httpResponse.GetHeaders().at(
"x-ms-copy-status"));
8540 auto response_version_id_iterator = httpResponse.GetHeaders().find(
"x-ms-version-id");
8541 if (response_version_id_iterator != httpResponse.GetHeaders().end())
8543 response.VersionId = response_version_id_iterator->second;
8545 return Azure::Core::Response<StartCopyPageBlobIncrementalResult>(
8546 std::move(response), std::move(pHttpResponse));
8550 static GetPageBlobPageRangesResultInternal GetPageBlobPageRangesResultInternalFromXml(
8553 GetPageBlobPageRangesResultInternal ret;
8554 enum class XmlTagName
8561 std::vector<XmlTagName> path;
8564 auto node = reader.Read();
8565 if (node.Type == XmlNodeType::End)
8569 else if (node.Type == XmlNodeType::EndTag)
8571 if (path.size() > 0)
8580 else if (node.Type == XmlNodeType::StartTag)
8582 if (std::strcmp(node.Name,
"PageList") == 0)
8584 path.emplace_back(XmlTagName::k_PageList);
8586 else if (std::strcmp(node.Name,
"PageRange") == 0)
8588 path.emplace_back(XmlTagName::k_PageRange);
8590 else if (std::strcmp(node.Name,
"ClearRange") == 0)
8592 path.emplace_back(XmlTagName::k_ClearRange);
8596 path.emplace_back(XmlTagName::k_Unknown);
8598 if (path.size() == 2 && path[0] == XmlTagName::k_PageList
8599 && path[1] == XmlTagName::k_PageRange)
8601 ret.PageRanges.emplace_back(PageRangesFromXml(reader));
8605 path.size() == 2 && path[0] == XmlTagName::k_PageList
8606 && path[1] == XmlTagName::k_ClearRange)
8608 ret.ClearRanges.emplace_back(ClearRangesFromXml(reader));
8612 else if (node.Type == XmlNodeType::Text)
8619 static std::pair<int64_t, int64_t> ClearRangesFromXml(XmlReader& reader)
8622 bool is_start =
false;
8623 bool is_end =
false;
8628 auto node = reader.Read();
8629 if (node.Type == XmlNodeType::End)
8633 else if (node.Type == XmlNodeType::StartTag && strcmp(node.Name,
"Start") == 0)
8638 else if (node.Type == XmlNodeType::StartTag && strcmp(node.Name,
"End") == 0)
8643 else if (node.Type == XmlNodeType::EndTag)
8652 if (depth == 1 && node.Type == XmlNodeType::Text)
8656 start = std::stoll(node.Value);
8660 end = std::stoll(node.Value);
8664 return std::make_pair(start, end);
8667 static std::pair<int64_t, int64_t> PageRangesFromXml(XmlReader& reader)
8670 bool is_start =
false;
8671 bool is_end =
false;
8676 auto node = reader.Read();
8677 if (node.Type == XmlNodeType::End)
8681 else if (node.Type == XmlNodeType::StartTag && strcmp(node.Name,
"Start") == 0)
8686 else if (node.Type == XmlNodeType::StartTag && strcmp(node.Name,
"End") == 0)
8691 else if (node.Type == XmlNodeType::EndTag)
8700 if (depth == 1 && node.Type == XmlNodeType::Text)
8704 start = std::stoll(node.Value);
8708 end = std::stoll(node.Value);
8712 return std::make_pair(start, end);
8721 Azure::Core::Nullable<int32_t> Timeout;
8723 std::map<std::string, std::string> Metadata;
8724 Azure::Core::Nullable<std::string> LeaseId;
8726 Azure::Core::Nullable<std::string> EncryptionKeySha256;
8727 Azure::Core::Nullable<EncryptionAlgorithmType> EncryptionAlgorithm;
8728 Azure::Core::Nullable<std::string> EncryptionScope;
8729 Azure::Core::Nullable<std::string> IfModifiedSince;
8730 Azure::Core::Nullable<std::string> IfUnmodifiedSince;
8731 Azure::Core::Nullable<std::string> IfMatch;
8732 Azure::Core::Nullable<std::string> IfNoneMatch;
8733 Azure::Core::Nullable<std::string> IfTags;
8736 static Azure::Core::Response<CreateAppendBlobResult> Create(
8737 const Azure::Core::Context& context,
8738 Azure::Core::Http::HttpPipeline& pipeline,
8739 const Azure::Core::Http::Url& url,
8743 auto request = Azure::Core::Http::Request(Azure::Core::Http::HttpMethod::Put, url);
8744 request.AddHeader(
"Content-Length",
"0");
8745 request.AddHeader(
"x-ms-version", c_ApiVersion);
8746 if (options.Timeout.HasValue())
8748 request.GetUrl().AppendQuery(
"timeout", std::to_string(options.Timeout.GetValue()));
8750 if (!options.HttpHeaders.ContentType.empty())
8752 request.AddHeader(
"x-ms-blob-content-type", options.HttpHeaders.ContentType);
8754 if (!options.HttpHeaders.ContentEncoding.empty())
8756 request.AddHeader(
"x-ms-blob-content-encoding", options.HttpHeaders.ContentEncoding);
8758 if (!options.HttpHeaders.ContentLanguage.empty())
8760 request.AddHeader(
"x-ms-blob-content-language", options.HttpHeaders.ContentLanguage);
8762 if (!options.HttpHeaders.CacheControl.empty())
8764 request.AddHeader(
"x-ms-blob-cache-control", options.HttpHeaders.CacheControl);
8766 if (!options.HttpHeaders.ContentMd5.empty())
8768 request.AddHeader(
"x-ms-blob-content-md5", options.HttpHeaders.ContentMd5);
8770 if (!options.HttpHeaders.ContentDisposition.empty())
8773 "x-ms-blob-content-disposition", options.HttpHeaders.ContentDisposition);
8775 std::set<std::string> metadataKeys;
8776 for (
const auto& pair : options.Metadata)
8778 std::string key = pair.first;
8779 std::transform(key.begin(), key.end(), key.begin(), [](
unsigned char c) {
8780 return static_cast<char>(std::tolower(c));
8782 if (metadataKeys.insert(key).second ==
false)
8784 throw std::runtime_error(
"duplicate keys in metadata");
8786 request.AddHeader(
"x-ms-meta-" + pair.first, pair.second);
8788 metadataKeys.clear();
8789 if (options.LeaseId.HasValue())
8791 request.AddHeader(
"x-ms-lease-id", options.LeaseId.GetValue());
8793 request.AddHeader(
"x-ms-blob-type",
"AppendBlob");
8794 if (options.EncryptionKey.HasValue())
8796 request.AddHeader(
"x-ms-encryption-key", options.EncryptionKey.GetValue());
8798 if (options.EncryptionKeySha256.HasValue())
8800 request.AddHeader(
"x-ms-encryption-key-sha256", options.EncryptionKeySha256.GetValue());
8802 if (options.EncryptionAlgorithm.HasValue())
8805 "x-ms-encryption-algorithm",
8806 EncryptionAlgorithmTypeToString(options.EncryptionAlgorithm.GetValue()));
8808 if (options.EncryptionScope.HasValue())
8810 request.AddHeader(
"x-ms-encryption-scope", options.EncryptionScope.GetValue());
8812 if (options.IfModifiedSince.HasValue())
8814 request.AddHeader(
"If-Modified-Since", options.IfModifiedSince.GetValue());
8816 if (options.IfUnmodifiedSince.HasValue())
8818 request.AddHeader(
"If-Unmodified-Since", options.IfUnmodifiedSince.GetValue());
8820 if (options.IfMatch.HasValue())
8822 request.AddHeader(
"If-Match", options.IfMatch.GetValue());
8824 if (options.IfNoneMatch.HasValue())
8826 request.AddHeader(
"If-None-Match", options.IfNoneMatch.GetValue());
8828 if (options.IfTags.HasValue())
8830 request.AddHeader(
"x-ms-if-tags", options.IfTags.GetValue());
8832 auto pHttpResponse = pipeline.Send(context, request);
8833 Azure::Core::Http::RawResponse& httpResponse = *pHttpResponse;
8834 CreateAppendBlobResult response;
8835 auto http_status_code
8836 =
static_cast<std::underlying_type<Azure::Core::Http::HttpStatusCode>::type
>(
8837 httpResponse.GetStatusCode());
8838 if (!(http_status_code == 201))
8840 throw StorageError::CreateFromResponse(std::move(pHttpResponse));
8842 response.ETag = httpResponse.GetHeaders().at(
"etag");
8843 response.LastModified = httpResponse.GetHeaders().at(
"last-modified");
8844 auto response_version_id_iterator = httpResponse.GetHeaders().find(
"x-ms-version-id");
8845 if (response_version_id_iterator != httpResponse.GetHeaders().end())
8847 response.VersionId = response_version_id_iterator->second;
8849 auto response_server_encrypted_iterator
8850 = httpResponse.GetHeaders().find(
"x-ms-request-server-encrypted");
8851 if (response_server_encrypted_iterator != httpResponse.GetHeaders().end())
8853 response.ServerEncrypted = response_server_encrypted_iterator->second ==
"true";
8855 auto response_encryption_key_sha256_iterator
8856 = httpResponse.GetHeaders().find(
"x-ms-encryption-key-sha256");
8857 if (response_encryption_key_sha256_iterator != httpResponse.GetHeaders().end())
8859 response.EncryptionKeySha256 = response_encryption_key_sha256_iterator->second;
8861 auto response_encryption_scope_iterator
8862 = httpResponse.GetHeaders().find(
"x-ms-encryption-scope");
8863 if (response_encryption_scope_iterator != httpResponse.GetHeaders().end())
8865 response.EncryptionScope = response_encryption_scope_iterator->second;
8867 return Azure::Core::Response<CreateAppendBlobResult>(
8868 std::move(response), std::move(pHttpResponse));
8873 Azure::Core::Nullable<int32_t> Timeout;
8874 Azure::Core::Nullable<std::string> TransactionalContentMd5;
8875 Azure::Core::Nullable<std::string> TransactionalContentCrc64;
8876 Azure::Core::Nullable<std::string> LeaseId;
8877 Azure::Core::Nullable<int64_t> MaxSize;
8878 Azure::Core::Nullable<int64_t> AppendPosition;
8880 Azure::Core::Nullable<std::string> EncryptionKeySha256;
8881 Azure::Core::Nullable<EncryptionAlgorithmType> EncryptionAlgorithm;
8882 Azure::Core::Nullable<std::string> EncryptionScope;
8883 Azure::Core::Nullable<std::string> IfModifiedSince;
8884 Azure::Core::Nullable<std::string> IfUnmodifiedSince;
8885 Azure::Core::Nullable<std::string> IfMatch;
8886 Azure::Core::Nullable<std::string> IfNoneMatch;
8887 Azure::Core::Nullable<std::string> IfTags;
8890 static Azure::Core::Response<AppendBlockResult> AppendBlock(
8891 const Azure::Core::Context& context,
8892 Azure::Core::Http::HttpPipeline& pipeline,
8893 const Azure::Core::Http::Url& url,
8894 Azure::Core::Http::BodyStream* requestBody,
8899 = Azure::Core::Http::Request(Azure::Core::Http::HttpMethod::Put, url, requestBody);
8900 request.AddHeader(
"Content-Length", std::to_string(requestBody->Length()));
8901 request.GetUrl().AppendQuery(
"comp",
"appendblock");
8902 request.AddHeader(
"x-ms-version", c_ApiVersion);
8903 if (options.Timeout.HasValue())
8905 request.GetUrl().AppendQuery(
"timeout", std::to_string(options.Timeout.GetValue()));
8907 if (options.TransactionalContentMd5.HasValue())
8909 request.AddHeader(
"Content-MD5", options.TransactionalContentMd5.GetValue());
8911 if (options.TransactionalContentCrc64.HasValue())
8913 request.AddHeader(
"x-ms-content-crc64", options.TransactionalContentCrc64.GetValue());
8915 if (options.LeaseId.HasValue())
8917 request.AddHeader(
"x-ms-lease-id", options.LeaseId.GetValue());
8919 if (options.MaxSize.HasValue())
8922 "x-ms-blob-condition-maxsize", std::to_string(options.MaxSize.GetValue()));
8924 if (options.AppendPosition.HasValue())
8927 "x-ms-blob-condition-appendpos", std::to_string(options.AppendPosition.GetValue()));
8929 if (options.EncryptionKey.HasValue())
8931 request.AddHeader(
"x-ms-encryption-key", options.EncryptionKey.GetValue());
8933 if (options.EncryptionKeySha256.HasValue())
8935 request.AddHeader(
"x-ms-encryption-key-sha256", options.EncryptionKeySha256.GetValue());
8937 if (options.EncryptionAlgorithm.HasValue())
8940 "x-ms-encryption-algorithm",
8941 EncryptionAlgorithmTypeToString(options.EncryptionAlgorithm.GetValue()));
8943 if (options.EncryptionScope.HasValue())
8945 request.AddHeader(
"x-ms-encryption-scope", options.EncryptionScope.GetValue());
8947 if (options.IfModifiedSince.HasValue())
8949 request.AddHeader(
"If-Modified-Since", options.IfModifiedSince.GetValue());
8951 if (options.IfUnmodifiedSince.HasValue())
8953 request.AddHeader(
"If-Unmodified-Since", options.IfUnmodifiedSince.GetValue());
8955 if (options.IfMatch.HasValue())
8957 request.AddHeader(
"If-Match", options.IfMatch.GetValue());
8959 if (options.IfNoneMatch.HasValue())
8961 request.AddHeader(
"If-None-Match", options.IfNoneMatch.GetValue());
8963 if (options.IfTags.HasValue())
8965 request.AddHeader(
"x-ms-if-tags", options.IfTags.GetValue());
8967 auto pHttpResponse = pipeline.Send(context, request);
8968 Azure::Core::Http::RawResponse& httpResponse = *pHttpResponse;
8969 AppendBlockResult response;
8970 auto http_status_code
8971 =
static_cast<std::underlying_type<Azure::Core::Http::HttpStatusCode>::type
>(
8972 httpResponse.GetStatusCode());
8973 if (!(http_status_code == 201))
8975 throw StorageError::CreateFromResponse(std::move(pHttpResponse));
8977 response.ETag = httpResponse.GetHeaders().at(
"etag");
8978 response.LastModified = httpResponse.GetHeaders().at(
"last-modified");
8979 auto response_transactional_content_md5_iterator
8980 = httpResponse.GetHeaders().find(
"content-md5");
8981 if (response_transactional_content_md5_iterator != httpResponse.GetHeaders().end())
8983 response.TransactionalContentMd5 = response_transactional_content_md5_iterator->second;
8985 auto response_transactional_content_crc64_iterator
8986 = httpResponse.GetHeaders().find(
"x-ms-content-crc64");
8987 if (response_transactional_content_crc64_iterator != httpResponse.GetHeaders().end())
8989 response.TransactionalContentCrc64
8990 = response_transactional_content_crc64_iterator->second;
8992 response.AppendOffset = std::stoll(httpResponse.GetHeaders().at(
"x-ms-blob-append-offset"));
8993 response.CommittedBlockCount
8994 = std::stoll(httpResponse.GetHeaders().at(
"x-ms-blob-committed-block-count"));
8995 auto response_server_encrypted_iterator
8996 = httpResponse.GetHeaders().find(
"x-ms-request-server-encrypted");
8997 if (response_server_encrypted_iterator != httpResponse.GetHeaders().end())
8999 response.ServerEncrypted = response_server_encrypted_iterator->second ==
"true";
9001 auto response_encryption_key_sha256_iterator
9002 = httpResponse.GetHeaders().find(
"x-ms-encryption-key-sha256");
9003 if (response_encryption_key_sha256_iterator != httpResponse.GetHeaders().end())
9005 response.EncryptionKeySha256 = response_encryption_key_sha256_iterator->second;
9007 auto response_encryption_scope_iterator
9008 = httpResponse.GetHeaders().find(
"x-ms-encryption-scope");
9009 if (response_encryption_scope_iterator != httpResponse.GetHeaders().end())
9011 response.EncryptionScope = response_encryption_scope_iterator->second;
9013 return Azure::Core::Response<AppendBlockResult>(
9014 std::move(response), std::move(pHttpResponse));
9019 Azure::Core::Nullable<int32_t> Timeout;
9020 std::string SourceUri;
9021 Azure::Core::Nullable<std::pair<int64_t, int64_t>> SourceRange;
9022 Azure::Core::Nullable<std::string> TransactionalContentMd5;
9023 Azure::Core::Nullable<std::string> TransactionalContentCrc64;
9024 Azure::Core::Nullable<std::string> LeaseId;
9025 Azure::Core::Nullable<int64_t> MaxSize;
9026 Azure::Core::Nullable<int64_t> AppendPosition;
9028 Azure::Core::Nullable<std::string> EncryptionKeySha256;
9029 Azure::Core::Nullable<EncryptionAlgorithmType> EncryptionAlgorithm;
9030 Azure::Core::Nullable<std::string> EncryptionScope;
9031 Azure::Core::Nullable<std::string> IfModifiedSince;
9032 Azure::Core::Nullable<std::string> IfUnmodifiedSince;
9033 Azure::Core::Nullable<std::string> IfMatch;
9034 Azure::Core::Nullable<std::string> IfNoneMatch;
9035 Azure::Core::Nullable<std::string> IfTags;
9038 static Azure::Core::Response<AppendBlockFromUriResult> AppendBlockFromUri(
9039 const Azure::Core::Context& context,
9040 Azure::Core::Http::HttpPipeline& pipeline,
9041 const Azure::Core::Http::Url& url,
9045 auto request = Azure::Core::Http::Request(Azure::Core::Http::HttpMethod::Put, url);
9046 request.AddHeader(
"Content-Length",
"0");
9047 request.GetUrl().AppendQuery(
"comp",
"appendblock");
9048 request.AddHeader(
"x-ms-version", c_ApiVersion);
9049 if (options.Timeout.HasValue())
9051 request.GetUrl().AppendQuery(
"timeout", std::to_string(options.Timeout.GetValue()));
9053 request.AddHeader(
"x-ms-copy-source", options.SourceUri);
9054 if (options.SourceRange.HasValue())
9056 auto startOffset = options.SourceRange.GetValue().first;
9057 auto endOffset = options.SourceRange.GetValue().second;
9058 if (endOffset != std::numeric_limits<decltype(endOffset)>::max())
9061 "x-ms-source-range",
9062 "bytes=" + std::to_string(startOffset) +
"-" + std::to_string(endOffset));
9066 request.AddHeader(
"x-ms-source-range",
"bytes=" + std::to_string(startOffset) +
"-");
9069 if (options.TransactionalContentMd5.HasValue())
9071 request.AddHeader(
"x-ms-source-content-md5", options.TransactionalContentMd5.GetValue());
9073 if (options.TransactionalContentCrc64.HasValue())
9076 "x-ms-source-content-crc64", options.TransactionalContentCrc64.GetValue());
9078 if (options.LeaseId.HasValue())
9080 request.AddHeader(
"x-ms-lease-id", options.LeaseId.GetValue());
9082 if (options.MaxSize.HasValue())
9085 "x-ms-blob-condition-maxsize", std::to_string(options.MaxSize.GetValue()));
9087 if (options.AppendPosition.HasValue())
9090 "x-ms-blob-condition-appendpos", std::to_string(options.AppendPosition.GetValue()));
9092 if (options.EncryptionKey.HasValue())
9094 request.AddHeader(
"x-ms-encryption-key", options.EncryptionKey.GetValue());
9096 if (options.EncryptionKeySha256.HasValue())
9098 request.AddHeader(
"x-ms-encryption-key-sha256", options.EncryptionKeySha256.GetValue());
9100 if (options.EncryptionAlgorithm.HasValue())
9103 "x-ms-encryption-algorithm",
9104 EncryptionAlgorithmTypeToString(options.EncryptionAlgorithm.GetValue()));
9106 if (options.EncryptionScope.HasValue())
9108 request.AddHeader(
"x-ms-encryption-scope", options.EncryptionScope.GetValue());
9110 if (options.IfModifiedSince.HasValue())
9112 request.AddHeader(
"If-Modified-Since", options.IfModifiedSince.GetValue());
9114 if (options.IfUnmodifiedSince.HasValue())
9116 request.AddHeader(
"If-Unmodified-Since", options.IfUnmodifiedSince.GetValue());
9118 if (options.IfMatch.HasValue())
9120 request.AddHeader(
"If-Match", options.IfMatch.GetValue());
9122 if (options.IfNoneMatch.HasValue())
9124 request.AddHeader(
"If-None-Match", options.IfNoneMatch.GetValue());
9126 if (options.IfTags.HasValue())
9128 request.AddHeader(
"x-ms-if-tags", options.IfTags.GetValue());
9130 auto pHttpResponse = pipeline.Send(context, request);
9131 Azure::Core::Http::RawResponse& httpResponse = *pHttpResponse;
9132 AppendBlockFromUriResult response;
9133 auto http_status_code
9134 =
static_cast<std::underlying_type<Azure::Core::Http::HttpStatusCode>::type
>(
9135 httpResponse.GetStatusCode());
9136 if (!(http_status_code == 201))
9138 throw StorageError::CreateFromResponse(std::move(pHttpResponse));
9140 response.ETag = httpResponse.GetHeaders().at(
"etag");
9141 response.LastModified = httpResponse.GetHeaders().at(
"last-modified");
9142 auto response_transactional_content_md5_iterator
9143 = httpResponse.GetHeaders().find(
"content-md5");
9144 if (response_transactional_content_md5_iterator != httpResponse.GetHeaders().end())
9146 response.TransactionalContentMd5 = response_transactional_content_md5_iterator->second;
9148 auto response_transactional_content_crc64_iterator
9149 = httpResponse.GetHeaders().find(
"x-ms-content-crc64");
9150 if (response_transactional_content_crc64_iterator != httpResponse.GetHeaders().end())
9152 response.TransactionalContentCrc64
9153 = response_transactional_content_crc64_iterator->second;
9155 response.AppendOffset = std::stoll(httpResponse.GetHeaders().at(
"x-ms-blob-append-offset"));
9156 response.CommittedBlockCount
9157 = std::stoll(httpResponse.GetHeaders().at(
"x-ms-blob-committed-block-count"));
9158 auto response_server_encrypted_iterator
9159 = httpResponse.GetHeaders().find(
"x-ms-request-server-encrypted");
9160 if (response_server_encrypted_iterator != httpResponse.GetHeaders().end())
9162 response.ServerEncrypted = response_server_encrypted_iterator->second ==
"true";
9164 auto response_encryption_key_sha256_iterator
9165 = httpResponse.GetHeaders().find(
"x-ms-encryption-key-sha256");
9166 if (response_encryption_key_sha256_iterator != httpResponse.GetHeaders().end())
9168 response.EncryptionKeySha256 = response_encryption_key_sha256_iterator->second;
9170 auto response_encryption_scope_iterator
9171 = httpResponse.GetHeaders().find(
"x-ms-encryption-scope");
9172 if (response_encryption_scope_iterator != httpResponse.GetHeaders().end())
9174 response.EncryptionScope = response_encryption_scope_iterator->second;
9176 return Azure::Core::Response<AppendBlockFromUriResult>(
9177 std::move(response), std::move(pHttpResponse));
9182 Azure::Core::Nullable<int32_t> Timeout;
9183 Azure::Core::Nullable<std::string> LeaseId;
9184 Azure::Core::Nullable<std::string> IfModifiedSince;
9185 Azure::Core::Nullable<std::string> IfUnmodifiedSince;
9186 Azure::Core::Nullable<std::string> IfMatch;
9187 Azure::Core::Nullable<std::string> IfNoneMatch;
9188 Azure::Core::Nullable<std::string> IfTags;
9189 Azure::Core::Nullable<int64_t> AppendPosition;
9192 static Azure::Core::Response<SealAppendBlobResult> Seal(
9193 const Azure::Core::Context& context,
9194 Azure::Core::Http::HttpPipeline& pipeline,
9195 const Azure::Core::Http::Url& url,
9199 auto request = Azure::Core::Http::Request(Azure::Core::Http::HttpMethod::Put, url);
9200 request.AddHeader(
"Content-Length",
"0");
9201 request.GetUrl().AppendQuery(
"comp",
"seal");
9202 request.AddHeader(
"x-ms-version", c_ApiVersion);
9203 if (options.Timeout.HasValue())
9205 request.GetUrl().AppendQuery(
"timeout", std::to_string(options.Timeout.GetValue()));
9207 if (options.LeaseId.HasValue())
9209 request.AddHeader(
"x-ms-lease-id", options.LeaseId.GetValue());
9211 if (options.IfModifiedSince.HasValue())
9213 request.AddHeader(
"If-Modified-Since", options.IfModifiedSince.GetValue());
9215 if (options.IfUnmodifiedSince.HasValue())
9217 request.AddHeader(
"If-Unmodified-Since", options.IfUnmodifiedSince.GetValue());
9219 if (options.IfMatch.HasValue())
9221 request.AddHeader(
"If-Match", options.IfMatch.GetValue());
9223 if (options.IfNoneMatch.HasValue())
9225 request.AddHeader(
"If-None-Match", options.IfNoneMatch.GetValue());
9227 if (options.IfTags.HasValue())
9229 request.AddHeader(
"x-ms-if-tags", options.IfTags.GetValue());
9231 if (options.AppendPosition.HasValue())
9234 "x-ms-blob-condition-appendpos", std::to_string(options.AppendPosition.GetValue()));
9236 auto pHttpResponse = pipeline.Send(context, request);
9237 Azure::Core::Http::RawResponse& httpResponse = *pHttpResponse;
9238 SealAppendBlobResult response;
9239 auto http_status_code
9240 =
static_cast<std::underlying_type<Azure::Core::Http::HttpStatusCode>::type
>(
9241 httpResponse.GetStatusCode());
9242 if (!(http_status_code == 200))
9244 throw StorageError::CreateFromResponse(std::move(pHttpResponse));
9246 response.ETag = httpResponse.GetHeaders().at(
"etag");
9247 response.LastModified = httpResponse.GetHeaders().at(
"last-modified");
9248 return Azure::Core::Response<SealAppendBlobResult>(
9249 std::move(response), std::move(pHttpResponse));
9259 Azure::Core::Nullable<int32_t> Timeout;
9260 std::string ContentType;
9263 static Azure::Core::Response<SubmitBlobBatchResultInternal> SubmitBatch(
9264 const Azure::Core::Context& context,
9265 Azure::Core::Http::HttpPipeline& pipeline,
9266 const Azure::Core::Http::Url& url,
9267 Azure::Core::Http::BodyStream* requestBody,
9272 = Azure::Core::Http::Request(Azure::Core::Http::HttpMethod::Post, url, requestBody);
9273 request.AddHeader(
"Content-Length", std::to_string(requestBody->Length()));
9274 request.GetUrl().AppendQuery(
"comp",
"batch");
9275 request.AddHeader(
"x-ms-version", c_ApiVersion);
9276 if (options.Timeout.HasValue())
9278 request.GetUrl().AppendQuery(
"timeout", std::to_string(options.Timeout.GetValue()));
9280 request.AddHeader(
"Content-Type", options.ContentType);
9281 auto pHttpResponse = pipeline.Send(context, request);
9282 Azure::Core::Http::RawResponse& httpResponse = *pHttpResponse;
9284 auto http_status_code
9285 =
static_cast<std::underlying_type<Azure::Core::Http::HttpStatusCode>::type
>(
9286 httpResponse.GetStatusCode());
9287 if (!(http_status_code == 202))
9289 throw StorageError::CreateFromResponse(std::move(pHttpResponse));
9291 response.ContentType = httpResponse.GetHeaders().at(
"content-type");
9292 return Azure::Core::Response<SubmitBlobBatchResultInternal>(
9293 std::move(response), std::move(pHttpResponse));