azure-storage-blobs
blob_rest_client.hpp
1 // Copyright (c) Microsoft Corporation. All rights reserved.
2 // SPDX-License-Identifier: MIT
3 
4 #pragma once
5 
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"
14 
15 #include <cstring>
16 #include <limits>
17 #include <map>
18 #include <set>
19 #include <stdexcept>
20 #include <string>
21 #include <type_traits>
22 #include <vector>
23 
24 namespace Azure { namespace Storage { namespace Blobs {
25 
26  constexpr static const char* c_ApiVersion = "2019-12-12";
27 
29  {
30  }; // struct AbortCopyBlobFromUriResult
31 
32  enum class AccessTier
33  {
34  Unknown,
35  P1,
36  P2,
37  P3,
38  P4,
39  P6,
40  P10,
41  P15,
42  P20,
43  P30,
44  P40,
45  P50,
46  P60,
47  P70,
48  P80,
49  Hot,
50  Cool,
51  Archive,
52  }; // enum class AccessTier
53 
54  inline std::string AccessTierToString(const AccessTier& access_tier)
55  {
56  switch (access_tier)
57  {
58  case AccessTier::Unknown:
59  return "";
60  case AccessTier::P1:
61  return "P1";
62  case AccessTier::P2:
63  return "P2";
64  case AccessTier::P3:
65  return "P3";
66  case AccessTier::P4:
67  return "P4";
68  case AccessTier::P6:
69  return "P6";
70  case AccessTier::P10:
71  return "P10";
72  case AccessTier::P15:
73  return "P15";
74  case AccessTier::P20:
75  return "P20";
76  case AccessTier::P30:
77  return "P30";
78  case AccessTier::P40:
79  return "P40";
80  case AccessTier::P50:
81  return "P50";
82  case AccessTier::P60:
83  return "P60";
84  case AccessTier::P70:
85  return "P70";
86  case AccessTier::P80:
87  return "P80";
88  case AccessTier::Hot:
89  return "Hot";
90  case AccessTier::Cool:
91  return "Cool";
92  case AccessTier::Archive:
93  return "Archive";
94  default:
95  return std::string();
96  }
97  }
98 
99  inline AccessTier AccessTierFromString(const std::string& access_tier)
100  {
101  if (access_tier == "")
102  {
103  return AccessTier::Unknown;
104  }
105  if (access_tier == "P1")
106  {
107  return AccessTier::P1;
108  }
109  if (access_tier == "P2")
110  {
111  return AccessTier::P2;
112  }
113  if (access_tier == "P3")
114  {
115  return AccessTier::P3;
116  }
117  if (access_tier == "P4")
118  {
119  return AccessTier::P4;
120  }
121  if (access_tier == "P6")
122  {
123  return AccessTier::P6;
124  }
125  if (access_tier == "P10")
126  {
127  return AccessTier::P10;
128  }
129  if (access_tier == "P15")
130  {
131  return AccessTier::P15;
132  }
133  if (access_tier == "P20")
134  {
135  return AccessTier::P20;
136  }
137  if (access_tier == "P30")
138  {
139  return AccessTier::P30;
140  }
141  if (access_tier == "P40")
142  {
143  return AccessTier::P40;
144  }
145  if (access_tier == "P50")
146  {
147  return AccessTier::P50;
148  }
149  if (access_tier == "P60")
150  {
151  return AccessTier::P60;
152  }
153  if (access_tier == "P70")
154  {
155  return AccessTier::P70;
156  }
157  if (access_tier == "P80")
158  {
159  return AccessTier::P80;
160  }
161  if (access_tier == "Hot")
162  {
163  return AccessTier::Hot;
164  }
165  if (access_tier == "Cool")
166  {
167  return AccessTier::Cool;
168  }
169  if (access_tier == "Archive")
170  {
171  return AccessTier::Archive;
172  }
173  throw std::runtime_error("cannot convert " + access_tier + " to AccessTier");
174  }
175 
176  enum class AccountKind
177  {
178  Unknown,
179  Storage,
180  BlobStorage,
181  StorageV2,
182  FileStorage,
183  BlockBlobStorage,
184  }; // enum class AccountKind
185 
186  inline std::string AccountKindToString(const AccountKind& account_kind)
187  {
188  switch (account_kind)
189  {
190  case AccountKind::Unknown:
191  return "";
192  case AccountKind::Storage:
193  return "Storage";
194  case AccountKind::BlobStorage:
195  return "BlobStorage";
196  case AccountKind::StorageV2:
197  return "StorageV2";
198  case AccountKind::FileStorage:
199  return "FileStorage";
200  case AccountKind::BlockBlobStorage:
201  return "BlockBlobStorage";
202  default:
203  return std::string();
204  }
205  }
206 
207  inline AccountKind AccountKindFromString(const std::string& account_kind)
208  {
209  if (account_kind == "")
210  {
211  return AccountKind::Unknown;
212  }
213  if (account_kind == "Storage")
214  {
215  return AccountKind::Storage;
216  }
217  if (account_kind == "BlobStorage")
218  {
219  return AccountKind::BlobStorage;
220  }
221  if (account_kind == "StorageV2")
222  {
223  return AccountKind::StorageV2;
224  }
225  if (account_kind == "FileStorage")
226  {
227  return AccountKind::FileStorage;
228  }
229  if (account_kind == "BlockBlobStorage")
230  {
231  return AccountKind::BlockBlobStorage;
232  }
233  throw std::runtime_error("cannot convert " + account_kind + " to AccountKind");
234  }
235 
237  {
238  std::string ETag;
239  std::string LastModified;
240  std::string LeaseId;
241  }; // struct AcquireBlobLeaseResult
242 
244  {
245  std::string ETag;
246  std::string LastModified;
247  std::string LeaseId;
248  }; // struct AcquireContainerLeaseResult
249 
251  {
252  std::string ETag;
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;
261  }; // struct AppendBlockFromUriResult
262 
264  {
265  std::string ETag;
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;
274  }; // struct AppendBlockResult
275 
276  enum class BlobArchiveStatus
277  {
278  Unknown,
279  RehydratePendingToHot,
280  RehydratePendingToCool,
281  }; // enum class BlobArchiveStatus
282 
283  inline std::string BlobArchiveStatusToString(const BlobArchiveStatus& blob_archive_status)
284  {
285  switch (blob_archive_status)
286  {
287  case BlobArchiveStatus::Unknown:
288  return "";
289  case BlobArchiveStatus::RehydratePendingToHot:
290  return "rehydrate-pending-to-hot";
291  case BlobArchiveStatus::RehydratePendingToCool:
292  return "rehydrate-pending-to-cool";
293  default:
294  return std::string();
295  }
296  }
297 
298  inline BlobArchiveStatus BlobArchiveStatusFromString(const std::string& blob_archive_status)
299  {
300  if (blob_archive_status == "")
301  {
302  return BlobArchiveStatus::Unknown;
303  }
304  if (blob_archive_status == "rehydrate-pending-to-hot")
305  {
306  return BlobArchiveStatus::RehydratePendingToHot;
307  }
308  if (blob_archive_status == "rehydrate-pending-to-cool")
309  {
310  return BlobArchiveStatus::RehydratePendingToCool;
311  }
312  throw std::runtime_error("cannot convert " + blob_archive_status + " to BlobArchiveStatus");
313  }
314 
315  struct BlobBlock
316  {
317  std::string Name;
318  int64_t Size = 0;
319  }; // struct BlobBlock
320 
322  {
323  std::string AllowedOrigins;
324  std::string AllowedMethods;
325  std::string AllowedHeaders;
326  std::string ExposedHeaders;
327  int32_t MaxAgeInSeconds = 0;
328  }; // struct BlobCorsRule
329 
330  enum class BlobGeoReplicationStatus
331  {
332  Unknown,
333  Live,
334  Bootstrap,
335  Unavailable,
336  }; // enum class BlobGeoReplicationStatus
337 
338  inline std::string BlobGeoReplicationStatusToString(
339  const BlobGeoReplicationStatus& blob_geo_replication_status)
340  {
341  switch (blob_geo_replication_status)
342  {
343  case BlobGeoReplicationStatus::Unknown:
344  return "";
345  case BlobGeoReplicationStatus::Live:
346  return "live";
347  case BlobGeoReplicationStatus::Bootstrap:
348  return "bootstrap";
349  case BlobGeoReplicationStatus::Unavailable:
350  return "unavailable";
351  default:
352  return std::string();
353  }
354  }
355 
356  inline BlobGeoReplicationStatus BlobGeoReplicationStatusFromString(
357  const std::string& blob_geo_replication_status)
358  {
359  if (blob_geo_replication_status == "")
360  {
361  return BlobGeoReplicationStatus::Unknown;
362  }
363  if (blob_geo_replication_status == "live")
364  {
365  return BlobGeoReplicationStatus::Live;
366  }
367  if (blob_geo_replication_status == "bootstrap")
368  {
369  return BlobGeoReplicationStatus::Bootstrap;
370  }
371  if (blob_geo_replication_status == "unavailable")
372  {
373  return BlobGeoReplicationStatus::Unavailable;
374  }
375  throw std::runtime_error(
376  "cannot convert " + blob_geo_replication_status + " to BlobGeoReplicationStatus");
377  }
378 
380  {
381  std::string ContentType;
382  std::string ContentEncoding;
383  std::string ContentLanguage;
384  std::string ContentMd5;
385  std::string CacheControl;
386  std::string ContentDisposition;
387  }; // struct BlobHttpHeaders
388 
389  enum class BlobLeaseState
390  {
391  Available,
392  Leased,
393  Expired,
394  Breaking,
395  Broken,
396  }; // enum class BlobLeaseState
397 
398  inline std::string BlobLeaseStateToString(const BlobLeaseState& blob_lease_state)
399  {
400  switch (blob_lease_state)
401  {
402  case BlobLeaseState::Available:
403  return "available";
404  case BlobLeaseState::Leased:
405  return "leased";
406  case BlobLeaseState::Expired:
407  return "expired";
408  case BlobLeaseState::Breaking:
409  return "breaking";
410  case BlobLeaseState::Broken:
411  return "broken";
412  default:
413  return std::string();
414  }
415  }
416 
417  inline BlobLeaseState BlobLeaseStateFromString(const std::string& blob_lease_state)
418  {
419  if (blob_lease_state == "available")
420  {
421  return BlobLeaseState::Available;
422  }
423  if (blob_lease_state == "leased")
424  {
425  return BlobLeaseState::Leased;
426  }
427  if (blob_lease_state == "expired")
428  {
429  return BlobLeaseState::Expired;
430  }
431  if (blob_lease_state == "breaking")
432  {
433  return BlobLeaseState::Breaking;
434  }
435  if (blob_lease_state == "broken")
436  {
437  return BlobLeaseState::Broken;
438  }
439  throw std::runtime_error("cannot convert " + blob_lease_state + " to BlobLeaseState");
440  }
441 
442  enum class BlobLeaseStatus
443  {
444  Locked,
445  Unlocked,
446  }; // enum class BlobLeaseStatus
447 
448  inline std::string BlobLeaseStatusToString(const BlobLeaseStatus& blob_lease_status)
449  {
450  switch (blob_lease_status)
451  {
452  case BlobLeaseStatus::Locked:
453  return "locked";
454  case BlobLeaseStatus::Unlocked:
455  return "unlocked";
456  default:
457  return std::string();
458  }
459  }
460 
461  inline BlobLeaseStatus BlobLeaseStatusFromString(const std::string& blob_lease_status)
462  {
463  if (blob_lease_status == "locked")
464  {
465  return BlobLeaseStatus::Locked;
466  }
467  if (blob_lease_status == "unlocked")
468  {
469  return BlobLeaseStatus::Unlocked;
470  }
471  throw std::runtime_error("cannot convert " + blob_lease_status + " to BlobLeaseStatus");
472  }
473 
474  struct BlobPrefix
475  {
476  std::string Name;
477  }; // struct BlobPrefix
478 
480  {
481  bool Enabled = false;
482  Azure::Core::Nullable<int32_t> Days;
483  }; // struct BlobRetentionPolicy
484 
486  {
487  std::string Id;
488  std::string StartsOn;
489  std::string ExpiresOn;
490  std::string Permissions;
491  }; // struct BlobSignedIdentifier
492 
494  {
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;
499  }; // struct BlobStaticWebsite
500 
501  enum class BlobType
502  {
503  Unknown,
504  BlockBlob,
505  PageBlob,
506  AppendBlob,
507  }; // enum class BlobType
508 
509  inline std::string BlobTypeToString(const BlobType& blob_type)
510  {
511  switch (blob_type)
512  {
513  case BlobType::Unknown:
514  return "";
515  case BlobType::BlockBlob:
516  return "BlockBlob";
517  case BlobType::PageBlob:
518  return "PageBlob";
519  case BlobType::AppendBlob:
520  return "AppendBlob";
521  default:
522  return std::string();
523  }
524  }
525 
526  inline BlobType BlobTypeFromString(const std::string& blob_type)
527  {
528  if (blob_type == "")
529  {
530  return BlobType::Unknown;
531  }
532  if (blob_type == "BlockBlob")
533  {
534  return BlobType::BlockBlob;
535  }
536  if (blob_type == "PageBlob")
537  {
538  return BlobType::PageBlob;
539  }
540  if (blob_type == "AppendBlob")
541  {
542  return BlobType::AppendBlob;
543  }
544  throw std::runtime_error("cannot convert " + blob_type + " to BlobType");
545  }
546 
547  enum class BlockListTypeOption
548  {
549  Committed,
550  Uncommitted,
551  All,
552  }; // enum class BlockListTypeOption
553 
554  inline std::string BlockListTypeOptionToString(const BlockListTypeOption& block_list_type_option)
555  {
556  switch (block_list_type_option)
557  {
558  case BlockListTypeOption::Committed:
559  return "committed";
560  case BlockListTypeOption::Uncommitted:
561  return "uncommitted";
562  case BlockListTypeOption::All:
563  return "all";
564  default:
565  return std::string();
566  }
567  }
568 
569  inline BlockListTypeOption BlockListTypeOptionFromString(
570  const std::string& block_list_type_option)
571  {
572  if (block_list_type_option == "committed")
573  {
574  return BlockListTypeOption::Committed;
575  }
576  if (block_list_type_option == "uncommitted")
577  {
578  return BlockListTypeOption::Uncommitted;
579  }
580  if (block_list_type_option == "all")
581  {
582  return BlockListTypeOption::All;
583  }
584  throw std::runtime_error(
585  "cannot convert " + block_list_type_option + " to BlockListTypeOption");
586  }
587 
588  enum class BlockType
589  {
590  Committed,
591  Uncommitted,
592  Latest,
593  }; // enum class BlockType
594 
595  inline std::string BlockTypeToString(const BlockType& block_type)
596  {
597  switch (block_type)
598  {
599  case BlockType::Committed:
600  return "Committed";
601  case BlockType::Uncommitted:
602  return "Uncommitted";
603  case BlockType::Latest:
604  return "Latest";
605  default:
606  return std::string();
607  }
608  }
609 
610  inline BlockType BlockTypeFromString(const std::string& block_type)
611  {
612  if (block_type == "Committed")
613  {
614  return BlockType::Committed;
615  }
616  if (block_type == "Uncommitted")
617  {
618  return BlockType::Uncommitted;
619  }
620  if (block_type == "Latest")
621  {
622  return BlockType::Latest;
623  }
624  throw std::runtime_error("cannot convert " + block_type + " to BlockType");
625  }
626 
628  {
629  std::string ETag;
630  std::string LastModified;
631  int32_t LeaseTime = 0;
632  }; // struct BreakBlobLeaseResult
633 
635  {
636  std::string ETag;
637  std::string LastModified;
638  int32_t LeaseTime = 0;
639  }; // struct BreakContainerLeaseResult
640 
642  {
643  std::string ETag;
644  std::string LastModified;
645  std::string LeaseId;
646  }; // struct ChangeBlobLeaseResult
647 
649  {
650  std::string ETag;
651  std::string LastModified;
652  std::string LeaseId;
653  }; // struct ChangeContainerLeaseResult
654 
656  {
657  std::string ETag;
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;
663  }; // struct ClearPageBlobPagesResult
664 
666  {
667  std::string ETag;
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;
675  }; // struct CommitBlockListResult
676 
677  enum class CopyStatus
678  {
679  Unknown,
680  Success,
681  Pending,
682  }; // enum class CopyStatus
683 
684  inline std::string CopyStatusToString(const CopyStatus& copy_status)
685  {
686  switch (copy_status)
687  {
688  case CopyStatus::Unknown:
689  return "";
690  case CopyStatus::Success:
691  return "success";
692  case CopyStatus::Pending:
693  return "pending";
694  default:
695  return std::string();
696  }
697  }
698 
699  inline CopyStatus CopyStatusFromString(const std::string& copy_status)
700  {
701  if (copy_status == "")
702  {
703  return CopyStatus::Unknown;
704  }
705  if (copy_status == "success")
706  {
707  return CopyStatus::Success;
708  }
709  if (copy_status == "pending")
710  {
711  return CopyStatus::Pending;
712  }
713  throw std::runtime_error("cannot convert " + copy_status + " to CopyStatus");
714  }
715 
717  {
718  std::string ETag;
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;
724  }; // struct CreateAppendBlobResult
725 
727  {
728  std::string Snapshot;
729  std::string ETag;
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;
735  }; // struct CreateBlobSnapshotResult
736 
738  {
739  std::string ETag;
740  std::string LastModified;
741  }; // struct CreateContainerResult
742 
744  {
745  std::string ETag;
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;
752  }; // struct CreatePageBlobResult
753 
755  {
756  }; // struct DeleteBlobResult
757 
759  {
760  }; // struct DeleteContainerResult
761 
762  enum class DeleteSnapshotsOption
763  {
764  None,
765  IncludeSnapshots,
766  Only,
767  }; // enum class DeleteSnapshotsOption
768 
769  inline std::string DeleteSnapshotsOptionToString(
770  const DeleteSnapshotsOption& delete_snapshots_option)
771  {
772  switch (delete_snapshots_option)
773  {
774  case DeleteSnapshotsOption::None:
775  return "";
776  case DeleteSnapshotsOption::IncludeSnapshots:
777  return "include";
778  case DeleteSnapshotsOption::Only:
779  return "only";
780  default:
781  return std::string();
782  }
783  }
784 
785  inline DeleteSnapshotsOption DeleteSnapshotsOptionFromString(
786  const std::string& delete_snapshots_option)
787  {
788  if (delete_snapshots_option == "")
789  {
790  return DeleteSnapshotsOption::None;
791  }
792  if (delete_snapshots_option == "include")
793  {
794  return DeleteSnapshotsOption::IncludeSnapshots;
795  }
796  if (delete_snapshots_option == "only")
797  {
798  return DeleteSnapshotsOption::Only;
799  }
800  throw std::runtime_error(
801  "cannot convert " + delete_snapshots_option + " to DeleteSnapshotsOption");
802  }
803 
804  enum class EncryptionAlgorithmType
805  {
806  Unknown,
807  Aes256,
808  }; // enum class EncryptionAlgorithmType
809 
810  inline std::string EncryptionAlgorithmTypeToString(
811  const EncryptionAlgorithmType& encryption_algorithm_type)
812  {
813  switch (encryption_algorithm_type)
814  {
815  case EncryptionAlgorithmType::Unknown:
816  return "";
817  case EncryptionAlgorithmType::Aes256:
818  return "AES256";
819  default:
820  return std::string();
821  }
822  }
823 
824  inline EncryptionAlgorithmType EncryptionAlgorithmTypeFromString(
825  const std::string& encryption_algorithm_type)
826  {
827  if (encryption_algorithm_type == "")
828  {
829  return EncryptionAlgorithmType::Unknown;
830  }
831  if (encryption_algorithm_type == "AES256")
832  {
833  return EncryptionAlgorithmType::Aes256;
834  }
835  throw std::runtime_error(
836  "cannot convert " + encryption_algorithm_type + " to EncryptionAlgorithmType");
837  }
838 
840  {
841  std::string BlobName;
842  std::string ContainerName;
843  std::string TagValue;
844  }; // struct FilterBlobItem
845 
847  {
848  std::map<std::string, std::string> Tags;
849  }; // struct GetBlobTagsResult
850 
852  {
853  std::string ETag;
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;
858  }; // struct GetPageBlobPageRangesResultInternal
859 
861  {
862  std::string SignedObjectId;
863  std::string SignedTenantId;
864  std::string SignedStartsOn;
865  std::string SignedExpiresOn;
866  std::string SignedService;
867  std::string SignedVersion;
868  std::string Value;
869  }; // struct GetUserDelegationKeyResult
870 
871  enum class ListBlobContainersIncludeItem
872  {
873  None = 0,
874  Metadata = 1,
875  Deleted = 2,
876  }; // bitwise enum ListBlobContainersIncludeItem
877 
878  inline ListBlobContainersIncludeItem operator|(
879  ListBlobContainersIncludeItem lhs,
880  ListBlobContainersIncludeItem rhs)
881  {
882  using type = std::underlying_type_t<ListBlobContainersIncludeItem>;
883  return static_cast<ListBlobContainersIncludeItem>(
884  static_cast<type>(lhs) | static_cast<type>(rhs));
885  }
886 
887  inline ListBlobContainersIncludeItem& operator|=(
888  ListBlobContainersIncludeItem& lhs,
889  ListBlobContainersIncludeItem rhs)
890  {
891  lhs = lhs | rhs;
892  return lhs;
893  }
894 
895  inline ListBlobContainersIncludeItem operator&(
896  ListBlobContainersIncludeItem lhs,
897  ListBlobContainersIncludeItem rhs)
898  {
899  using type = std::underlying_type_t<ListBlobContainersIncludeItem>;
900  return static_cast<ListBlobContainersIncludeItem>(
901  static_cast<type>(lhs) & static_cast<type>(rhs));
902  }
903 
904  inline ListBlobContainersIncludeItem& operator&=(
905  ListBlobContainersIncludeItem& lhs,
906  ListBlobContainersIncludeItem rhs)
907  {
908  lhs = lhs & rhs;
909  return lhs;
910  }
911 
912  inline std::string ListBlobContainersIncludeItemToString(const ListBlobContainersIncludeItem& val)
913  {
914  ListBlobContainersIncludeItem value_list[] = {
915  ListBlobContainersIncludeItem::Metadata,
916  ListBlobContainersIncludeItem::Deleted,
917  };
918  const char* string_list[] = {
919  "metadata",
920  "deleted",
921  };
922  std::string ret;
923  for (std::size_t i = 0; i < sizeof(value_list) / sizeof(ListBlobContainersIncludeItem); ++i)
924  {
925  if ((val & value_list[i]) == value_list[i])
926  {
927  if (!ret.empty())
928  {
929  ret += ",";
930  }
931  ret += string_list[i];
932  }
933  }
934  return ret;
935  }
936 
937  enum class ListBlobsIncludeItem
938  {
939  None = 0,
940  Copy = 1,
941  Deleted = 2,
942  Metadata = 4,
943  Snapshots = 8,
944  Versions = 16,
945  UncomittedBlobs = 32,
946  }; // bitwise enum ListBlobsIncludeItem
947 
948  inline ListBlobsIncludeItem operator|(ListBlobsIncludeItem lhs, ListBlobsIncludeItem rhs)
949  {
950  using type = std::underlying_type_t<ListBlobsIncludeItem>;
951  return static_cast<ListBlobsIncludeItem>(static_cast<type>(lhs) | static_cast<type>(rhs));
952  }
953 
954  inline ListBlobsIncludeItem& operator|=(ListBlobsIncludeItem& lhs, ListBlobsIncludeItem rhs)
955  {
956  lhs = lhs | rhs;
957  return lhs;
958  }
959 
960  inline ListBlobsIncludeItem operator&(ListBlobsIncludeItem lhs, ListBlobsIncludeItem rhs)
961  {
962  using type = std::underlying_type_t<ListBlobsIncludeItem>;
963  return static_cast<ListBlobsIncludeItem>(static_cast<type>(lhs) & static_cast<type>(rhs));
964  }
965 
966  inline ListBlobsIncludeItem& operator&=(ListBlobsIncludeItem& lhs, ListBlobsIncludeItem rhs)
967  {
968  lhs = lhs & rhs;
969  return lhs;
970  }
971 
972  inline std::string ListBlobsIncludeItemToString(const ListBlobsIncludeItem& val)
973  {
974  ListBlobsIncludeItem value_list[] = {
975  ListBlobsIncludeItem::Copy,
976  ListBlobsIncludeItem::Deleted,
977  ListBlobsIncludeItem::Metadata,
978  ListBlobsIncludeItem::Snapshots,
979  ListBlobsIncludeItem::Versions,
980  ListBlobsIncludeItem::UncomittedBlobs,
981  };
982  const char* string_list[] = {
983  "copy",
984  "deleted",
985  "metadata",
986  "snapshots",
987  "versions",
988  "uncommittedblobs",
989  };
990  std::string ret;
991  for (std::size_t i = 0; i < sizeof(value_list) / sizeof(ListBlobsIncludeItem); ++i)
992  {
993  if ((val & value_list[i]) == value_list[i])
994  {
995  if (!ret.empty())
996  {
997  ret += ",";
998  }
999  ret += string_list[i];
1000  }
1001  }
1002  return ret;
1003  }
1004 
1005  enum class ObjectReplicationStatus
1006  {
1007  Unknown,
1008  Complete,
1009  Failed,
1010  }; // enum class ObjectReplicationStatus
1011 
1012  inline std::string ObjectReplicationStatusToString(
1013  const ObjectReplicationStatus& object_replication_status)
1014  {
1015  switch (object_replication_status)
1016  {
1017  case ObjectReplicationStatus::Unknown:
1018  return "";
1019  case ObjectReplicationStatus::Complete:
1020  return "complete";
1021  case ObjectReplicationStatus::Failed:
1022  return "failed";
1023  default:
1024  return std::string();
1025  }
1026  }
1027 
1028  inline ObjectReplicationStatus ObjectReplicationStatusFromString(
1029  const std::string& object_replication_status)
1030  {
1031  if (object_replication_status == "")
1032  {
1033  return ObjectReplicationStatus::Unknown;
1034  }
1035  if (object_replication_status == "complete")
1036  {
1037  return ObjectReplicationStatus::Complete;
1038  }
1039  if (object_replication_status == "failed")
1040  {
1041  return ObjectReplicationStatus::Failed;
1042  }
1043  throw std::runtime_error(
1044  "cannot convert " + object_replication_status + " to ObjectReplicationStatus");
1045  }
1046 
1047  enum class PublicAccessType
1048  {
1049  Container,
1050  Blob,
1051  Private,
1052  }; // enum class PublicAccessType
1053 
1054  inline std::string PublicAccessTypeToString(const PublicAccessType& public_access_type)
1055  {
1056  switch (public_access_type)
1057  {
1058  case PublicAccessType::Container:
1059  return "container";
1060  case PublicAccessType::Blob:
1061  return "blob";
1062  case PublicAccessType::Private:
1063  return "";
1064  default:
1065  return std::string();
1066  }
1067  }
1068 
1069  inline PublicAccessType PublicAccessTypeFromString(const std::string& public_access_type)
1070  {
1071  if (public_access_type == "container")
1072  {
1073  return PublicAccessType::Container;
1074  }
1075  if (public_access_type == "blob")
1076  {
1077  return PublicAccessType::Blob;
1078  }
1079  if (public_access_type == "")
1080  {
1081  return PublicAccessType::Private;
1082  }
1083  throw std::runtime_error("cannot convert " + public_access_type + " to PublicAccessType");
1084  }
1085 
1086  enum class RehydratePriority
1087  {
1088  Unknown,
1089  High,
1090  Standard,
1091  }; // enum class RehydratePriority
1092 
1093  inline std::string RehydratePriorityToString(const RehydratePriority& rehydrate_priority)
1094  {
1095  switch (rehydrate_priority)
1096  {
1097  case RehydratePriority::Unknown:
1098  return "";
1099  case RehydratePriority::High:
1100  return "High";
1101  case RehydratePriority::Standard:
1102  return "Standard";
1103  default:
1104  return std::string();
1105  }
1106  }
1107 
1108  inline RehydratePriority RehydratePriorityFromString(const std::string& rehydrate_priority)
1109  {
1110  if (rehydrate_priority == "")
1111  {
1112  return RehydratePriority::Unknown;
1113  }
1114  if (rehydrate_priority == "High")
1115  {
1116  return RehydratePriority::High;
1117  }
1118  if (rehydrate_priority == "Standard")
1119  {
1120  return RehydratePriority::Standard;
1121  }
1122  throw std::runtime_error("cannot convert " + rehydrate_priority + " to RehydratePriority");
1123  }
1124 
1126  {
1127  std::string ETag;
1128  std::string LastModified;
1129  Azure::Core::Nullable<int64_t> SequenceNumber;
1130  }; // struct ReleaseBlobLeaseResult
1131 
1133  {
1134  std::string ETag;
1135  std::string LastModified;
1136  }; // struct ReleaseContainerLeaseResult
1137 
1139  {
1140  std::string ETag;
1141  std::string LastModified;
1142  std::string LeaseId;
1143  }; // struct RenewBlobLeaseResult
1144 
1146  {
1147  std::string ETag;
1148  std::string LastModified;
1149  std::string LeaseId;
1150  }; // struct RenewContainerLeaseResult
1151 
1153  {
1154  std::string ETag;
1155  std::string LastModified;
1156  int64_t SequenceNumber = 0;
1157  }; // struct ResizePageBlobResult
1158 
1160  {
1161  std::string ETag;
1162  std::string LastModified;
1163  bool IsSealed = true;
1164  }; // struct SealAppendBlobResult
1165 
1167  {
1168  }; // struct SetBlobAccessTierResult
1169 
1171  {
1172  std::string ETag;
1173  std::string LastModified;
1174  Azure::Core::Nullable<int64_t> SequenceNumber;
1175  }; // struct SetBlobHttpHeadersResult
1176 
1178  {
1179  std::string ETag;
1180  std::string LastModified;
1181  Azure::Core::Nullable<int64_t> SequenceNumber;
1182  }; // struct SetBlobMetadataResult
1183 
1185  {
1186  }; // struct SetBlobTagsResult
1187 
1189  {
1190  std::string ETag;
1191  std::string LastModified;
1192  }; // struct SetContainerAccessPolicyResult
1193 
1195  {
1196  std::string ETag;
1197  std::string LastModified;
1198  }; // struct SetContainerMetadataResult
1199 
1201  {
1202  }; // struct SetServicePropertiesResult
1203 
1204  enum class SkuName
1205  {
1206  Unknown,
1207  StandardLrs,
1208  StandardGrs,
1209  StandardRagrs,
1210  StandardZrs,
1211  PremiumLrs,
1212  PremiumZrs,
1213  StandardGzrs,
1214  StandardRagzrs,
1215  }; // enum class SkuName
1216 
1217  inline std::string SkuNameToString(const SkuName& sku_name)
1218  {
1219  switch (sku_name)
1220  {
1221  case SkuName::Unknown:
1222  return "";
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";
1239  default:
1240  return std::string();
1241  }
1242  }
1243 
1244  inline SkuName SkuNameFromString(const std::string& sku_name)
1245  {
1246  if (sku_name == "")
1247  {
1248  return SkuName::Unknown;
1249  }
1250  if (sku_name == "Standard_LRS")
1251  {
1252  return SkuName::StandardLrs;
1253  }
1254  if (sku_name == "Standard_GRS")
1255  {
1256  return SkuName::StandardGrs;
1257  }
1258  if (sku_name == "Standard_RAGRS")
1259  {
1260  return SkuName::StandardRagrs;
1261  }
1262  if (sku_name == "Standard_ZRS")
1263  {
1264  return SkuName::StandardZrs;
1265  }
1266  if (sku_name == "Premium_LRS")
1267  {
1268  return SkuName::PremiumLrs;
1269  }
1270  if (sku_name == "Premium_ZRS")
1271  {
1272  return SkuName::PremiumZrs;
1273  }
1274  if (sku_name == "Standard_GZRS")
1275  {
1276  return SkuName::StandardGzrs;
1277  }
1278  if (sku_name == "Standard_RAGZRS")
1279  {
1280  return SkuName::StandardRagzrs;
1281  }
1282  throw std::runtime_error("cannot convert " + sku_name + " to SkuName");
1283  }
1284 
1286  {
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;
1292  }; // struct StageBlockFromUriResult
1293 
1295  {
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;
1301  }; // struct StageBlockResult
1302 
1304  {
1305  std::string ContentType;
1306  }; // struct SubmitBlobBatchResultInternal
1307 
1309  {
1310  }; // struct UndeleteBlobResult
1311 
1313  {
1314  }; // struct UndeleteContainerResult
1315 
1317  {
1318  std::string ETag;
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;
1326  }; // struct UploadBlockBlobResult
1327 
1329  {
1330  std::string ETag;
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;
1338  }; // struct UploadPageBlobPagesFromUriResult
1339 
1341  {
1342  std::string ETag;
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;
1350  }; // struct UploadPageBlobPagesResult
1351 
1353  {
1354  std::string Version;
1355  bool Delete = false;
1356  bool Read = false;
1357  bool Write = false;
1358  BlobRetentionPolicy RetentionPolicy;
1359  }; // struct BlobAnalyticsLogging
1360 
1362  {
1363  std::string Name;
1364  std::string ETag;
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;
1379  }; // struct BlobContainerItem
1380 
1382  {
1383  BlobGeoReplicationStatus Status = BlobGeoReplicationStatus::Unknown;
1384  Azure::Core::Nullable<std::string> LastSyncTime;
1385  }; // struct BlobGeoReplication
1386 
1388  {
1389  std::string Version;
1390  bool Enabled = false;
1391  BlobRetentionPolicy RetentionPolicy;
1392  Azure::Core::Nullable<bool> IncludeApis;
1393  }; // struct BlobMetrics
1394 
1396  {
1397  std::string ServiceEndpoint;
1398  std::string Where;
1399  std::string NextMarker;
1400  std::vector<FilterBlobItem> Items;
1401  }; // struct FilterBlobsSegmentResult
1402 
1404  {
1405  Blobs::SkuName SkuName = Blobs::SkuName::Unknown;
1406  Blobs::AccountKind AccountKind = Blobs::AccountKind::Unknown;
1407  }; // struct GetAccountInfoResult
1408 
1410  {
1411  std::string ETag;
1412  std::string LastModified;
1413  std::string ContentType;
1414  int64_t ContentLength = 0;
1415  std::vector<BlobBlock> CommittedBlocks;
1416  std::vector<BlobBlock> UncommittedBlocks;
1417  }; // struct GetBlockListResult
1418 
1420  {
1421  PublicAccessType AccessType = PublicAccessType::Private;
1422  std::string ETag;
1423  std::string LastModified;
1424  std::vector<BlobSignedIdentifier> SignedIdentifiers;
1425  }; // struct GetContainerAccessPolicyResult
1426 
1428  {
1429  std::string ETag;
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;
1440  }; // struct GetContainerPropertiesResult
1441 
1443  {
1444  std::string RuleId;
1445  ObjectReplicationStatus ReplicationStatus = ObjectReplicationStatus::Unknown;
1446  }; // struct ObjectReplicationRule
1447 
1449  {
1450  std::string ETag;
1451  std::string LastModified;
1452  std::string CopyId;
1453  Blobs::CopyStatus CopyStatus = Blobs::CopyStatus::Unknown;
1454  Azure::Core::Nullable<std::string> VersionId;
1455  }; // struct StartCopyBlobFromUriResult
1456 
1458  {
1459  std::string ETag;
1460  std::string LastModified;
1461  std::string CopyId;
1462  Blobs::CopyStatus CopyStatus = Blobs::CopyStatus::Unknown;
1463  Azure::Core::Nullable<std::string> VersionId;
1464  }; // struct StartCopyPageBlobIncrementalResult
1465 
1467  {
1468  BlobAnalyticsLogging Logging;
1469  BlobMetrics HourMetrics;
1470  BlobMetrics MinuteMetrics;
1471  std::vector<BlobCorsRule> Cors;
1472  std::string DefaultServiceVersion;
1473  BlobRetentionPolicy DeleteRetentionPolicy;
1474  BlobStaticWebsite StaticWebsite;
1475  }; // struct BlobServiceProperties
1476 
1478  {
1479  BlobAnalyticsLogging Logging;
1480  BlobMetrics HourMetrics;
1481  BlobMetrics MinuteMetrics;
1482  std::vector<BlobCorsRule> Cors;
1483  std::string DefaultServiceVersion;
1484  BlobRetentionPolicy DeleteRetentionPolicy;
1485  BlobStaticWebsite StaticWebsite;
1486  }; // struct GetServicePropertiesResult
1487 
1489  {
1490  BlobGeoReplication GeoReplication;
1491  }; // struct GetServiceStatisticsResult
1492 
1494  {
1495  std::string ServiceEndpoint;
1496  std::string Prefix;
1497  std::string Marker;
1498  std::string NextMarker;
1499  std::vector<BlobContainerItem> Items;
1500  }; // struct ListContainersSegmentResult
1501 
1503  {
1504  std::string PolicyId;
1505  std::vector<ObjectReplicationRule> Rules;
1506  }; // struct ObjectReplicationPolicy
1507 
1508  struct BlobItem
1509  {
1510  std::string Name;
1511  bool Deleted = false;
1512  std::string Snapshot;
1513  Azure::Core::Nullable<std::string> VersionId;
1514  Azure::Core::Nullable<bool> IsCurrentVersion;
1515  BlobHttpHeaders HttpHeaders;
1516  std::map<std::string, std::string> Metadata;
1517  std::string CreationTime;
1518  std::string LastModified;
1519  std::string ETag;
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; // only for page blobd
1531  Azure::Core::Nullable<bool> IsSealed; // only for append blob
1532  std::vector<ObjectReplicationPolicy>
1533  ObjectReplicationSourceProperties; // only valid for replication source blob
1534  }; // struct BlobItem
1535 
1537  {
1538  std::unique_ptr<Azure::Core::Http::BodyStream> BodyStream;
1539  std::string ETag;
1540  std::string LastModified;
1541  Azure::Core::Nullable<std::string> ContentRange;
1542  BlobHttpHeaders HttpHeaders;
1543  std::map<std::string, std::string> Metadata;
1544  Azure::Core::Nullable<int64_t> SequenceNumber; // only for page blob
1545  Azure::Core::Nullable<int64_t> CommittedBlockCount; // only for append blob
1546  Azure::Core::Nullable<bool> IsSealed; // only for append blob
1547  Blobs::BlobType BlobType = Blobs::BlobType::Unknown;
1548  Azure::Core::Nullable<std::string> TransactionalContentMd5; // Md5 for the downloaded range
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; // only valid for replication destination blob
1558  std::vector<ObjectReplicationPolicy>
1559  ObjectReplicationSourceProperties; // only valid for replication source blob
1560  }; // struct DownloadBlobResult
1561 
1563  {
1564  std::string ETag;
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;
1573  BlobHttpHeaders HttpHeaders;
1574  Azure::Core::Nullable<int64_t> SequenceNumber; // only for page blob
1575  Azure::Core::Nullable<int32_t> CommittedBlockCount; // only for append blob
1576  Azure::Core::Nullable<bool> IsSealed; // only for append blob
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; // only valid for replication destination blob
1591  std::vector<ObjectReplicationPolicy>
1592  ObjectReplicationSourceProperties; // only valid for replication source blob
1593  }; // struct GetBlobPropertiesResult
1594 
1596  {
1597  std::string ServiceEndpoint;
1598  std::string Container;
1599  std::string Prefix;
1600  std::string Delimiter;
1601  std::string Marker;
1602  std::string NextMarker;
1603  std::vector<BlobItem> Items;
1604  std::vector<BlobPrefix> BlobPrefixes;
1605  }; // struct ListBlobsByHierarchySegmentResult
1606 
1608  {
1609  std::string ServiceEndpoint;
1610  std::string Container;
1611  std::string Prefix;
1612  std::string Marker;
1613  std::string NextMarker;
1614  std::vector<BlobItem> Items;
1615  }; // struct ListBlobsFlatSegmentResult
1616 
1618  public:
1619  class Service {
1620  public:
1622  {
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;
1628  }; // struct ListContainersSegmentOptions
1629 
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,
1634  const ListContainersSegmentOptions& options)
1635  {
1636  unused(options);
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())
1640  {
1641  request.GetUrl().AppendQuery("timeout", std::to_string(options.Timeout.GetValue()));
1642  }
1643  request.GetUrl().AppendQuery("comp", "list");
1644  if (options.Prefix.HasValue())
1645  {
1646  request.GetUrl().AppendQuery("prefix", options.Prefix.GetValue());
1647  }
1648  if (options.Marker.HasValue())
1649  {
1650  request.GetUrl().AppendQuery("marker", options.Marker.GetValue());
1651  }
1652  if (options.MaxResults.HasValue())
1653  {
1654  request.GetUrl().AppendQuery("maxresults", std::to_string(options.MaxResults.GetValue()));
1655  }
1656  std::string list_blob_containers_include_item
1657  = ListBlobContainersIncludeItemToString(options.Include);
1658  if (!list_blob_containers_include_item.empty())
1659  {
1660  request.GetUrl().AppendQuery("include", list_blob_containers_include_item);
1661  }
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))
1669  {
1670  throw StorageError::CreateFromResponse(std::move(pHttpResponse));
1671  }
1672  {
1673  const auto& httpResponseBody = httpResponse.GetBody();
1674  XmlReader reader(
1675  reinterpret_cast<const char*>(httpResponseBody.data()), httpResponseBody.size());
1676  response = ListContainersSegmentResultFromXml(reader);
1677  }
1678  return Azure::Core::Response<ListContainersSegmentResult>(
1679  std::move(response), std::move(pHttpResponse));
1680  }
1681 
1683  {
1684  Azure::Core::Nullable<int32_t> Timeout;
1685  std::string StartsOn;
1686  std::string ExpiresOn;
1687  }; // struct GetUserDelegationKeyOptions
1688 
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,
1693  const GetUserDelegationKeyOptions& options)
1694  {
1695  unused(options);
1696  std::string xml_body;
1697  {
1698  XmlWriter writer;
1699  GetUserDelegationKeyOptionsToXml(writer, options);
1700  xml_body = writer.GetDocument();
1701  writer.Write(XmlNode{XmlNodeType::End});
1702  }
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())
1712  {
1713  request.GetUrl().AppendQuery("timeout", std::to_string(options.Timeout.GetValue()));
1714  }
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))
1722  {
1723  throw StorageError::CreateFromResponse(std::move(pHttpResponse));
1724  }
1725  {
1726  const auto& httpResponseBody = httpResponse.GetBody();
1727  XmlReader reader(
1728  reinterpret_cast<const char*>(httpResponseBody.data()), httpResponseBody.size());
1729  response = GetUserDelegationKeyResultFromXml(reader);
1730  }
1731  return Azure::Core::Response<GetUserDelegationKeyResult>(
1732  std::move(response), std::move(pHttpResponse));
1733  }
1734 
1736  {
1737  Azure::Core::Nullable<int32_t> Timeout;
1738  }; // struct GetServicePropertiesOptions
1739 
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,
1744  const GetServicePropertiesOptions& options)
1745  {
1746  unused(options);
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())
1752  {
1753  request.GetUrl().AppendQuery("timeout", std::to_string(options.Timeout.GetValue()));
1754  }
1755  auto pHttpResponse = pipeline.Send(context, request);
1756  Azure::Core::Http::RawResponse& httpResponse = *pHttpResponse;
1757  GetServicePropertiesResult response;
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))
1762  {
1763  throw StorageError::CreateFromResponse(std::move(pHttpResponse));
1764  }
1765  {
1766  const auto& httpResponseBody = httpResponse.GetBody();
1767  XmlReader reader(
1768  reinterpret_cast<const char*>(httpResponseBody.data()), httpResponseBody.size());
1769  response = GetServicePropertiesResultFromXml(reader);
1770  }
1771  return Azure::Core::Response<GetServicePropertiesResult>(
1772  std::move(response), std::move(pHttpResponse));
1773  }
1774 
1776  {
1777  Azure::Core::Nullable<int32_t> Timeout;
1778  BlobServiceProperties Properties;
1779  }; // struct SetServicePropertiesOptions
1780 
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,
1785  const SetServicePropertiesOptions& options)
1786  {
1787  unused(options);
1788  std::string xml_body;
1789  {
1790  XmlWriter writer;
1791  SetServicePropertiesOptionsToXml(writer, options);
1792  xml_body = writer.GetDocument();
1793  writer.Write(XmlNode{XmlNodeType::End});
1794  }
1795  Azure::Core::Http::MemoryBodyStream xml_body_stream(
1796  reinterpret_cast<const uint8_t*>(xml_body.data()), xml_body.length());
1797  auto request
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())
1804  {
1805  request.GetUrl().AppendQuery("timeout", std::to_string(options.Timeout.GetValue()));
1806  }
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))
1814  {
1815  throw StorageError::CreateFromResponse(std::move(pHttpResponse));
1816  }
1817  return Azure::Core::Response<SetServicePropertiesResult>(
1818  std::move(response), std::move(pHttpResponse));
1819  }
1820 
1822  {
1823  Azure::Core::Nullable<int32_t> Timeout;
1824  }; // struct GetAccountInfoOptions
1825 
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,
1830  const GetAccountInfoOptions& options)
1831  {
1832  unused(options);
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())
1838  {
1839  request.GetUrl().AppendQuery("timeout", std::to_string(options.Timeout.GetValue()));
1840  }
1841  auto pHttpResponse = pipeline.Send(context, request);
1842  Azure::Core::Http::RawResponse& httpResponse = *pHttpResponse;
1843  GetAccountInfoResult response;
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))
1848  {
1849  throw StorageError::CreateFromResponse(std::move(pHttpResponse));
1850  }
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));
1856  }
1857 
1859  {
1860  Azure::Core::Nullable<int32_t> Timeout;
1861  }; // struct GetServiceStatisticsOptions
1862 
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,
1867  const GetServiceStatisticsOptions& options)
1868  {
1869  unused(options);
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())
1875  {
1876  request.GetUrl().AppendQuery("timeout", std::to_string(options.Timeout.GetValue()));
1877  }
1878  auto pHttpResponse = pipeline.Send(context, request);
1879  Azure::Core::Http::RawResponse& httpResponse = *pHttpResponse;
1880  GetServiceStatisticsResult response;
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))
1885  {
1886  throw StorageError::CreateFromResponse(std::move(pHttpResponse));
1887  }
1888  {
1889  const auto& httpResponseBody = httpResponse.GetBody();
1890  XmlReader reader(
1891  reinterpret_cast<const char*>(httpResponseBody.data()), httpResponseBody.size());
1892  response = GetServiceStatisticsResultFromXml(reader);
1893  }
1894  return Azure::Core::Response<GetServiceStatisticsResult>(
1895  std::move(response), std::move(pHttpResponse));
1896  }
1897 
1899  {
1900  Azure::Core::Nullable<int32_t> Timeout;
1901  std::string Where;
1902  Azure::Core::Nullable<std::string> Marker;
1903  Azure::Core::Nullable<int32_t> MaxResults;
1904  }; // struct FilterBlobsSegmentOptions
1905 
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,
1910  const FilterBlobsSegmentOptions& options)
1911  {
1912  unused(options);
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())
1916  {
1917  request.GetUrl().AppendQuery("timeout", std::to_string(options.Timeout.GetValue()));
1918  }
1919  request.GetUrl().AppendQuery("comp", "blobs");
1920  request.GetUrl().AppendQuery("where", options.Where);
1921  if (options.Marker.HasValue())
1922  {
1923  request.GetUrl().AppendQuery("marker", options.Marker.GetValue());
1924  }
1925  if (options.MaxResults.HasValue())
1926  {
1927  request.GetUrl().AppendQuery("maxresults", std::to_string(options.MaxResults.GetValue()));
1928  }
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))
1936  {
1937  throw StorageError::CreateFromResponse(std::move(pHttpResponse));
1938  }
1939  {
1940  const auto& httpResponseBody = httpResponse.GetBody();
1941  XmlReader reader(
1942  reinterpret_cast<const char*>(httpResponseBody.data()), httpResponseBody.size());
1943  response = FilterBlobsSegmentResultFromXml(reader);
1944  }
1945  return Azure::Core::Response<FilterBlobsSegmentResult>(
1946  std::move(response), std::move(pHttpResponse));
1947  }
1948 
1949  private:
1950  static FilterBlobsSegmentResult FilterBlobsSegmentResultFromXml(XmlReader& reader)
1951  {
1952  FilterBlobsSegmentResult ret;
1953  enum class XmlTagName
1954  {
1955  k_EnumerationResults,
1956  k_Where,
1957  k_NextMarker,
1958  k_Blobs,
1959  k_Blob,
1960  k_Unknown,
1961  };
1962  std::vector<XmlTagName> path;
1963  while (true)
1964  {
1965  auto node = reader.Read();
1966  if (node.Type == XmlNodeType::End)
1967  {
1968  break;
1969  }
1970  else if (node.Type == XmlNodeType::EndTag)
1971  {
1972  if (path.size() > 0)
1973  {
1974  path.pop_back();
1975  }
1976  else
1977  {
1978  break;
1979  }
1980  }
1981  else if (node.Type == XmlNodeType::StartTag)
1982  {
1983  if (std::strcmp(node.Name, "EnumerationResults") == 0)
1984  {
1985  path.emplace_back(XmlTagName::k_EnumerationResults);
1986  }
1987  else if (std::strcmp(node.Name, "Where") == 0)
1988  {
1989  path.emplace_back(XmlTagName::k_Where);
1990  }
1991  else if (std::strcmp(node.Name, "NextMarker") == 0)
1992  {
1993  path.emplace_back(XmlTagName::k_NextMarker);
1994  }
1995  else if (std::strcmp(node.Name, "Blobs") == 0)
1996  {
1997  path.emplace_back(XmlTagName::k_Blobs);
1998  }
1999  else if (std::strcmp(node.Name, "Blob") == 0)
2000  {
2001  path.emplace_back(XmlTagName::k_Blob);
2002  }
2003  else
2004  {
2005  path.emplace_back(XmlTagName::k_Unknown);
2006  }
2007  if (path.size() == 3 && path[0] == XmlTagName::k_EnumerationResults
2008  && path[1] == XmlTagName::k_Blobs && path[2] == XmlTagName::k_Blob)
2009  {
2010  ret.Items.emplace_back(FilterBlobItemFromXml(reader));
2011  path.pop_back();
2012  }
2013  }
2014  else if (node.Type == XmlNodeType::Text)
2015  {
2016  if (path.size() == 2 && path[0] == XmlTagName::k_EnumerationResults
2017  && path[1] == XmlTagName::k_Where)
2018  {
2019  ret.Where = node.Value;
2020  }
2021  else if (
2022  path.size() == 2 && path[0] == XmlTagName::k_EnumerationResults
2023  && path[1] == XmlTagName::k_NextMarker)
2024  {
2025  ret.NextMarker = node.Value;
2026  }
2027  }
2028  else if (node.Type == XmlNodeType::Attribute)
2029  {
2030  if (path.size() == 1 && path[0] == XmlTagName::k_EnumerationResults
2031  && std::strcmp(node.Name, "ServiceEndpoint") == 0)
2032  {
2033  ret.ServiceEndpoint = node.Value;
2034  }
2035  }
2036  }
2037  return ret;
2038  }
2039 
2040  static GetServicePropertiesResult GetServicePropertiesResultFromXml(XmlReader& reader)
2041  {
2042  GetServicePropertiesResult ret;
2043  enum class XmlTagName
2044  {
2045  k_StorageServiceProperties,
2046  k_Logging,
2047  k_HourMetrics,
2048  k_MinuteMetrics,
2049  k_Cors,
2050  k_CorsRule,
2051  k_DefaultServiceVersion,
2052  k_DeleteRetentionPolicy,
2053  k_StaticWebsite,
2054  k_Unknown,
2055  };
2056  std::vector<XmlTagName> path;
2057  while (true)
2058  {
2059  auto node = reader.Read();
2060  if (node.Type == XmlNodeType::End)
2061  {
2062  break;
2063  }
2064  else if (node.Type == XmlNodeType::EndTag)
2065  {
2066  if (path.size() > 0)
2067  {
2068  path.pop_back();
2069  }
2070  else
2071  {
2072  break;
2073  }
2074  }
2075  else if (node.Type == XmlNodeType::StartTag)
2076  {
2077  if (std::strcmp(node.Name, "StorageServiceProperties") == 0)
2078  {
2079  path.emplace_back(XmlTagName::k_StorageServiceProperties);
2080  }
2081  else if (std::strcmp(node.Name, "Logging") == 0)
2082  {
2083  path.emplace_back(XmlTagName::k_Logging);
2084  }
2085  else if (std::strcmp(node.Name, "HourMetrics") == 0)
2086  {
2087  path.emplace_back(XmlTagName::k_HourMetrics);
2088  }
2089  else if (std::strcmp(node.Name, "MinuteMetrics") == 0)
2090  {
2091  path.emplace_back(XmlTagName::k_MinuteMetrics);
2092  }
2093  else if (std::strcmp(node.Name, "Cors") == 0)
2094  {
2095  path.emplace_back(XmlTagName::k_Cors);
2096  }
2097  else if (std::strcmp(node.Name, "CorsRule") == 0)
2098  {
2099  path.emplace_back(XmlTagName::k_CorsRule);
2100  }
2101  else if (std::strcmp(node.Name, "DefaultServiceVersion") == 0)
2102  {
2103  path.emplace_back(XmlTagName::k_DefaultServiceVersion);
2104  }
2105  else if (std::strcmp(node.Name, "DeleteRetentionPolicy") == 0)
2106  {
2107  path.emplace_back(XmlTagName::k_DeleteRetentionPolicy);
2108  }
2109  else if (std::strcmp(node.Name, "StaticWebsite") == 0)
2110  {
2111  path.emplace_back(XmlTagName::k_StaticWebsite);
2112  }
2113  else
2114  {
2115  path.emplace_back(XmlTagName::k_Unknown);
2116  }
2117  if (path.size() == 2 && path[0] == XmlTagName::k_StorageServiceProperties
2118  && path[1] == XmlTagName::k_Logging)
2119  {
2120  ret.Logging = BlobAnalyticsLoggingFromXml(reader);
2121  path.pop_back();
2122  }
2123  else if (
2124  path.size() == 2 && path[0] == XmlTagName::k_StorageServiceProperties
2125  && path[1] == XmlTagName::k_HourMetrics)
2126  {
2127  ret.HourMetrics = BlobMetricsFromXml(reader);
2128  path.pop_back();
2129  }
2130  else if (
2131  path.size() == 2 && path[0] == XmlTagName::k_StorageServiceProperties
2132  && path[1] == XmlTagName::k_MinuteMetrics)
2133  {
2134  ret.MinuteMetrics = BlobMetricsFromXml(reader);
2135  path.pop_back();
2136  }
2137  else if (
2138  path.size() == 3 && path[0] == XmlTagName::k_StorageServiceProperties
2139  && path[1] == XmlTagName::k_Cors && path[2] == XmlTagName::k_CorsRule)
2140  {
2141  ret.Cors.emplace_back(BlobCorsRuleFromXml(reader));
2142  path.pop_back();
2143  }
2144  else if (
2145  path.size() == 2 && path[0] == XmlTagName::k_StorageServiceProperties
2146  && path[1] == XmlTagName::k_DeleteRetentionPolicy)
2147  {
2148  ret.DeleteRetentionPolicy = BlobRetentionPolicyFromXml(reader);
2149  path.pop_back();
2150  }
2151  else if (
2152  path.size() == 2 && path[0] == XmlTagName::k_StorageServiceProperties
2153  && path[1] == XmlTagName::k_StaticWebsite)
2154  {
2155  ret.StaticWebsite = BlobStaticWebsiteFromXml(reader);
2156  path.pop_back();
2157  }
2158  }
2159  else if (node.Type == XmlNodeType::Text)
2160  {
2161  if (path.size() == 2 && path[0] == XmlTagName::k_StorageServiceProperties
2162  && path[1] == XmlTagName::k_DefaultServiceVersion)
2163  {
2164  ret.DefaultServiceVersion = node.Value;
2165  }
2166  }
2167  }
2168  return ret;
2169  }
2170 
2171  static GetServiceStatisticsResult GetServiceStatisticsResultFromXml(XmlReader& reader)
2172  {
2173  GetServiceStatisticsResult ret;
2174  enum class XmlTagName
2175  {
2176  k_StorageServiceStats,
2177  k_GeoReplication,
2178  k_Unknown,
2179  };
2180  std::vector<XmlTagName> path;
2181  while (true)
2182  {
2183  auto node = reader.Read();
2184  if (node.Type == XmlNodeType::End)
2185  {
2186  break;
2187  }
2188  else if (node.Type == XmlNodeType::EndTag)
2189  {
2190  if (path.size() > 0)
2191  {
2192  path.pop_back();
2193  }
2194  else
2195  {
2196  break;
2197  }
2198  }
2199  else if (node.Type == XmlNodeType::StartTag)
2200  {
2201  if (std::strcmp(node.Name, "StorageServiceStats") == 0)
2202  {
2203  path.emplace_back(XmlTagName::k_StorageServiceStats);
2204  }
2205  else if (std::strcmp(node.Name, "GeoReplication") == 0)
2206  {
2207  path.emplace_back(XmlTagName::k_GeoReplication);
2208  }
2209  else
2210  {
2211  path.emplace_back(XmlTagName::k_Unknown);
2212  }
2213  if (path.size() == 2 && path[0] == XmlTagName::k_StorageServiceStats
2214  && path[1] == XmlTagName::k_GeoReplication)
2215  {
2216  ret.GeoReplication = BlobGeoReplicationFromXml(reader);
2217  path.pop_back();
2218  }
2219  }
2220  else if (node.Type == XmlNodeType::Text)
2221  {
2222  }
2223  }
2224  return ret;
2225  }
2226 
2227  static GetUserDelegationKeyResult GetUserDelegationKeyResultFromXml(XmlReader& reader)
2228  {
2229  GetUserDelegationKeyResult ret;
2230  enum class XmlTagName
2231  {
2232  k_UserDelegationKey,
2233  k_SignedOid,
2234  k_SignedTid,
2235  k_SignedStart,
2236  k_SignedExpiry,
2237  k_SignedService,
2238  k_SignedVersion,
2239  k_Value,
2240  k_Unknown,
2241  };
2242  std::vector<XmlTagName> path;
2243  while (true)
2244  {
2245  auto node = reader.Read();
2246  if (node.Type == XmlNodeType::End)
2247  {
2248  break;
2249  }
2250  else if (node.Type == XmlNodeType::EndTag)
2251  {
2252  if (path.size() > 0)
2253  {
2254  path.pop_back();
2255  }
2256  else
2257  {
2258  break;
2259  }
2260  }
2261  else if (node.Type == XmlNodeType::StartTag)
2262  {
2263  if (std::strcmp(node.Name, "UserDelegationKey") == 0)
2264  {
2265  path.emplace_back(XmlTagName::k_UserDelegationKey);
2266  }
2267  else if (std::strcmp(node.Name, "SignedOid") == 0)
2268  {
2269  path.emplace_back(XmlTagName::k_SignedOid);
2270  }
2271  else if (std::strcmp(node.Name, "SignedTid") == 0)
2272  {
2273  path.emplace_back(XmlTagName::k_SignedTid);
2274  }
2275  else if (std::strcmp(node.Name, "SignedStart") == 0)
2276  {
2277  path.emplace_back(XmlTagName::k_SignedStart);
2278  }
2279  else if (std::strcmp(node.Name, "SignedExpiry") == 0)
2280  {
2281  path.emplace_back(XmlTagName::k_SignedExpiry);
2282  }
2283  else if (std::strcmp(node.Name, "SignedService") == 0)
2284  {
2285  path.emplace_back(XmlTagName::k_SignedService);
2286  }
2287  else if (std::strcmp(node.Name, "SignedVersion") == 0)
2288  {
2289  path.emplace_back(XmlTagName::k_SignedVersion);
2290  }
2291  else if (std::strcmp(node.Name, "Value") == 0)
2292  {
2293  path.emplace_back(XmlTagName::k_Value);
2294  }
2295  else
2296  {
2297  path.emplace_back(XmlTagName::k_Unknown);
2298  }
2299  }
2300  else if (node.Type == XmlNodeType::Text)
2301  {
2302  if (path.size() == 2 && path[0] == XmlTagName::k_UserDelegationKey
2303  && path[1] == XmlTagName::k_SignedOid)
2304  {
2305  ret.SignedObjectId = node.Value;
2306  }
2307  else if (
2308  path.size() == 2 && path[0] == XmlTagName::k_UserDelegationKey
2309  && path[1] == XmlTagName::k_SignedTid)
2310  {
2311  ret.SignedTenantId = node.Value;
2312  }
2313  else if (
2314  path.size() == 2 && path[0] == XmlTagName::k_UserDelegationKey
2315  && path[1] == XmlTagName::k_SignedStart)
2316  {
2317  ret.SignedStartsOn = node.Value;
2318  }
2319  else if (
2320  path.size() == 2 && path[0] == XmlTagName::k_UserDelegationKey
2321  && path[1] == XmlTagName::k_SignedExpiry)
2322  {
2323  ret.SignedExpiresOn = node.Value;
2324  }
2325  else if (
2326  path.size() == 2 && path[0] == XmlTagName::k_UserDelegationKey
2327  && path[1] == XmlTagName::k_SignedService)
2328  {
2329  ret.SignedService = node.Value;
2330  }
2331  else if (
2332  path.size() == 2 && path[0] == XmlTagName::k_UserDelegationKey
2333  && path[1] == XmlTagName::k_SignedVersion)
2334  {
2335  ret.SignedVersion = node.Value;
2336  }
2337  else if (
2338  path.size() == 2 && path[0] == XmlTagName::k_UserDelegationKey
2339  && path[1] == XmlTagName::k_Value)
2340  {
2341  ret.Value = node.Value;
2342  }
2343  }
2344  }
2345  return ret;
2346  }
2347 
2348  static ListContainersSegmentResult ListContainersSegmentResultFromXml(XmlReader& reader)
2349  {
2350  ListContainersSegmentResult ret;
2351  enum class XmlTagName
2352  {
2353  k_EnumerationResults,
2354  k_Prefix,
2355  k_Marker,
2356  k_NextMarker,
2357  k_Containers,
2358  k_Container,
2359  k_Unknown,
2360  };
2361  std::vector<XmlTagName> path;
2362  while (true)
2363  {
2364  auto node = reader.Read();
2365  if (node.Type == XmlNodeType::End)
2366  {
2367  break;
2368  }
2369  else if (node.Type == XmlNodeType::EndTag)
2370  {
2371  if (path.size() > 0)
2372  {
2373  path.pop_back();
2374  }
2375  else
2376  {
2377  break;
2378  }
2379  }
2380  else if (node.Type == XmlNodeType::StartTag)
2381  {
2382  if (std::strcmp(node.Name, "EnumerationResults") == 0)
2383  {
2384  path.emplace_back(XmlTagName::k_EnumerationResults);
2385  }
2386  else if (std::strcmp(node.Name, "Prefix") == 0)
2387  {
2388  path.emplace_back(XmlTagName::k_Prefix);
2389  }
2390  else if (std::strcmp(node.Name, "Marker") == 0)
2391  {
2392  path.emplace_back(XmlTagName::k_Marker);
2393  }
2394  else if (std::strcmp(node.Name, "NextMarker") == 0)
2395  {
2396  path.emplace_back(XmlTagName::k_NextMarker);
2397  }
2398  else if (std::strcmp(node.Name, "Containers") == 0)
2399  {
2400  path.emplace_back(XmlTagName::k_Containers);
2401  }
2402  else if (std::strcmp(node.Name, "Container") == 0)
2403  {
2404  path.emplace_back(XmlTagName::k_Container);
2405  }
2406  else
2407  {
2408  path.emplace_back(XmlTagName::k_Unknown);
2409  }
2410  if (path.size() == 3 && path[0] == XmlTagName::k_EnumerationResults
2411  && path[1] == XmlTagName::k_Containers && path[2] == XmlTagName::k_Container)
2412  {
2413  ret.Items.emplace_back(BlobContainerItemFromXml(reader));
2414  path.pop_back();
2415  }
2416  }
2417  else if (node.Type == XmlNodeType::Text)
2418  {
2419  if (path.size() == 2 && path[0] == XmlTagName::k_EnumerationResults
2420  && path[1] == XmlTagName::k_Prefix)
2421  {
2422  ret.Prefix = node.Value;
2423  }
2424  else if (
2425  path.size() == 2 && path[0] == XmlTagName::k_EnumerationResults
2426  && path[1] == XmlTagName::k_Marker)
2427  {
2428  ret.Marker = node.Value;
2429  }
2430  else if (
2431  path.size() == 2 && path[0] == XmlTagName::k_EnumerationResults
2432  && path[1] == XmlTagName::k_NextMarker)
2433  {
2434  ret.NextMarker = node.Value;
2435  }
2436  }
2437  else if (node.Type == XmlNodeType::Attribute)
2438  {
2439  if (path.size() == 1 && path[0] == XmlTagName::k_EnumerationResults
2440  && std::strcmp(node.Name, "ServiceEndpoint") == 0)
2441  {
2442  ret.ServiceEndpoint = node.Value;
2443  }
2444  }
2445  }
2446  return ret;
2447  }
2448 
2449  static BlobAnalyticsLogging BlobAnalyticsLoggingFromXml(XmlReader& reader)
2450  {
2451  BlobAnalyticsLogging ret;
2452  enum class XmlTagName
2453  {
2454  k_Version,
2455  k_Delete,
2456  k_Read,
2457  k_Write,
2458  k_RetentionPolicy,
2459  k_Unknown,
2460  };
2461  std::vector<XmlTagName> path;
2462  while (true)
2463  {
2464  auto node = reader.Read();
2465  if (node.Type == XmlNodeType::End)
2466  {
2467  break;
2468  }
2469  else if (node.Type == XmlNodeType::EndTag)
2470  {
2471  if (path.size() > 0)
2472  {
2473  path.pop_back();
2474  }
2475  else
2476  {
2477  break;
2478  }
2479  }
2480  else if (node.Type == XmlNodeType::StartTag)
2481  {
2482  if (std::strcmp(node.Name, "Version") == 0)
2483  {
2484  path.emplace_back(XmlTagName::k_Version);
2485  }
2486  else if (std::strcmp(node.Name, "Delete") == 0)
2487  {
2488  path.emplace_back(XmlTagName::k_Delete);
2489  }
2490  else if (std::strcmp(node.Name, "Read") == 0)
2491  {
2492  path.emplace_back(XmlTagName::k_Read);
2493  }
2494  else if (std::strcmp(node.Name, "Write") == 0)
2495  {
2496  path.emplace_back(XmlTagName::k_Write);
2497  }
2498  else if (std::strcmp(node.Name, "RetentionPolicy") == 0)
2499  {
2500  path.emplace_back(XmlTagName::k_RetentionPolicy);
2501  }
2502  else
2503  {
2504  path.emplace_back(XmlTagName::k_Unknown);
2505  }
2506  if (path.size() == 1 && path[0] == XmlTagName::k_RetentionPolicy)
2507  {
2508  ret.RetentionPolicy = BlobRetentionPolicyFromXml(reader);
2509  path.pop_back();
2510  }
2511  }
2512  else if (node.Type == XmlNodeType::Text)
2513  {
2514  if (path.size() == 1 && path[0] == XmlTagName::k_Version)
2515  {
2516  ret.Version = node.Value;
2517  }
2518  else if (path.size() == 1 && path[0] == XmlTagName::k_Delete)
2519  {
2520  ret.Delete = std::strcmp(node.Value, "true") == 0;
2521  }
2522  else if (path.size() == 1 && path[0] == XmlTagName::k_Read)
2523  {
2524  ret.Read = std::strcmp(node.Value, "true") == 0;
2525  }
2526  else if (path.size() == 1 && path[0] == XmlTagName::k_Write)
2527  {
2528  ret.Write = std::strcmp(node.Value, "true") == 0;
2529  }
2530  }
2531  }
2532  return ret;
2533  }
2534 
2535  static BlobContainerItem BlobContainerItemFromXml(XmlReader& reader)
2536  {
2537  BlobContainerItem ret;
2538  enum class XmlTagName
2539  {
2540  k_Name,
2541  k_Properties,
2542  k_Etag,
2543  k_LastModified,
2544  k_PublicAccess,
2545  k_HasImmutabilityPolicy,
2546  k_HasLegalHold,
2547  k_LeaseStatus,
2548  k_LeaseState,
2549  k_LeaseDuration,
2550  k_DefaultEncryptionScope,
2551  k_DenyEncryptionScopeOverride,
2552  k_Metadata,
2553  k_Deleted,
2554  k_Version,
2555  k_DeletedTime,
2556  k_RemainingRetentionDays,
2557  k_Unknown,
2558  };
2559  std::vector<XmlTagName> path;
2560  while (true)
2561  {
2562  auto node = reader.Read();
2563  if (node.Type == XmlNodeType::End)
2564  {
2565  break;
2566  }
2567  else if (node.Type == XmlNodeType::EndTag)
2568  {
2569  if (path.size() > 0)
2570  {
2571  path.pop_back();
2572  }
2573  else
2574  {
2575  break;
2576  }
2577  }
2578  else if (node.Type == XmlNodeType::StartTag)
2579  {
2580  if (std::strcmp(node.Name, "Name") == 0)
2581  {
2582  path.emplace_back(XmlTagName::k_Name);
2583  }
2584  else if (std::strcmp(node.Name, "Properties") == 0)
2585  {
2586  path.emplace_back(XmlTagName::k_Properties);
2587  }
2588  else if (std::strcmp(node.Name, "Etag") == 0)
2589  {
2590  path.emplace_back(XmlTagName::k_Etag);
2591  }
2592  else if (std::strcmp(node.Name, "Last-Modified") == 0)
2593  {
2594  path.emplace_back(XmlTagName::k_LastModified);
2595  }
2596  else if (std::strcmp(node.Name, "PublicAccess") == 0)
2597  {
2598  path.emplace_back(XmlTagName::k_PublicAccess);
2599  }
2600  else if (std::strcmp(node.Name, "HasImmutabilityPolicy") == 0)
2601  {
2602  path.emplace_back(XmlTagName::k_HasImmutabilityPolicy);
2603  }
2604  else if (std::strcmp(node.Name, "HasLegalHold") == 0)
2605  {
2606  path.emplace_back(XmlTagName::k_HasLegalHold);
2607  }
2608  else if (std::strcmp(node.Name, "LeaseStatus") == 0)
2609  {
2610  path.emplace_back(XmlTagName::k_LeaseStatus);
2611  }
2612  else if (std::strcmp(node.Name, "LeaseState") == 0)
2613  {
2614  path.emplace_back(XmlTagName::k_LeaseState);
2615  }
2616  else if (std::strcmp(node.Name, "LeaseDuration") == 0)
2617  {
2618  path.emplace_back(XmlTagName::k_LeaseDuration);
2619  }
2620  else if (std::strcmp(node.Name, "DefaultEncryptionScope") == 0)
2621  {
2622  path.emplace_back(XmlTagName::k_DefaultEncryptionScope);
2623  }
2624  else if (std::strcmp(node.Name, "DenyEncryptionScopeOverride") == 0)
2625  {
2626  path.emplace_back(XmlTagName::k_DenyEncryptionScopeOverride);
2627  }
2628  else if (std::strcmp(node.Name, "Metadata") == 0)
2629  {
2630  path.emplace_back(XmlTagName::k_Metadata);
2631  }
2632  else if (std::strcmp(node.Name, "Deleted") == 0)
2633  {
2634  path.emplace_back(XmlTagName::k_Deleted);
2635  }
2636  else if (std::strcmp(node.Name, "Version") == 0)
2637  {
2638  path.emplace_back(XmlTagName::k_Version);
2639  }
2640  else if (std::strcmp(node.Name, "DeletedTime") == 0)
2641  {
2642  path.emplace_back(XmlTagName::k_DeletedTime);
2643  }
2644  else if (std::strcmp(node.Name, "RemainingRetentionDays") == 0)
2645  {
2646  path.emplace_back(XmlTagName::k_RemainingRetentionDays);
2647  }
2648  else
2649  {
2650  path.emplace_back(XmlTagName::k_Unknown);
2651  }
2652  if (path.size() == 1 && path[0] == XmlTagName::k_Metadata)
2653  {
2654  ret.Metadata = MetadataFromXml(reader);
2655  path.pop_back();
2656  }
2657  }
2658  else if (node.Type == XmlNodeType::Text)
2659  {
2660  if (path.size() == 1 && path[0] == XmlTagName::k_Name)
2661  {
2662  ret.Name = node.Value;
2663  }
2664  else if (
2665  path.size() == 2 && path[0] == XmlTagName::k_Properties
2666  && path[1] == XmlTagName::k_Etag)
2667  {
2668  ret.ETag = node.Value;
2669  }
2670  else if (
2671  path.size() == 2 && path[0] == XmlTagName::k_Properties
2672  && path[1] == XmlTagName::k_LastModified)
2673  {
2674  ret.LastModified = node.Value;
2675  }
2676  else if (
2677  path.size() == 2 && path[0] == XmlTagName::k_Properties
2678  && path[1] == XmlTagName::k_PublicAccess)
2679  {
2680  ret.AccessType = PublicAccessTypeFromString(node.Value);
2681  }
2682  else if (
2683  path.size() == 2 && path[0] == XmlTagName::k_Properties
2684  && path[1] == XmlTagName::k_HasImmutabilityPolicy)
2685  {
2686  ret.HasImmutabilityPolicy = std::strcmp(node.Value, "true") == 0;
2687  }
2688  else if (
2689  path.size() == 2 && path[0] == XmlTagName::k_Properties
2690  && path[1] == XmlTagName::k_HasLegalHold)
2691  {
2692  ret.HasLegalHold = std::strcmp(node.Value, "true") == 0;
2693  }
2694  else if (
2695  path.size() == 2 && path[0] == XmlTagName::k_Properties
2696  && path[1] == XmlTagName::k_LeaseStatus)
2697  {
2698  ret.LeaseStatus = BlobLeaseStatusFromString(node.Value);
2699  }
2700  else if (
2701  path.size() == 2 && path[0] == XmlTagName::k_Properties
2702  && path[1] == XmlTagName::k_LeaseState)
2703  {
2704  ret.LeaseState = BlobLeaseStateFromString(node.Value);
2705  }
2706  else if (
2707  path.size() == 2 && path[0] == XmlTagName::k_Properties
2708  && path[1] == XmlTagName::k_LeaseDuration)
2709  {
2710  ret.LeaseDuration = node.Value;
2711  }
2712  else if (
2713  path.size() == 2 && path[0] == XmlTagName::k_Properties
2714  && path[1] == XmlTagName::k_DefaultEncryptionScope)
2715  {
2716  ret.DefaultEncryptionScope = node.Value;
2717  }
2718  else if (
2719  path.size() == 2 && path[0] == XmlTagName::k_Properties
2720  && path[1] == XmlTagName::k_DenyEncryptionScopeOverride)
2721  {
2722  ret.PreventEncryptionScopeOverride = std::strcmp(node.Value, "true") == 0;
2723  }
2724  else if (path.size() == 1 && path[0] == XmlTagName::k_Deleted)
2725  {
2726  ret.IsDeleted = std::strcmp(node.Value, "true") == 0;
2727  }
2728  else if (path.size() == 1 && path[0] == XmlTagName::k_Version)
2729  {
2730  ret.VersionId = node.Value;
2731  }
2732  else if (
2733  path.size() == 2 && path[0] == XmlTagName::k_Properties
2734  && path[1] == XmlTagName::k_DeletedTime)
2735  {
2736  ret.DeletedTime = node.Value;
2737  }
2738  else if (
2739  path.size() == 2 && path[0] == XmlTagName::k_Properties
2740  && path[1] == XmlTagName::k_RemainingRetentionDays)
2741  {
2742  ret.RemainingRetentionDays = std::stoi(node.Value);
2743  }
2744  }
2745  }
2746  return ret;
2747  }
2748 
2749  static BlobCorsRule BlobCorsRuleFromXml(XmlReader& reader)
2750  {
2751  BlobCorsRule ret;
2752  enum class XmlTagName
2753  {
2754  k_AllowedOrigins,
2755  k_AllowedMethods,
2756  k_MaxAgeInSeconds,
2757  k_ExposedHeaders,
2758  k_AllowedHeaders,
2759  k_Unknown,
2760  };
2761  std::vector<XmlTagName> path;
2762  while (true)
2763  {
2764  auto node = reader.Read();
2765  if (node.Type == XmlNodeType::End)
2766  {
2767  break;
2768  }
2769  else if (node.Type == XmlNodeType::EndTag)
2770  {
2771  if (path.size() > 0)
2772  {
2773  path.pop_back();
2774  }
2775  else
2776  {
2777  break;
2778  }
2779  }
2780  else if (node.Type == XmlNodeType::StartTag)
2781  {
2782  if (std::strcmp(node.Name, "AllowedOrigins") == 0)
2783  {
2784  path.emplace_back(XmlTagName::k_AllowedOrigins);
2785  }
2786  else if (std::strcmp(node.Name, "AllowedMethods") == 0)
2787  {
2788  path.emplace_back(XmlTagName::k_AllowedMethods);
2789  }
2790  else if (std::strcmp(node.Name, "MaxAgeInSeconds") == 0)
2791  {
2792  path.emplace_back(XmlTagName::k_MaxAgeInSeconds);
2793  }
2794  else if (std::strcmp(node.Name, "ExposedHeaders") == 0)
2795  {
2796  path.emplace_back(XmlTagName::k_ExposedHeaders);
2797  }
2798  else if (std::strcmp(node.Name, "AllowedHeaders") == 0)
2799  {
2800  path.emplace_back(XmlTagName::k_AllowedHeaders);
2801  }
2802  else
2803  {
2804  path.emplace_back(XmlTagName::k_Unknown);
2805  }
2806  }
2807  else if (node.Type == XmlNodeType::Text)
2808  {
2809  if (path.size() == 1 && path[0] == XmlTagName::k_AllowedOrigins)
2810  {
2811  ret.AllowedOrigins = node.Value;
2812  }
2813  else if (path.size() == 1 && path[0] == XmlTagName::k_AllowedMethods)
2814  {
2815  ret.AllowedMethods = node.Value;
2816  }
2817  else if (path.size() == 1 && path[0] == XmlTagName::k_MaxAgeInSeconds)
2818  {
2819  ret.MaxAgeInSeconds = std::stoi(node.Value);
2820  }
2821  else if (path.size() == 1 && path[0] == XmlTagName::k_ExposedHeaders)
2822  {
2823  ret.ExposedHeaders = node.Value;
2824  }
2825  else if (path.size() == 1 && path[0] == XmlTagName::k_AllowedHeaders)
2826  {
2827  ret.AllowedHeaders = node.Value;
2828  }
2829  }
2830  }
2831  return ret;
2832  }
2833 
2834  static BlobGeoReplication BlobGeoReplicationFromXml(XmlReader& reader)
2835  {
2836  BlobGeoReplication ret;
2837  enum class XmlTagName
2838  {
2839  k_Status,
2840  k_LastSyncTime,
2841  k_Unknown,
2842  };
2843  std::vector<XmlTagName> path;
2844  while (true)
2845  {
2846  auto node = reader.Read();
2847  if (node.Type == XmlNodeType::End)
2848  {
2849  break;
2850  }
2851  else if (node.Type == XmlNodeType::EndTag)
2852  {
2853  if (path.size() > 0)
2854  {
2855  path.pop_back();
2856  }
2857  else
2858  {
2859  break;
2860  }
2861  }
2862  else if (node.Type == XmlNodeType::StartTag)
2863  {
2864  if (std::strcmp(node.Name, "Status") == 0)
2865  {
2866  path.emplace_back(XmlTagName::k_Status);
2867  }
2868  else if (std::strcmp(node.Name, "LastSyncTime") == 0)
2869  {
2870  path.emplace_back(XmlTagName::k_LastSyncTime);
2871  }
2872  else
2873  {
2874  path.emplace_back(XmlTagName::k_Unknown);
2875  }
2876  }
2877  else if (node.Type == XmlNodeType::Text)
2878  {
2879  if (path.size() == 1 && path[0] == XmlTagName::k_Status)
2880  {
2881  ret.Status = BlobGeoReplicationStatusFromString(node.Value);
2882  }
2883  else if (path.size() == 1 && path[0] == XmlTagName::k_LastSyncTime)
2884  {
2885  ret.LastSyncTime = node.Value;
2886  }
2887  }
2888  }
2889  return ret;
2890  }
2891 
2892  static BlobMetrics BlobMetricsFromXml(XmlReader& reader)
2893  {
2894  BlobMetrics ret;
2895  enum class XmlTagName
2896  {
2897  k_Version,
2898  k_Enabled,
2899  k_IncludeAPIs,
2900  k_RetentionPolicy,
2901  k_Unknown,
2902  };
2903  std::vector<XmlTagName> path;
2904  while (true)
2905  {
2906  auto node = reader.Read();
2907  if (node.Type == XmlNodeType::End)
2908  {
2909  break;
2910  }
2911  else if (node.Type == XmlNodeType::EndTag)
2912  {
2913  if (path.size() > 0)
2914  {
2915  path.pop_back();
2916  }
2917  else
2918  {
2919  break;
2920  }
2921  }
2922  else if (node.Type == XmlNodeType::StartTag)
2923  {
2924  if (std::strcmp(node.Name, "Version") == 0)
2925  {
2926  path.emplace_back(XmlTagName::k_Version);
2927  }
2928  else if (std::strcmp(node.Name, "Enabled") == 0)
2929  {
2930  path.emplace_back(XmlTagName::k_Enabled);
2931  }
2932  else if (std::strcmp(node.Name, "IncludeAPIs") == 0)
2933  {
2934  path.emplace_back(XmlTagName::k_IncludeAPIs);
2935  }
2936  else if (std::strcmp(node.Name, "RetentionPolicy") == 0)
2937  {
2938  path.emplace_back(XmlTagName::k_RetentionPolicy);
2939  }
2940  else
2941  {
2942  path.emplace_back(XmlTagName::k_Unknown);
2943  }
2944  if (path.size() == 1 && path[0] == XmlTagName::k_RetentionPolicy)
2945  {
2946  ret.RetentionPolicy = BlobRetentionPolicyFromXml(reader);
2947  path.pop_back();
2948  }
2949  }
2950  else if (node.Type == XmlNodeType::Text)
2951  {
2952  if (path.size() == 1 && path[0] == XmlTagName::k_Version)
2953  {
2954  ret.Version = node.Value;
2955  }
2956  else if (path.size() == 1 && path[0] == XmlTagName::k_Enabled)
2957  {
2958  ret.Enabled = std::strcmp(node.Value, "true") == 0;
2959  }
2960  else if (path.size() == 1 && path[0] == XmlTagName::k_IncludeAPIs)
2961  {
2962  ret.IncludeApis = std::strcmp(node.Value, "true") == 0;
2963  }
2964  }
2965  }
2966  return ret;
2967  }
2968 
2969  static BlobRetentionPolicy BlobRetentionPolicyFromXml(XmlReader& reader)
2970  {
2971  BlobRetentionPolicy ret;
2972  enum class XmlTagName
2973  {
2974  k_Enabled,
2975  k_Days,
2976  k_Unknown,
2977  };
2978  std::vector<XmlTagName> path;
2979  while (true)
2980  {
2981  auto node = reader.Read();
2982  if (node.Type == XmlNodeType::End)
2983  {
2984  break;
2985  }
2986  else if (node.Type == XmlNodeType::EndTag)
2987  {
2988  if (path.size() > 0)
2989  {
2990  path.pop_back();
2991  }
2992  else
2993  {
2994  break;
2995  }
2996  }
2997  else if (node.Type == XmlNodeType::StartTag)
2998  {
2999  if (std::strcmp(node.Name, "Enabled") == 0)
3000  {
3001  path.emplace_back(XmlTagName::k_Enabled);
3002  }
3003  else if (std::strcmp(node.Name, "Days") == 0)
3004  {
3005  path.emplace_back(XmlTagName::k_Days);
3006  }
3007  else
3008  {
3009  path.emplace_back(XmlTagName::k_Unknown);
3010  }
3011  }
3012  else if (node.Type == XmlNodeType::Text)
3013  {
3014  if (path.size() == 1 && path[0] == XmlTagName::k_Enabled)
3015  {
3016  ret.Enabled = std::strcmp(node.Value, "true") == 0;
3017  }
3018  else if (path.size() == 1 && path[0] == XmlTagName::k_Days)
3019  {
3020  ret.Days = std::stoi(node.Value);
3021  }
3022  }
3023  }
3024  return ret;
3025  }
3026 
3027  static BlobStaticWebsite BlobStaticWebsiteFromXml(XmlReader& reader)
3028  {
3029  BlobStaticWebsite ret;
3030  enum class XmlTagName
3031  {
3032  k_Enabled,
3033  k_IndexDocument,
3034  k_DefaultIndexDocumentPath,
3035  k_ErrorDocument404Path,
3036  k_Unknown,
3037  };
3038  std::vector<XmlTagName> path;
3039  while (true)
3040  {
3041  auto node = reader.Read();
3042  if (node.Type == XmlNodeType::End)
3043  {
3044  break;
3045  }
3046  else if (node.Type == XmlNodeType::EndTag)
3047  {
3048  if (path.size() > 0)
3049  {
3050  path.pop_back();
3051  }
3052  else
3053  {
3054  break;
3055  }
3056  }
3057  else if (node.Type == XmlNodeType::StartTag)
3058  {
3059  if (std::strcmp(node.Name, "Enabled") == 0)
3060  {
3061  path.emplace_back(XmlTagName::k_Enabled);
3062  }
3063  else if (std::strcmp(node.Name, "IndexDocument") == 0)
3064  {
3065  path.emplace_back(XmlTagName::k_IndexDocument);
3066  }
3067  else if (std::strcmp(node.Name, "DefaultIndexDocumentPath") == 0)
3068  {
3069  path.emplace_back(XmlTagName::k_DefaultIndexDocumentPath);
3070  }
3071  else if (std::strcmp(node.Name, "ErrorDocument404Path") == 0)
3072  {
3073  path.emplace_back(XmlTagName::k_ErrorDocument404Path);
3074  }
3075  else
3076  {
3077  path.emplace_back(XmlTagName::k_Unknown);
3078  }
3079  }
3080  else if (node.Type == XmlNodeType::Text)
3081  {
3082  if (path.size() == 1 && path[0] == XmlTagName::k_Enabled)
3083  {
3084  ret.Enabled = std::strcmp(node.Value, "true") == 0;
3085  }
3086  else if (path.size() == 1 && path[0] == XmlTagName::k_IndexDocument)
3087  {
3088  ret.IndexDocument = node.Value;
3089  }
3090  else if (path.size() == 1 && path[0] == XmlTagName::k_DefaultIndexDocumentPath)
3091  {
3092  ret.DefaultIndexDocumentPath = node.Value;
3093  }
3094  else if (path.size() == 1 && path[0] == XmlTagName::k_ErrorDocument404Path)
3095  {
3096  ret.ErrorDocument404Path = node.Value;
3097  }
3098  }
3099  }
3100  return ret;
3101  }
3102 
3103  static FilterBlobItem FilterBlobItemFromXml(XmlReader& reader)
3104  {
3105  FilterBlobItem ret;
3106  enum class XmlTagName
3107  {
3108  k_Name,
3109  k_ContainerName,
3110  k_TagValue,
3111  k_Unknown,
3112  };
3113  std::vector<XmlTagName> path;
3114  while (true)
3115  {
3116  auto node = reader.Read();
3117  if (node.Type == XmlNodeType::End)
3118  {
3119  break;
3120  }
3121  else if (node.Type == XmlNodeType::EndTag)
3122  {
3123  if (path.size() > 0)
3124  {
3125  path.pop_back();
3126  }
3127  else
3128  {
3129  break;
3130  }
3131  }
3132  else if (node.Type == XmlNodeType::StartTag)
3133  {
3134  if (std::strcmp(node.Name, "Name") == 0)
3135  {
3136  path.emplace_back(XmlTagName::k_Name);
3137  }
3138  else if (std::strcmp(node.Name, "ContainerName") == 0)
3139  {
3140  path.emplace_back(XmlTagName::k_ContainerName);
3141  }
3142  else if (std::strcmp(node.Name, "TagValue") == 0)
3143  {
3144  path.emplace_back(XmlTagName::k_TagValue);
3145  }
3146  else
3147  {
3148  path.emplace_back(XmlTagName::k_Unknown);
3149  }
3150  }
3151  else if (node.Type == XmlNodeType::Text)
3152  {
3153  if (path.size() == 1 && path[0] == XmlTagName::k_Name)
3154  {
3155  ret.BlobName = node.Value;
3156  }
3157  else if (path.size() == 1 && path[0] == XmlTagName::k_ContainerName)
3158  {
3159  ret.ContainerName = node.Value;
3160  }
3161  else if (path.size() == 1 && path[0] == XmlTagName::k_TagValue)
3162  {
3163  ret.TagValue = node.Value;
3164  }
3165  }
3166  }
3167  return ret;
3168  }
3169 
3170  static std::map<std::string, std::string> MetadataFromXml(XmlReader& reader)
3171  {
3172  std::map<std::string, std::string> ret;
3173  int depth = 0;
3174  std::string key;
3175  while (true)
3176  {
3177  auto node = reader.Read();
3178  if (node.Type == XmlNodeType::End)
3179  {
3180  break;
3181  }
3182  else if (node.Type == XmlNodeType::StartTag)
3183  {
3184  if (depth++ == 0)
3185  {
3186  key = node.Name;
3187  }
3188  }
3189  else if (node.Type == XmlNodeType::EndTag)
3190  {
3191  if (depth-- == 0)
3192  {
3193  break;
3194  }
3195  }
3196  else if (depth == 1 && node.Type == XmlNodeType::Text)
3197  {
3198  ret.emplace(std::move(key), std::string(node.Value));
3199  }
3200  }
3201  return ret;
3202  }
3203 
3204  static void GetUserDelegationKeyOptionsToXml(
3205  XmlWriter& writer,
3206  const GetUserDelegationKeyOptions& options)
3207  {
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});
3216  }
3217 
3218  static void SetServicePropertiesOptionsToXml(
3219  XmlWriter& writer,
3220  const SetServicePropertiesOptions& options)
3221  {
3222  writer.Write(XmlNode{XmlNodeType::StartTag, "StorageServiceProperties"});
3223  BlobServicePropertiesToXml(writer, options.Properties);
3224  writer.Write(XmlNode{XmlNodeType::EndTag});
3225  }
3226 
3227  static void BlobServicePropertiesToXml(
3228  XmlWriter& writer,
3229  const BlobServiceProperties& options)
3230  {
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)
3242  {
3243  BlobCorsRuleToXml(writer, i);
3244  }
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});
3255  }
3256 
3257  static void BlobAnalyticsLoggingToXml(XmlWriter& writer, const BlobAnalyticsLogging& options)
3258  {
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});
3274  }
3275 
3276  static void BlobCorsRuleToXml(XmlWriter& writer, const BlobCorsRule& options)
3277  {
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"});
3292  writer.Write(
3293  XmlNode{XmlNodeType::Text, nullptr, std::to_string(options.MaxAgeInSeconds).data()});
3294  writer.Write(XmlNode{XmlNodeType::EndTag});
3295  writer.Write(XmlNode{XmlNodeType::EndTag});
3296  }
3297 
3298  static void BlobMetricsToXml(XmlWriter& writer, const BlobMetrics& options)
3299  {
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())
3307  {
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});
3312  }
3313  writer.Write(XmlNode{XmlNodeType::StartTag, "RetentionPolicy"});
3314  BlobRetentionPolicyToXml(writer, options.RetentionPolicy);
3315  writer.Write(XmlNode{XmlNodeType::EndTag});
3316  }
3317 
3318  static void BlobRetentionPolicyToXml(XmlWriter& writer, const BlobRetentionPolicy& options)
3319  {
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())
3324  {
3325  writer.Write(XmlNode{XmlNodeType::StartTag, "Days"});
3326  writer.Write(
3327  XmlNode{XmlNodeType::Text, nullptr, std::to_string(options.Days.GetValue()).data()});
3328  writer.Write(XmlNode{XmlNodeType::EndTag});
3329  }
3330  }
3331 
3332  static void BlobStaticWebsiteToXml(XmlWriter& writer, const BlobStaticWebsite& options)
3333  {
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())
3338  {
3339  writer.Write(XmlNode{XmlNodeType::StartTag, "IndexDocument"});
3340  writer.Write(
3341  XmlNode{XmlNodeType::Text, nullptr, options.IndexDocument.GetValue().data()});
3342  writer.Write(XmlNode{XmlNodeType::EndTag});
3343  }
3344  if (options.DefaultIndexDocumentPath.HasValue())
3345  {
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});
3350  }
3351  if (options.ErrorDocument404Path.HasValue())
3352  {
3353  writer.Write(XmlNode{XmlNodeType::StartTag, "ErrorDocument404Path"});
3354  writer.Write(
3355  XmlNode{XmlNodeType::Text, nullptr, options.ErrorDocument404Path.GetValue().data()});
3356  writer.Write(XmlNode{XmlNodeType::EndTag});
3357  }
3358  }
3359 
3360  }; // class Service
3361 
3362  class Container {
3363  public:
3365  {
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;
3371  }; // struct CreateContainerOptions
3372 
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,
3377  const CreateContainerOptions& options)
3378  {
3379  unused(options);
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())
3385  {
3386  request.GetUrl().AppendQuery("timeout", std::to_string(options.Timeout.GetValue()));
3387  }
3388  std::set<std::string> metadataKeys;
3389  for (const auto& pair : options.Metadata)
3390  {
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));
3394  });
3395  if (metadataKeys.insert(key).second == false)
3396  {
3397  throw std::runtime_error("duplicate keys in metadata");
3398  }
3399  request.AddHeader("x-ms-meta-" + pair.first, pair.second);
3400  }
3401  metadataKeys.clear();
3402  if (options.AccessType.HasValue())
3403  {
3404  request.AddHeader(
3405  "x-ms-blob-public-access", PublicAccessTypeToString(options.AccessType.GetValue()));
3406  }
3407  if (options.DefaultEncryptionScope.HasValue())
3408  {
3409  request.AddHeader(
3410  "x-ms-default-encryption-scope", options.DefaultEncryptionScope.GetValue());
3411  }
3412  if (options.PreventEncryptionScopeOverride.HasValue())
3413  {
3414  request.AddHeader(
3415  "x-ms-deny-encryption-scope-override",
3416  options.PreventEncryptionScopeOverride.GetValue() ? "true" : "false");
3417  }
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))
3425  {
3426  throw StorageError::CreateFromResponse(std::move(pHttpResponse));
3427  }
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));
3432  }
3433 
3435  {
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;
3440  }; // struct DeleteContainerOptions
3441 
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,
3446  const DeleteContainerOptions& options)
3447  {
3448  unused(options);
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())
3453  {
3454  request.GetUrl().AppendQuery("timeout", std::to_string(options.Timeout.GetValue()));
3455  }
3456  if (options.LeaseId.HasValue())
3457  {
3458  request.AddHeader("x-ms-lease-id", options.LeaseId.GetValue());
3459  }
3460  if (options.IfModifiedSince.HasValue())
3461  {
3462  request.AddHeader("If-Modified-Since", options.IfModifiedSince.GetValue());
3463  }
3464  if (options.IfUnmodifiedSince.HasValue())
3465  {
3466  request.AddHeader("If-Unmodified-Since", options.IfUnmodifiedSince.GetValue());
3467  }
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))
3475  {
3476  throw StorageError::CreateFromResponse(std::move(pHttpResponse));
3477  }
3478  return Azure::Core::Response<DeleteContainerResult>(
3479  std::move(response), std::move(pHttpResponse));
3480  }
3481 
3483  {
3484  Azure::Core::Nullable<int32_t> Timeout;
3485  std::string DeletedContainerName;
3486  std::string DeletedContainerVersion;
3487  }; // struct UndeleteContainerOptions
3488 
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,
3493  const UndeleteContainerOptions& options)
3494  {
3495  unused(options);
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())
3502  {
3503  request.GetUrl().AppendQuery("timeout", std::to_string(options.Timeout.GetValue()));
3504  }
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;
3509  UndeleteContainerResult response;
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))
3514  {
3515  throw StorageError::CreateFromResponse(std::move(pHttpResponse));
3516  }
3517  return Azure::Core::Response<UndeleteContainerResult>(
3518  std::move(response), std::move(pHttpResponse));
3519  }
3520 
3522  {
3523  Azure::Core::Nullable<int32_t> Timeout;
3524  Azure::Core::Nullable<std::string> LeaseId;
3525  }; // struct GetContainerPropertiesOptions
3526 
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,
3531  const GetContainerPropertiesOptions& options)
3532  {
3533  unused(options);
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())
3538  {
3539  request.GetUrl().AppendQuery("timeout", std::to_string(options.Timeout.GetValue()));
3540  }
3541  if (options.LeaseId.HasValue())
3542  {
3543  request.AddHeader("x-ms-lease-id", options.LeaseId.GetValue());
3544  }
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))
3552  {
3553  throw StorageError::CreateFromResponse(std::move(pHttpResponse));
3554  }
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-";
3559  ++i)
3560  {
3561  response.Metadata.emplace(i->first.substr(10), i->second);
3562  }
3563  auto response_access_type_iterator
3564  = httpResponse.GetHeaders().find("x-ms-blob-public-access");
3565  if (response_access_type_iterator != httpResponse.GetHeaders().end())
3566  {
3567  response.AccessType = PublicAccessTypeFromString(response_access_type_iterator->second);
3568  }
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"));
3574  response.LeaseState
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())
3579  {
3580  response.LeaseDuration = response_lease_duration_iterator->second;
3581  }
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));
3588  }
3589 
3591  {
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;
3596  }; // struct SetContainerMetadataOptions
3597 
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,
3602  const SetContainerMetadataOptions& options)
3603  {
3604  unused(options);
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())
3611  {
3612  request.GetUrl().AppendQuery("timeout", std::to_string(options.Timeout.GetValue()));
3613  }
3614  std::set<std::string> metadataKeys;
3615  for (const auto& pair : options.Metadata)
3616  {
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));
3620  });
3621  if (metadataKeys.insert(key).second == false)
3622  {
3623  throw std::runtime_error("duplicate keys in metadata");
3624  }
3625  request.AddHeader("x-ms-meta-" + pair.first, pair.second);
3626  }
3627  metadataKeys.clear();
3628  if (options.LeaseId.HasValue())
3629  {
3630  request.AddHeader("x-ms-lease-id", options.LeaseId.GetValue());
3631  }
3632  if (options.IfModifiedSince.HasValue())
3633  {
3634  request.AddHeader("If-Modified-Since", options.IfModifiedSince.GetValue());
3635  }
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))
3643  {
3644  throw StorageError::CreateFromResponse(std::move(pHttpResponse));
3645  }
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));
3650  }
3651 
3653  {
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;
3659  }; // struct ListBlobsFlatSegmentOptions
3660 
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,
3665  const ListBlobsFlatSegmentOptions& options)
3666  {
3667  unused(options);
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())
3671  {
3672  request.GetUrl().AppendQuery("timeout", std::to_string(options.Timeout.GetValue()));
3673  }
3674  request.GetUrl().AppendQuery("restype", "container");
3675  request.GetUrl().AppendQuery("comp", "list");
3676  if (options.Prefix.HasValue())
3677  {
3678  request.GetUrl().AppendQuery("prefix", options.Prefix.GetValue());
3679  }
3680  if (options.Marker.HasValue())
3681  {
3682  request.GetUrl().AppendQuery("marker", options.Marker.GetValue());
3683  }
3684  if (options.MaxResults.HasValue())
3685  {
3686  request.GetUrl().AppendQuery("maxresults", std::to_string(options.MaxResults.GetValue()));
3687  }
3688  std::string list_blobs_include_item = ListBlobsIncludeItemToString(options.Include);
3689  if (!list_blobs_include_item.empty())
3690  {
3691  request.GetUrl().AppendQuery("include", list_blobs_include_item);
3692  }
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))
3700  {
3701  throw StorageError::CreateFromResponse(std::move(pHttpResponse));
3702  }
3703  {
3704  const auto& httpResponseBody = httpResponse.GetBody();
3705  XmlReader reader(
3706  reinterpret_cast<const char*>(httpResponseBody.data()), httpResponseBody.size());
3707  response = ListBlobsFlatSegmentResultFromXml(reader);
3708  }
3709  return Azure::Core::Response<ListBlobsFlatSegmentResult>(
3710  std::move(response), std::move(pHttpResponse));
3711  }
3712 
3714  {
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;
3721  }; // struct ListBlobsByHierarchySegmentOptions
3722 
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,
3727  const ListBlobsByHierarchySegmentOptions& options)
3728  {
3729  unused(options);
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())
3733  {
3734  request.GetUrl().AppendQuery("timeout", std::to_string(options.Timeout.GetValue()));
3735  }
3736  request.GetUrl().AppendQuery("restype", "container");
3737  request.GetUrl().AppendQuery("comp", "list");
3738  if (options.Prefix.HasValue())
3739  {
3740  request.GetUrl().AppendQuery("prefix", options.Prefix.GetValue());
3741  }
3742  if (options.Delimiter.HasValue())
3743  {
3744  request.GetUrl().AppendQuery("delimiter", options.Delimiter.GetValue());
3745  }
3746  if (options.Marker.HasValue())
3747  {
3748  request.GetUrl().AppendQuery("marker", options.Marker.GetValue());
3749  }
3750  if (options.MaxResults.HasValue())
3751  {
3752  request.GetUrl().AppendQuery("maxresults", std::to_string(options.MaxResults.GetValue()));
3753  }
3754  std::string list_blobs_include_item = ListBlobsIncludeItemToString(options.Include);
3755  if (!list_blobs_include_item.empty())
3756  {
3757  request.GetUrl().AppendQuery("include", list_blobs_include_item);
3758  }
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))
3766  {
3767  throw StorageError::CreateFromResponse(std::move(pHttpResponse));
3768  }
3769  {
3770  const auto& httpResponseBody = httpResponse.GetBody();
3771  XmlReader reader(
3772  reinterpret_cast<const char*>(httpResponseBody.data()), httpResponseBody.size());
3773  response = ListBlobsByHierarchySegmentResultFromXml(reader);
3774  }
3775  return Azure::Core::Response<ListBlobsByHierarchySegmentResult>(
3776  std::move(response), std::move(pHttpResponse));
3777  }
3778 
3780  {
3781  Azure::Core::Nullable<int32_t> Timeout;
3782  Azure::Core::Nullable<std::string> LeaseId;
3783  }; // struct GetContainerAccessPolicyOptions
3784 
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,
3789  const GetContainerAccessPolicyOptions& options)
3790  {
3791  unused(options);
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())
3795  {
3796  request.GetUrl().AppendQuery("timeout", std::to_string(options.Timeout.GetValue()));
3797  }
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))
3807  {
3808  throw StorageError::CreateFromResponse(std::move(pHttpResponse));
3809  }
3810  {
3811  const auto& httpResponseBody = httpResponse.GetBody();
3812  XmlReader reader(
3813  reinterpret_cast<const char*>(httpResponseBody.data()), httpResponseBody.size());
3814  response = GetContainerAccessPolicyResultFromXml(reader);
3815  }
3816  response.ETag = httpResponse.GetHeaders().at("etag");
3817  response.LastModified = httpResponse.GetHeaders().at("last-modified");
3818  response.AccessType
3819  = PublicAccessTypeFromString(httpResponse.GetHeaders().at("x-ms-blob-public-access"));
3820  return Azure::Core::Response<GetContainerAccessPolicyResult>(
3821  std::move(response), std::move(pHttpResponse));
3822  }
3823 
3825  {
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;
3832  }; // struct SetContainerAccessPolicyOptions
3833 
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,
3838  const SetContainerAccessPolicyOptions& options)
3839  {
3840  unused(options);
3841  std::string xml_body;
3842  {
3843  XmlWriter writer;
3844  SetContainerAccessPolicyOptionsToXml(writer, options);
3845  xml_body = writer.GetDocument();
3846  writer.Write(XmlNode{XmlNodeType::End});
3847  }
3848  Azure::Core::Http::MemoryBodyStream xml_body_stream(
3849  reinterpret_cast<const uint8_t*>(xml_body.data()), xml_body.length());
3850  auto request
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())
3855  {
3856  request.GetUrl().AppendQuery("timeout", std::to_string(options.Timeout.GetValue()));
3857  }
3858  request.GetUrl().AppendQuery("restype", "container");
3859  request.GetUrl().AppendQuery("comp", "acl");
3860  if (options.AccessType.HasValue())
3861  {
3862  request.AddHeader(
3863  "x-ms-blob-public-access", PublicAccessTypeToString(options.AccessType.GetValue()));
3864  }
3865  if (options.LeaseId.HasValue())
3866  {
3867  request.AddHeader("x-ms-lease-id", options.LeaseId.GetValue());
3868  }
3869  if (options.IfModifiedSince.HasValue())
3870  {
3871  request.AddHeader("If-Modified-Since", options.IfModifiedSince.GetValue());
3872  }
3873  if (options.IfUnmodifiedSince.HasValue())
3874  {
3875  request.AddHeader("If-Unmodified-Since", options.IfUnmodifiedSince.GetValue());
3876  }
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))
3884  {
3885  throw StorageError::CreateFromResponse(std::move(pHttpResponse));
3886  }
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));
3891  }
3892 
3894  {
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;
3900  }; // struct AcquireContainerLeaseOptions
3901 
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,
3906  const AcquireContainerLeaseOptions& options)
3907  {
3908  unused(options);
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())
3913  {
3914  request.GetUrl().AppendQuery("timeout", std::to_string(options.Timeout.GetValue()));
3915  }
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())
3921  {
3922  request.AddHeader("x-ms-proposed-lease-id", options.ProposedLeaseId.GetValue());
3923  }
3924  if (options.IfModifiedSince.HasValue())
3925  {
3926  request.AddHeader("If-Modified-Since", options.IfModifiedSince.GetValue());
3927  }
3928  if (options.IfUnmodifiedSince.HasValue())
3929  {
3930  request.AddHeader("If-Unmodified-Since", options.IfUnmodifiedSince.GetValue());
3931  }
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))
3939  {
3940  throw StorageError::CreateFromResponse(std::move(pHttpResponse));
3941  }
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));
3947  }
3948 
3950  {
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;
3955  }; // struct RenewContainerLeaseOptions
3956 
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,
3961  const RenewContainerLeaseOptions& options)
3962  {
3963  unused(options);
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())
3968  {
3969  request.GetUrl().AppendQuery("timeout", std::to_string(options.Timeout.GetValue()));
3970  }
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())
3976  {
3977  request.AddHeader("If-Modified-Since", options.IfModifiedSince.GetValue());
3978  }
3979  if (options.IfUnmodifiedSince.HasValue())
3980  {
3981  request.AddHeader("If-Unmodified-Since", options.IfUnmodifiedSince.GetValue());
3982  }
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))
3990  {
3991  throw StorageError::CreateFromResponse(std::move(pHttpResponse));
3992  }
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));
3998  }
3999 
4001  {
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;
4007  }; // struct ChangeContainerLeaseOptions
4008 
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,
4013  const ChangeContainerLeaseOptions& options)
4014  {
4015  unused(options);
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())
4020  {
4021  request.GetUrl().AppendQuery("timeout", std::to_string(options.Timeout.GetValue()));
4022  }
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())
4029  {
4030  request.AddHeader("If-Modified-Since", options.IfModifiedSince.GetValue());
4031  }
4032  if (options.IfUnmodifiedSince.HasValue())
4033  {
4034  request.AddHeader("If-Unmodified-Since", options.IfUnmodifiedSince.GetValue());
4035  }
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))
4043  {
4044  throw StorageError::CreateFromResponse(std::move(pHttpResponse));
4045  }
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));
4051  }
4052 
4054  {
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;
4059  }; // struct ReleaseContainerLeaseOptions
4060 
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,
4065  const ReleaseContainerLeaseOptions& options)
4066  {
4067  unused(options);
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())
4072  {
4073  request.GetUrl().AppendQuery("timeout", std::to_string(options.Timeout.GetValue()));
4074  }
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())
4080  {
4081  request.AddHeader("If-Modified-Since", options.IfModifiedSince.GetValue());
4082  }
4083  if (options.IfUnmodifiedSince.HasValue())
4084  {
4085  request.AddHeader("If-Unmodified-Since", options.IfUnmodifiedSince.GetValue());
4086  }
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))
4094  {
4095  throw StorageError::CreateFromResponse(std::move(pHttpResponse));
4096  }
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));
4101  }
4102 
4104  {
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;
4109  }; // struct BreakContainerLeaseOptions
4110 
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,
4115  const BreakContainerLeaseOptions& options)
4116  {
4117  unused(options);
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())
4122  {
4123  request.GetUrl().AppendQuery("timeout", std::to_string(options.Timeout.GetValue()));
4124  }
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())
4129  {
4130  request.AddHeader(
4131  "x-ms-lease-break-period", std::to_string(options.BreakPeriod.GetValue()));
4132  }
4133  if (options.IfModifiedSince.HasValue())
4134  {
4135  request.AddHeader("If-Modified-Since", options.IfModifiedSince.GetValue());
4136  }
4137  if (options.IfUnmodifiedSince.HasValue())
4138  {
4139  request.AddHeader("If-Unmodified-Since", options.IfUnmodifiedSince.GetValue());
4140  }
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))
4148  {
4149  throw StorageError::CreateFromResponse(std::move(pHttpResponse));
4150  }
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));
4156  }
4157 
4158  private:
4159  static GetContainerAccessPolicyResult GetContainerAccessPolicyResultFromXml(XmlReader& reader)
4160  {
4161  GetContainerAccessPolicyResult ret;
4162  enum class XmlTagName
4163  {
4164  k_SignedIdentifiers,
4165  k_SignedIdentifier,
4166  k_Unknown,
4167  };
4168  std::vector<XmlTagName> path;
4169  while (true)
4170  {
4171  auto node = reader.Read();
4172  if (node.Type == XmlNodeType::End)
4173  {
4174  break;
4175  }
4176  else if (node.Type == XmlNodeType::EndTag)
4177  {
4178  if (path.size() > 0)
4179  {
4180  path.pop_back();
4181  }
4182  else
4183  {
4184  break;
4185  }
4186  }
4187  else if (node.Type == XmlNodeType::StartTag)
4188  {
4189  if (std::strcmp(node.Name, "SignedIdentifiers") == 0)
4190  {
4191  path.emplace_back(XmlTagName::k_SignedIdentifiers);
4192  }
4193  else if (std::strcmp(node.Name, "SignedIdentifier") == 0)
4194  {
4195  path.emplace_back(XmlTagName::k_SignedIdentifier);
4196  }
4197  else
4198  {
4199  path.emplace_back(XmlTagName::k_Unknown);
4200  }
4201  if (path.size() == 2 && path[0] == XmlTagName::k_SignedIdentifiers
4202  && path[1] == XmlTagName::k_SignedIdentifier)
4203  {
4204  ret.SignedIdentifiers.emplace_back(BlobSignedIdentifierFromXml(reader));
4205  path.pop_back();
4206  }
4207  }
4208  else if (node.Type == XmlNodeType::Text)
4209  {
4210  }
4211  }
4212  return ret;
4213  }
4214 
4215  static ListBlobsByHierarchySegmentResult ListBlobsByHierarchySegmentResultFromXml(
4216  XmlReader& reader)
4217  {
4218  ListBlobsByHierarchySegmentResult ret;
4219  enum class XmlTagName
4220  {
4221  k_EnumerationResults,
4222  k_Prefix,
4223  k_Delimiter,
4224  k_Marker,
4225  k_NextMarker,
4226  k_Blobs,
4227  k_Blob,
4228  k_BlobPrefix,
4229  k_Unknown,
4230  };
4231  std::vector<XmlTagName> path;
4232  while (true)
4233  {
4234  auto node = reader.Read();
4235  if (node.Type == XmlNodeType::End)
4236  {
4237  break;
4238  }
4239  else if (node.Type == XmlNodeType::EndTag)
4240  {
4241  if (path.size() > 0)
4242  {
4243  path.pop_back();
4244  }
4245  else
4246  {
4247  break;
4248  }
4249  }
4250  else if (node.Type == XmlNodeType::StartTag)
4251  {
4252  if (std::strcmp(node.Name, "EnumerationResults") == 0)
4253  {
4254  path.emplace_back(XmlTagName::k_EnumerationResults);
4255  }
4256  else if (std::strcmp(node.Name, "Prefix") == 0)
4257  {
4258  path.emplace_back(XmlTagName::k_Prefix);
4259  }
4260  else if (std::strcmp(node.Name, "Delimiter") == 0)
4261  {
4262  path.emplace_back(XmlTagName::k_Delimiter);
4263  }
4264  else if (std::strcmp(node.Name, "Marker") == 0)
4265  {
4266  path.emplace_back(XmlTagName::k_Marker);
4267  }
4268  else if (std::strcmp(node.Name, "NextMarker") == 0)
4269  {
4270  path.emplace_back(XmlTagName::k_NextMarker);
4271  }
4272  else if (std::strcmp(node.Name, "Blobs") == 0)
4273  {
4274  path.emplace_back(XmlTagName::k_Blobs);
4275  }
4276  else if (std::strcmp(node.Name, "Blob") == 0)
4277  {
4278  path.emplace_back(XmlTagName::k_Blob);
4279  }
4280  else if (std::strcmp(node.Name, "BlobPrefix") == 0)
4281  {
4282  path.emplace_back(XmlTagName::k_BlobPrefix);
4283  }
4284  else
4285  {
4286  path.emplace_back(XmlTagName::k_Unknown);
4287  }
4288  if (path.size() == 3 && path[0] == XmlTagName::k_EnumerationResults
4289  && path[1] == XmlTagName::k_Blobs && path[2] == XmlTagName::k_Blob)
4290  {
4291  ret.Items.emplace_back(BlobItemFromXml(reader));
4292  path.pop_back();
4293  }
4294  else if (
4295  path.size() == 3 && path[0] == XmlTagName::k_EnumerationResults
4296  && path[1] == XmlTagName::k_Blobs && path[2] == XmlTagName::k_BlobPrefix)
4297  {
4298  ret.BlobPrefixes.emplace_back(BlobPrefixFromXml(reader));
4299  path.pop_back();
4300  }
4301  }
4302  else if (node.Type == XmlNodeType::Text)
4303  {
4304  if (path.size() == 2 && path[0] == XmlTagName::k_EnumerationResults
4305  && path[1] == XmlTagName::k_Prefix)
4306  {
4307  ret.Prefix = node.Value;
4308  }
4309  else if (
4310  path.size() == 2 && path[0] == XmlTagName::k_EnumerationResults
4311  && path[1] == XmlTagName::k_Delimiter)
4312  {
4313  ret.Delimiter = node.Value;
4314  }
4315  else if (
4316  path.size() == 2 && path[0] == XmlTagName::k_EnumerationResults
4317  && path[1] == XmlTagName::k_Marker)
4318  {
4319  ret.Marker = node.Value;
4320  }
4321  else if (
4322  path.size() == 2 && path[0] == XmlTagName::k_EnumerationResults
4323  && path[1] == XmlTagName::k_NextMarker)
4324  {
4325  ret.NextMarker = node.Value;
4326  }
4327  }
4328  else if (node.Type == XmlNodeType::Attribute)
4329  {
4330  if (path.size() == 1 && path[0] == XmlTagName::k_EnumerationResults
4331  && std::strcmp(node.Name, "ServiceEndpoint") == 0)
4332  {
4333  ret.ServiceEndpoint = node.Value;
4334  }
4335  else if (
4336  path.size() == 1 && path[0] == XmlTagName::k_EnumerationResults
4337  && std::strcmp(node.Name, "ContainerName") == 0)
4338  {
4339  ret.Container = node.Value;
4340  }
4341  }
4342  }
4343  return ret;
4344  }
4345 
4346  static ListBlobsFlatSegmentResult ListBlobsFlatSegmentResultFromXml(XmlReader& reader)
4347  {
4348  ListBlobsFlatSegmentResult ret;
4349  enum class XmlTagName
4350  {
4351  k_EnumerationResults,
4352  k_Prefix,
4353  k_Marker,
4354  k_NextMarker,
4355  k_Blobs,
4356  k_Blob,
4357  k_Unknown,
4358  };
4359  std::vector<XmlTagName> path;
4360  while (true)
4361  {
4362  auto node = reader.Read();
4363  if (node.Type == XmlNodeType::End)
4364  {
4365  break;
4366  }
4367  else if (node.Type == XmlNodeType::EndTag)
4368  {
4369  if (path.size() > 0)
4370  {
4371  path.pop_back();
4372  }
4373  else
4374  {
4375  break;
4376  }
4377  }
4378  else if (node.Type == XmlNodeType::StartTag)
4379  {
4380  if (std::strcmp(node.Name, "EnumerationResults") == 0)
4381  {
4382  path.emplace_back(XmlTagName::k_EnumerationResults);
4383  }
4384  else if (std::strcmp(node.Name, "Prefix") == 0)
4385  {
4386  path.emplace_back(XmlTagName::k_Prefix);
4387  }
4388  else if (std::strcmp(node.Name, "Marker") == 0)
4389  {
4390  path.emplace_back(XmlTagName::k_Marker);
4391  }
4392  else if (std::strcmp(node.Name, "NextMarker") == 0)
4393  {
4394  path.emplace_back(XmlTagName::k_NextMarker);
4395  }
4396  else if (std::strcmp(node.Name, "Blobs") == 0)
4397  {
4398  path.emplace_back(XmlTagName::k_Blobs);
4399  }
4400  else if (std::strcmp(node.Name, "Blob") == 0)
4401  {
4402  path.emplace_back(XmlTagName::k_Blob);
4403  }
4404  else
4405  {
4406  path.emplace_back(XmlTagName::k_Unknown);
4407  }
4408  if (path.size() == 3 && path[0] == XmlTagName::k_EnumerationResults
4409  && path[1] == XmlTagName::k_Blobs && path[2] == XmlTagName::k_Blob)
4410  {
4411  ret.Items.emplace_back(BlobItemFromXml(reader));
4412  path.pop_back();
4413  }
4414  }
4415  else if (node.Type == XmlNodeType::Text)
4416  {
4417  if (path.size() == 2 && path[0] == XmlTagName::k_EnumerationResults
4418  && path[1] == XmlTagName::k_Prefix)
4419  {
4420  ret.Prefix = node.Value;
4421  }
4422  else if (
4423  path.size() == 2 && path[0] == XmlTagName::k_EnumerationResults
4424  && path[1] == XmlTagName::k_Marker)
4425  {
4426  ret.Marker = node.Value;
4427  }
4428  else if (
4429  path.size() == 2 && path[0] == XmlTagName::k_EnumerationResults
4430  && path[1] == XmlTagName::k_NextMarker)
4431  {
4432  ret.NextMarker = node.Value;
4433  }
4434  }
4435  else if (node.Type == XmlNodeType::Attribute)
4436  {
4437  if (path.size() == 1 && path[0] == XmlTagName::k_EnumerationResults
4438  && std::strcmp(node.Name, "ServiceEndpoint") == 0)
4439  {
4440  ret.ServiceEndpoint = node.Value;
4441  }
4442  else if (
4443  path.size() == 1 && path[0] == XmlTagName::k_EnumerationResults
4444  && std::strcmp(node.Name, "ContainerName") == 0)
4445  {
4446  ret.Container = node.Value;
4447  }
4448  }
4449  }
4450  return ret;
4451  }
4452 
4453  static BlobItem BlobItemFromXml(XmlReader& reader)
4454  {
4455  BlobItem ret;
4456  enum class XmlTagName
4457  {
4458  k_Name,
4459  k_Deleted,
4460  k_Snapshot,
4461  k_VersionId,
4462  k_IsCurrentVersion,
4463  k_Properties,
4464  k_ContentType,
4465  k_ContentEncoding,
4466  k_ContentLanguage,
4467  k_ContentMD5,
4468  k_CacheControl,
4469  k_ContentDisposition,
4470  k_CreationTime,
4471  k_LastModified,
4472  k_Etag,
4473  k_ContentLength,
4474  k_BlobType,
4475  k_AccessTier,
4476  k_AccessTierInferred,
4477  k_LeaseStatus,
4478  k_LeaseState,
4479  k_LeaseDuration,
4480  k_ServerEncrypted,
4481  k_EncryptionKeySHA256,
4482  k_Sealed,
4483  k_xmsblobsequencenumber,
4484  k_Metadata,
4485  k_OrMetadata,
4486  k_Unknown,
4487  };
4488  std::vector<XmlTagName> path;
4489  while (true)
4490  {
4491  auto node = reader.Read();
4492  if (node.Type == XmlNodeType::End)
4493  {
4494  break;
4495  }
4496  else if (node.Type == XmlNodeType::EndTag)
4497  {
4498  if (path.size() > 0)
4499  {
4500  path.pop_back();
4501  }
4502  else
4503  {
4504  break;
4505  }
4506  }
4507  else if (node.Type == XmlNodeType::StartTag)
4508  {
4509  if (std::strcmp(node.Name, "Name") == 0)
4510  {
4511  path.emplace_back(XmlTagName::k_Name);
4512  }
4513  else if (std::strcmp(node.Name, "Deleted") == 0)
4514  {
4515  path.emplace_back(XmlTagName::k_Deleted);
4516  }
4517  else if (std::strcmp(node.Name, "Snapshot") == 0)
4518  {
4519  path.emplace_back(XmlTagName::k_Snapshot);
4520  }
4521  else if (std::strcmp(node.Name, "VersionId") == 0)
4522  {
4523  path.emplace_back(XmlTagName::k_VersionId);
4524  }
4525  else if (std::strcmp(node.Name, "IsCurrentVersion") == 0)
4526  {
4527  path.emplace_back(XmlTagName::k_IsCurrentVersion);
4528  }
4529  else if (std::strcmp(node.Name, "Properties") == 0)
4530  {
4531  path.emplace_back(XmlTagName::k_Properties);
4532  }
4533  else if (std::strcmp(node.Name, "Content-Type") == 0)
4534  {
4535  path.emplace_back(XmlTagName::k_ContentType);
4536  }
4537  else if (std::strcmp(node.Name, "Content-Encoding") == 0)
4538  {
4539  path.emplace_back(XmlTagName::k_ContentEncoding);
4540  }
4541  else if (std::strcmp(node.Name, "Content-Language") == 0)
4542  {
4543  path.emplace_back(XmlTagName::k_ContentLanguage);
4544  }
4545  else if (std::strcmp(node.Name, "Content-MD5") == 0)
4546  {
4547  path.emplace_back(XmlTagName::k_ContentMD5);
4548  }
4549  else if (std::strcmp(node.Name, "Cache-Control") == 0)
4550  {
4551  path.emplace_back(XmlTagName::k_CacheControl);
4552  }
4553  else if (std::strcmp(node.Name, "Content-Disposition") == 0)
4554  {
4555  path.emplace_back(XmlTagName::k_ContentDisposition);
4556  }
4557  else if (std::strcmp(node.Name, "Creation-Time") == 0)
4558  {
4559  path.emplace_back(XmlTagName::k_CreationTime);
4560  }
4561  else if (std::strcmp(node.Name, "Last-Modified") == 0)
4562  {
4563  path.emplace_back(XmlTagName::k_LastModified);
4564  }
4565  else if (std::strcmp(node.Name, "Etag") == 0)
4566  {
4567  path.emplace_back(XmlTagName::k_Etag);
4568  }
4569  else if (std::strcmp(node.Name, "Content-Length") == 0)
4570  {
4571  path.emplace_back(XmlTagName::k_ContentLength);
4572  }
4573  else if (std::strcmp(node.Name, "BlobType") == 0)
4574  {
4575  path.emplace_back(XmlTagName::k_BlobType);
4576  }
4577  else if (std::strcmp(node.Name, "AccessTier") == 0)
4578  {
4579  path.emplace_back(XmlTagName::k_AccessTier);
4580  }
4581  else if (std::strcmp(node.Name, "AccessTierInferred") == 0)
4582  {
4583  path.emplace_back(XmlTagName::k_AccessTierInferred);
4584  }
4585  else if (std::strcmp(node.Name, "LeaseStatus") == 0)
4586  {
4587  path.emplace_back(XmlTagName::k_LeaseStatus);
4588  }
4589  else if (std::strcmp(node.Name, "LeaseState") == 0)
4590  {
4591  path.emplace_back(XmlTagName::k_LeaseState);
4592  }
4593  else if (std::strcmp(node.Name, "LeaseDuration") == 0)
4594  {
4595  path.emplace_back(XmlTagName::k_LeaseDuration);
4596  }
4597  else if (std::strcmp(node.Name, "ServerEncrypted") == 0)
4598  {
4599  path.emplace_back(XmlTagName::k_ServerEncrypted);
4600  }
4601  else if (std::strcmp(node.Name, "EncryptionKeySHA256") == 0)
4602  {
4603  path.emplace_back(XmlTagName::k_EncryptionKeySHA256);
4604  }
4605  else if (std::strcmp(node.Name, "Sealed") == 0)
4606  {
4607  path.emplace_back(XmlTagName::k_Sealed);
4608  }
4609  else if (std::strcmp(node.Name, "x-ms-blob-sequence-number") == 0)
4610  {
4611  path.emplace_back(XmlTagName::k_xmsblobsequencenumber);
4612  }
4613  else if (std::strcmp(node.Name, "Metadata") == 0)
4614  {
4615  path.emplace_back(XmlTagName::k_Metadata);
4616  }
4617  else if (std::strcmp(node.Name, "OrMetadata") == 0)
4618  {
4619  path.emplace_back(XmlTagName::k_OrMetadata);
4620  }
4621  else
4622  {
4623  path.emplace_back(XmlTagName::k_Unknown);
4624  }
4625  if (path.size() == 1 && path[0] == XmlTagName::k_Metadata)
4626  {
4627  ret.Metadata = MetadataFromXml(reader);
4628  path.pop_back();
4629  }
4630  else if (path.size() == 1 && path[0] == XmlTagName::k_OrMetadata)
4631  {
4632  ret.ObjectReplicationSourceProperties
4633  = ObjectReplicationSourcePropertiesFromXml(reader);
4634  path.pop_back();
4635  }
4636  }
4637  else if (node.Type == XmlNodeType::Text)
4638  {
4639  if (path.size() == 1 && path[0] == XmlTagName::k_Name)
4640  {
4641  ret.Name = node.Value;
4642  }
4643  else if (path.size() == 1 && path[0] == XmlTagName::k_Deleted)
4644  {
4645  ret.Deleted = std::strcmp(node.Value, "true") == 0;
4646  }
4647  else if (path.size() == 1 && path[0] == XmlTagName::k_Snapshot)
4648  {
4649  ret.Snapshot = node.Value;
4650  }
4651  else if (path.size() == 1 && path[0] == XmlTagName::k_VersionId)
4652  {
4653  ret.VersionId = node.Value;
4654  }
4655  else if (path.size() == 1 && path[0] == XmlTagName::k_IsCurrentVersion)
4656  {
4657  ret.IsCurrentVersion = std::strcmp(node.Value, "true") == 0;
4658  }
4659  else if (
4660  path.size() == 2 && path[0] == XmlTagName::k_Properties
4661  && path[1] == XmlTagName::k_ContentType)
4662  {
4663  ret.HttpHeaders.ContentType = node.Value;
4664  }
4665  else if (
4666  path.size() == 2 && path[0] == XmlTagName::k_Properties
4667  && path[1] == XmlTagName::k_ContentEncoding)
4668  {
4669  ret.HttpHeaders.ContentEncoding = node.Value;
4670  }
4671  else if (
4672  path.size() == 2 && path[0] == XmlTagName::k_Properties
4673  && path[1] == XmlTagName::k_ContentLanguage)
4674  {
4675  ret.HttpHeaders.ContentLanguage = node.Value;
4676  }
4677  else if (
4678  path.size() == 2 && path[0] == XmlTagName::k_Properties
4679  && path[1] == XmlTagName::k_ContentMD5)
4680  {
4681  ret.HttpHeaders.ContentMd5 = node.Value;
4682  }
4683  else if (
4684  path.size() == 2 && path[0] == XmlTagName::k_Properties
4685  && path[1] == XmlTagName::k_CacheControl)
4686  {
4687  ret.HttpHeaders.CacheControl = node.Value;
4688  }
4689  else if (
4690  path.size() == 2 && path[0] == XmlTagName::k_Properties
4691  && path[1] == XmlTagName::k_ContentDisposition)
4692  {
4693  ret.HttpHeaders.ContentDisposition = node.Value;
4694  }
4695  else if (
4696  path.size() == 2 && path[0] == XmlTagName::k_Properties
4697  && path[1] == XmlTagName::k_CreationTime)
4698  {
4699  ret.CreationTime = node.Value;
4700  }
4701  else if (
4702  path.size() == 2 && path[0] == XmlTagName::k_Properties
4703  && path[1] == XmlTagName::k_LastModified)
4704  {
4705  ret.LastModified = node.Value;
4706  }
4707  else if (
4708  path.size() == 2 && path[0] == XmlTagName::k_Properties
4709  && path[1] == XmlTagName::k_Etag)
4710  {
4711  ret.ETag = node.Value;
4712  }
4713  else if (
4714  path.size() == 2 && path[0] == XmlTagName::k_Properties
4715  && path[1] == XmlTagName::k_ContentLength)
4716  {
4717  ret.ContentLength = std::stoll(node.Value);
4718  }
4719  else if (
4720  path.size() == 2 && path[0] == XmlTagName::k_Properties
4721  && path[1] == XmlTagName::k_BlobType)
4722  {
4723  ret.BlobType = BlobTypeFromString(node.Value);
4724  }
4725  else if (
4726  path.size() == 2 && path[0] == XmlTagName::k_Properties
4727  && path[1] == XmlTagName::k_AccessTier)
4728  {
4729  ret.Tier = AccessTierFromString(node.Value);
4730  }
4731  else if (
4732  path.size() == 2 && path[0] == XmlTagName::k_Properties
4733  && path[1] == XmlTagName::k_AccessTierInferred)
4734  {
4735  ret.AccessTierInferred = std::strcmp(node.Value, "true") == 0;
4736  }
4737  else if (
4738  path.size() == 2 && path[0] == XmlTagName::k_Properties
4739  && path[1] == XmlTagName::k_LeaseStatus)
4740  {
4741  ret.LeaseStatus = BlobLeaseStatusFromString(node.Value);
4742  }
4743  else if (
4744  path.size() == 2 && path[0] == XmlTagName::k_Properties
4745  && path[1] == XmlTagName::k_LeaseState)
4746  {
4747  ret.LeaseState = BlobLeaseStateFromString(node.Value);
4748  }
4749  else if (
4750  path.size() == 2 && path[0] == XmlTagName::k_Properties
4751  && path[1] == XmlTagName::k_LeaseDuration)
4752  {
4753  ret.LeaseDuration = node.Value;
4754  }
4755  else if (
4756  path.size() == 2 && path[0] == XmlTagName::k_Properties
4757  && path[1] == XmlTagName::k_ServerEncrypted)
4758  {
4759  ret.ServerEncrypted = std::strcmp(node.Value, "true") == 0;
4760  }
4761  else if (
4762  path.size() == 2 && path[0] == XmlTagName::k_Properties
4763  && path[1] == XmlTagName::k_EncryptionKeySHA256)
4764  {
4765  ret.EncryptionKeySha256 = node.Value;
4766  }
4767  else if (
4768  path.size() == 2 && path[0] == XmlTagName::k_Properties
4769  && path[1] == XmlTagName::k_Sealed)
4770  {
4771  ret.IsSealed = std::strcmp(node.Value, "true") == 0;
4772  }
4773  else if (
4774  path.size() == 2 && path[0] == XmlTagName::k_Properties
4775  && path[1] == XmlTagName::k_xmsblobsequencenumber)
4776  {
4777  ret.SequenceNumber = std::stoll(node.Value);
4778  }
4779  }
4780  }
4781  return ret;
4782  }
4783 
4784  static BlobPrefix BlobPrefixFromXml(XmlReader& reader)
4785  {
4786  BlobPrefix ret;
4787  enum class XmlTagName
4788  {
4789  k_Name,
4790  k_Unknown,
4791  };
4792  std::vector<XmlTagName> path;
4793  while (true)
4794  {
4795  auto node = reader.Read();
4796  if (node.Type == XmlNodeType::End)
4797  {
4798  break;
4799  }
4800  else if (node.Type == XmlNodeType::EndTag)
4801  {
4802  if (path.size() > 0)
4803  {
4804  path.pop_back();
4805  }
4806  else
4807  {
4808  break;
4809  }
4810  }
4811  else if (node.Type == XmlNodeType::StartTag)
4812  {
4813  if (std::strcmp(node.Name, "Name") == 0)
4814  {
4815  path.emplace_back(XmlTagName::k_Name);
4816  }
4817  else
4818  {
4819  path.emplace_back(XmlTagName::k_Unknown);
4820  }
4821  }
4822  else if (node.Type == XmlNodeType::Text)
4823  {
4824  if (path.size() == 1 && path[0] == XmlTagName::k_Name)
4825  {
4826  ret.Name = node.Value;
4827  }
4828  }
4829  }
4830  return ret;
4831  }
4832 
4833  static BlobSignedIdentifier BlobSignedIdentifierFromXml(XmlReader& reader)
4834  {
4835  BlobSignedIdentifier ret;
4836  enum class XmlTagName
4837  {
4838  k_Id,
4839  k_AccessPolicy,
4840  k_Start,
4841  k_Expiry,
4842  k_Permission,
4843  k_Unknown,
4844  };
4845  std::vector<XmlTagName> path;
4846  while (true)
4847  {
4848  auto node = reader.Read();
4849  if (node.Type == XmlNodeType::End)
4850  {
4851  break;
4852  }
4853  else if (node.Type == XmlNodeType::EndTag)
4854  {
4855  if (path.size() > 0)
4856  {
4857  path.pop_back();
4858  }
4859  else
4860  {
4861  break;
4862  }
4863  }
4864  else if (node.Type == XmlNodeType::StartTag)
4865  {
4866  if (std::strcmp(node.Name, "Id") == 0)
4867  {
4868  path.emplace_back(XmlTagName::k_Id);
4869  }
4870  else if (std::strcmp(node.Name, "AccessPolicy") == 0)
4871  {
4872  path.emplace_back(XmlTagName::k_AccessPolicy);
4873  }
4874  else if (std::strcmp(node.Name, "Start") == 0)
4875  {
4876  path.emplace_back(XmlTagName::k_Start);
4877  }
4878  else if (std::strcmp(node.Name, "Expiry") == 0)
4879  {
4880  path.emplace_back(XmlTagName::k_Expiry);
4881  }
4882  else if (std::strcmp(node.Name, "Permission") == 0)
4883  {
4884  path.emplace_back(XmlTagName::k_Permission);
4885  }
4886  else
4887  {
4888  path.emplace_back(XmlTagName::k_Unknown);
4889  }
4890  }
4891  else if (node.Type == XmlNodeType::Text)
4892  {
4893  if (path.size() == 1 && path[0] == XmlTagName::k_Id)
4894  {
4895  ret.Id = node.Value;
4896  }
4897  else if (
4898  path.size() == 2 && path[0] == XmlTagName::k_AccessPolicy
4899  && path[1] == XmlTagName::k_Start)
4900  {
4901  ret.StartsOn = node.Value;
4902  }
4903  else if (
4904  path.size() == 2 && path[0] == XmlTagName::k_AccessPolicy
4905  && path[1] == XmlTagName::k_Expiry)
4906  {
4907  ret.ExpiresOn = node.Value;
4908  }
4909  else if (
4910  path.size() == 2 && path[0] == XmlTagName::k_AccessPolicy
4911  && path[1] == XmlTagName::k_Permission)
4912  {
4913  ret.Permissions = node.Value;
4914  }
4915  }
4916  }
4917  return ret;
4918  }
4919 
4920  static std::map<std::string, std::string> MetadataFromXml(XmlReader& reader)
4921  {
4922  std::map<std::string, std::string> ret;
4923  int depth = 0;
4924  std::string key;
4925  while (true)
4926  {
4927  auto node = reader.Read();
4928  if (node.Type == XmlNodeType::End)
4929  {
4930  break;
4931  }
4932  else if (node.Type == XmlNodeType::StartTag)
4933  {
4934  if (depth++ == 0)
4935  {
4936  key = node.Name;
4937  }
4938  }
4939  else if (node.Type == XmlNodeType::EndTag)
4940  {
4941  if (depth-- == 0)
4942  {
4943  break;
4944  }
4945  }
4946  else if (depth == 1 && node.Type == XmlNodeType::Text)
4947  {
4948  ret.emplace(std::move(key), std::string(node.Value));
4949  }
4950  }
4951  return ret;
4952  }
4953 
4954  static std::vector<ObjectReplicationPolicy> ObjectReplicationSourcePropertiesFromXml(
4955  XmlReader& reader)
4956  {
4957  int depth = 0;
4958  std::map<std::string, std::vector<ObjectReplicationRule>> orPropertiesMap;
4959  std::string policyId;
4960  std::string ruleId;
4961  while (true)
4962  {
4963  auto node = reader.Read();
4964  if (node.Type == XmlNodeType::End)
4965  {
4966  break;
4967  }
4968  else if (node.Type == XmlNodeType::StartTag)
4969  {
4970  ++depth;
4971  std::string startTagName = node.Name;
4972  if (startTagName.substr(0, 3) == "or-")
4973  {
4974  auto underscorePos = startTagName.find('_', 3);
4975  policyId
4976  = std::string(startTagName.begin() + 3, startTagName.begin() + underscorePos);
4977  ruleId = startTagName.substr(underscorePos + 1);
4978  }
4979  }
4980  else if (node.Type == XmlNodeType::EndTag)
4981  {
4982  if (depth-- == 0)
4983  {
4984  break;
4985  }
4986  }
4987  if (depth == 1 && node.Type == XmlNodeType::Text)
4988  {
4989  ObjectReplicationRule rule;
4990  rule.RuleId = std::move(ruleId);
4991  rule.ReplicationStatus = ObjectReplicationStatusFromString(node.Value);
4992  orPropertiesMap[policyId].emplace_back(std::move(rule));
4993  }
4994  }
4995  std::vector<ObjectReplicationPolicy> ret;
4996  for (auto& property : orPropertiesMap)
4997  {
4998  ObjectReplicationPolicy policy;
4999  policy.PolicyId = property.first;
5000  policy.Rules = std::move(property.second);
5001  ret.emplace_back(std::move(policy));
5002  }
5003  return ret;
5004  }
5005 
5006  static void SetContainerAccessPolicyOptionsToXml(
5007  XmlWriter& writer,
5008  const SetContainerAccessPolicyOptions& options)
5009  {
5010  writer.Write(XmlNode{XmlNodeType::StartTag, "SignedIdentifiers"});
5011  for (const auto& i : options.SignedIdentifiers)
5012  {
5013  BlobSignedIdentifierToXml(writer, i);
5014  }
5015  writer.Write(XmlNode{XmlNodeType::EndTag});
5016  }
5017 
5018  static void BlobSignedIdentifierToXml(XmlWriter& writer, const BlobSignedIdentifier& options)
5019  {
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});
5036  }
5037 
5038  }; // class Container
5039 
5040  class Blob {
5041  public:
5043  {
5044  Azure::Core::Nullable<int32_t> Timeout;
5045  Azure::Core::Nullable<std::pair<int64_t, int64_t>> Range;
5046  Azure::Core::Nullable<std::string> EncryptionKey;
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;
5055  }; // struct DownloadBlobOptions
5056 
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,
5061  const DownloadBlobOptions& options)
5062  {
5063  unused(options);
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())
5067  {
5068  request.GetUrl().AppendQuery("timeout", std::to_string(options.Timeout.GetValue()));
5069  }
5070  if (options.Range.HasValue())
5071  {
5072  auto startOffset = options.Range.GetValue().first;
5073  auto endOffset = options.Range.GetValue().second;
5074  if (endOffset != std::numeric_limits<decltype(endOffset)>::max())
5075  {
5076  request.AddHeader(
5077  "x-ms-range",
5078  "bytes=" + std::to_string(startOffset) + "-" + std::to_string(endOffset));
5079  }
5080  else
5081  {
5082  request.AddHeader("x-ms-range", "bytes=" + std::to_string(startOffset) + "-");
5083  }
5084  }
5085  if (options.EncryptionKey.HasValue())
5086  {
5087  request.AddHeader("x-ms-encryption-key", options.EncryptionKey.GetValue());
5088  }
5089  if (options.EncryptionKeySha256.HasValue())
5090  {
5091  request.AddHeader("x-ms-encryption-key-sha256", options.EncryptionKeySha256.GetValue());
5092  }
5093  if (options.EncryptionAlgorithm.HasValue())
5094  {
5095  request.AddHeader(
5096  "x-ms-encryption-algorithm",
5097  EncryptionAlgorithmTypeToString(options.EncryptionAlgorithm.GetValue()));
5098  }
5099  if (options.IfModifiedSince.HasValue())
5100  {
5101  request.AddHeader("If-Modified-Since", options.IfModifiedSince.GetValue());
5102  }
5103  if (options.IfUnmodifiedSince.HasValue())
5104  {
5105  request.AddHeader("If-Unmodified-Since", options.IfUnmodifiedSince.GetValue());
5106  }
5107  if (options.IfMatch.HasValue())
5108  {
5109  request.AddHeader("If-Match", options.IfMatch.GetValue());
5110  }
5111  if (options.IfNoneMatch.HasValue())
5112  {
5113  request.AddHeader("If-None-Match", options.IfNoneMatch.GetValue());
5114  }
5115  if (options.IfTags.HasValue())
5116  {
5117  request.AddHeader("x-ms-if-tags", options.IfTags.GetValue());
5118  }
5119  if (options.LeaseId.HasValue())
5120  {
5121  request.AddHeader("x-ms-lease-id", options.LeaseId.GetValue());
5122  }
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))
5130  {
5131  throw StorageError::CreateFromResponse(std::move(pHttpResponse));
5132  }
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())
5139  {
5140  response.TransactionalContentMd5 = response_transactional_content_md5_iterator->second;
5141  }
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())
5145  {
5146  response.TransactionalContentCrc64
5147  = response_transactional_content_crc64_iterator->second;
5148  }
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())
5152  {
5153  response.HttpHeaders.ContentType = response_http_headers_content_type_iterator->second;
5154  }
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())
5158  {
5159  response.HttpHeaders.ContentEncoding
5160  = response_http_headers_content_encoding_iterator->second;
5161  }
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())
5165  {
5166  response.HttpHeaders.ContentLanguage
5167  = response_http_headers_content_language_iterator->second;
5168  }
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())
5172  {
5173  response.HttpHeaders.CacheControl = response_http_headers_cache_control_iterator->second;
5174  }
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())
5178  {
5179  response.HttpHeaders.ContentMd5 = response_http_headers_content_md5_iterator->second;
5180  }
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())
5184  {
5185  response.HttpHeaders.ContentMd5 = x_ms_blob_content_md5_iterator->second;
5186  }
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())
5190  {
5191  response.HttpHeaders.ContentDisposition
5192  = response_http_headers_content_disposition_iterator->second;
5193  }
5194  for (auto i = httpResponse.GetHeaders().lower_bound("x-ms-meta-");
5195  i != httpResponse.GetHeaders().end() && i->first.substr(0, 10) == "x-ms-meta-";
5196  ++i)
5197  {
5198  response.Metadata.emplace(i->first.substr(10), i->second);
5199  }
5200  auto response_server_encrypted_iterator
5201  = httpResponse.GetHeaders().find("x-ms-server-encrypted");
5202  if (response_server_encrypted_iterator != httpResponse.GetHeaders().end())
5203  {
5204  response.ServerEncrypted = response_server_encrypted_iterator->second == "true";
5205  }
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())
5209  {
5210  response.EncryptionKeySha256 = response_encryption_key_sha256_iterator->second;
5211  }
5212  auto response_encryption_scope_iterator
5213  = httpResponse.GetHeaders().find("x-ms-encryption-scope");
5214  if (response_encryption_scope_iterator != httpResponse.GetHeaders().end())
5215  {
5216  response.EncryptionScope = response_encryption_scope_iterator->second;
5217  }
5218  auto response_lease_status_iterator = httpResponse.GetHeaders().find("x-ms-lease-status");
5219  if (response_lease_status_iterator != httpResponse.GetHeaders().end())
5220  {
5221  response.LeaseStatus = BlobLeaseStatusFromString(response_lease_status_iterator->second);
5222  }
5223  auto response_lease_state_iterator = httpResponse.GetHeaders().find("x-ms-lease-state");
5224  if (response_lease_state_iterator != httpResponse.GetHeaders().end())
5225  {
5226  response.LeaseState = BlobLeaseStateFromString(response_lease_state_iterator->second);
5227  }
5228  auto response_lease_duration_iterator
5229  = httpResponse.GetHeaders().find("x-ms-lease-duration");
5230  if (response_lease_duration_iterator != httpResponse.GetHeaders().end())
5231  {
5232  response.LeaseDuration = response_lease_duration_iterator->second;
5233  }
5234  auto response_content_range_iterator = httpResponse.GetHeaders().find("content-range");
5235  if (response_content_range_iterator != httpResponse.GetHeaders().end())
5236  {
5237  response.ContentRange = response_content_range_iterator->second;
5238  }
5239  auto response_sequence_number_iterator
5240  = httpResponse.GetHeaders().find("x-ms-blob-sequence-number");
5241  if (response_sequence_number_iterator != httpResponse.GetHeaders().end())
5242  {
5243  response.SequenceNumber = std::stoll(response_sequence_number_iterator->second);
5244  }
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())
5248  {
5249  response.CommittedBlockCount
5250  = std::stoll(response_committed_block_count_iterator->second);
5251  }
5252  auto response_is_sealed_iterator = httpResponse.GetHeaders().find("x-ms-blob-sealed");
5253  if (response_is_sealed_iterator != httpResponse.GetHeaders().end())
5254  {
5255  response.IsSealed = response_is_sealed_iterator->second == "true";
5256  }
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())
5262  {
5263  response.ObjectReplicationDestinationPolicyId
5264  = response_object_replication_destination_policy_id_iterator->second;
5265  }
5266  {
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-";
5270  ++i)
5271  {
5272  const std::string& header = i->first;
5273  auto underscorePos = header.find('_', 8);
5274  if (underscorePos == std::string::npos)
5275  {
5276  continue;
5277  }
5278  std::string policyId = std::string(header.begin() + 8, header.begin() + underscorePos);
5279  std::string ruleId = header.substr(underscorePos + 1);
5280 
5281  ObjectReplicationRule rule;
5282  rule.RuleId = std::move(ruleId);
5283  rule.ReplicationStatus = ObjectReplicationStatusFromString(i->second);
5284  orPropertiesMap[policyId].emplace_back(std::move(rule));
5285  }
5286  for (auto& property : orPropertiesMap)
5287  {
5288  ObjectReplicationPolicy policy;
5289  policy.PolicyId = property.first;
5290  policy.Rules = std::move(property.second);
5291  response.ObjectReplicationSourceProperties.emplace_back(std::move(policy));
5292  }
5293  }
5294  return Azure::Core::Response<DownloadBlobResult>(
5295  std::move(response), std::move(pHttpResponse));
5296  }
5297 
5299  {
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;
5308  }; // struct DeleteBlobOptions
5309 
5310  static Azure::Core::Http::Request DeleteCreateMessage(
5311  const Azure::Core::Http::Url& url,
5312  const DeleteBlobOptions& options)
5313  {
5314  unused(options);
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())
5318  {
5319  request.GetUrl().AppendQuery("timeout", std::to_string(options.Timeout.GetValue()));
5320  }
5321  if (options.DeleteSnapshots.HasValue())
5322  {
5323  request.AddHeader(
5324  "x-ms-delete-snapshots",
5325  DeleteSnapshotsOptionToString(options.DeleteSnapshots.GetValue()));
5326  }
5327  if (options.LeaseId.HasValue())
5328  {
5329  request.AddHeader("x-ms-lease-id", options.LeaseId.GetValue());
5330  }
5331  if (options.IfModifiedSince.HasValue())
5332  {
5333  request.AddHeader("If-Modified-Since", options.IfModifiedSince.GetValue());
5334  }
5335  if (options.IfUnmodifiedSince.HasValue())
5336  {
5337  request.AddHeader("If-Unmodified-Since", options.IfUnmodifiedSince.GetValue());
5338  }
5339  if (options.IfMatch.HasValue())
5340  {
5341  request.AddHeader("If-Match", options.IfMatch.GetValue());
5342  }
5343  if (options.IfNoneMatch.HasValue())
5344  {
5345  request.AddHeader("If-None-Match", options.IfNoneMatch.GetValue());
5346  }
5347  if (options.IfTags.HasValue())
5348  {
5349  request.AddHeader("x-ms-if-tags", options.IfTags.GetValue());
5350  }
5351  return request;
5352  }
5353 
5354  static Azure::Core::Response<DeleteBlobResult> DeleteCreateResponse(
5355  const Azure::Core::Context& context,
5356  std::unique_ptr<Azure::Core::Http::RawResponse> pHttpResponse)
5357  {
5358  unused(context);
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))
5365  {
5366  throw StorageError::CreateFromResponse(std::move(pHttpResponse));
5367  }
5368  return Azure::Core::Response<DeleteBlobResult>(
5369  std::move(response), std::move(pHttpResponse));
5370  }
5371 
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)
5377  {
5378  auto request = DeleteCreateMessage(url, options);
5379  auto pHttpResponse = pipeline.Send(context, request);
5380  return DeleteCreateResponse(context, std::move(pHttpResponse));
5381  }
5382 
5384  {
5385  Azure::Core::Nullable<int32_t> Timeout;
5386  }; // struct UndeleteBlobOptions
5387 
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,
5392  const UndeleteBlobOptions& options)
5393  {
5394  unused(options);
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())
5399  {
5400  request.GetUrl().AppendQuery("timeout", std::to_string(options.Timeout.GetValue()));
5401  }
5402  request.GetUrl().AppendQuery("comp", "undelete");
5403  auto pHttpResponse = pipeline.Send(context, request);
5404  Azure::Core::Http::RawResponse& httpResponse = *pHttpResponse;
5405  UndeleteBlobResult response;
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))
5410  {
5411  throw StorageError::CreateFromResponse(std::move(pHttpResponse));
5412  }
5413  return Azure::Core::Response<UndeleteBlobResult>(
5414  std::move(response), std::move(pHttpResponse));
5415  }
5416 
5418  {
5419  Azure::Core::Nullable<int32_t> Timeout;
5420  Azure::Core::Nullable<std::string> EncryptionKey;
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;
5429  }; // struct GetBlobPropertiesOptions
5430 
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,
5435  const GetBlobPropertiesOptions& options)
5436  {
5437  unused(options);
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())
5441  {
5442  request.GetUrl().AppendQuery("timeout", std::to_string(options.Timeout.GetValue()));
5443  }
5444  if (options.EncryptionKey.HasValue())
5445  {
5446  request.AddHeader("x-ms-encryption-key", options.EncryptionKey.GetValue());
5447  }
5448  if (options.EncryptionKeySha256.HasValue())
5449  {
5450  request.AddHeader("x-ms-encryption-key-sha256", options.EncryptionKeySha256.GetValue());
5451  }
5452  if (options.EncryptionAlgorithm.HasValue())
5453  {
5454  request.AddHeader(
5455  "x-ms-encryption-algorithm",
5456  EncryptionAlgorithmTypeToString(options.EncryptionAlgorithm.GetValue()));
5457  }
5458  if (options.LeaseId.HasValue())
5459  {
5460  request.AddHeader("x-ms-lease-id", options.LeaseId.GetValue());
5461  }
5462  if (options.IfModifiedSince.HasValue())
5463  {
5464  request.AddHeader("If-Modified-Since", options.IfModifiedSince.GetValue());
5465  }
5466  if (options.IfUnmodifiedSince.HasValue())
5467  {
5468  request.AddHeader("If-Unmodified-Since", options.IfUnmodifiedSince.GetValue());
5469  }
5470  if (options.IfMatch.HasValue())
5471  {
5472  request.AddHeader("If-Match", options.IfMatch.GetValue());
5473  }
5474  if (options.IfNoneMatch.HasValue())
5475  {
5476  request.AddHeader("If-None-Match", options.IfNoneMatch.GetValue());
5477  }
5478  if (options.IfTags.HasValue())
5479  {
5480  request.AddHeader("x-ms-if-tags", options.IfTags.GetValue());
5481  }
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))
5489  {
5490  throw StorageError::CreateFromResponse(std::move(pHttpResponse));
5491  }
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-";
5497  ++i)
5498  {
5499  response.Metadata.emplace(i->first.substr(10), i->second);
5500  }
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())
5504  {
5505  response.LeaseStatus = BlobLeaseStatusFromString(response_lease_status_iterator->second);
5506  }
5507  auto response_lease_state_iterator = httpResponse.GetHeaders().find("x-ms-lease-state");
5508  if (response_lease_state_iterator != httpResponse.GetHeaders().end())
5509  {
5510  response.LeaseState = BlobLeaseStateFromString(response_lease_state_iterator->second);
5511  }
5512  auto response_lease_duration_iterator
5513  = httpResponse.GetHeaders().find("x-ms-lease-duration");
5514  if (response_lease_duration_iterator != httpResponse.GetHeaders().end())
5515  {
5516  response.LeaseDuration = response_lease_duration_iterator->second;
5517  }
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())
5522  {
5523  response.HttpHeaders.ContentType = response_http_headers_content_type_iterator->second;
5524  }
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())
5528  {
5529  response.HttpHeaders.ContentEncoding
5530  = response_http_headers_content_encoding_iterator->second;
5531  }
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())
5535  {
5536  response.HttpHeaders.ContentLanguage
5537  = response_http_headers_content_language_iterator->second;
5538  }
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())
5542  {
5543  response.HttpHeaders.CacheControl = response_http_headers_cache_control_iterator->second;
5544  }
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())
5548  {
5549  response.HttpHeaders.ContentMd5 = response_http_headers_content_md5_iterator->second;
5550  }
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())
5554  {
5555  response.HttpHeaders.ContentMd5 = x_ms_blob_content_md5_iterator->second;
5556  }
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())
5560  {
5561  response.HttpHeaders.ContentDisposition
5562  = response_http_headers_content_disposition_iterator->second;
5563  }
5564  auto response_sequence_number_iterator
5565  = httpResponse.GetHeaders().find("x-ms-blob-sequence-number");
5566  if (response_sequence_number_iterator != httpResponse.GetHeaders().end())
5567  {
5568  response.SequenceNumber = std::stoll(response_sequence_number_iterator->second);
5569  }
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())
5573  {
5574  response.CommittedBlockCount = std::stoi(response_committed_block_count_iterator->second);
5575  }
5576  auto response_is_sealed_iterator = httpResponse.GetHeaders().find("x-ms-blob-sealed");
5577  if (response_is_sealed_iterator != httpResponse.GetHeaders().end())
5578  {
5579  response.IsSealed = response_is_sealed_iterator->second == "true";
5580  }
5581  auto response_server_encrypted_iterator
5582  = httpResponse.GetHeaders().find("x-ms-server-encrypted");
5583  if (response_server_encrypted_iterator != httpResponse.GetHeaders().end())
5584  {
5585  response.ServerEncrypted = response_server_encrypted_iterator->second == "true";
5586  }
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())
5590  {
5591  response.EncryptionKeySha256 = response_encryption_key_sha256_iterator->second;
5592  }
5593  auto response_encryption_scope_iterator
5594  = httpResponse.GetHeaders().find("x-ms-encryption-scope");
5595  if (response_encryption_scope_iterator != httpResponse.GetHeaders().end())
5596  {
5597  response.EncryptionScope = response_encryption_scope_iterator->second;
5598  }
5599  auto response_tier_iterator = httpResponse.GetHeaders().find("x-ms-access-tier");
5600  if (response_tier_iterator != httpResponse.GetHeaders().end())
5601  {
5602  response.Tier = AccessTierFromString(response_tier_iterator->second);
5603  }
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())
5607  {
5608  response.AccessTierInferred = response_access_tier_inferred_iterator->second == "true";
5609  }
5610  auto response_archive_status_iterator
5611  = httpResponse.GetHeaders().find("x-ms-archive-status");
5612  if (response_archive_status_iterator != httpResponse.GetHeaders().end())
5613  {
5614  response.ArchiveStatus
5615  = BlobArchiveStatusFromString(response_archive_status_iterator->second);
5616  }
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())
5620  {
5621  response.AccessTierChangeTime = response_access_tier_change_time_iterator->second;
5622  }
5623  auto response_copy_id_iterator = httpResponse.GetHeaders().find("x-ms-copy-id");
5624  if (response_copy_id_iterator != httpResponse.GetHeaders().end())
5625  {
5626  response.CopyId = response_copy_id_iterator->second;
5627  }
5628  auto response_copy_source_iterator = httpResponse.GetHeaders().find("x-ms-copy-source");
5629  if (response_copy_source_iterator != httpResponse.GetHeaders().end())
5630  {
5631  response.CopySource = response_copy_source_iterator->second;
5632  }
5633  auto response_copy_status_iterator = httpResponse.GetHeaders().find("x-ms-copy-status");
5634  if (response_copy_status_iterator != httpResponse.GetHeaders().end())
5635  {
5636  response.CopyStatus = CopyStatusFromString(response_copy_status_iterator->second);
5637  }
5638  auto response_copy_progress_iterator = httpResponse.GetHeaders().find("x-ms-copy-progress");
5639  if (response_copy_progress_iterator != httpResponse.GetHeaders().end())
5640  {
5641  response.CopyProgress = response_copy_progress_iterator->second;
5642  }
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())
5646  {
5647  response.CopyCompletionTime = response_copy_completion_time_iterator->second;
5648  }
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())
5653  {
5654  response.ObjectReplicationDestinationPolicyId
5655  = response_object_replication_destination_policy_id_iterator->second;
5656  }
5657  {
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-";
5661  ++i)
5662  {
5663  const std::string& header = i->first;
5664  auto underscorePos = header.find('_', 8);
5665  if (underscorePos == std::string::npos)
5666  {
5667  continue;
5668  }
5669  std::string policyId = std::string(header.begin() + 8, header.begin() + underscorePos);
5670  std::string ruleId = header.substr(underscorePos + 1);
5671 
5672  ObjectReplicationRule rule;
5673  rule.RuleId = std::move(ruleId);
5674  rule.ReplicationStatus = ObjectReplicationStatusFromString(i->second);
5675  orPropertiesMap[policyId].emplace_back(std::move(rule));
5676  }
5677  for (auto& property : orPropertiesMap)
5678  {
5679  ObjectReplicationPolicy policy;
5680  policy.PolicyId = property.first;
5681  policy.Rules = std::move(property.second);
5682  response.ObjectReplicationSourceProperties.emplace_back(std::move(policy));
5683  }
5684  }
5685  return Azure::Core::Response<GetBlobPropertiesResult>(
5686  std::move(response), std::move(pHttpResponse));
5687  }
5688 
5690  {
5691  Azure::Core::Nullable<int32_t> Timeout;
5692  BlobHttpHeaders HttpHeaders;
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;
5699  }; // struct SetBlobHttpHeadersOptions
5700 
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,
5705  const SetBlobHttpHeadersOptions& options)
5706  {
5707  unused(options);
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())
5713  {
5714  request.GetUrl().AppendQuery("timeout", std::to_string(options.Timeout.GetValue()));
5715  }
5716  if (!options.HttpHeaders.ContentType.empty())
5717  {
5718  request.AddHeader("x-ms-blob-content-type", options.HttpHeaders.ContentType);
5719  }
5720  if (!options.HttpHeaders.ContentEncoding.empty())
5721  {
5722  request.AddHeader("x-ms-blob-content-encoding", options.HttpHeaders.ContentEncoding);
5723  }
5724  if (!options.HttpHeaders.ContentLanguage.empty())
5725  {
5726  request.AddHeader("x-ms-blob-content-language", options.HttpHeaders.ContentLanguage);
5727  }
5728  if (!options.HttpHeaders.CacheControl.empty())
5729  {
5730  request.AddHeader("x-ms-blob-cache-control", options.HttpHeaders.CacheControl);
5731  }
5732  if (!options.HttpHeaders.ContentMd5.empty())
5733  {
5734  request.AddHeader("x-ms-blob-content-md5", options.HttpHeaders.ContentMd5);
5735  }
5736  if (!options.HttpHeaders.ContentDisposition.empty())
5737  {
5738  request.AddHeader(
5739  "x-ms-blob-content-disposition", options.HttpHeaders.ContentDisposition);
5740  }
5741  if (options.LeaseId.HasValue())
5742  {
5743  request.AddHeader("x-ms-lease-id", options.LeaseId.GetValue());
5744  }
5745  if (options.IfModifiedSince.HasValue())
5746  {
5747  request.AddHeader("If-Modified-Since", options.IfModifiedSince.GetValue());
5748  }
5749  if (options.IfUnmodifiedSince.HasValue())
5750  {
5751  request.AddHeader("If-Unmodified-Since", options.IfUnmodifiedSince.GetValue());
5752  }
5753  if (options.IfMatch.HasValue())
5754  {
5755  request.AddHeader("If-Match", options.IfMatch.GetValue());
5756  }
5757  if (options.IfNoneMatch.HasValue())
5758  {
5759  request.AddHeader("If-None-Match", options.IfNoneMatch.GetValue());
5760  }
5761  if (options.IfTags.HasValue())
5762  {
5763  request.AddHeader("x-ms-if-tags", options.IfTags.GetValue());
5764  }
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))
5772  {
5773  throw StorageError::CreateFromResponse(std::move(pHttpResponse));
5774  }
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())
5780  {
5781  response.SequenceNumber = std::stoll(response_sequence_number_iterator->second);
5782  }
5783  return Azure::Core::Response<SetBlobHttpHeadersResult>(
5784  std::move(response), std::move(pHttpResponse));
5785  }
5786 
5788  {
5789  Azure::Core::Nullable<int32_t> Timeout;
5790  std::map<std::string, std::string> Metadata;
5791  Azure::Core::Nullable<std::string> EncryptionKey;
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;
5801  }; // struct SetBlobMetadataOptions
5802 
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,
5807  const SetBlobMetadataOptions& options)
5808  {
5809  unused(options);
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())
5815  {
5816  request.GetUrl().AppendQuery("timeout", std::to_string(options.Timeout.GetValue()));
5817  }
5818  std::set<std::string> metadataKeys;
5819  for (const auto& pair : options.Metadata)
5820  {
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));
5824  });
5825  if (metadataKeys.insert(key).second == false)
5826  {
5827  throw std::runtime_error("duplicate keys in metadata");
5828  }
5829  request.AddHeader("x-ms-meta-" + pair.first, pair.second);
5830  }
5831  metadataKeys.clear();
5832  if (options.EncryptionKey.HasValue())
5833  {
5834  request.AddHeader("x-ms-encryption-key", options.EncryptionKey.GetValue());
5835  }
5836  if (options.EncryptionKeySha256.HasValue())
5837  {
5838  request.AddHeader("x-ms-encryption-key-sha256", options.EncryptionKeySha256.GetValue());
5839  }
5840  if (options.EncryptionAlgorithm.HasValue())
5841  {
5842  request.AddHeader(
5843  "x-ms-encryption-algorithm",
5844  EncryptionAlgorithmTypeToString(options.EncryptionAlgorithm.GetValue()));
5845  }
5846  if (options.EncryptionScope.HasValue())
5847  {
5848  request.AddHeader("x-ms-encryption-scope", options.EncryptionScope.GetValue());
5849  }
5850  if (options.LeaseId.HasValue())
5851  {
5852  request.AddHeader("x-ms-lease-id", options.LeaseId.GetValue());
5853  }
5854  if (options.IfModifiedSince.HasValue())
5855  {
5856  request.AddHeader("If-Modified-Since", options.IfModifiedSince.GetValue());
5857  }
5858  if (options.IfUnmodifiedSince.HasValue())
5859  {
5860  request.AddHeader("If-Unmodified-Since", options.IfUnmodifiedSince.GetValue());
5861  }
5862  if (options.IfMatch.HasValue())
5863  {
5864  request.AddHeader("If-Match", options.IfMatch.GetValue());
5865  }
5866  if (options.IfNoneMatch.HasValue())
5867  {
5868  request.AddHeader("If-None-Match", options.IfNoneMatch.GetValue());
5869  }
5870  if (options.IfTags.HasValue())
5871  {
5872  request.AddHeader("x-ms-if-tags", options.IfTags.GetValue());
5873  }
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))
5881  {
5882  throw StorageError::CreateFromResponse(std::move(pHttpResponse));
5883  }
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));
5888  }
5889 
5891  {
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;
5896  }; // struct SetBlobAccessTierOptions
5897 
5898  static Azure::Core::Http::Request SetAccessTierCreateMessage(
5899  const Azure::Core::Http::Url& url,
5900  const SetBlobAccessTierOptions& options)
5901  {
5902  unused(options);
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())
5908  {
5909  request.GetUrl().AppendQuery("timeout", std::to_string(options.Timeout.GetValue()));
5910  }
5911  request.AddHeader("x-ms-access-tier", AccessTierToString(options.Tier));
5912  if (options.RehydratePriority.HasValue())
5913  {
5914  request.AddHeader(
5915  "x-ms-rehydrate-priority",
5916  RehydratePriorityToString(options.RehydratePriority.GetValue()));
5917  }
5918  if (options.IfTags.HasValue())
5919  {
5920  request.AddHeader("x-ms-if-tags", options.IfTags.GetValue());
5921  }
5922  return request;
5923  }
5924 
5925  static Azure::Core::Response<SetBlobAccessTierResult> SetAccessTierCreateResponse(
5926  const Azure::Core::Context& context,
5927  std::unique_ptr<Azure::Core::Http::RawResponse> pHttpResponse)
5928  {
5929  unused(context);
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))
5936  {
5937  throw StorageError::CreateFromResponse(std::move(pHttpResponse));
5938  }
5939  return Azure::Core::Response<SetBlobAccessTierResult>(
5940  std::move(response), std::move(pHttpResponse));
5941  }
5942 
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)
5948  {
5949  auto request = SetAccessTierCreateMessage(url, options);
5950  auto pHttpResponse = pipeline.Send(context, request);
5951  return SetAccessTierCreateResponse(context, std::move(pHttpResponse));
5952  }
5953 
5955  {
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;
5974  }; // struct StartCopyBlobFromUriOptions
5975 
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,
5980  const StartCopyBlobFromUriOptions& options)
5981  {
5982  unused(options);
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())
5987  {
5988  request.GetUrl().AppendQuery("timeout", std::to_string(options.Timeout.GetValue()));
5989  }
5990  std::set<std::string> metadataKeys;
5991  for (const auto& pair : options.Metadata)
5992  {
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));
5996  });
5997  if (metadataKeys.insert(key).second == false)
5998  {
5999  throw std::runtime_error("duplicate keys in metadata");
6000  }
6001  request.AddHeader("x-ms-meta-" + pair.first, pair.second);
6002  }
6003  metadataKeys.clear();
6004  request.AddHeader("x-ms-copy-source", options.SourceUri);
6005  if (options.LeaseId.HasValue())
6006  {
6007  request.AddHeader("x-ms-lease-id", options.LeaseId.GetValue());
6008  }
6009  if (options.SourceLeaseId.HasValue())
6010  {
6011  request.AddHeader("x-ms-source-lease-id", options.SourceLeaseId.GetValue());
6012  }
6013  if (options.Tier.HasValue())
6014  {
6015  request.AddHeader("x-ms-access-tier", AccessTierToString(options.Tier.GetValue()));
6016  }
6017  if (options.RehydratePriority.HasValue())
6018  {
6019  request.AddHeader(
6020  "x-ms-rehydrate-priority",
6021  RehydratePriorityToString(options.RehydratePriority.GetValue()));
6022  }
6023  if (options.ShouldSealDestination.HasValue())
6024  {
6025  request.AddHeader(
6026  "x-ms-seal-blob", options.ShouldSealDestination.GetValue() ? "true" : "false");
6027  }
6028  if (options.IfModifiedSince.HasValue())
6029  {
6030  request.AddHeader("If-Modified-Since", options.IfModifiedSince.GetValue());
6031  }
6032  if (options.IfUnmodifiedSince.HasValue())
6033  {
6034  request.AddHeader("If-Unmodified-Since", options.IfUnmodifiedSince.GetValue());
6035  }
6036  if (options.IfMatch.HasValue())
6037  {
6038  request.AddHeader("If-Match", options.IfMatch.GetValue());
6039  }
6040  if (options.IfNoneMatch.HasValue())
6041  {
6042  request.AddHeader("If-None-Match", options.IfNoneMatch.GetValue());
6043  }
6044  if (options.IfTags.HasValue())
6045  {
6046  request.AddHeader("x-ms-if-tags", options.IfTags.GetValue());
6047  }
6048  if (options.SourceIfModifiedSince.HasValue())
6049  {
6050  request.AddHeader(
6051  "x-ms-source-if-modified-since", options.SourceIfModifiedSince.GetValue());
6052  }
6053  if (options.SourceIfUnmodifiedSince.HasValue())
6054  {
6055  request.AddHeader(
6056  "x-ms-source-if-unmodified-since", options.SourceIfUnmodifiedSince.GetValue());
6057  }
6058  if (options.SourceIfMatch.HasValue())
6059  {
6060  request.AddHeader("x-ms-source-if-match", options.SourceIfMatch.GetValue());
6061  }
6062  if (options.SourceIfNoneMatch.HasValue())
6063  {
6064  request.AddHeader("x-ms-source-if-none-match", options.SourceIfNoneMatch.GetValue());
6065  }
6066  if (options.SourceIfTags.HasValue())
6067  {
6068  request.AddHeader("x-ms-source-if-tags", options.SourceIfTags.GetValue());
6069  }
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))
6077  {
6078  throw StorageError::CreateFromResponse(std::move(pHttpResponse));
6079  }
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");
6083  response.CopyStatus
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())
6087  {
6088  response.VersionId = response_version_id_iterator->second;
6089  }
6090  return Azure::Core::Response<StartCopyBlobFromUriResult>(
6091  std::move(response), std::move(pHttpResponse));
6092  }
6093 
6095  {
6096  Azure::Core::Nullable<int32_t> Timeout;
6097  std::string CopyId;
6098  Azure::Core::Nullable<std::string> LeaseId;
6099  }; // struct AbortCopyBlobFromUriOptions
6100 
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,
6105  const AbortCopyBlobFromUriOptions& options)
6106  {
6107  unused(options);
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())
6112  {
6113  request.GetUrl().AppendQuery("timeout", std::to_string(options.Timeout.GetValue()));
6114  }
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())
6119  {
6120  request.AddHeader("x-ms-lease-id", options.LeaseId.GetValue());
6121  }
6122  auto pHttpResponse = pipeline.Send(context, request);
6123  Azure::Core::Http::RawResponse& httpResponse = *pHttpResponse;
6124  AbortCopyBlobFromUriResult response;
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))
6129  {
6130  throw StorageError::CreateFromResponse(std::move(pHttpResponse));
6131  }
6132  return Azure::Core::Response<AbortCopyBlobFromUriResult>(
6133  std::move(response), std::move(pHttpResponse));
6134  }
6135 
6137  {
6138  Azure::Core::Nullable<int32_t> Timeout;
6139  std::map<std::string, std::string> Metadata;
6140  Azure::Core::Nullable<std::string> LeaseId;
6141  Azure::Core::Nullable<std::string> EncryptionKey;
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;
6150  }; // struct CreateBlobSnapshotOptions
6151 
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,
6156  const CreateBlobSnapshotOptions& options)
6157  {
6158  unused(options);
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())
6164  {
6165  request.GetUrl().AppendQuery("timeout", std::to_string(options.Timeout.GetValue()));
6166  }
6167  if (options.EncryptionKey.HasValue())
6168  {
6169  request.AddHeader("x-ms-encryption-key", options.EncryptionKey.GetValue());
6170  }
6171  if (options.EncryptionKeySha256.HasValue())
6172  {
6173  request.AddHeader("x-ms-encryption-key-sha256", options.EncryptionKeySha256.GetValue());
6174  }
6175  if (options.EncryptionAlgorithm.HasValue())
6176  {
6177  request.AddHeader(
6178  "x-ms-encryption-algorithm",
6179  EncryptionAlgorithmTypeToString(options.EncryptionAlgorithm.GetValue()));
6180  }
6181  if (options.EncryptionScope.HasValue())
6182  {
6183  request.AddHeader("x-ms-encryption-scope", options.EncryptionScope.GetValue());
6184  }
6185  std::set<std::string> metadataKeys;
6186  for (const auto& pair : options.Metadata)
6187  {
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));
6191  });
6192  if (metadataKeys.insert(key).second == false)
6193  {
6194  throw std::runtime_error("duplicate keys in metadata");
6195  }
6196  request.AddHeader("x-ms-meta-" + pair.first, pair.second);
6197  }
6198  metadataKeys.clear();
6199  if (options.LeaseId.HasValue())
6200  {
6201  request.AddHeader("x-ms-lease-id", options.LeaseId.GetValue());
6202  }
6203  if (options.IfModifiedSince.HasValue())
6204  {
6205  request.AddHeader("If-Modified-Since", options.IfModifiedSince.GetValue());
6206  }
6207  if (options.IfUnmodifiedSince.HasValue())
6208  {
6209  request.AddHeader("If-Unmodified-Since", options.IfUnmodifiedSince.GetValue());
6210  }
6211  if (options.IfMatch.HasValue())
6212  {
6213  request.AddHeader("If-Match", options.IfMatch.GetValue());
6214  }
6215  if (options.IfNoneMatch.HasValue())
6216  {
6217  request.AddHeader("If-None-Match", options.IfNoneMatch.GetValue());
6218  }
6219  if (options.IfTags.HasValue())
6220  {
6221  request.AddHeader("x-ms-if-tags", options.IfTags.GetValue());
6222  }
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))
6230  {
6231  throw StorageError::CreateFromResponse(std::move(pHttpResponse));
6232  }
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())
6238  {
6239  response.ServerEncrypted = response_server_encrypted_iterator->second == "true";
6240  }
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())
6244  {
6245  response.EncryptionKeySha256 = response_encryption_key_sha256_iterator->second;
6246  }
6247  auto response_encryption_scope_iterator
6248  = httpResponse.GetHeaders().find("x-ms-encryption-scope");
6249  if (response_encryption_scope_iterator != httpResponse.GetHeaders().end())
6250  {
6251  response.EncryptionScope = response_encryption_scope_iterator->second;
6252  }
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())
6256  {
6257  response.VersionId = response_version_id_iterator->second;
6258  }
6259  return Azure::Core::Response<CreateBlobSnapshotResult>(
6260  std::move(response), std::move(pHttpResponse));
6261  }
6262 
6264  {
6265  Azure::Core::Nullable<int32_t> Timeout;
6266  Azure::Core::Nullable<std::string> IfTags;
6267  }; // struct GetBlobTagsOptions
6268 
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,
6273  const GetBlobTagsOptions& options)
6274  {
6275  unused(options);
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())
6279  {
6280  request.GetUrl().AppendQuery("timeout", std::to_string(options.Timeout.GetValue()));
6281  }
6282  request.GetUrl().AppendQuery("comp", "tags");
6283  if (options.IfTags.HasValue())
6284  {
6285  request.AddHeader("x-ms-if-tags", options.IfTags.GetValue());
6286  }
6287  auto pHttpResponse = pipeline.Send(context, request);
6288  Azure::Core::Http::RawResponse& httpResponse = *pHttpResponse;
6289  GetBlobTagsResult response;
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))
6294  {
6295  throw StorageError::CreateFromResponse(std::move(pHttpResponse));
6296  }
6297  {
6298  const auto& httpResponseBody = httpResponse.GetBody();
6299  XmlReader reader(
6300  reinterpret_cast<const char*>(httpResponseBody.data()), httpResponseBody.size());
6301  response = GetBlobTagsResultFromXml(reader);
6302  }
6303  return Azure::Core::Response<GetBlobTagsResult>(
6304  std::move(response), std::move(pHttpResponse));
6305  }
6306 
6308  {
6309  Azure::Core::Nullable<int32_t> Timeout;
6310  std::map<std::string, std::string> Tags;
6311  Azure::Core::Nullable<std::string> IfTags;
6312  }; // struct SetBlobTagsOptions
6313 
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,
6318  const SetBlobTagsOptions& options)
6319  {
6320  unused(options);
6321  std::string xml_body;
6322  {
6323  XmlWriter writer;
6324  SetBlobTagsOptionsToXml(writer, options);
6325  xml_body = writer.GetDocument();
6326  writer.Write(XmlNode{XmlNodeType::End});
6327  }
6328  Azure::Core::Http::MemoryBodyStream xml_body_stream(
6329  reinterpret_cast<const uint8_t*>(xml_body.data()), xml_body.length());
6330  auto request
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())
6335  {
6336  request.GetUrl().AppendQuery("timeout", std::to_string(options.Timeout.GetValue()));
6337  }
6338  request.GetUrl().AppendQuery("comp", "tags");
6339  request.AddHeader("Content-Type", "application/xml; charset=UTF-8");
6340  if (options.IfTags.HasValue())
6341  {
6342  request.AddHeader("x-ms-if-tags", options.IfTags.GetValue());
6343  }
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))
6351  {
6352  throw StorageError::CreateFromResponse(std::move(pHttpResponse));
6353  }
6354  return Azure::Core::Response<SetBlobTagsResult>(
6355  std::move(response), std::move(pHttpResponse));
6356  }
6357 
6359  {
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;
6368  }; // struct AcquireBlobLeaseOptions
6369 
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,
6374  const AcquireBlobLeaseOptions& options)
6375  {
6376  unused(options);
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())
6381  {
6382  request.GetUrl().AppendQuery("timeout", std::to_string(options.Timeout.GetValue()));
6383  }
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())
6388  {
6389  request.AddHeader("x-ms-proposed-lease-id", options.ProposedLeaseId.GetValue());
6390  }
6391  if (options.IfModifiedSince.HasValue())
6392  {
6393  request.AddHeader("If-Modified-Since", options.IfModifiedSince.GetValue());
6394  }
6395  if (options.IfUnmodifiedSince.HasValue())
6396  {
6397  request.AddHeader("If-Unmodified-Since", options.IfUnmodifiedSince.GetValue());
6398  }
6399  if (options.IfMatch.HasValue())
6400  {
6401  request.AddHeader("If-Match", options.IfMatch.GetValue());
6402  }
6403  if (options.IfNoneMatch.HasValue())
6404  {
6405  request.AddHeader("If-None-Match", options.IfNoneMatch.GetValue());
6406  }
6407  if (options.IfTags.HasValue())
6408  {
6409  request.AddHeader("x-ms-if-tags", options.IfTags.GetValue());
6410  }
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))
6418  {
6419  throw StorageError::CreateFromResponse(std::move(pHttpResponse));
6420  }
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));
6426  }
6427 
6429  {
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;
6437  }; // struct RenewBlobLeaseOptions
6438 
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,
6443  const RenewBlobLeaseOptions& options)
6444  {
6445  unused(options);
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())
6450  {
6451  request.GetUrl().AppendQuery("timeout", std::to_string(options.Timeout.GetValue()));
6452  }
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())
6457  {
6458  request.AddHeader("If-Modified-Since", options.IfModifiedSince.GetValue());
6459  }
6460  if (options.IfUnmodifiedSince.HasValue())
6461  {
6462  request.AddHeader("If-Unmodified-Since", options.IfUnmodifiedSince.GetValue());
6463  }
6464  if (options.IfMatch.HasValue())
6465  {
6466  request.AddHeader("If-Match", options.IfMatch.GetValue());
6467  }
6468  if (options.IfNoneMatch.HasValue())
6469  {
6470  request.AddHeader("If-None-Match", options.IfNoneMatch.GetValue());
6471  }
6472  if (options.IfTags.HasValue())
6473  {
6474  request.AddHeader("x-ms-if-tags", options.IfTags.GetValue());
6475  }
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))
6483  {
6484  throw StorageError::CreateFromResponse(std::move(pHttpResponse));
6485  }
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));
6491  }
6492 
6494  {
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;
6503  }; // struct ChangeBlobLeaseOptions
6504 
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,
6509  const ChangeBlobLeaseOptions& options)
6510  {
6511  unused(options);
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())
6516  {
6517  request.GetUrl().AppendQuery("timeout", std::to_string(options.Timeout.GetValue()));
6518  }
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())
6524  {
6525  request.AddHeader("If-Modified-Since", options.IfModifiedSince.GetValue());
6526  }
6527  if (options.IfUnmodifiedSince.HasValue())
6528  {
6529  request.AddHeader("If-Unmodified-Since", options.IfUnmodifiedSince.GetValue());
6530  }
6531  if (options.IfMatch.HasValue())
6532  {
6533  request.AddHeader("If-Match", options.IfMatch.GetValue());
6534  }
6535  if (options.IfNoneMatch.HasValue())
6536  {
6537  request.AddHeader("If-None-Match", options.IfNoneMatch.GetValue());
6538  }
6539  if (options.IfTags.HasValue())
6540  {
6541  request.AddHeader("x-ms-if-tags", options.IfTags.GetValue());
6542  }
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))
6550  {
6551  throw StorageError::CreateFromResponse(std::move(pHttpResponse));
6552  }
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));
6558  }
6559 
6561  {
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;
6569  }; // struct ReleaseBlobLeaseOptions
6570 
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,
6575  const ReleaseBlobLeaseOptions& options)
6576  {
6577  unused(options);
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())
6582  {
6583  request.GetUrl().AppendQuery("timeout", std::to_string(options.Timeout.GetValue()));
6584  }
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())
6589  {
6590  request.AddHeader("If-Modified-Since", options.IfModifiedSince.GetValue());
6591  }
6592  if (options.IfUnmodifiedSince.HasValue())
6593  {
6594  request.AddHeader("If-Unmodified-Since", options.IfUnmodifiedSince.GetValue());
6595  }
6596  if (options.IfMatch.HasValue())
6597  {
6598  request.AddHeader("If-Match", options.IfMatch.GetValue());
6599  }
6600  if (options.IfNoneMatch.HasValue())
6601  {
6602  request.AddHeader("If-None-Match", options.IfNoneMatch.GetValue());
6603  }
6604  if (options.IfTags.HasValue())
6605  {
6606  request.AddHeader("x-ms-if-tags", options.IfTags.GetValue());
6607  }
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))
6615  {
6616  throw StorageError::CreateFromResponse(std::move(pHttpResponse));
6617  }
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())
6623  {
6624  response.SequenceNumber = std::stoll(response_sequence_number_iterator->second);
6625  }
6626  return Azure::Core::Response<ReleaseBlobLeaseResult>(
6627  std::move(response), std::move(pHttpResponse));
6628  }
6629 
6631  {
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;
6639  }; // struct BreakBlobLeaseOptions
6640 
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,
6645  const BreakBlobLeaseOptions& options)
6646  {
6647  unused(options);
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())
6652  {
6653  request.GetUrl().AppendQuery("timeout", std::to_string(options.Timeout.GetValue()));
6654  }
6655  request.GetUrl().AppendQuery("comp", "lease");
6656  request.AddHeader("x-ms-lease-action", "break");
6657  if (options.BreakPeriod.HasValue())
6658  {
6659  request.AddHeader(
6660  "x-ms-lease-break-period", std::to_string(options.BreakPeriod.GetValue()));
6661  }
6662  if (options.IfModifiedSince.HasValue())
6663  {
6664  request.AddHeader("If-Modified-Since", options.IfModifiedSince.GetValue());
6665  }
6666  if (options.IfUnmodifiedSince.HasValue())
6667  {
6668  request.AddHeader("If-Unmodified-Since", options.IfUnmodifiedSince.GetValue());
6669  }
6670  if (options.IfMatch.HasValue())
6671  {
6672  request.AddHeader("If-Match", options.IfMatch.GetValue());
6673  }
6674  if (options.IfNoneMatch.HasValue())
6675  {
6676  request.AddHeader("If-None-Match", options.IfNoneMatch.GetValue());
6677  }
6678  if (options.IfTags.HasValue())
6679  {
6680  request.AddHeader("x-ms-if-tags", options.IfTags.GetValue());
6681  }
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))
6689  {
6690  throw StorageError::CreateFromResponse(std::move(pHttpResponse));
6691  }
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));
6697  }
6698 
6699  private:
6700  static GetBlobTagsResult GetBlobTagsResultFromXml(XmlReader& reader)
6701  {
6702  GetBlobTagsResult ret;
6703  enum class XmlTagName
6704  {
6705  k_Tags,
6706  k_TagSet,
6707  k_Unknown,
6708  };
6709  std::vector<XmlTagName> path;
6710  while (true)
6711  {
6712  auto node = reader.Read();
6713  if (node.Type == XmlNodeType::End)
6714  {
6715  break;
6716  }
6717  else if (node.Type == XmlNodeType::EndTag)
6718  {
6719  if (path.size() > 0)
6720  {
6721  path.pop_back();
6722  }
6723  else
6724  {
6725  break;
6726  }
6727  }
6728  else if (node.Type == XmlNodeType::StartTag)
6729  {
6730  if (std::strcmp(node.Name, "Tags") == 0)
6731  {
6732  path.emplace_back(XmlTagName::k_Tags);
6733  }
6734  else if (std::strcmp(node.Name, "TagSet") == 0)
6735  {
6736  path.emplace_back(XmlTagName::k_TagSet);
6737  }
6738  else
6739  {
6740  path.emplace_back(XmlTagName::k_Unknown);
6741  }
6742  if (path.size() == 2 && path[0] == XmlTagName::k_Tags
6743  && path[1] == XmlTagName::k_TagSet)
6744  {
6745  ret.Tags = TagsFromXml(reader);
6746  path.pop_back();
6747  }
6748  }
6749  else if (node.Type == XmlNodeType::Text)
6750  {
6751  }
6752  }
6753  return ret;
6754  }
6755 
6756  static std::map<std::string, std::string> TagsFromXml(XmlReader& reader)
6757  {
6758  std::map<std::string, std::string> ret;
6759  int depth = 0;
6760  std::string key;
6761  bool is_key = false;
6762  bool is_value = false;
6763  while (true)
6764  {
6765  auto node = reader.Read();
6766  if (node.Type == XmlNodeType::End)
6767  {
6768  break;
6769  }
6770  else if (node.Type == XmlNodeType::StartTag)
6771  {
6772  ++depth;
6773  if (strcmp(node.Name, "Key") == 0)
6774  {
6775  is_key = true;
6776  }
6777  else if (strcmp(node.Name, "Value") == 0)
6778  {
6779  is_value = true;
6780  }
6781  }
6782  else if (node.Type == XmlNodeType::EndTag)
6783  {
6784  if (depth-- == 0)
6785  {
6786  break;
6787  }
6788  }
6789  if (depth == 2 && node.Type == XmlNodeType::Text)
6790  {
6791  if (is_key)
6792  {
6793  key = node.Value;
6794  is_key = false;
6795  }
6796  else if (is_value)
6797  {
6798  ret.emplace(std::move(key), node.Value);
6799  is_value = false;
6800  }
6801  }
6802  }
6803  return ret;
6804  }
6805 
6806  static void SetBlobTagsOptionsToXml(XmlWriter& writer, const SetBlobTagsOptions& options)
6807  {
6808  writer.Write(XmlNode{XmlNodeType::StartTag, "Tags"});
6809  writer.Write(XmlNode{XmlNodeType::StartTag, "TagSet"});
6810  for (const auto& i : options.Tags)
6811  {
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});
6820  }
6821  writer.Write(XmlNode{XmlNodeType::EndTag});
6822  writer.Write(XmlNode{XmlNodeType::EndTag});
6823  }
6824 
6825  }; // class Blob
6826 
6827  class BlockBlob {
6828  public:
6830  {
6831  Azure::Core::Nullable<int32_t> Timeout;
6832  Azure::Core::Nullable<std::string> TransactionalContentMd5;
6833  Azure::Core::Nullable<std::string> TransactionalContentCrc64;
6834  BlobHttpHeaders HttpHeaders;
6835  std::map<std::string, std::string> Metadata;
6836  Azure::Core::Nullable<std::string> LeaseId;
6837  Azure::Core::Nullable<AccessTier> Tier;
6838  Azure::Core::Nullable<std::string> EncryptionKey;
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;
6847  }; // struct UploadBlockBlobOptions
6848 
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,
6854  const UploadBlockBlobOptions& options)
6855  {
6856  unused(options);
6857  auto request
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())
6862  {
6863  request.GetUrl().AppendQuery("timeout", std::to_string(options.Timeout.GetValue()));
6864  }
6865  if (options.EncryptionKey.HasValue())
6866  {
6867  request.AddHeader("x-ms-encryption-key", options.EncryptionKey.GetValue());
6868  }
6869  if (options.EncryptionKeySha256.HasValue())
6870  {
6871  request.AddHeader("x-ms-encryption-key-sha256", options.EncryptionKeySha256.GetValue());
6872  }
6873  if (options.EncryptionAlgorithm.HasValue())
6874  {
6875  request.AddHeader(
6876  "x-ms-encryption-algorithm",
6877  EncryptionAlgorithmTypeToString(options.EncryptionAlgorithm.GetValue()));
6878  }
6879  if (options.EncryptionScope.HasValue())
6880  {
6881  request.AddHeader("x-ms-encryption-scope", options.EncryptionScope.GetValue());
6882  }
6883  if (options.TransactionalContentMd5.HasValue())
6884  {
6885  request.AddHeader("Content-MD5", options.TransactionalContentMd5.GetValue());
6886  }
6887  if (options.TransactionalContentCrc64.HasValue())
6888  {
6889  request.AddHeader("x-ms-content-crc64", options.TransactionalContentCrc64.GetValue());
6890  }
6891  if (!options.HttpHeaders.ContentType.empty())
6892  {
6893  request.AddHeader("x-ms-blob-content-type", options.HttpHeaders.ContentType);
6894  }
6895  if (!options.HttpHeaders.ContentEncoding.empty())
6896  {
6897  request.AddHeader("x-ms-blob-content-encoding", options.HttpHeaders.ContentEncoding);
6898  }
6899  if (!options.HttpHeaders.ContentLanguage.empty())
6900  {
6901  request.AddHeader("x-ms-blob-content-language", options.HttpHeaders.ContentLanguage);
6902  }
6903  if (!options.HttpHeaders.CacheControl.empty())
6904  {
6905  request.AddHeader("x-ms-blob-cache-control", options.HttpHeaders.CacheControl);
6906  }
6907  if (!options.HttpHeaders.ContentMd5.empty())
6908  {
6909  request.AddHeader("x-ms-blob-content-md5", options.HttpHeaders.ContentMd5);
6910  }
6911  if (!options.HttpHeaders.ContentDisposition.empty())
6912  {
6913  request.AddHeader(
6914  "x-ms-blob-content-disposition", options.HttpHeaders.ContentDisposition);
6915  }
6916  std::set<std::string> metadataKeys;
6917  for (const auto& pair : options.Metadata)
6918  {
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));
6922  });
6923  if (metadataKeys.insert(key).second == false)
6924  {
6925  throw std::runtime_error("duplicate keys in metadata");
6926  }
6927  request.AddHeader("x-ms-meta-" + pair.first, pair.second);
6928  }
6929  metadataKeys.clear();
6930  if (options.LeaseId.HasValue())
6931  {
6932  request.AddHeader("x-ms-lease-id", options.LeaseId.GetValue());
6933  }
6934  request.AddHeader("x-ms-blob-type", "BlockBlob");
6935  if (options.Tier.HasValue())
6936  {
6937  request.AddHeader("x-ms-access-tier", AccessTierToString(options.Tier.GetValue()));
6938  }
6939  if (options.IfModifiedSince.HasValue())
6940  {
6941  request.AddHeader("If-Modified-Since", options.IfModifiedSince.GetValue());
6942  }
6943  if (options.IfUnmodifiedSince.HasValue())
6944  {
6945  request.AddHeader("If-Unmodified-Since", options.IfUnmodifiedSince.GetValue());
6946  }
6947  if (options.IfMatch.HasValue())
6948  {
6949  request.AddHeader("If-Match", options.IfMatch.GetValue());
6950  }
6951  if (options.IfNoneMatch.HasValue())
6952  {
6953  request.AddHeader("If-None-Match", options.IfNoneMatch.GetValue());
6954  }
6955  if (options.IfTags.HasValue())
6956  {
6957  request.AddHeader("x-ms-if-tags", options.IfTags.GetValue());
6958  }
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))
6966  {
6967  throw StorageError::CreateFromResponse(std::move(pHttpResponse));
6968  }
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())
6974  {
6975  response.TransactionalContentMd5 = response_transactional_content_md5_iterator->second;
6976  }
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())
6980  {
6981  response.TransactionalContentCrc64
6982  = response_transactional_content_crc64_iterator->second;
6983  }
6984  auto response_version_id_iterator = httpResponse.GetHeaders().find("x-ms-version-id");
6985  if (response_version_id_iterator != httpResponse.GetHeaders().end())
6986  {
6987  response.VersionId = response_version_id_iterator->second;
6988  }
6989  auto response_server_encrypted_iterator
6990  = httpResponse.GetHeaders().find("x-ms-request-server-encrypted");
6991  if (response_server_encrypted_iterator != httpResponse.GetHeaders().end())
6992  {
6993  response.ServerEncrypted = response_server_encrypted_iterator->second == "true";
6994  }
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())
6998  {
6999  response.EncryptionKeySha256 = response_encryption_key_sha256_iterator->second;
7000  }
7001  auto response_encryption_scope_iterator
7002  = httpResponse.GetHeaders().find("x-ms-encryption-scope");
7003  if (response_encryption_scope_iterator != httpResponse.GetHeaders().end())
7004  {
7005  response.EncryptionScope = response_encryption_scope_iterator->second;
7006  }
7007  return Azure::Core::Response<UploadBlockBlobResult>(
7008  std::move(response), std::move(pHttpResponse));
7009  }
7010 
7012  {
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;
7018  Azure::Core::Nullable<std::string> EncryptionKey;
7019  Azure::Core::Nullable<std::string> EncryptionKeySha256;
7020  Azure::Core::Nullable<EncryptionAlgorithmType> EncryptionAlgorithm;
7021  Azure::Core::Nullable<std::string> EncryptionScope;
7022  }; // struct StageBlockOptions
7023 
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,
7029  const StageBlockOptions& options)
7030  {
7031  unused(options);
7032  auto request
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())
7039  {
7040  request.GetUrl().AppendQuery("timeout", std::to_string(options.Timeout.GetValue()));
7041  }
7042  if (options.TransactionalContentMd5.HasValue())
7043  {
7044  request.AddHeader("Content-MD5", options.TransactionalContentMd5.GetValue());
7045  }
7046  if (options.TransactionalContentCrc64.HasValue())
7047  {
7048  request.AddHeader("x-ms-content-crc64", options.TransactionalContentCrc64.GetValue());
7049  }
7050  if (options.LeaseId.HasValue())
7051  {
7052  request.AddHeader("x-ms-lease-id", options.LeaseId.GetValue());
7053  }
7054  if (options.EncryptionKey.HasValue())
7055  {
7056  request.AddHeader("x-ms-encryption-key", options.EncryptionKey.GetValue());
7057  }
7058  if (options.EncryptionKeySha256.HasValue())
7059  {
7060  request.AddHeader("x-ms-encryption-key-sha256", options.EncryptionKeySha256.GetValue());
7061  }
7062  if (options.EncryptionAlgorithm.HasValue())
7063  {
7064  request.AddHeader(
7065  "x-ms-encryption-algorithm",
7066  EncryptionAlgorithmTypeToString(options.EncryptionAlgorithm.GetValue()));
7067  }
7068  if (options.EncryptionScope.HasValue())
7069  {
7070  request.AddHeader("x-ms-encryption-scope", options.EncryptionScope.GetValue());
7071  }
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))
7079  {
7080  throw StorageError::CreateFromResponse(std::move(pHttpResponse));
7081  }
7082  auto response_transactional_content_md5_iterator
7083  = httpResponse.GetHeaders().find("content-md5");
7084  if (response_transactional_content_md5_iterator != httpResponse.GetHeaders().end())
7085  {
7086  response.TransactionalContentMd5 = response_transactional_content_md5_iterator->second;
7087  }
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())
7091  {
7092  response.TransactionalContentCrc64
7093  = response_transactional_content_crc64_iterator->second;
7094  }
7095  auto response_server_encrypted_iterator
7096  = httpResponse.GetHeaders().find("x-ms-request-server-encrypted");
7097  if (response_server_encrypted_iterator != httpResponse.GetHeaders().end())
7098  {
7099  response.ServerEncrypted = response_server_encrypted_iterator->second == "true";
7100  }
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())
7104  {
7105  response.EncryptionKeySha256 = response_encryption_key_sha256_iterator->second;
7106  }
7107  auto response_encryption_scope_iterator
7108  = httpResponse.GetHeaders().find("x-ms-encryption-scope");
7109  if (response_encryption_scope_iterator != httpResponse.GetHeaders().end())
7110  {
7111  response.EncryptionScope = response_encryption_scope_iterator->second;
7112  }
7113  return Azure::Core::Response<StageBlockResult>(
7114  std::move(response), std::move(pHttpResponse));
7115  }
7116 
7118  {
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;
7126  Azure::Core::Nullable<std::string> EncryptionKey;
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;
7134  }; // struct StageBlockFromUriOptions
7135 
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,
7140  const StageBlockFromUriOptions& options)
7141  {
7142  unused(options);
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())
7149  {
7150  request.GetUrl().AppendQuery("timeout", std::to_string(options.Timeout.GetValue()));
7151  }
7152  request.AddHeader("x-ms-copy-source", options.SourceUri);
7153  if (options.SourceRange.HasValue())
7154  {
7155  auto startOffset = options.SourceRange.GetValue().first;
7156  auto endOffset = options.SourceRange.GetValue().second;
7157  if (endOffset != std::numeric_limits<decltype(endOffset)>::max())
7158  {
7159  request.AddHeader(
7160  "x-ms-source_range",
7161  "bytes=" + std::to_string(startOffset) + "-" + std::to_string(endOffset));
7162  }
7163  else
7164  {
7165  request.AddHeader("x-ms-source_range", "bytes=" + std::to_string(startOffset) + "-");
7166  }
7167  }
7168  if (options.TransactionalContentMd5.HasValue())
7169  {
7170  request.AddHeader("x-ms-source-content-md5", options.TransactionalContentMd5.GetValue());
7171  }
7172  if (options.TransactionalContentCrc64.HasValue())
7173  {
7174  request.AddHeader(
7175  "x-ms-source-content-crc64", options.TransactionalContentCrc64.GetValue());
7176  }
7177  if (options.LeaseId.HasValue())
7178  {
7179  request.AddHeader("x-ms-lease-id", options.LeaseId.GetValue());
7180  }
7181  if (options.EncryptionKey.HasValue())
7182  {
7183  request.AddHeader("x-ms-encryption-key", options.EncryptionKey.GetValue());
7184  }
7185  if (options.EncryptionKeySha256.HasValue())
7186  {
7187  request.AddHeader("x-ms-encryption-key-sha256", options.EncryptionKeySha256.GetValue());
7188  }
7189  if (options.EncryptionAlgorithm.HasValue())
7190  {
7191  request.AddHeader(
7192  "x-ms-encryption-algorithm",
7193  EncryptionAlgorithmTypeToString(options.EncryptionAlgorithm.GetValue()));
7194  }
7195  if (options.EncryptionScope.HasValue())
7196  {
7197  request.AddHeader("x-ms-encryption-scope", options.EncryptionScope.GetValue());
7198  }
7199  if (options.SourceIfModifiedSince.HasValue())
7200  {
7201  request.AddHeader(
7202  "x-ms-source-if-modified-since", options.SourceIfModifiedSince.GetValue());
7203  }
7204  if (options.SourceIfUnmodifiedSince.HasValue())
7205  {
7206  request.AddHeader(
7207  "x-ms-source-if-unmodified-since", options.SourceIfUnmodifiedSince.GetValue());
7208  }
7209  if (options.SourceIfMatch.HasValue())
7210  {
7211  request.AddHeader("x-ms-source-if-match", options.SourceIfMatch.GetValue());
7212  }
7213  if (options.SourceIfNoneMatch.HasValue())
7214  {
7215  request.AddHeader("x-ms-source-if-none-match", options.SourceIfNoneMatch.GetValue());
7216  }
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))
7224  {
7225  throw StorageError::CreateFromResponse(std::move(pHttpResponse));
7226  }
7227  auto response_transactional_content_md5_iterator
7228  = httpResponse.GetHeaders().find("content-md5");
7229  if (response_transactional_content_md5_iterator != httpResponse.GetHeaders().end())
7230  {
7231  response.TransactionalContentMd5 = response_transactional_content_md5_iterator->second;
7232  }
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())
7236  {
7237  response.TransactionalContentCrc64
7238  = response_transactional_content_crc64_iterator->second;
7239  }
7240  auto response_server_encrypted_iterator
7241  = httpResponse.GetHeaders().find("x-ms-request-server-encrypted");
7242  if (response_server_encrypted_iterator != httpResponse.GetHeaders().end())
7243  {
7244  response.ServerEncrypted = response_server_encrypted_iterator->second == "true";
7245  }
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())
7249  {
7250  response.EncryptionKeySha256 = response_encryption_key_sha256_iterator->second;
7251  }
7252  auto response_encryption_scope_iterator
7253  = httpResponse.GetHeaders().find("x-ms-encryption-scope");
7254  if (response_encryption_scope_iterator != httpResponse.GetHeaders().end())
7255  {
7256  response.EncryptionScope = response_encryption_scope_iterator->second;
7257  }
7258  return Azure::Core::Response<StageBlockFromUriResult>(
7259  std::move(response), std::move(pHttpResponse));
7260  }
7261 
7263  {
7264  Azure::Core::Nullable<int32_t> Timeout;
7265  std::vector<std::pair<BlockType, std::string>> BlockList;
7266  BlobHttpHeaders HttpHeaders;
7267  std::map<std::string, std::string> Metadata;
7268  Azure::Core::Nullable<std::string> LeaseId;
7269  Azure::Core::Nullable<std::string> EncryptionKey;
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;
7279  }; // struct CommitBlockListOptions
7280 
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,
7285  const CommitBlockListOptions& options)
7286  {
7287  unused(options);
7288  std::string xml_body;
7289  {
7290  XmlWriter writer;
7291  CommitBlockListOptionsToXml(writer, options);
7292  xml_body = writer.GetDocument();
7293  writer.Write(XmlNode{XmlNodeType::End});
7294  }
7295  Azure::Core::Http::MemoryBodyStream xml_body_stream(
7296  reinterpret_cast<const uint8_t*>(xml_body.data()), xml_body.length());
7297  auto request
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())
7303  {
7304  request.GetUrl().AppendQuery("timeout", std::to_string(options.Timeout.GetValue()));
7305  }
7306  if (!options.HttpHeaders.ContentType.empty())
7307  {
7308  request.AddHeader("x-ms-blob-content-type", options.HttpHeaders.ContentType);
7309  }
7310  if (!options.HttpHeaders.ContentEncoding.empty())
7311  {
7312  request.AddHeader("x-ms-blob-content-encoding", options.HttpHeaders.ContentEncoding);
7313  }
7314  if (!options.HttpHeaders.ContentLanguage.empty())
7315  {
7316  request.AddHeader("x-ms-blob-content-language", options.HttpHeaders.ContentLanguage);
7317  }
7318  if (!options.HttpHeaders.CacheControl.empty())
7319  {
7320  request.AddHeader("x-ms-blob-cache-control", options.HttpHeaders.CacheControl);
7321  }
7322  if (!options.HttpHeaders.ContentMd5.empty())
7323  {
7324  request.AddHeader("x-ms-blob-content-md5", options.HttpHeaders.ContentMd5);
7325  }
7326  if (!options.HttpHeaders.ContentDisposition.empty())
7327  {
7328  request.AddHeader(
7329  "x-ms-blob-content-disposition", options.HttpHeaders.ContentDisposition);
7330  }
7331  std::set<std::string> metadataKeys;
7332  for (const auto& pair : options.Metadata)
7333  {
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));
7337  });
7338  if (metadataKeys.insert(key).second == false)
7339  {
7340  throw std::runtime_error("duplicate keys in metadata");
7341  }
7342  request.AddHeader("x-ms-meta-" + pair.first, pair.second);
7343  }
7344  metadataKeys.clear();
7345  if (options.LeaseId.HasValue())
7346  {
7347  request.AddHeader("x-ms-lease-id", options.LeaseId.GetValue());
7348  }
7349  if (options.EncryptionKey.HasValue())
7350  {
7351  request.AddHeader("x-ms-encryption-key", options.EncryptionKey.GetValue());
7352  }
7353  if (options.EncryptionKeySha256.HasValue())
7354  {
7355  request.AddHeader("x-ms-encryption-key-sha256", options.EncryptionKeySha256.GetValue());
7356  }
7357  if (options.EncryptionAlgorithm.HasValue())
7358  {
7359  request.AddHeader(
7360  "x-ms-encryption-algorithm",
7361  EncryptionAlgorithmTypeToString(options.EncryptionAlgorithm.GetValue()));
7362  }
7363  if (options.EncryptionScope.HasValue())
7364  {
7365  request.AddHeader("x-ms-encryption-scope", options.EncryptionScope.GetValue());
7366  }
7367  if (options.Tier.HasValue())
7368  {
7369  request.AddHeader("x-ms-access-tier", AccessTierToString(options.Tier.GetValue()));
7370  }
7371  if (options.IfModifiedSince.HasValue())
7372  {
7373  request.AddHeader("If-Modified-Since", options.IfModifiedSince.GetValue());
7374  }
7375  if (options.IfUnmodifiedSince.HasValue())
7376  {
7377  request.AddHeader("If-Unmodified-Since", options.IfUnmodifiedSince.GetValue());
7378  }
7379  if (options.IfMatch.HasValue())
7380  {
7381  request.AddHeader("If-Match", options.IfMatch.GetValue());
7382  }
7383  if (options.IfNoneMatch.HasValue())
7384  {
7385  request.AddHeader("If-None-Match", options.IfNoneMatch.GetValue());
7386  }
7387  if (options.IfTags.HasValue())
7388  {
7389  request.AddHeader("x-ms-if-tags", options.IfTags.GetValue());
7390  }
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))
7398  {
7399  throw StorageError::CreateFromResponse(std::move(pHttpResponse));
7400  }
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())
7405  {
7406  response.VersionId = response_version_id_iterator->second;
7407  }
7408  auto response_server_encrypted_iterator
7409  = httpResponse.GetHeaders().find("x-ms-request-server-encrypted");
7410  if (response_server_encrypted_iterator != httpResponse.GetHeaders().end())
7411  {
7412  response.ServerEncrypted = response_server_encrypted_iterator->second == "true";
7413  }
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())
7417  {
7418  response.EncryptionKeySha256 = response_encryption_key_sha256_iterator->second;
7419  }
7420  auto response_encryption_scope_iterator
7421  = httpResponse.GetHeaders().find("x-ms-encryption-scope");
7422  if (response_encryption_scope_iterator != httpResponse.GetHeaders().end())
7423  {
7424  response.EncryptionScope = response_encryption_scope_iterator->second;
7425  }
7426  return Azure::Core::Response<CommitBlockListResult>(
7427  std::move(response), std::move(pHttpResponse));
7428  }
7429 
7431  {
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;
7436  }; // struct GetBlockListOptions
7437 
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,
7442  const GetBlockListOptions& options)
7443  {
7444  unused(options);
7445  auto request = Azure::Core::Http::Request(Azure::Core::Http::HttpMethod::Get, url);
7446  request.GetUrl().AppendQuery("comp", "blocklist");
7447  if (options.ListType.HasValue())
7448  {
7449  std::string block_list_type_option
7450  = BlockListTypeOptionToString(options.ListType.GetValue());
7451  request.GetUrl().AppendQuery("blocklisttype", block_list_type_option);
7452  }
7453  request.AddHeader("x-ms-version", c_ApiVersion);
7454  if (options.Timeout.HasValue())
7455  {
7456  request.GetUrl().AppendQuery("timeout", std::to_string(options.Timeout.GetValue()));
7457  }
7458  if (options.LeaseId.HasValue())
7459  {
7460  request.AddHeader("x-ms-lease-id", options.LeaseId.GetValue());
7461  }
7462  if (options.IfTags.HasValue())
7463  {
7464  request.AddHeader("x-ms-if-tags", options.IfTags.GetValue());
7465  }
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))
7473  {
7474  throw StorageError::CreateFromResponse(std::move(pHttpResponse));
7475  }
7476  {
7477  const auto& httpResponseBody = httpResponse.GetBody();
7478  XmlReader reader(
7479  reinterpret_cast<const char*>(httpResponseBody.data()), httpResponseBody.size());
7480  response = GetBlockListResultFromXml(reader);
7481  }
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));
7489  }
7490 
7491  private:
7492  static GetBlockListResult GetBlockListResultFromXml(XmlReader& reader)
7493  {
7494  GetBlockListResult ret;
7495  enum class XmlTagName
7496  {
7497  k_BlockList,
7498  k_CommittedBlocks,
7499  k_Block,
7500  k_UncommittedBlocks,
7501  k_Unknown,
7502  };
7503  std::vector<XmlTagName> path;
7504  while (true)
7505  {
7506  auto node = reader.Read();
7507  if (node.Type == XmlNodeType::End)
7508  {
7509  break;
7510  }
7511  else if (node.Type == XmlNodeType::EndTag)
7512  {
7513  if (path.size() > 0)
7514  {
7515  path.pop_back();
7516  }
7517  else
7518  {
7519  break;
7520  }
7521  }
7522  else if (node.Type == XmlNodeType::StartTag)
7523  {
7524  if (std::strcmp(node.Name, "BlockList") == 0)
7525  {
7526  path.emplace_back(XmlTagName::k_BlockList);
7527  }
7528  else if (std::strcmp(node.Name, "CommittedBlocks") == 0)
7529  {
7530  path.emplace_back(XmlTagName::k_CommittedBlocks);
7531  }
7532  else if (std::strcmp(node.Name, "Block") == 0)
7533  {
7534  path.emplace_back(XmlTagName::k_Block);
7535  }
7536  else if (std::strcmp(node.Name, "UncommittedBlocks") == 0)
7537  {
7538  path.emplace_back(XmlTagName::k_UncommittedBlocks);
7539  }
7540  else
7541  {
7542  path.emplace_back(XmlTagName::k_Unknown);
7543  }
7544  if (path.size() == 3 && path[0] == XmlTagName::k_BlockList
7545  && path[1] == XmlTagName::k_CommittedBlocks && path[2] == XmlTagName::k_Block)
7546  {
7547  ret.CommittedBlocks.emplace_back(BlobBlockFromXml(reader));
7548  path.pop_back();
7549  }
7550  else if (
7551  path.size() == 3 && path[0] == XmlTagName::k_BlockList
7552  && path[1] == XmlTagName::k_UncommittedBlocks && path[2] == XmlTagName::k_Block)
7553  {
7554  ret.UncommittedBlocks.emplace_back(BlobBlockFromXml(reader));
7555  path.pop_back();
7556  }
7557  }
7558  else if (node.Type == XmlNodeType::Text)
7559  {
7560  }
7561  }
7562  return ret;
7563  }
7564 
7565  static BlobBlock BlobBlockFromXml(XmlReader& reader)
7566  {
7567  BlobBlock ret;
7568  enum class XmlTagName
7569  {
7570  k_Name,
7571  k_Size,
7572  k_Unknown,
7573  };
7574  std::vector<XmlTagName> path;
7575  while (true)
7576  {
7577  auto node = reader.Read();
7578  if (node.Type == XmlNodeType::End)
7579  {
7580  break;
7581  }
7582  else if (node.Type == XmlNodeType::EndTag)
7583  {
7584  if (path.size() > 0)
7585  {
7586  path.pop_back();
7587  }
7588  else
7589  {
7590  break;
7591  }
7592  }
7593  else if (node.Type == XmlNodeType::StartTag)
7594  {
7595  if (std::strcmp(node.Name, "Name") == 0)
7596  {
7597  path.emplace_back(XmlTagName::k_Name);
7598  }
7599  else if (std::strcmp(node.Name, "Size") == 0)
7600  {
7601  path.emplace_back(XmlTagName::k_Size);
7602  }
7603  else
7604  {
7605  path.emplace_back(XmlTagName::k_Unknown);
7606  }
7607  }
7608  else if (node.Type == XmlNodeType::Text)
7609  {
7610  if (path.size() == 1 && path[0] == XmlTagName::k_Name)
7611  {
7612  ret.Name = node.Value;
7613  }
7614  else if (path.size() == 1 && path[0] == XmlTagName::k_Size)
7615  {
7616  ret.Size = std::stoll(node.Value);
7617  }
7618  }
7619  }
7620  return ret;
7621  }
7622 
7623  static void CommitBlockListOptionsToXml(
7624  XmlWriter& writer,
7625  const CommitBlockListOptions& options)
7626  {
7627  writer.Write(XmlNode{XmlNodeType::StartTag, "BlockList"});
7628  for (const auto& i : options.BlockList)
7629  {
7630  writer.Write(
7631  XmlNode{XmlNodeType::StartTag, BlockTypeToString(i.first).data(), i.second.data()});
7632  }
7633  writer.Write(XmlNode{XmlNodeType::EndTag});
7634  }
7635 
7636  }; // class BlockBlob
7637 
7638  class PageBlob {
7639  public:
7641  {
7642  Azure::Core::Nullable<int32_t> Timeout;
7643  int64_t BlobContentLength = -1;
7644  Azure::Core::Nullable<int64_t> SequenceNumber;
7645  BlobHttpHeaders HttpHeaders;
7646  std::map<std::string, std::string> Metadata;
7647  Azure::Core::Nullable<std::string> LeaseId;
7648  Azure::Core::Nullable<AccessTier> Tier;
7649  Azure::Core::Nullable<std::string> EncryptionKey;
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;
7658  }; // struct CreatePageBlobOptions
7659 
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,
7664  const CreatePageBlobOptions& options)
7665  {
7666  unused(options);
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())
7671  {
7672  request.GetUrl().AppendQuery("timeout", std::to_string(options.Timeout.GetValue()));
7673  }
7674  if (!options.HttpHeaders.ContentType.empty())
7675  {
7676  request.AddHeader("x-ms-blob-content-type", options.HttpHeaders.ContentType);
7677  }
7678  if (!options.HttpHeaders.ContentEncoding.empty())
7679  {
7680  request.AddHeader("x-ms-blob-content-encoding", options.HttpHeaders.ContentEncoding);
7681  }
7682  if (!options.HttpHeaders.ContentLanguage.empty())
7683  {
7684  request.AddHeader("x-ms-blob-content-language", options.HttpHeaders.ContentLanguage);
7685  }
7686  if (!options.HttpHeaders.CacheControl.empty())
7687  {
7688  request.AddHeader("x-ms-blob-cache-control", options.HttpHeaders.CacheControl);
7689  }
7690  if (!options.HttpHeaders.ContentMd5.empty())
7691  {
7692  request.AddHeader("x-ms-blob-content-md5", options.HttpHeaders.ContentMd5);
7693  }
7694  if (!options.HttpHeaders.ContentDisposition.empty())
7695  {
7696  request.AddHeader(
7697  "x-ms-blob-content-disposition", options.HttpHeaders.ContentDisposition);
7698  }
7699  std::set<std::string> metadataKeys;
7700  for (const auto& pair : options.Metadata)
7701  {
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));
7705  });
7706  if (metadataKeys.insert(key).second == false)
7707  {
7708  throw std::runtime_error("duplicate keys in metadata");
7709  }
7710  request.AddHeader("x-ms-meta-" + pair.first, pair.second);
7711  }
7712  metadataKeys.clear();
7713  if (options.LeaseId.HasValue())
7714  {
7715  request.AddHeader("x-ms-lease-id", options.LeaseId.GetValue());
7716  }
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())
7720  {
7721  request.AddHeader(
7722  "x-ms-blob-sequence-number", std::to_string(options.SequenceNumber.GetValue()));
7723  }
7724  if (options.Tier.HasValue())
7725  {
7726  request.AddHeader("x-ms-access-tier", AccessTierToString(options.Tier.GetValue()));
7727  }
7728  if (options.EncryptionKey.HasValue())
7729  {
7730  request.AddHeader("x-ms-encryption-key", options.EncryptionKey.GetValue());
7731  }
7732  if (options.EncryptionKeySha256.HasValue())
7733  {
7734  request.AddHeader("x-ms-encryption-key-sha256", options.EncryptionKeySha256.GetValue());
7735  }
7736  if (options.EncryptionAlgorithm.HasValue())
7737  {
7738  request.AddHeader(
7739  "x-ms-encryption-algorithm",
7740  EncryptionAlgorithmTypeToString(options.EncryptionAlgorithm.GetValue()));
7741  }
7742  if (options.EncryptionScope.HasValue())
7743  {
7744  request.AddHeader("x-ms-encryption-scope", options.EncryptionScope.GetValue());
7745  }
7746  if (options.IfModifiedSince.HasValue())
7747  {
7748  request.AddHeader("If-Modified-Since", options.IfModifiedSince.GetValue());
7749  }
7750  if (options.IfUnmodifiedSince.HasValue())
7751  {
7752  request.AddHeader("If-Unmodified-Since", options.IfUnmodifiedSince.GetValue());
7753  }
7754  if (options.IfMatch.HasValue())
7755  {
7756  request.AddHeader("If-Match", options.IfMatch.GetValue());
7757  }
7758  if (options.IfNoneMatch.HasValue())
7759  {
7760  request.AddHeader("If-None-Match", options.IfNoneMatch.GetValue());
7761  }
7762  if (options.IfTags.HasValue())
7763  {
7764  request.AddHeader("x-ms-if-tags", options.IfTags.GetValue());
7765  }
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))
7773  {
7774  throw StorageError::CreateFromResponse(std::move(pHttpResponse));
7775  }
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())
7780  {
7781  response.VersionId = response_version_id_iterator->second;
7782  }
7783  auto response_server_encrypted_iterator
7784  = httpResponse.GetHeaders().find("x-ms-request-server-encrypted");
7785  if (response_server_encrypted_iterator != httpResponse.GetHeaders().end())
7786  {
7787  response.ServerEncrypted = response_server_encrypted_iterator->second == "true";
7788  }
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())
7792  {
7793  response.EncryptionKeySha256 = response_encryption_key_sha256_iterator->second;
7794  }
7795  auto response_encryption_scope_iterator
7796  = httpResponse.GetHeaders().find("x-ms-encryption-scope");
7797  if (response_encryption_scope_iterator != httpResponse.GetHeaders().end())
7798  {
7799  response.EncryptionScope = response_encryption_scope_iterator->second;
7800  }
7801  return Azure::Core::Response<CreatePageBlobResult>(
7802  std::move(response), std::move(pHttpResponse));
7803  }
7804 
7806  {
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;
7815  Azure::Core::Nullable<std::string> EncryptionKey;
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;
7824  }; // struct UploadPageBlobPagesOptions
7825 
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,
7831  const UploadPageBlobPagesOptions& options)
7832  {
7833  unused(options);
7834  auto request
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())
7840  {
7841  request.GetUrl().AppendQuery("timeout", std::to_string(options.Timeout.GetValue()));
7842  }
7843  request.AddHeader(
7844  "x-ms-range",
7845  "bytes=" + std::to_string(options.Range.first) + "-"
7846  + std::to_string(options.Range.second));
7847  if (options.TransactionalContentMd5.HasValue())
7848  {
7849  request.AddHeader("Content-MD5", options.TransactionalContentMd5.GetValue());
7850  }
7851  if (options.TransactionalContentCrc64.HasValue())
7852  {
7853  request.AddHeader("x-ms-content-crc64", options.TransactionalContentCrc64.GetValue());
7854  }
7855  request.AddHeader("x-ms-page-write", "update");
7856  if (options.LeaseId.HasValue())
7857  {
7858  request.AddHeader("x-ms-lease-id", options.LeaseId.GetValue());
7859  }
7860  if (options.IfSequenceNumberLessThanOrEqualTo.HasValue())
7861  {
7862  request.AddHeader(
7863  "x-ms-if-sequence-number-le",
7864  std::to_string(options.IfSequenceNumberLessThanOrEqualTo.GetValue()));
7865  }
7866  if (options.IfSequenceNumberLessThan.HasValue())
7867  {
7868  request.AddHeader(
7869  "x-ms-if-sequence-number-lt",
7870  std::to_string(options.IfSequenceNumberLessThan.GetValue()));
7871  }
7872  if (options.IfSequenceNumberEqualTo.HasValue())
7873  {
7874  request.AddHeader(
7875  "x-ms-if-sequence-number-eq",
7876  std::to_string(options.IfSequenceNumberEqualTo.GetValue()));
7877  }
7878  if (options.EncryptionKey.HasValue())
7879  {
7880  request.AddHeader("x-ms-encryption-key", options.EncryptionKey.GetValue());
7881  }
7882  if (options.EncryptionKeySha256.HasValue())
7883  {
7884  request.AddHeader("x-ms-encryption-key-sha256", options.EncryptionKeySha256.GetValue());
7885  }
7886  if (options.EncryptionAlgorithm.HasValue())
7887  {
7888  request.AddHeader(
7889  "x-ms-encryption-algorithm",
7890  EncryptionAlgorithmTypeToString(options.EncryptionAlgorithm.GetValue()));
7891  }
7892  if (options.EncryptionScope.HasValue())
7893  {
7894  request.AddHeader("x-ms-encryption-scope", options.EncryptionScope.GetValue());
7895  }
7896  if (options.IfModifiedSince.HasValue())
7897  {
7898  request.AddHeader("If-Modified-Since", options.IfModifiedSince.GetValue());
7899  }
7900  if (options.IfUnmodifiedSince.HasValue())
7901  {
7902  request.AddHeader("If-Unmodified-Since", options.IfUnmodifiedSince.GetValue());
7903  }
7904  if (options.IfMatch.HasValue())
7905  {
7906  request.AddHeader("If-Match", options.IfMatch.GetValue());
7907  }
7908  if (options.IfNoneMatch.HasValue())
7909  {
7910  request.AddHeader("If-None-Match", options.IfNoneMatch.GetValue());
7911  }
7912  if (options.IfTags.HasValue())
7913  {
7914  request.AddHeader("x-ms-if-tags", options.IfTags.GetValue());
7915  }
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))
7923  {
7924  throw StorageError::CreateFromResponse(std::move(pHttpResponse));
7925  }
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())
7931  {
7932  response.TransactionalContentMd5 = response_transactional_content_md5_iterator->second;
7933  }
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())
7937  {
7938  response.TransactionalContentCrc64
7939  = response_transactional_content_crc64_iterator->second;
7940  }
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())
7946  {
7947  response.ServerEncrypted = response_server_encrypted_iterator->second == "true";
7948  }
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())
7952  {
7953  response.EncryptionKeySha256 = response_encryption_key_sha256_iterator->second;
7954  }
7955  auto response_encryption_scope_iterator
7956  = httpResponse.GetHeaders().find("x-ms-encryption-scope");
7957  if (response_encryption_scope_iterator != httpResponse.GetHeaders().end())
7958  {
7959  response.EncryptionScope = response_encryption_scope_iterator->second;
7960  }
7961  return Azure::Core::Response<UploadPageBlobPagesResult>(
7962  std::move(response), std::move(pHttpResponse));
7963  }
7964 
7966  {
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;
7977  Azure::Core::Nullable<std::string> EncryptionKey;
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;
7986  }; // struct UploadPageBlobPagesFromUriOptions
7987 
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,
7992  const UploadPageBlobPagesFromUriOptions& options)
7993  {
7994  unused(options);
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())
8000  {
8001  request.GetUrl().AppendQuery("timeout", std::to_string(options.Timeout.GetValue()));
8002  }
8003  request.AddHeader(
8004  "x-ms-range",
8005  "bytes=" + std::to_string(options.Range.first) + "-"
8006  + std::to_string(options.Range.second));
8007  request.AddHeader("x-ms-copy-source", options.SourceUri);
8008  request.AddHeader(
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())
8013  {
8014  request.AddHeader("x-ms-source-content-md5", options.TransactionalContentMd5.GetValue());
8015  }
8016  if (options.TransactionalContentCrc64.HasValue())
8017  {
8018  request.AddHeader(
8019  "x-ms-source-content-crc64", options.TransactionalContentCrc64.GetValue());
8020  }
8021  request.AddHeader("x-ms-page-write", "update");
8022  if (options.LeaseId.HasValue())
8023  {
8024  request.AddHeader("x-ms-lease-id", options.LeaseId.GetValue());
8025  }
8026  if (options.IfSequenceNumberLessThanOrEqualTo.HasValue())
8027  {
8028  request.AddHeader(
8029  "x-ms-if-sequence-number-le",
8030  std::to_string(options.IfSequenceNumberLessThanOrEqualTo.GetValue()));
8031  }
8032  if (options.IfSequenceNumberLessThan.HasValue())
8033  {
8034  request.AddHeader(
8035  "x-ms-if-sequence-number-lt",
8036  std::to_string(options.IfSequenceNumberLessThan.GetValue()));
8037  }
8038  if (options.IfSequenceNumberEqualTo.HasValue())
8039  {
8040  request.AddHeader(
8041  "x-ms-if-sequence-number-eq",
8042  std::to_string(options.IfSequenceNumberEqualTo.GetValue()));
8043  }
8044  if (options.EncryptionKey.HasValue())
8045  {
8046  request.AddHeader("x-ms-encryption-key", options.EncryptionKey.GetValue());
8047  }
8048  if (options.EncryptionKeySha256.HasValue())
8049  {
8050  request.AddHeader("x-ms-encryption-key-sha256", options.EncryptionKeySha256.GetValue());
8051  }
8052  if (options.EncryptionAlgorithm.HasValue())
8053  {
8054  request.AddHeader(
8055  "x-ms-encryption-algorithm",
8056  EncryptionAlgorithmTypeToString(options.EncryptionAlgorithm.GetValue()));
8057  }
8058  if (options.EncryptionScope.HasValue())
8059  {
8060  request.AddHeader("x-ms-encryption-scope", options.EncryptionScope.GetValue());
8061  }
8062  if (options.IfModifiedSince.HasValue())
8063  {
8064  request.AddHeader("If-Modified-Since", options.IfModifiedSince.GetValue());
8065  }
8066  if (options.IfUnmodifiedSince.HasValue())
8067  {
8068  request.AddHeader("If-Unmodified-Since", options.IfUnmodifiedSince.GetValue());
8069  }
8070  if (options.IfMatch.HasValue())
8071  {
8072  request.AddHeader("If-Match", options.IfMatch.GetValue());
8073  }
8074  if (options.IfNoneMatch.HasValue())
8075  {
8076  request.AddHeader("If-None-Match", options.IfNoneMatch.GetValue());
8077  }
8078  if (options.IfTags.HasValue())
8079  {
8080  request.AddHeader("x-ms-if-tags", options.IfTags.GetValue());
8081  }
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))
8089  {
8090  throw StorageError::CreateFromResponse(std::move(pHttpResponse));
8091  }
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())
8097  {
8098  response.TransactionalContentMd5 = response_transactional_content_md5_iterator->second;
8099  }
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())
8103  {
8104  response.TransactionalContentCrc64
8105  = response_transactional_content_crc64_iterator->second;
8106  }
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())
8112  {
8113  response.ServerEncrypted = response_server_encrypted_iterator->second == "true";
8114  }
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())
8118  {
8119  response.EncryptionKeySha256 = response_encryption_key_sha256_iterator->second;
8120  }
8121  auto response_encryption_scope_iterator
8122  = httpResponse.GetHeaders().find("x-ms-encryption-scope");
8123  if (response_encryption_scope_iterator != httpResponse.GetHeaders().end())
8124  {
8125  response.EncryptionScope = response_encryption_scope_iterator->second;
8126  }
8127  return Azure::Core::Response<UploadPageBlobPagesFromUriResult>(
8128  std::move(response), std::move(pHttpResponse));
8129  }
8130 
8132  {
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;
8139  Azure::Core::Nullable<std::string> EncryptionKey;
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;
8148  }; // struct ClearPageBlobPagesOptions
8149 
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,
8154  const ClearPageBlobPagesOptions& options)
8155  {
8156  unused(options);
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())
8162  {
8163  request.GetUrl().AppendQuery("timeout", std::to_string(options.Timeout.GetValue()));
8164  }
8165  request.AddHeader(
8166  "x-ms-range",
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())
8171  {
8172  request.AddHeader("x-ms-lease-id", options.LeaseId.GetValue());
8173  }
8174  if (options.IfSequenceNumberLessThanOrEqualTo.HasValue())
8175  {
8176  request.AddHeader(
8177  "x-ms-if-sequence-number-le",
8178  std::to_string(options.IfSequenceNumberLessThanOrEqualTo.GetValue()));
8179  }
8180  if (options.IfSequenceNumberLessThan.HasValue())
8181  {
8182  request.AddHeader(
8183  "x-ms-if-sequence-number-lt",
8184  std::to_string(options.IfSequenceNumberLessThan.GetValue()));
8185  }
8186  if (options.IfSequenceNumberEqualTo.HasValue())
8187  {
8188  request.AddHeader(
8189  "x-ms-if-sequence-number-eq",
8190  std::to_string(options.IfSequenceNumberEqualTo.GetValue()));
8191  }
8192  if (options.EncryptionKey.HasValue())
8193  {
8194  request.AddHeader("x-ms-encryption-key", options.EncryptionKey.GetValue());
8195  }
8196  if (options.EncryptionKeySha256.HasValue())
8197  {
8198  request.AddHeader("x-ms-encryption-key-sha256", options.EncryptionKeySha256.GetValue());
8199  }
8200  if (options.EncryptionAlgorithm.HasValue())
8201  {
8202  request.AddHeader(
8203  "x-ms-encryption-algorithm",
8204  EncryptionAlgorithmTypeToString(options.EncryptionAlgorithm.GetValue()));
8205  }
8206  if (options.EncryptionScope.HasValue())
8207  {
8208  request.AddHeader("x-ms-encryption-scope", options.EncryptionScope.GetValue());
8209  }
8210  if (options.IfModifiedSince.HasValue())
8211  {
8212  request.AddHeader("If-Modified-Since", options.IfModifiedSince.GetValue());
8213  }
8214  if (options.IfUnmodifiedSince.HasValue())
8215  {
8216  request.AddHeader("If-Unmodified-Since", options.IfUnmodifiedSince.GetValue());
8217  }
8218  if (options.IfMatch.HasValue())
8219  {
8220  request.AddHeader("If-Match", options.IfMatch.GetValue());
8221  }
8222  if (options.IfNoneMatch.HasValue())
8223  {
8224  request.AddHeader("If-None-Match", options.IfNoneMatch.GetValue());
8225  }
8226  if (options.IfTags.HasValue())
8227  {
8228  request.AddHeader("x-ms-if-tags", options.IfTags.GetValue());
8229  }
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))
8237  {
8238  throw StorageError::CreateFromResponse(std::move(pHttpResponse));
8239  }
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())
8247  {
8248  response.ServerEncrypted = response_server_encrypted_iterator->second == "true";
8249  }
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())
8253  {
8254  response.EncryptionKeySha256 = response_encryption_key_sha256_iterator->second;
8255  }
8256  auto response_encryption_scope_iterator
8257  = httpResponse.GetHeaders().find("x-ms-encryption-scope");
8258  if (response_encryption_scope_iterator != httpResponse.GetHeaders().end())
8259  {
8260  response.EncryptionScope = response_encryption_scope_iterator->second;
8261  }
8262  return Azure::Core::Response<ClearPageBlobPagesResult>(
8263  std::move(response), std::move(pHttpResponse));
8264  }
8265 
8267  {
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;
8274  Azure::Core::Nullable<std::string> EncryptionKey;
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;
8283  }; // struct ResizePageBlobOptions
8284 
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,
8289  const ResizePageBlobOptions& options)
8290  {
8291  unused(options);
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())
8297  {
8298  request.GetUrl().AppendQuery("timeout", std::to_string(options.Timeout.GetValue()));
8299  }
8300  request.AddHeader("x-ms-blob-content-length", std::to_string(options.BlobContentLength));
8301  if (options.LeaseId.HasValue())
8302  {
8303  request.AddHeader("x-ms-lease-id", options.LeaseId.GetValue());
8304  }
8305  if (options.IfSequenceNumberLessThanOrEqualTo.HasValue())
8306  {
8307  request.AddHeader(
8308  "x-ms-if-sequence-number-le",
8309  std::to_string(options.IfSequenceNumberLessThanOrEqualTo.GetValue()));
8310  }
8311  if (options.IfSequenceNumberLessThan.HasValue())
8312  {
8313  request.AddHeader(
8314  "x-ms-if-sequence-number-lt",
8315  std::to_string(options.IfSequenceNumberLessThan.GetValue()));
8316  }
8317  if (options.IfSequenceNumberEqualTo.HasValue())
8318  {
8319  request.AddHeader(
8320  "x-ms-if-sequence-number-eq",
8321  std::to_string(options.IfSequenceNumberEqualTo.GetValue()));
8322  }
8323  if (options.EncryptionKey.HasValue())
8324  {
8325  request.AddHeader("x-ms-encryption-key", options.EncryptionKey.GetValue());
8326  }
8327  if (options.EncryptionKeySha256.HasValue())
8328  {
8329  request.AddHeader("x-ms-encryption-key-sha256", options.EncryptionKeySha256.GetValue());
8330  }
8331  if (options.EncryptionAlgorithm.HasValue())
8332  {
8333  request.AddHeader(
8334  "x-ms-encryption-algorithm",
8335  EncryptionAlgorithmTypeToString(options.EncryptionAlgorithm.GetValue()));
8336  }
8337  if (options.EncryptionScope.HasValue())
8338  {
8339  request.AddHeader("x-ms-encryption-scope", options.EncryptionScope.GetValue());
8340  }
8341  if (options.IfModifiedSince.HasValue())
8342  {
8343  request.AddHeader("If-Modified-Since", options.IfModifiedSince.GetValue());
8344  }
8345  if (options.IfUnmodifiedSince.HasValue())
8346  {
8347  request.AddHeader("If-Unmodified-Since", options.IfUnmodifiedSince.GetValue());
8348  }
8349  if (options.IfMatch.HasValue())
8350  {
8351  request.AddHeader("If-Match", options.IfMatch.GetValue());
8352  }
8353  if (options.IfNoneMatch.HasValue())
8354  {
8355  request.AddHeader("If-None-Match", options.IfNoneMatch.GetValue());
8356  }
8357  if (options.IfTags.HasValue())
8358  {
8359  request.AddHeader("x-ms-if-tags", options.IfTags.GetValue());
8360  }
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))
8368  {
8369  throw StorageError::CreateFromResponse(std::move(pHttpResponse));
8370  }
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));
8377  }
8378 
8380  {
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;
8391  }; // struct GetPageBlobPageRangesOptions
8392 
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,
8397  const GetPageBlobPageRangesOptions& options)
8398  {
8399  unused(options);
8400  auto request = Azure::Core::Http::Request(Azure::Core::Http::HttpMethod::Get, url);
8401  request.GetUrl().AppendQuery("comp", "pagelist");
8402  if (options.PreviousSnapshot.HasValue())
8403  {
8404  request.GetUrl().AppendQuery("prevsnapshot", options.PreviousSnapshot.GetValue());
8405  }
8406  request.AddHeader("x-ms-version", c_ApiVersion);
8407  if (options.Timeout.HasValue())
8408  {
8409  request.GetUrl().AppendQuery("timeout", std::to_string(options.Timeout.GetValue()));
8410  }
8411  if (options.Range.HasValue())
8412  {
8413  auto startOffset = options.Range.GetValue().first;
8414  auto endOffset = options.Range.GetValue().second;
8415  if (endOffset != std::numeric_limits<decltype(endOffset)>::max())
8416  {
8417  request.AddHeader(
8418  "x-ms-range",
8419  "bytes=" + std::to_string(startOffset) + "-" + std::to_string(endOffset));
8420  }
8421  else
8422  {
8423  request.AddHeader("x-ms-range", "bytes=" + std::to_string(startOffset) + "-");
8424  }
8425  }
8426  if (options.LeaseId.HasValue())
8427  {
8428  request.AddHeader("x-ms-lease-id", options.LeaseId.GetValue());
8429  }
8430  if (options.PreviousSnapshotUrl.HasValue())
8431  {
8432  request.AddHeader("x-ms-previous-snapshot-url", options.PreviousSnapshotUrl.GetValue());
8433  }
8434  if (options.IfModifiedSince.HasValue())
8435  {
8436  request.AddHeader("If-Modified-Since", options.IfModifiedSince.GetValue());
8437  }
8438  if (options.IfUnmodifiedSince.HasValue())
8439  {
8440  request.AddHeader("If-Unmodified-Since", options.IfUnmodifiedSince.GetValue());
8441  }
8442  if (options.IfMatch.HasValue())
8443  {
8444  request.AddHeader("If-Match", options.IfMatch.GetValue());
8445  }
8446  if (options.IfNoneMatch.HasValue())
8447  {
8448  request.AddHeader("If-None-Match", options.IfNoneMatch.GetValue());
8449  }
8450  if (options.IfTags.HasValue())
8451  {
8452  request.AddHeader("x-ms-if-tags", options.IfTags.GetValue());
8453  }
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))
8461  {
8462  throw StorageError::CreateFromResponse(std::move(pHttpResponse));
8463  }
8464  {
8465  const auto& httpResponseBody = httpResponse.GetBody();
8466  XmlReader reader(
8467  reinterpret_cast<const char*>(httpResponseBody.data()), httpResponseBody.size());
8468  response = GetPageBlobPageRangesResultInternalFromXml(reader);
8469  }
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));
8476  }
8477 
8479  {
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;
8487  }; // struct StartCopyPageBlobIncrementalOptions
8488 
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,
8493  const StartCopyPageBlobIncrementalOptions& options)
8494  {
8495  unused(options);
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())
8501  {
8502  request.GetUrl().AppendQuery("timeout", std::to_string(options.Timeout.GetValue()));
8503  }
8504  request.AddHeader("x-ms-copy-source", options.CopySource);
8505  if (options.IfModifiedSince.HasValue())
8506  {
8507  request.AddHeader("If-Modified-Since", options.IfModifiedSince.GetValue());
8508  }
8509  if (options.IfUnmodifiedSince.HasValue())
8510  {
8511  request.AddHeader("If-Unmodified-Since", options.IfUnmodifiedSince.GetValue());
8512  }
8513  if (options.IfMatch.HasValue())
8514  {
8515  request.AddHeader("If-Match", options.IfMatch.GetValue());
8516  }
8517  if (options.IfNoneMatch.HasValue())
8518  {
8519  request.AddHeader("If-None-Match", options.IfNoneMatch.GetValue());
8520  }
8521  if (options.IfTags.HasValue())
8522  {
8523  request.AddHeader("x-ms-if-tags", options.IfTags.GetValue());
8524  }
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))
8532  {
8533  throw StorageError::CreateFromResponse(std::move(pHttpResponse));
8534  }
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");
8538  response.CopyStatus
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())
8542  {
8543  response.VersionId = response_version_id_iterator->second;
8544  }
8545  return Azure::Core::Response<StartCopyPageBlobIncrementalResult>(
8546  std::move(response), std::move(pHttpResponse));
8547  }
8548 
8549  private:
8550  static GetPageBlobPageRangesResultInternal GetPageBlobPageRangesResultInternalFromXml(
8551  XmlReader& reader)
8552  {
8553  GetPageBlobPageRangesResultInternal ret;
8554  enum class XmlTagName
8555  {
8556  k_PageList,
8557  k_PageRange,
8558  k_ClearRange,
8559  k_Unknown,
8560  };
8561  std::vector<XmlTagName> path;
8562  while (true)
8563  {
8564  auto node = reader.Read();
8565  if (node.Type == XmlNodeType::End)
8566  {
8567  break;
8568  }
8569  else if (node.Type == XmlNodeType::EndTag)
8570  {
8571  if (path.size() > 0)
8572  {
8573  path.pop_back();
8574  }
8575  else
8576  {
8577  break;
8578  }
8579  }
8580  else if (node.Type == XmlNodeType::StartTag)
8581  {
8582  if (std::strcmp(node.Name, "PageList") == 0)
8583  {
8584  path.emplace_back(XmlTagName::k_PageList);
8585  }
8586  else if (std::strcmp(node.Name, "PageRange") == 0)
8587  {
8588  path.emplace_back(XmlTagName::k_PageRange);
8589  }
8590  else if (std::strcmp(node.Name, "ClearRange") == 0)
8591  {
8592  path.emplace_back(XmlTagName::k_ClearRange);
8593  }
8594  else
8595  {
8596  path.emplace_back(XmlTagName::k_Unknown);
8597  }
8598  if (path.size() == 2 && path[0] == XmlTagName::k_PageList
8599  && path[1] == XmlTagName::k_PageRange)
8600  {
8601  ret.PageRanges.emplace_back(PageRangesFromXml(reader));
8602  path.pop_back();
8603  }
8604  else if (
8605  path.size() == 2 && path[0] == XmlTagName::k_PageList
8606  && path[1] == XmlTagName::k_ClearRange)
8607  {
8608  ret.ClearRanges.emplace_back(ClearRangesFromXml(reader));
8609  path.pop_back();
8610  }
8611  }
8612  else if (node.Type == XmlNodeType::Text)
8613  {
8614  }
8615  }
8616  return ret;
8617  }
8618 
8619  static std::pair<int64_t, int64_t> ClearRangesFromXml(XmlReader& reader)
8620  {
8621  int depth = 0;
8622  bool is_start = false;
8623  bool is_end = false;
8624  int64_t start = 0;
8625  int64_t end = 0;
8626  while (true)
8627  {
8628  auto node = reader.Read();
8629  if (node.Type == XmlNodeType::End)
8630  {
8631  break;
8632  }
8633  else if (node.Type == XmlNodeType::StartTag && strcmp(node.Name, "Start") == 0)
8634  {
8635  ++depth;
8636  is_start = true;
8637  }
8638  else if (node.Type == XmlNodeType::StartTag && strcmp(node.Name, "End") == 0)
8639  {
8640  ++depth;
8641  is_end = true;
8642  }
8643  else if (node.Type == XmlNodeType::EndTag)
8644  {
8645  is_start = false;
8646  is_end = false;
8647  if (depth-- == 0)
8648  {
8649  break;
8650  }
8651  }
8652  if (depth == 1 && node.Type == XmlNodeType::Text)
8653  {
8654  if (is_start)
8655  {
8656  start = std::stoll(node.Value);
8657  }
8658  else if (is_end)
8659  {
8660  end = std::stoll(node.Value);
8661  }
8662  }
8663  }
8664  return std::make_pair(start, end);
8665  }
8666 
8667  static std::pair<int64_t, int64_t> PageRangesFromXml(XmlReader& reader)
8668  {
8669  int depth = 0;
8670  bool is_start = false;
8671  bool is_end = false;
8672  int64_t start = 0;
8673  int64_t end = 0;
8674  while (true)
8675  {
8676  auto node = reader.Read();
8677  if (node.Type == XmlNodeType::End)
8678  {
8679  break;
8680  }
8681  else if (node.Type == XmlNodeType::StartTag && strcmp(node.Name, "Start") == 0)
8682  {
8683  ++depth;
8684  is_start = true;
8685  }
8686  else if (node.Type == XmlNodeType::StartTag && strcmp(node.Name, "End") == 0)
8687  {
8688  ++depth;
8689  is_end = true;
8690  }
8691  else if (node.Type == XmlNodeType::EndTag)
8692  {
8693  is_start = false;
8694  is_end = false;
8695  if (depth-- == 0)
8696  {
8697  break;
8698  }
8699  }
8700  if (depth == 1 && node.Type == XmlNodeType::Text)
8701  {
8702  if (is_start)
8703  {
8704  start = std::stoll(node.Value);
8705  }
8706  else if (is_end)
8707  {
8708  end = std::stoll(node.Value);
8709  }
8710  }
8711  }
8712  return std::make_pair(start, end);
8713  }
8714 
8715  }; // class PageBlob
8716 
8717  class AppendBlob {
8718  public:
8720  {
8721  Azure::Core::Nullable<int32_t> Timeout;
8722  BlobHttpHeaders HttpHeaders;
8723  std::map<std::string, std::string> Metadata;
8724  Azure::Core::Nullable<std::string> LeaseId;
8725  Azure::Core::Nullable<std::string> EncryptionKey;
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;
8734  }; // struct CreateAppendBlobOptions
8735 
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,
8740  const CreateAppendBlobOptions& options)
8741  {
8742  unused(options);
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())
8747  {
8748  request.GetUrl().AppendQuery("timeout", std::to_string(options.Timeout.GetValue()));
8749  }
8750  if (!options.HttpHeaders.ContentType.empty())
8751  {
8752  request.AddHeader("x-ms-blob-content-type", options.HttpHeaders.ContentType);
8753  }
8754  if (!options.HttpHeaders.ContentEncoding.empty())
8755  {
8756  request.AddHeader("x-ms-blob-content-encoding", options.HttpHeaders.ContentEncoding);
8757  }
8758  if (!options.HttpHeaders.ContentLanguage.empty())
8759  {
8760  request.AddHeader("x-ms-blob-content-language", options.HttpHeaders.ContentLanguage);
8761  }
8762  if (!options.HttpHeaders.CacheControl.empty())
8763  {
8764  request.AddHeader("x-ms-blob-cache-control", options.HttpHeaders.CacheControl);
8765  }
8766  if (!options.HttpHeaders.ContentMd5.empty())
8767  {
8768  request.AddHeader("x-ms-blob-content-md5", options.HttpHeaders.ContentMd5);
8769  }
8770  if (!options.HttpHeaders.ContentDisposition.empty())
8771  {
8772  request.AddHeader(
8773  "x-ms-blob-content-disposition", options.HttpHeaders.ContentDisposition);
8774  }
8775  std::set<std::string> metadataKeys;
8776  for (const auto& pair : options.Metadata)
8777  {
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));
8781  });
8782  if (metadataKeys.insert(key).second == false)
8783  {
8784  throw std::runtime_error("duplicate keys in metadata");
8785  }
8786  request.AddHeader("x-ms-meta-" + pair.first, pair.second);
8787  }
8788  metadataKeys.clear();
8789  if (options.LeaseId.HasValue())
8790  {
8791  request.AddHeader("x-ms-lease-id", options.LeaseId.GetValue());
8792  }
8793  request.AddHeader("x-ms-blob-type", "AppendBlob");
8794  if (options.EncryptionKey.HasValue())
8795  {
8796  request.AddHeader("x-ms-encryption-key", options.EncryptionKey.GetValue());
8797  }
8798  if (options.EncryptionKeySha256.HasValue())
8799  {
8800  request.AddHeader("x-ms-encryption-key-sha256", options.EncryptionKeySha256.GetValue());
8801  }
8802  if (options.EncryptionAlgorithm.HasValue())
8803  {
8804  request.AddHeader(
8805  "x-ms-encryption-algorithm",
8806  EncryptionAlgorithmTypeToString(options.EncryptionAlgorithm.GetValue()));
8807  }
8808  if (options.EncryptionScope.HasValue())
8809  {
8810  request.AddHeader("x-ms-encryption-scope", options.EncryptionScope.GetValue());
8811  }
8812  if (options.IfModifiedSince.HasValue())
8813  {
8814  request.AddHeader("If-Modified-Since", options.IfModifiedSince.GetValue());
8815  }
8816  if (options.IfUnmodifiedSince.HasValue())
8817  {
8818  request.AddHeader("If-Unmodified-Since", options.IfUnmodifiedSince.GetValue());
8819  }
8820  if (options.IfMatch.HasValue())
8821  {
8822  request.AddHeader("If-Match", options.IfMatch.GetValue());
8823  }
8824  if (options.IfNoneMatch.HasValue())
8825  {
8826  request.AddHeader("If-None-Match", options.IfNoneMatch.GetValue());
8827  }
8828  if (options.IfTags.HasValue())
8829  {
8830  request.AddHeader("x-ms-if-tags", options.IfTags.GetValue());
8831  }
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))
8839  {
8840  throw StorageError::CreateFromResponse(std::move(pHttpResponse));
8841  }
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())
8846  {
8847  response.VersionId = response_version_id_iterator->second;
8848  }
8849  auto response_server_encrypted_iterator
8850  = httpResponse.GetHeaders().find("x-ms-request-server-encrypted");
8851  if (response_server_encrypted_iterator != httpResponse.GetHeaders().end())
8852  {
8853  response.ServerEncrypted = response_server_encrypted_iterator->second == "true";
8854  }
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())
8858  {
8859  response.EncryptionKeySha256 = response_encryption_key_sha256_iterator->second;
8860  }
8861  auto response_encryption_scope_iterator
8862  = httpResponse.GetHeaders().find("x-ms-encryption-scope");
8863  if (response_encryption_scope_iterator != httpResponse.GetHeaders().end())
8864  {
8865  response.EncryptionScope = response_encryption_scope_iterator->second;
8866  }
8867  return Azure::Core::Response<CreateAppendBlobResult>(
8868  std::move(response), std::move(pHttpResponse));
8869  }
8870 
8872  {
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;
8879  Azure::Core::Nullable<std::string> EncryptionKey;
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;
8888  }; // struct AppendBlockOptions
8889 
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,
8895  const AppendBlockOptions& options)
8896  {
8897  unused(options);
8898  auto request
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())
8904  {
8905  request.GetUrl().AppendQuery("timeout", std::to_string(options.Timeout.GetValue()));
8906  }
8907  if (options.TransactionalContentMd5.HasValue())
8908  {
8909  request.AddHeader("Content-MD5", options.TransactionalContentMd5.GetValue());
8910  }
8911  if (options.TransactionalContentCrc64.HasValue())
8912  {
8913  request.AddHeader("x-ms-content-crc64", options.TransactionalContentCrc64.GetValue());
8914  }
8915  if (options.LeaseId.HasValue())
8916  {
8917  request.AddHeader("x-ms-lease-id", options.LeaseId.GetValue());
8918  }
8919  if (options.MaxSize.HasValue())
8920  {
8921  request.AddHeader(
8922  "x-ms-blob-condition-maxsize", std::to_string(options.MaxSize.GetValue()));
8923  }
8924  if (options.AppendPosition.HasValue())
8925  {
8926  request.AddHeader(
8927  "x-ms-blob-condition-appendpos", std::to_string(options.AppendPosition.GetValue()));
8928  }
8929  if (options.EncryptionKey.HasValue())
8930  {
8931  request.AddHeader("x-ms-encryption-key", options.EncryptionKey.GetValue());
8932  }
8933  if (options.EncryptionKeySha256.HasValue())
8934  {
8935  request.AddHeader("x-ms-encryption-key-sha256", options.EncryptionKeySha256.GetValue());
8936  }
8937  if (options.EncryptionAlgorithm.HasValue())
8938  {
8939  request.AddHeader(
8940  "x-ms-encryption-algorithm",
8941  EncryptionAlgorithmTypeToString(options.EncryptionAlgorithm.GetValue()));
8942  }
8943  if (options.EncryptionScope.HasValue())
8944  {
8945  request.AddHeader("x-ms-encryption-scope", options.EncryptionScope.GetValue());
8946  }
8947  if (options.IfModifiedSince.HasValue())
8948  {
8949  request.AddHeader("If-Modified-Since", options.IfModifiedSince.GetValue());
8950  }
8951  if (options.IfUnmodifiedSince.HasValue())
8952  {
8953  request.AddHeader("If-Unmodified-Since", options.IfUnmodifiedSince.GetValue());
8954  }
8955  if (options.IfMatch.HasValue())
8956  {
8957  request.AddHeader("If-Match", options.IfMatch.GetValue());
8958  }
8959  if (options.IfNoneMatch.HasValue())
8960  {
8961  request.AddHeader("If-None-Match", options.IfNoneMatch.GetValue());
8962  }
8963  if (options.IfTags.HasValue())
8964  {
8965  request.AddHeader("x-ms-if-tags", options.IfTags.GetValue());
8966  }
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))
8974  {
8975  throw StorageError::CreateFromResponse(std::move(pHttpResponse));
8976  }
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())
8982  {
8983  response.TransactionalContentMd5 = response_transactional_content_md5_iterator->second;
8984  }
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())
8988  {
8989  response.TransactionalContentCrc64
8990  = response_transactional_content_crc64_iterator->second;
8991  }
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())
8998  {
8999  response.ServerEncrypted = response_server_encrypted_iterator->second == "true";
9000  }
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())
9004  {
9005  response.EncryptionKeySha256 = response_encryption_key_sha256_iterator->second;
9006  }
9007  auto response_encryption_scope_iterator
9008  = httpResponse.GetHeaders().find("x-ms-encryption-scope");
9009  if (response_encryption_scope_iterator != httpResponse.GetHeaders().end())
9010  {
9011  response.EncryptionScope = response_encryption_scope_iterator->second;
9012  }
9013  return Azure::Core::Response<AppendBlockResult>(
9014  std::move(response), std::move(pHttpResponse));
9015  }
9016 
9018  {
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;
9027  Azure::Core::Nullable<std::string> EncryptionKey;
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;
9036  }; // struct AppendBlockFromUriOptions
9037 
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,
9042  const AppendBlockFromUriOptions& options)
9043  {
9044  unused(options);
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())
9050  {
9051  request.GetUrl().AppendQuery("timeout", std::to_string(options.Timeout.GetValue()));
9052  }
9053  request.AddHeader("x-ms-copy-source", options.SourceUri);
9054  if (options.SourceRange.HasValue())
9055  {
9056  auto startOffset = options.SourceRange.GetValue().first;
9057  auto endOffset = options.SourceRange.GetValue().second;
9058  if (endOffset != std::numeric_limits<decltype(endOffset)>::max())
9059  {
9060  request.AddHeader(
9061  "x-ms-source-range",
9062  "bytes=" + std::to_string(startOffset) + "-" + std::to_string(endOffset));
9063  }
9064  else
9065  {
9066  request.AddHeader("x-ms-source-range", "bytes=" + std::to_string(startOffset) + "-");
9067  }
9068  }
9069  if (options.TransactionalContentMd5.HasValue())
9070  {
9071  request.AddHeader("x-ms-source-content-md5", options.TransactionalContentMd5.GetValue());
9072  }
9073  if (options.TransactionalContentCrc64.HasValue())
9074  {
9075  request.AddHeader(
9076  "x-ms-source-content-crc64", options.TransactionalContentCrc64.GetValue());
9077  }
9078  if (options.LeaseId.HasValue())
9079  {
9080  request.AddHeader("x-ms-lease-id", options.LeaseId.GetValue());
9081  }
9082  if (options.MaxSize.HasValue())
9083  {
9084  request.AddHeader(
9085  "x-ms-blob-condition-maxsize", std::to_string(options.MaxSize.GetValue()));
9086  }
9087  if (options.AppendPosition.HasValue())
9088  {
9089  request.AddHeader(
9090  "x-ms-blob-condition-appendpos", std::to_string(options.AppendPosition.GetValue()));
9091  }
9092  if (options.EncryptionKey.HasValue())
9093  {
9094  request.AddHeader("x-ms-encryption-key", options.EncryptionKey.GetValue());
9095  }
9096  if (options.EncryptionKeySha256.HasValue())
9097  {
9098  request.AddHeader("x-ms-encryption-key-sha256", options.EncryptionKeySha256.GetValue());
9099  }
9100  if (options.EncryptionAlgorithm.HasValue())
9101  {
9102  request.AddHeader(
9103  "x-ms-encryption-algorithm",
9104  EncryptionAlgorithmTypeToString(options.EncryptionAlgorithm.GetValue()));
9105  }
9106  if (options.EncryptionScope.HasValue())
9107  {
9108  request.AddHeader("x-ms-encryption-scope", options.EncryptionScope.GetValue());
9109  }
9110  if (options.IfModifiedSince.HasValue())
9111  {
9112  request.AddHeader("If-Modified-Since", options.IfModifiedSince.GetValue());
9113  }
9114  if (options.IfUnmodifiedSince.HasValue())
9115  {
9116  request.AddHeader("If-Unmodified-Since", options.IfUnmodifiedSince.GetValue());
9117  }
9118  if (options.IfMatch.HasValue())
9119  {
9120  request.AddHeader("If-Match", options.IfMatch.GetValue());
9121  }
9122  if (options.IfNoneMatch.HasValue())
9123  {
9124  request.AddHeader("If-None-Match", options.IfNoneMatch.GetValue());
9125  }
9126  if (options.IfTags.HasValue())
9127  {
9128  request.AddHeader("x-ms-if-tags", options.IfTags.GetValue());
9129  }
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))
9137  {
9138  throw StorageError::CreateFromResponse(std::move(pHttpResponse));
9139  }
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())
9145  {
9146  response.TransactionalContentMd5 = response_transactional_content_md5_iterator->second;
9147  }
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())
9151  {
9152  response.TransactionalContentCrc64
9153  = response_transactional_content_crc64_iterator->second;
9154  }
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())
9161  {
9162  response.ServerEncrypted = response_server_encrypted_iterator->second == "true";
9163  }
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())
9167  {
9168  response.EncryptionKeySha256 = response_encryption_key_sha256_iterator->second;
9169  }
9170  auto response_encryption_scope_iterator
9171  = httpResponse.GetHeaders().find("x-ms-encryption-scope");
9172  if (response_encryption_scope_iterator != httpResponse.GetHeaders().end())
9173  {
9174  response.EncryptionScope = response_encryption_scope_iterator->second;
9175  }
9176  return Azure::Core::Response<AppendBlockFromUriResult>(
9177  std::move(response), std::move(pHttpResponse));
9178  }
9179 
9181  {
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;
9190  }; // struct SealAppendBlobOptions
9191 
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,
9196  const SealAppendBlobOptions& options)
9197  {
9198  unused(options);
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())
9204  {
9205  request.GetUrl().AppendQuery("timeout", std::to_string(options.Timeout.GetValue()));
9206  }
9207  if (options.LeaseId.HasValue())
9208  {
9209  request.AddHeader("x-ms-lease-id", options.LeaseId.GetValue());
9210  }
9211  if (options.IfModifiedSince.HasValue())
9212  {
9213  request.AddHeader("If-Modified-Since", options.IfModifiedSince.GetValue());
9214  }
9215  if (options.IfUnmodifiedSince.HasValue())
9216  {
9217  request.AddHeader("If-Unmodified-Since", options.IfUnmodifiedSince.GetValue());
9218  }
9219  if (options.IfMatch.HasValue())
9220  {
9221  request.AddHeader("If-Match", options.IfMatch.GetValue());
9222  }
9223  if (options.IfNoneMatch.HasValue())
9224  {
9225  request.AddHeader("If-None-Match", options.IfNoneMatch.GetValue());
9226  }
9227  if (options.IfTags.HasValue())
9228  {
9229  request.AddHeader("x-ms-if-tags", options.IfTags.GetValue());
9230  }
9231  if (options.AppendPosition.HasValue())
9232  {
9233  request.AddHeader(
9234  "x-ms-blob-condition-appendpos", std::to_string(options.AppendPosition.GetValue()));
9235  }
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))
9243  {
9244  throw StorageError::CreateFromResponse(std::move(pHttpResponse));
9245  }
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));
9250  }
9251 
9252  private:
9253  }; // class AppendBlob
9254 
9255  class BlobBatch {
9256  public:
9258  {
9259  Azure::Core::Nullable<int32_t> Timeout;
9260  std::string ContentType;
9261  }; // struct SubmitBlobBatchOptions
9262 
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,
9268  const SubmitBlobBatchOptions& options)
9269  {
9270  unused(options);
9271  auto request
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())
9277  {
9278  request.GetUrl().AppendQuery("timeout", std::to_string(options.Timeout.GetValue()));
9279  }
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))
9288  {
9289  throw StorageError::CreateFromResponse(std::move(pHttpResponse));
9290  }
9291  response.ContentType = httpResponse.GetHeaders().at("content-type");
9292  return Azure::Core::Response<SubmitBlobBatchResultInternal>(
9293  std::move(response), std::move(pHttpResponse));
9294  }
9295 
9296  private:
9297  }; // class BlobBatch
9298 
9299  }; // class BlobRestClient
9300 }}} // namespace Azure::Storage::Blobs
Azure::Storage::Blobs::BlobRestClient::Blob::AbortCopyBlobFromUriOptions
Definition: blob_rest_client.hpp:6095
Azure::Storage::Blobs::BlobRestClient::Service::GetServiceStatisticsOptions
Definition: blob_rest_client.hpp:1859
Azure::Storage::Blobs::GetContainerAccessPolicyResult
Definition: blob_rest_client.hpp:1420
Azure::Storage::Blobs::BlobRestClient::PageBlob::CreatePageBlobOptions
Definition: blob_rest_client.hpp:7641
Azure::Storage::Blobs::BlobRestClient::BlockBlob::CommitBlockListOptions
Definition: blob_rest_client.hpp:7263
Azure::Storage::Blobs::BlobServiceProperties
Definition: blob_rest_client.hpp:1467
Azure::Storage::Blobs::SetServicePropertiesResult
Definition: blob_rest_client.hpp:1201
Azure::Storage::Blobs::UploadBlockBlobResult
Definition: blob_rest_client.hpp:1317
Azure::Storage::Blobs::AcquireBlobLeaseResult
Definition: blob_rest_client.hpp:237
Azure::Storage::Blobs::BlobRestClient::Blob::BreakBlobLeaseOptions
Definition: blob_rest_client.hpp:6631
Azure::Storage::Blobs::GetAccountInfoResult
Definition: blob_rest_client.hpp:1404
Azure::Storage::Blobs::BlobRestClient::Service::GetAccountInfoOptions
Definition: blob_rest_client.hpp:1822
Azure::Storage::Blobs::ReleaseBlobLeaseResult
Definition: blob_rest_client.hpp:1126
Azure::Storage::Blobs::BlobItem
Definition: blob_rest_client.hpp:1509
Azure::Storage::Blobs::BlobRestClient::Container::UndeleteContainerOptions
Definition: blob_rest_client.hpp:3483
Azure::Storage::Blobs::BlobCorsRule
Definition: blob_rest_client.hpp:322
Azure::Storage::Blobs::GetServiceStatisticsResult
Definition: blob_rest_client.hpp:1489
Azure::Storage::Blobs::BlobRestClient::Container::ChangeContainerLeaseOptions
Definition: blob_rest_client.hpp:4001
Azure::Storage::Blobs::BlobRestClient::Blob::ReleaseBlobLeaseOptions
Definition: blob_rest_client.hpp:6561
Azure::Storage::Blobs::SetBlobMetadataResult
Definition: blob_rest_client.hpp:1178
Azure::Storage::Blobs::BlobRestClient::Container::GetContainerPropertiesOptions
Definition: blob_rest_client.hpp:3522
Azure::Storage::Blobs::BlobRestClient::Blob::ChangeBlobLeaseOptions
Definition: blob_rest_client.hpp:6494
Azure::Storage::Blobs::BlobHttpHeaders
Definition: blob_rest_client.hpp:380
Azure::Storage::Blobs::BlobRestClient::Blob::SetBlobHttpHeadersOptions
Definition: blob_rest_client.hpp:5690
Azure::Storage::Blobs::AcquireContainerLeaseResult
Definition: blob_rest_client.hpp:244
Azure::Storage::Blobs::BlobContainerItem
Definition: blob_rest_client.hpp:1362
Azure::Storage::Blobs::BlobRestClient::Blob::GetBlobPropertiesOptions
Definition: blob_rest_client.hpp:5418
Azure::Storage::Blobs::BlobRestClient::Container::ListBlobsFlatSegmentOptions
Definition: blob_rest_client.hpp:3653
Azure::Storage::Blobs::BlobRestClient::Container::GetContainerAccessPolicyOptions
Definition: blob_rest_client.hpp:3780
Azure::Storage::Blobs::GetContainerPropertiesResult
Definition: blob_rest_client.hpp:1428
Azure::Storage::Blobs::SetBlobTagsResult
Definition: blob_rest_client.hpp:1185
Azure::Storage::Blobs::ChangeContainerLeaseResult
Definition: blob_rest_client.hpp:649
Azure::Storage::Blobs::StageBlockFromUriResult
Definition: blob_rest_client.hpp:1286
Azure::Storage::Blobs::BlobRestClient::AppendBlob::CreateAppendBlobOptions
Definition: blob_rest_client.hpp:8720
Azure::Storage::Blobs::BlobRestClient::Container::CreateContainerOptions
Definition: blob_rest_client.hpp:3365
Azure::Storage::Blobs::BlobRestClient::AppendBlob::SealAppendBlobOptions
Definition: blob_rest_client.hpp:9181
Azure::Storage::Blobs::BlobRestClient::PageBlob::UploadPageBlobPagesOptions
Definition: blob_rest_client.hpp:7806
Azure::Storage::Blobs::GetServicePropertiesResult
Definition: blob_rest_client.hpp:1478
Azure::Storage::Blobs::GetBlobPropertiesResult
Definition: blob_rest_client.hpp:1563
Azure::Storage::Blobs::EncryptionKey
Wrapper for an encryption key to be used with client provided key server-side encryption.
Definition: blob_options.hpp:227
Azure::Storage::Blobs::BlobRestClient
Definition: blob_rest_client.hpp:1617
Azure::Storage::Blobs::ObjectReplicationRule
Definition: blob_rest_client.hpp:1443
Azure::Storage::Blobs::AbortCopyBlobFromUriResult
Definition: blob_rest_client.hpp:29
Azure::Storage::Blobs::ResizePageBlobResult
Definition: blob_rest_client.hpp:1153
Azure::Storage::Blobs::StartCopyBlobFromUriResult
Definition: blob_rest_client.hpp:1449
Azure::Storage::Blobs::BlobRestClient::BlockBlob
Definition: blob_rest_client.hpp:6827
Azure::Storage::Blobs::BlobRestClient::AppendBlob::AppendBlockFromUriOptions
Definition: blob_rest_client.hpp:9018
Azure::Storage::Blobs::BlobRestClient::Blob::RenewBlobLeaseOptions
Definition: blob_rest_client.hpp:6429
Azure::Storage::Blobs::BlobRestClient::Container
Definition: blob_rest_client.hpp:3362
Azure::Storage::Blobs::FilterBlobsSegmentResult
Definition: blob_rest_client.hpp:1396
Azure::Storage::Blobs::BlobSignedIdentifier
Definition: blob_rest_client.hpp:486
Azure::Storage::Blobs::BlobRestClient::Container::RenewContainerLeaseOptions
Definition: blob_rest_client.hpp:3950
Azure::Storage::Blobs::BlobStaticWebsite
Definition: blob_rest_client.hpp:494
Azure::Storage::Blobs::BreakContainerLeaseResult
Definition: blob_rest_client.hpp:635
Azure::Storage::Blobs::BlobRestClient::BlockBlob::UploadBlockBlobOptions
Definition: blob_rest_client.hpp:6830
Azure::Storage::Blobs::BlobRestClient::Container::SetContainerAccessPolicyOptions
Definition: blob_rest_client.hpp:3825
Azure::Storage::Blobs::BlobRestClient::Blob::CreateBlobSnapshotOptions
Definition: blob_rest_client.hpp:6137
Azure::Storage::Blobs::GetPageBlobPageRangesResultInternal
Definition: blob_rest_client.hpp:852
Azure::Storage::Blobs::GetBlobTagsResult
Definition: blob_rest_client.hpp:847
Azure::Storage::Blobs::BlobRestClient::Service
Definition: blob_rest_client.hpp:1619
Azure::Storage::Blobs::BlobRestClient::Service::SetServicePropertiesOptions
Definition: blob_rest_client.hpp:1776
Azure::Storage::Blobs::BlobRestClient::PageBlob::ResizePageBlobOptions
Definition: blob_rest_client.hpp:8267
Azure::Storage::Blobs::ObjectReplicationPolicy
Definition: blob_rest_client.hpp:1503
Azure::Storage::Blobs::BlobRestClient::Service::GetServicePropertiesOptions
Definition: blob_rest_client.hpp:1736
Azure::Storage::Blobs::ListBlobsByHierarchySegmentResult
Definition: blob_rest_client.hpp:1596
Azure::Storage::Blobs::AppendBlockFromUriResult
Definition: blob_rest_client.hpp:251
Azure::Storage::Blobs::ListContainersSegmentResult
Definition: blob_rest_client.hpp:1494
Azure::Storage::Blobs::BlobRestClient::PageBlob::UploadPageBlobPagesFromUriOptions
Definition: blob_rest_client.hpp:7966
Azure::Storage::Blobs::BlobRestClient::Blob::StartCopyBlobFromUriOptions
Definition: blob_rest_client.hpp:5955
Azure::Storage::Blobs::BlobRestClient::AppendBlob
Definition: blob_rest_client.hpp:8717
Azure::Storage::Blobs::BlobRestClient::PageBlob::ClearPageBlobPagesOptions
Definition: blob_rest_client.hpp:8132
Azure::Storage::Blobs::ClearPageBlobPagesResult
Definition: blob_rest_client.hpp:656
Azure::Storage::Blobs::BlobRestClient::Blob::SetBlobTagsOptions
Definition: blob_rest_client.hpp:6308
Azure::Storage::Blobs::BlobRetentionPolicy
Definition: blob_rest_client.hpp:480
Azure::Storage::Blobs::CreatePageBlobResult
Definition: blob_rest_client.hpp:744
Azure::Storage::Blobs::BlobRestClient::Blob
Definition: blob_rest_client.hpp:5040
Azure::Storage::Blobs::BlobRestClient::Blob::GetBlobTagsOptions
Definition: blob_rest_client.hpp:6264
Azure::Storage::Blobs::SetContainerAccessPolicyResult
Definition: blob_rest_client.hpp:1189
Azure::Storage::Blobs::BlobRestClient::Blob::AcquireBlobLeaseOptions
Definition: blob_rest_client.hpp:6359
Azure::Storage::Blobs::CommitBlockListResult
Definition: blob_rest_client.hpp:666
Azure::Storage::Blobs::BlobRestClient::Service::GetUserDelegationKeyOptions
Definition: blob_rest_client.hpp:1683
Azure::Storage::Blobs::BreakBlobLeaseResult
Definition: blob_rest_client.hpp:628
Azure::Storage::Blobs::BlobRestClient::Container::ListBlobsByHierarchySegmentOptions
Definition: blob_rest_client.hpp:3714
Azure::Storage::Blobs::BlobRestClient::Container::ReleaseContainerLeaseOptions
Definition: blob_rest_client.hpp:4054
Azure::Storage::Blobs::SetContainerMetadataResult
Definition: blob_rest_client.hpp:1195
Azure::Storage::Blobs::UndeleteBlobResult
Definition: blob_rest_client.hpp:1309
Azure::Storage::Blobs::RenewBlobLeaseResult
Definition: blob_rest_client.hpp:1139
Azure::Storage::Blobs::BlobRestClient::BlockBlob::StageBlockOptions
Definition: blob_rest_client.hpp:7012
Azure::Storage::Blobs::BlobRestClient::Blob::UndeleteBlobOptions
Definition: blob_rest_client.hpp:5384
Azure::Storage::Blobs::AppendBlockResult
Definition: blob_rest_client.hpp:264
Azure::Storage::Blobs::BlobRestClient::Container::SetContainerMetadataOptions
Definition: blob_rest_client.hpp:3591
Azure::Storage::Blobs::GetUserDelegationKeyResult
Definition: blob_rest_client.hpp:861
Azure::Storage::Blobs::RenewContainerLeaseResult
Definition: blob_rest_client.hpp:1146
Azure::Storage::Blobs::BlobRestClient::Blob::SetBlobMetadataOptions
Definition: blob_rest_client.hpp:5788
Azure::Storage::Blobs::CreateAppendBlobResult
Definition: blob_rest_client.hpp:717
Azure::Storage::Blobs::BlobPrefix
Definition: blob_rest_client.hpp:475
Azure::Storage::Blobs::FilterBlobItem
Definition: blob_rest_client.hpp:840
Azure::Storage::Blobs::CreateContainerResult
Definition: blob_rest_client.hpp:738
Azure::Storage::Blobs::BlobRestClient::Service::FilterBlobsSegmentOptions
Definition: blob_rest_client.hpp:1899
Azure::Storage::Blobs::SetBlobHttpHeadersResult
Definition: blob_rest_client.hpp:1171
Azure::Storage::Blobs::SealAppendBlobResult
Definition: blob_rest_client.hpp:1160
Azure::Storage::Blobs::BlobRestClient::PageBlob::GetPageBlobPageRangesOptions
Definition: blob_rest_client.hpp:8380
Azure::Storage::Blobs::SubmitBlobBatchResultInternal
Definition: blob_rest_client.hpp:1304
Azure::Storage::Blobs::UploadPageBlobPagesResult
Definition: blob_rest_client.hpp:1341
Azure::Storage::Blobs::DeleteContainerResult
Definition: blob_rest_client.hpp:759
Azure::Storage::Blobs::ReleaseContainerLeaseResult
Definition: blob_rest_client.hpp:1133
Azure::Storage::Blobs::StartCopyPageBlobIncrementalResult
Definition: blob_rest_client.hpp:1458
Azure::Storage::Blobs::UndeleteContainerResult
Definition: blob_rest_client.hpp:1313
Azure::Storage::Blobs::BlobRestClient::BlobBatch
Definition: blob_rest_client.hpp:9255
Azure::Storage::Blobs::CreateBlobSnapshotResult
Definition: blob_rest_client.hpp:727
Azure::Storage::Blobs::ListBlobsFlatSegmentResult
Definition: blob_rest_client.hpp:1608
Azure::Storage::Blobs::BlobRestClient::Blob::SetBlobAccessTierOptions
Definition: blob_rest_client.hpp:5891
Azure::Storage::Blobs::BlobRestClient::BlockBlob::StageBlockFromUriOptions
Definition: blob_rest_client.hpp:7118
Azure::Storage::Blobs::UploadPageBlobPagesFromUriResult
Definition: blob_rest_client.hpp:1329
Azure::Storage::Blobs::BlobRestClient::Container::DeleteContainerOptions
Definition: blob_rest_client.hpp:3435
Azure::Storage::Blobs::GetBlockListResult
Definition: blob_rest_client.hpp:1410
Azure::Storage::Blobs::BlobRestClient::PageBlob
Definition: blob_rest_client.hpp:7638
Azure::Storage::Blobs::BlobRestClient::PageBlob::StartCopyPageBlobIncrementalOptions
Definition: blob_rest_client.hpp:8479
Azure::Storage::Blobs::StageBlockResult
Definition: blob_rest_client.hpp:1295
Azure::Storage::Blobs::DownloadBlobResult
Definition: blob_rest_client.hpp:1537
Azure::Storage::Blobs::BlobMetrics
Definition: blob_rest_client.hpp:1388
Azure::Storage::Blobs::SetBlobAccessTierResult
Definition: blob_rest_client.hpp:1167
Azure::Storage::Blobs::BlobRestClient::BlobBatch::SubmitBlobBatchOptions
Definition: blob_rest_client.hpp:9258
Azure::Storage::Blobs::BlobRestClient::Container::BreakContainerLeaseOptions
Definition: blob_rest_client.hpp:4104
Azure::Storage::Blobs::BlobRestClient::Blob::DownloadBlobOptions
Definition: blob_rest_client.hpp:5043
Azure::Storage::Blobs::BlobBlock
Definition: blob_rest_client.hpp:316
Azure::Storage::Blobs::BlobRestClient::Service::ListContainersSegmentOptions
Definition: blob_rest_client.hpp:1622
Azure::Storage::Blobs::BlobRestClient::BlockBlob::GetBlockListOptions
Definition: blob_rest_client.hpp:7431
Azure::Storage::Blobs::BlobRestClient::Container::AcquireContainerLeaseOptions
Definition: blob_rest_client.hpp:3894
Azure::Storage::Blobs::ChangeBlobLeaseResult
Definition: blob_rest_client.hpp:642
Azure::Storage::Blobs::BlobGeoReplication
Definition: blob_rest_client.hpp:1382
Azure::Storage::Blobs::BlobRestClient::AppendBlob::AppendBlockOptions
Definition: blob_rest_client.hpp:8872
Azure::Storage::Blobs::BlobAnalyticsLogging
Definition: blob_rest_client.hpp:1353
Azure::Storage::Blobs::BlobRestClient::Blob::DeleteBlobOptions
Definition: blob_rest_client.hpp:5299
Azure::Storage::Blobs::DeleteBlobResult
Definition: blob_rest_client.hpp:755