1use super::{
7 AccountKind, AppendBlobClientAppendBlockFromUrlResult, AppendBlobClientAppendBlockResult,
8 AppendBlobClientCreateResult, AppendBlobClientSealResult, ArchiveStatus,
9 BlobClientAcquireLeaseResult, BlobClientBreakLeaseResult, BlobClientChangeLeaseResult,
10 BlobClientCreateSnapshotResult, BlobClientDownloadInternalResult,
11 BlobClientGetAccountInfoResult, BlobClientGetPropertiesResult, BlobClientReleaseLeaseResult,
12 BlobClientRenewLeaseResult, BlobClientStartCopyFromUrlResult,
13 BlobContainerClientAcquireLeaseResult, BlobContainerClientBreakLeaseResult,
14 BlobContainerClientChangeLeaseResult, BlobContainerClientGetAccountInfoResult,
15 BlobContainerClientGetPropertiesResult, BlobContainerClientReleaseLeaseResult,
16 BlobContainerClientRenewLeaseResult, BlobServiceClientGetAccountInfoResult, BlobType,
17 BlockBlobClientCommitBlockListResult, BlockBlobClientStageBlockFromUrlResult,
18 BlockBlobClientStageBlockResult, BlockBlobClientUploadBlobFromUrlResult,
19 BlockBlobClientUploadInternalResult, BlockList, CopyStatus, ImmutabilityPolicyMode,
20 LeaseDuration, LeaseState, LeaseStatus, PageBlobClientClearPagesResult,
21 PageBlobClientCreateResult, PageBlobClientResizeResult, PageBlobClientSetSequenceNumberResult,
22 PageBlobClientUploadPagesFromUrlResult, PageBlobClientUploadPagesResult, PageList,
23 PublicAccessType, RehydratePriority, SignedIdentifiers, SkuName,
24};
25use azure_core::{
26 base64,
27 http::{
28 headers::{HeaderName, Headers},
29 AsyncResponse, Etag, NoFormat, Response, XmlFormat,
30 },
31 time::{parse_rfc7231, OffsetDateTime},
32 Result,
33};
34use std::collections::HashMap;
35
36const ACCESS_TIER: HeaderName = HeaderName::from_static("x-ms-access-tier");
37const ACCESS_TIER_CHANGE_TIME: HeaderName = HeaderName::from_static("x-ms-access-tier-change-time");
38const ACCESS_TIER_INFERRED: HeaderName = HeaderName::from_static("x-ms-access-tier-inferred");
39const ACCOUNT_KIND: HeaderName = HeaderName::from_static("x-ms-account-kind");
40const ARCHIVE_STATUS: HeaderName = HeaderName::from_static("x-ms-archive-status");
41const BLOB_APPEND_OFFSET: HeaderName = HeaderName::from_static("x-ms-blob-append-offset");
42const BLOB_COMMITTED_BLOCK_COUNT: HeaderName =
43 HeaderName::from_static("x-ms-blob-committed-block-count");
44const BLOB_CONTENT_LENGTH: HeaderName = HeaderName::from_static("x-ms-blob-content-length");
45const BLOB_CONTENT_MD5: HeaderName = HeaderName::from_static("x-ms-blob-content-md5");
46const BLOB_PUBLIC_ACCESS: HeaderName = HeaderName::from_static("x-ms-blob-public-access");
47const BLOB_SEALED: HeaderName = HeaderName::from_static("x-ms-blob-sealed");
48const BLOB_SEQUENCE_NUMBER: HeaderName = HeaderName::from_static("x-ms-blob-sequence-number");
49const BLOB_TYPE: HeaderName = HeaderName::from_static("x-ms-blob-type");
50const CACHE_CONTROL: HeaderName = HeaderName::from_static("cache-control");
51const CONTENT_CRC64: HeaderName = HeaderName::from_static("x-ms-content-crc64");
52const CONTENT_DISPOSITION: HeaderName = HeaderName::from_static("content-disposition");
53const CONTENT_ENCODING: HeaderName = HeaderName::from_static("content-encoding");
54const CONTENT_LANGUAGE: HeaderName = HeaderName::from_static("content-language");
55const CONTENT_LENGTH: HeaderName = HeaderName::from_static("content-length");
56const CONTENT_MD5: HeaderName = HeaderName::from_static("content-md5");
57const CONTENT_RANGE: HeaderName = HeaderName::from_static("content-range");
58const CONTENT_TYPE: HeaderName = HeaderName::from_static("content-type");
59const COPY_COMPLETION_TIME: HeaderName = HeaderName::from_static("x-ms-copy-completion-time");
60const COPY_DESTINATION_SNAPSHOT: HeaderName =
61 HeaderName::from_static("x-ms-copy-destination-snapshot");
62const COPY_ID: HeaderName = HeaderName::from_static("x-ms-copy-id");
63const COPY_PROGRESS: HeaderName = HeaderName::from_static("x-ms-copy-progress");
64const COPY_SOURCE: HeaderName = HeaderName::from_static("x-ms-copy-source");
65const COPY_STATUS: HeaderName = HeaderName::from_static("x-ms-copy-status");
66const COPY_STATUS_DESCRIPTION: HeaderName = HeaderName::from_static("x-ms-copy-status-description");
67const CREATION_TIME: HeaderName = HeaderName::from_static("x-ms-creation-time");
68const DEFAULT_ENCRYPTION_SCOPE: HeaderName =
69 HeaderName::from_static("x-ms-default-encryption-scope");
70const DENY_ENCRYPTION_SCOPE_OVERRIDE: HeaderName =
71 HeaderName::from_static("x-ms-deny-encryption-scope-override");
72const ENCRYPTION_KEY_SHA256: HeaderName = HeaderName::from_static("x-ms-encryption-key-sha256");
73const ENCRYPTION_SCOPE: HeaderName = HeaderName::from_static("x-ms-encryption-scope");
74const ETAG: HeaderName = HeaderName::from_static("etag");
75const EXPIRY_TIME: HeaderName = HeaderName::from_static("x-ms-expiry-time");
76const HAS_IMMUTABILITY_POLICY: HeaderName = HeaderName::from_static("x-ms-has-immutability-policy");
77const HAS_LEGAL_HOLD: HeaderName = HeaderName::from_static("x-ms-has-legal-hold");
78const IMMUTABILITY_POLICY_MODE: HeaderName =
79 HeaderName::from_static("x-ms-immutability-policy-mode");
80const IMMUTABILITY_POLICY_UNTIL_DATE: HeaderName =
81 HeaderName::from_static("x-ms-immutability-policy-until-date");
82const IMMUTABLE_STORAGE_WITH_VERSIONING_ENABLED: HeaderName =
83 HeaderName::from_static("x-ms-immutable-storage-with-versioning-enabled");
84const INCREMENTAL_COPY: HeaderName = HeaderName::from_static("x-ms-incremental-copy");
85const IS_CURRENT_VERSION: HeaderName = HeaderName::from_static("x-ms-is-current-version");
86const IS_HNS_ENABLED: HeaderName = HeaderName::from_static("x-ms-is-hns-enabled");
87const LAST_ACCESS_TIME: HeaderName = HeaderName::from_static("x-ms-last-access-time");
88const LAST_MODIFIED: HeaderName = HeaderName::from_static("last-modified");
89const LEASE_DURATION: HeaderName = HeaderName::from_static("x-ms-lease-duration");
90const LEASE_ID: HeaderName = HeaderName::from_static("x-ms-lease-id");
91const LEASE_STATE: HeaderName = HeaderName::from_static("x-ms-lease-state");
92const LEASE_STATUS: HeaderName = HeaderName::from_static("x-ms-lease-status");
93const LEASE_TIME: HeaderName = HeaderName::from_static("x-ms-lease-time");
94const LEGAL_HOLD: HeaderName = HeaderName::from_static("x-ms-legal-hold");
95const META: &str = "x-ms-meta-";
96const OR: &str = "x-ms-or-";
97const OR_POLICY_ID: HeaderName = HeaderName::from_static("x-ms-or-policy-id");
98const REHYDRATE_PRIORITY: HeaderName = HeaderName::from_static("x-ms-rehydrate-priority");
99const REQUEST_SERVER_ENCRYPTED: HeaderName =
100 HeaderName::from_static("x-ms-request-server-encrypted");
101const SERVER_ENCRYPTED: HeaderName = HeaderName::from_static("x-ms-server-encrypted");
102const SKU_NAME: HeaderName = HeaderName::from_static("x-ms-sku-name");
103const SNAPSHOT: HeaderName = HeaderName::from_static("x-ms-snapshot");
104const TAG_COUNT: HeaderName = HeaderName::from_static("x-ms-tag-count");
105const VERSION_ID: HeaderName = HeaderName::from_static("x-ms-version-id");
106
107pub trait AppendBlobClientAppendBlockFromUrlResultHeaders: private::Sealed {
130 fn content_md5(&self) -> Result<Option<Vec<u8>>>;
131 fn etag(&self) -> Result<Option<Etag>>;
132 fn last_modified(&self) -> Result<Option<OffsetDateTime>>;
133 fn blob_append_offset(&self) -> Result<Option<String>>;
134 fn blob_committed_block_count(&self) -> Result<Option<i32>>;
135 fn content_crc64(&self) -> Result<Option<Vec<u8>>>;
136 fn encryption_key_sha256(&self) -> Result<Option<String>>;
137 fn encryption_scope(&self) -> Result<Option<String>>;
138 fn is_server_encrypted(&self) -> Result<Option<bool>>;
139}
140
141impl AppendBlobClientAppendBlockFromUrlResultHeaders
142 for Response<AppendBlobClientAppendBlockFromUrlResult, NoFormat>
143{
144 fn content_md5(&self) -> Result<Option<Vec<u8>>> {
146 Headers::get_optional_with(self.headers(), &CONTENT_MD5, |h| base64::decode(h.as_str()))
147 }
148
149 fn etag(&self) -> Result<Option<Etag>> {
151 Headers::get_optional_as(self.headers(), &ETAG)
152 }
153
154 fn last_modified(&self) -> Result<Option<OffsetDateTime>> {
156 Headers::get_optional_with(self.headers(), &LAST_MODIFIED, |h| {
157 parse_rfc7231(h.as_str())
158 })
159 }
160
161 fn blob_append_offset(&self) -> Result<Option<String>> {
163 Headers::get_optional_as(self.headers(), &BLOB_APPEND_OFFSET)
164 }
165
166 fn blob_committed_block_count(&self) -> Result<Option<i32>> {
168 Headers::get_optional_as(self.headers(), &BLOB_COMMITTED_BLOCK_COUNT)
169 }
170
171 fn content_crc64(&self) -> Result<Option<Vec<u8>>> {
173 Headers::get_optional_with(self.headers(), &CONTENT_CRC64, |h| {
174 base64::decode(h.as_str())
175 })
176 }
177
178 fn encryption_key_sha256(&self) -> Result<Option<String>> {
180 Headers::get_optional_as(self.headers(), &ENCRYPTION_KEY_SHA256)
181 }
182
183 fn encryption_scope(&self) -> Result<Option<String>> {
185 Headers::get_optional_as(self.headers(), &ENCRYPTION_SCOPE)
186 }
187
188 fn is_server_encrypted(&self) -> Result<Option<bool>> {
190 Headers::get_optional_as(self.headers(), &REQUEST_SERVER_ENCRYPTED)
191 }
192}
193
194pub trait AppendBlobClientAppendBlockResultHeaders: private::Sealed {
217 fn content_md5(&self) -> Result<Option<Vec<u8>>>;
218 fn etag(&self) -> Result<Option<Etag>>;
219 fn last_modified(&self) -> Result<Option<OffsetDateTime>>;
220 fn blob_append_offset(&self) -> Result<Option<String>>;
221 fn blob_committed_block_count(&self) -> Result<Option<i32>>;
222 fn content_crc64(&self) -> Result<Option<Vec<u8>>>;
223 fn encryption_key_sha256(&self) -> Result<Option<String>>;
224 fn encryption_scope(&self) -> Result<Option<String>>;
225 fn is_server_encrypted(&self) -> Result<Option<bool>>;
226}
227
228impl AppendBlobClientAppendBlockResultHeaders
229 for Response<AppendBlobClientAppendBlockResult, NoFormat>
230{
231 fn content_md5(&self) -> Result<Option<Vec<u8>>> {
233 Headers::get_optional_with(self.headers(), &CONTENT_MD5, |h| base64::decode(h.as_str()))
234 }
235
236 fn etag(&self) -> Result<Option<Etag>> {
238 Headers::get_optional_as(self.headers(), &ETAG)
239 }
240
241 fn last_modified(&self) -> Result<Option<OffsetDateTime>> {
243 Headers::get_optional_with(self.headers(), &LAST_MODIFIED, |h| {
244 parse_rfc7231(h.as_str())
245 })
246 }
247
248 fn blob_append_offset(&self) -> Result<Option<String>> {
250 Headers::get_optional_as(self.headers(), &BLOB_APPEND_OFFSET)
251 }
252
253 fn blob_committed_block_count(&self) -> Result<Option<i32>> {
255 Headers::get_optional_as(self.headers(), &BLOB_COMMITTED_BLOCK_COUNT)
256 }
257
258 fn content_crc64(&self) -> Result<Option<Vec<u8>>> {
260 Headers::get_optional_with(self.headers(), &CONTENT_CRC64, |h| {
261 base64::decode(h.as_str())
262 })
263 }
264
265 fn encryption_key_sha256(&self) -> Result<Option<String>> {
267 Headers::get_optional_as(self.headers(), &ENCRYPTION_KEY_SHA256)
268 }
269
270 fn encryption_scope(&self) -> Result<Option<String>> {
272 Headers::get_optional_as(self.headers(), &ENCRYPTION_SCOPE)
273 }
274
275 fn is_server_encrypted(&self) -> Result<Option<bool>> {
277 Headers::get_optional_as(self.headers(), &REQUEST_SERVER_ENCRYPTED)
278 }
279}
280
281pub trait AppendBlobClientCreateResultHeaders: private::Sealed {
304 fn content_md5(&self) -> Result<Option<Vec<u8>>>;
305 fn etag(&self) -> Result<Option<Etag>>;
306 fn last_modified(&self) -> Result<Option<OffsetDateTime>>;
307 fn encryption_key_sha256(&self) -> Result<Option<String>>;
308 fn encryption_scope(&self) -> Result<Option<String>>;
309 fn is_server_encrypted(&self) -> Result<Option<bool>>;
310 fn version_id(&self) -> Result<Option<String>>;
311}
312
313impl AppendBlobClientCreateResultHeaders for Response<AppendBlobClientCreateResult, NoFormat> {
314 fn content_md5(&self) -> Result<Option<Vec<u8>>> {
316 Headers::get_optional_with(self.headers(), &CONTENT_MD5, |h| base64::decode(h.as_str()))
317 }
318
319 fn etag(&self) -> Result<Option<Etag>> {
321 Headers::get_optional_as(self.headers(), &ETAG)
322 }
323
324 fn last_modified(&self) -> Result<Option<OffsetDateTime>> {
326 Headers::get_optional_with(self.headers(), &LAST_MODIFIED, |h| {
327 parse_rfc7231(h.as_str())
328 })
329 }
330
331 fn encryption_key_sha256(&self) -> Result<Option<String>> {
333 Headers::get_optional_as(self.headers(), &ENCRYPTION_KEY_SHA256)
334 }
335
336 fn encryption_scope(&self) -> Result<Option<String>> {
338 Headers::get_optional_as(self.headers(), &ENCRYPTION_SCOPE)
339 }
340
341 fn is_server_encrypted(&self) -> Result<Option<bool>> {
343 Headers::get_optional_as(self.headers(), &REQUEST_SERVER_ENCRYPTED)
344 }
345
346 fn version_id(&self) -> Result<Option<String>> {
348 Headers::get_optional_as(self.headers(), &VERSION_ID)
349 }
350}
351
352pub trait AppendBlobClientSealResultHeaders: private::Sealed {
375 fn etag(&self) -> Result<Option<Etag>>;
376 fn last_modified(&self) -> Result<Option<OffsetDateTime>>;
377 fn is_sealed(&self) -> Result<Option<bool>>;
378}
379
380impl AppendBlobClientSealResultHeaders for Response<AppendBlobClientSealResult, NoFormat> {
381 fn etag(&self) -> Result<Option<Etag>> {
383 Headers::get_optional_as(self.headers(), &ETAG)
384 }
385
386 fn last_modified(&self) -> Result<Option<OffsetDateTime>> {
388 Headers::get_optional_with(self.headers(), &LAST_MODIFIED, |h| {
389 parse_rfc7231(h.as_str())
390 })
391 }
392
393 fn is_sealed(&self) -> Result<Option<bool>> {
395 Headers::get_optional_as(self.headers(), &BLOB_SEALED)
396 }
397}
398
399pub trait BlobClientAcquireLeaseResultHeaders: private::Sealed {
422 fn etag(&self) -> Result<Option<Etag>>;
423 fn last_modified(&self) -> Result<Option<OffsetDateTime>>;
424 fn lease_id(&self) -> Result<Option<String>>;
425}
426
427impl BlobClientAcquireLeaseResultHeaders for Response<BlobClientAcquireLeaseResult, NoFormat> {
428 fn etag(&self) -> Result<Option<Etag>> {
430 Headers::get_optional_as(self.headers(), &ETAG)
431 }
432
433 fn last_modified(&self) -> Result<Option<OffsetDateTime>> {
435 Headers::get_optional_with(self.headers(), &LAST_MODIFIED, |h| {
436 parse_rfc7231(h.as_str())
437 })
438 }
439
440 fn lease_id(&self) -> Result<Option<String>> {
442 Headers::get_optional_as(self.headers(), &LEASE_ID)
443 }
444}
445
446pub trait BlobClientBreakLeaseResultHeaders: private::Sealed {
469 fn etag(&self) -> Result<Option<Etag>>;
470 fn last_modified(&self) -> Result<Option<OffsetDateTime>>;
471 fn lease_time(&self) -> Result<Option<i32>>;
472}
473
474impl BlobClientBreakLeaseResultHeaders for Response<BlobClientBreakLeaseResult, NoFormat> {
475 fn etag(&self) -> Result<Option<Etag>> {
477 Headers::get_optional_as(self.headers(), &ETAG)
478 }
479
480 fn last_modified(&self) -> Result<Option<OffsetDateTime>> {
482 Headers::get_optional_with(self.headers(), &LAST_MODIFIED, |h| {
483 parse_rfc7231(h.as_str())
484 })
485 }
486
487 fn lease_time(&self) -> Result<Option<i32>> {
489 Headers::get_optional_as(self.headers(), &LEASE_TIME)
490 }
491}
492
493pub trait BlobClientChangeLeaseResultHeaders: private::Sealed {
516 fn etag(&self) -> Result<Option<Etag>>;
517 fn last_modified(&self) -> Result<Option<OffsetDateTime>>;
518 fn lease_id(&self) -> Result<Option<String>>;
519}
520
521impl BlobClientChangeLeaseResultHeaders for Response<BlobClientChangeLeaseResult, NoFormat> {
522 fn etag(&self) -> Result<Option<Etag>> {
524 Headers::get_optional_as(self.headers(), &ETAG)
525 }
526
527 fn last_modified(&self) -> Result<Option<OffsetDateTime>> {
529 Headers::get_optional_with(self.headers(), &LAST_MODIFIED, |h| {
530 parse_rfc7231(h.as_str())
531 })
532 }
533
534 fn lease_id(&self) -> Result<Option<String>> {
536 Headers::get_optional_as(self.headers(), &LEASE_ID)
537 }
538}
539
540pub trait BlobClientCreateSnapshotResultHeaders: private::Sealed {
563 fn etag(&self) -> Result<Option<Etag>>;
564 fn last_modified(&self) -> Result<Option<OffsetDateTime>>;
565 fn is_server_encrypted(&self) -> Result<Option<bool>>;
566 fn snapshot(&self) -> Result<Option<String>>;
567 fn version_id(&self) -> Result<Option<String>>;
568}
569
570impl BlobClientCreateSnapshotResultHeaders for Response<BlobClientCreateSnapshotResult, NoFormat> {
571 fn etag(&self) -> Result<Option<Etag>> {
573 Headers::get_optional_as(self.headers(), &ETAG)
574 }
575
576 fn last_modified(&self) -> Result<Option<OffsetDateTime>> {
578 Headers::get_optional_with(self.headers(), &LAST_MODIFIED, |h| {
579 parse_rfc7231(h.as_str())
580 })
581 }
582
583 fn is_server_encrypted(&self) -> Result<Option<bool>> {
585 Headers::get_optional_as(self.headers(), &REQUEST_SERVER_ENCRYPTED)
586 }
587
588 fn snapshot(&self) -> Result<Option<String>> {
590 Headers::get_optional_as(self.headers(), &SNAPSHOT)
591 }
592
593 fn version_id(&self) -> Result<Option<String>> {
595 Headers::get_optional_as(self.headers(), &VERSION_ID)
596 }
597}
598
599pub(crate) trait BlobClientDownloadInternalResultHeaders: private::Sealed {
622 fn cache_control(&self) -> Result<Option<String>>;
623 fn content_disposition(&self) -> Result<Option<String>>;
624 fn content_encoding(&self) -> Result<Option<String>>;
625 fn content_language(&self) -> Result<Option<String>>;
626 fn content_length(&self) -> Result<Option<u64>>;
627 fn content_md5(&self) -> Result<Option<Vec<u8>>>;
628 fn content_range(&self) -> Result<Option<String>>;
629 fn etag(&self) -> Result<Option<Etag>>;
630 fn last_modified(&self) -> Result<Option<OffsetDateTime>>;
631 fn blob_committed_block_count(&self) -> Result<Option<i32>>;
632 fn blob_content_md5(&self) -> Result<Option<Vec<u8>>>;
633 fn is_sealed(&self) -> Result<Option<bool>>;
634 fn blob_sequence_number(&self) -> Result<Option<i64>>;
635 fn blob_type(&self) -> Result<Option<BlobType>>;
636 fn content_crc64(&self) -> Result<Option<Vec<u8>>>;
637 fn copy_completion_time(&self) -> Result<Option<OffsetDateTime>>;
638 fn copy_id(&self) -> Result<Option<String>>;
639 fn copy_progress(&self) -> Result<Option<String>>;
640 fn copy_source(&self) -> Result<Option<String>>;
641 fn copy_status(&self) -> Result<Option<CopyStatus>>;
642 fn copy_status_description(&self) -> Result<Option<String>>;
643 fn creation_time(&self) -> Result<Option<OffsetDateTime>>;
644 fn encryption_key_sha256(&self) -> Result<Option<String>>;
645 fn encryption_scope(&self) -> Result<Option<String>>;
646 fn immutability_policy_mode(&self) -> Result<Option<ImmutabilityPolicyMode>>;
647 fn immutability_policy_expires_on(&self) -> Result<Option<OffsetDateTime>>;
648 fn is_current_version(&self) -> Result<Option<bool>>;
649 fn last_accessed(&self) -> Result<Option<OffsetDateTime>>;
650 fn duration(&self) -> Result<Option<LeaseDuration>>;
651 fn lease_state(&self) -> Result<Option<LeaseState>>;
652 fn lease_status(&self) -> Result<Option<LeaseStatus>>;
653 fn legal_hold(&self) -> Result<Option<bool>>;
654 fn metadata(&self) -> Result<HashMap<String, String>>;
655 fn object_replication_rules(&self) -> Result<HashMap<String, String>>;
656 fn object_replication_policy_id(&self) -> Result<Option<String>>;
657 fn is_server_encrypted(&self) -> Result<Option<bool>>;
658 fn tag_count(&self) -> Result<Option<i64>>;
659 fn version_id(&self) -> Result<Option<String>>;
660}
661
662impl BlobClientDownloadInternalResultHeaders for AsyncResponse<BlobClientDownloadInternalResult> {
663 fn cache_control(&self) -> Result<Option<String>> {
665 Headers::get_optional_as(self.headers(), &CACHE_CONTROL)
666 }
667
668 fn content_disposition(&self) -> Result<Option<String>> {
670 Headers::get_optional_as(self.headers(), &CONTENT_DISPOSITION)
671 }
672
673 fn content_encoding(&self) -> Result<Option<String>> {
675 Headers::get_optional_as(self.headers(), &CONTENT_ENCODING)
676 }
677
678 fn content_language(&self) -> Result<Option<String>> {
680 Headers::get_optional_as(self.headers(), &CONTENT_LANGUAGE)
681 }
682
683 fn content_length(&self) -> Result<Option<u64>> {
685 Headers::get_optional_as(self.headers(), &CONTENT_LENGTH)
686 }
687
688 fn content_md5(&self) -> Result<Option<Vec<u8>>> {
690 Headers::get_optional_with(self.headers(), &CONTENT_MD5, |h| base64::decode(h.as_str()))
691 }
692
693 fn content_range(&self) -> Result<Option<String>> {
695 Headers::get_optional_as(self.headers(), &CONTENT_RANGE)
696 }
697
698 fn etag(&self) -> Result<Option<Etag>> {
700 Headers::get_optional_as(self.headers(), &ETAG)
701 }
702
703 fn last_modified(&self) -> Result<Option<OffsetDateTime>> {
705 Headers::get_optional_with(self.headers(), &LAST_MODIFIED, |h| {
706 parse_rfc7231(h.as_str())
707 })
708 }
709
710 fn blob_committed_block_count(&self) -> Result<Option<i32>> {
712 Headers::get_optional_as(self.headers(), &BLOB_COMMITTED_BLOCK_COUNT)
713 }
714
715 fn blob_content_md5(&self) -> Result<Option<Vec<u8>>> {
718 Headers::get_optional_with(self.headers(), &BLOB_CONTENT_MD5, |h| {
719 base64::decode(h.as_str())
720 })
721 }
722
723 fn is_sealed(&self) -> Result<Option<bool>> {
725 Headers::get_optional_as(self.headers(), &BLOB_SEALED)
726 }
727
728 fn blob_sequence_number(&self) -> Result<Option<i64>> {
730 Headers::get_optional_as(self.headers(), &BLOB_SEQUENCE_NUMBER)
731 }
732
733 fn blob_type(&self) -> Result<Option<BlobType>> {
735 Headers::get_optional_as(self.headers(), &BLOB_TYPE)
736 }
737
738 fn content_crc64(&self) -> Result<Option<Vec<u8>>> {
740 Headers::get_optional_with(self.headers(), &CONTENT_CRC64, |h| {
741 base64::decode(h.as_str())
742 })
743 }
744
745 fn copy_completion_time(&self) -> Result<Option<OffsetDateTime>> {
747 Headers::get_optional_with(self.headers(), ©_COMPLETION_TIME, |h| {
748 parse_rfc7231(h.as_str())
749 })
750 }
751
752 fn copy_id(&self) -> Result<Option<String>> {
754 Headers::get_optional_as(self.headers(), ©_ID)
755 }
756
757 fn copy_progress(&self) -> Result<Option<String>> {
759 Headers::get_optional_as(self.headers(), ©_PROGRESS)
760 }
761
762 fn copy_source(&self) -> Result<Option<String>> {
764 Headers::get_optional_as(self.headers(), ©_SOURCE)
765 }
766
767 fn copy_status(&self) -> Result<Option<CopyStatus>> {
769 Headers::get_optional_as(self.headers(), ©_STATUS)
770 }
771
772 fn copy_status_description(&self) -> Result<Option<String>> {
774 Headers::get_optional_as(self.headers(), ©_STATUS_DESCRIPTION)
775 }
776
777 fn creation_time(&self) -> Result<Option<OffsetDateTime>> {
779 Headers::get_optional_with(self.headers(), &CREATION_TIME, |h| {
780 parse_rfc7231(h.as_str())
781 })
782 }
783
784 fn encryption_key_sha256(&self) -> Result<Option<String>> {
786 Headers::get_optional_as(self.headers(), &ENCRYPTION_KEY_SHA256)
787 }
788
789 fn encryption_scope(&self) -> Result<Option<String>> {
791 Headers::get_optional_as(self.headers(), &ENCRYPTION_SCOPE)
792 }
793
794 fn immutability_policy_mode(&self) -> Result<Option<ImmutabilityPolicyMode>> {
796 Headers::get_optional_as(self.headers(), &IMMUTABILITY_POLICY_MODE)
797 }
798
799 fn immutability_policy_expires_on(&self) -> Result<Option<OffsetDateTime>> {
801 Headers::get_optional_with(self.headers(), &IMMUTABILITY_POLICY_UNTIL_DATE, |h| {
802 parse_rfc7231(h.as_str())
803 })
804 }
805
806 fn is_current_version(&self) -> Result<Option<bool>> {
808 Headers::get_optional_as(self.headers(), &IS_CURRENT_VERSION)
809 }
810
811 fn last_accessed(&self) -> Result<Option<OffsetDateTime>> {
813 Headers::get_optional_with(self.headers(), &LAST_ACCESS_TIME, |h| {
814 parse_rfc7231(h.as_str())
815 })
816 }
817
818 fn duration(&self) -> Result<Option<LeaseDuration>> {
820 Headers::get_optional_as(self.headers(), &LEASE_DURATION)
821 }
822
823 fn lease_state(&self) -> Result<Option<LeaseState>> {
825 Headers::get_optional_as(self.headers(), &LEASE_STATE)
826 }
827
828 fn lease_status(&self) -> Result<Option<LeaseStatus>> {
830 Headers::get_optional_as(self.headers(), &LEASE_STATUS)
831 }
832
833 fn legal_hold(&self) -> Result<Option<bool>> {
835 Headers::get_optional_as(self.headers(), &LEGAL_HOLD)
836 }
837
838 fn metadata(&self) -> Result<HashMap<String, String>> {
840 let mut values = HashMap::new();
841 for h in self.headers().iter() {
842 let name = h.0.as_str();
843 if name.len() > META.len() && name.starts_with(META) {
844 values.insert(name[META.len()..].to_owned(), h.1.as_str().to_owned());
845 }
846 }
847 Ok(values)
848 }
849
850 fn object_replication_rules(&self) -> Result<HashMap<String, String>> {
852 let mut values = HashMap::new();
853 for h in self.headers().iter() {
854 let name = h.0.as_str();
855 if name.len() > OR.len() && name.starts_with(OR) {
856 values.insert(name[OR.len()..].to_owned(), h.1.as_str().to_owned());
857 }
858 }
859 Ok(values)
860 }
861
862 fn object_replication_policy_id(&self) -> Result<Option<String>> {
864 Headers::get_optional_as(self.headers(), &OR_POLICY_ID)
865 }
866
867 fn is_server_encrypted(&self) -> Result<Option<bool>> {
869 Headers::get_optional_as(self.headers(), &SERVER_ENCRYPTED)
870 }
871
872 fn tag_count(&self) -> Result<Option<i64>> {
874 Headers::get_optional_as(self.headers(), &TAG_COUNT)
875 }
876
877 fn version_id(&self) -> Result<Option<String>> {
879 Headers::get_optional_as(self.headers(), &VERSION_ID)
880 }
881}
882
883pub trait BlobClientGetAccountInfoResultHeaders: private::Sealed {
906 fn account_kind(&self) -> Result<Option<AccountKind>>;
907 fn is_hierarchical_namespace_enabled(&self) -> Result<Option<bool>>;
908 fn sku_name(&self) -> Result<Option<SkuName>>;
909}
910
911impl BlobClientGetAccountInfoResultHeaders for Response<BlobClientGetAccountInfoResult, NoFormat> {
912 fn account_kind(&self) -> Result<Option<AccountKind>> {
914 Headers::get_optional_as(self.headers(), &ACCOUNT_KIND)
915 }
916
917 fn is_hierarchical_namespace_enabled(&self) -> Result<Option<bool>> {
919 Headers::get_optional_as(self.headers(), &IS_HNS_ENABLED)
920 }
921
922 fn sku_name(&self) -> Result<Option<SkuName>> {
924 Headers::get_optional_as(self.headers(), &SKU_NAME)
925 }
926}
927
928pub trait BlobClientGetPropertiesResultHeaders: private::Sealed {
951 fn cache_control(&self) -> Result<Option<String>>;
952 fn content_disposition(&self) -> Result<Option<String>>;
953 fn content_encoding(&self) -> Result<Option<String>>;
954 fn content_language(&self) -> Result<Option<String>>;
955 fn content_length(&self) -> Result<Option<u64>>;
956 fn content_md5(&self) -> Result<Option<Vec<u8>>>;
957 fn content_type(&self) -> Result<Option<String>>;
958 fn etag(&self) -> Result<Option<Etag>>;
959 fn last_modified(&self) -> Result<Option<OffsetDateTime>>;
960 fn access_tier(&self) -> Result<Option<String>>;
961 fn access_tier_change_time(&self) -> Result<Option<OffsetDateTime>>;
962 fn access_tier_inferred(&self) -> Result<Option<bool>>;
963 fn archive_status(&self) -> Result<Option<ArchiveStatus>>;
964 fn blob_committed_block_count(&self) -> Result<Option<i32>>;
965 fn is_sealed(&self) -> Result<Option<bool>>;
966 fn blob_sequence_number(&self) -> Result<Option<i64>>;
967 fn blob_type(&self) -> Result<Option<BlobType>>;
968 fn copy_completion_time(&self) -> Result<Option<OffsetDateTime>>;
969 fn destination_snapshot(&self) -> Result<Option<String>>;
970 fn copy_id(&self) -> Result<Option<String>>;
971 fn copy_progress(&self) -> Result<Option<String>>;
972 fn copy_source(&self) -> Result<Option<String>>;
973 fn copy_status(&self) -> Result<Option<CopyStatus>>;
974 fn copy_status_description(&self) -> Result<Option<String>>;
975 fn creation_time(&self) -> Result<Option<OffsetDateTime>>;
976 fn encryption_key_sha256(&self) -> Result<Option<String>>;
977 fn encryption_scope(&self) -> Result<Option<String>>;
978 fn expires_on(&self) -> Result<Option<OffsetDateTime>>;
979 fn immutability_policy_mode(&self) -> Result<Option<ImmutabilityPolicyMode>>;
980 fn immutability_policy_expires_on(&self) -> Result<Option<OffsetDateTime>>;
981 fn is_incremental_copy(&self) -> Result<Option<bool>>;
982 fn is_current_version(&self) -> Result<Option<bool>>;
983 fn last_accessed(&self) -> Result<Option<OffsetDateTime>>;
984 fn duration(&self) -> Result<Option<LeaseDuration>>;
985 fn lease_state(&self) -> Result<Option<LeaseState>>;
986 fn lease_status(&self) -> Result<Option<LeaseStatus>>;
987 fn legal_hold(&self) -> Result<Option<bool>>;
988 fn metadata(&self) -> Result<HashMap<String, String>>;
989 fn object_replication_rules(&self) -> Result<HashMap<String, String>>;
990 fn object_replication_policy_id(&self) -> Result<Option<String>>;
991 fn rehydrate_priority(&self) -> Result<Option<RehydratePriority>>;
992 fn is_server_encrypted(&self) -> Result<Option<bool>>;
993 fn tag_count(&self) -> Result<Option<i64>>;
994 fn version_id(&self) -> Result<Option<String>>;
995}
996
997impl BlobClientGetPropertiesResultHeaders for Response<BlobClientGetPropertiesResult, NoFormat> {
998 fn cache_control(&self) -> Result<Option<String>> {
1000 Headers::get_optional_as(self.headers(), &CACHE_CONTROL)
1001 }
1002
1003 fn content_disposition(&self) -> Result<Option<String>> {
1005 Headers::get_optional_as(self.headers(), &CONTENT_DISPOSITION)
1006 }
1007
1008 fn content_encoding(&self) -> Result<Option<String>> {
1010 Headers::get_optional_as(self.headers(), &CONTENT_ENCODING)
1011 }
1012
1013 fn content_language(&self) -> Result<Option<String>> {
1015 Headers::get_optional_as(self.headers(), &CONTENT_LANGUAGE)
1016 }
1017
1018 fn content_length(&self) -> Result<Option<u64>> {
1020 Headers::get_optional_as(self.headers(), &CONTENT_LENGTH)
1021 }
1022
1023 fn content_md5(&self) -> Result<Option<Vec<u8>>> {
1025 Headers::get_optional_with(self.headers(), &CONTENT_MD5, |h| base64::decode(h.as_str()))
1026 }
1027
1028 fn content_type(&self) -> Result<Option<String>> {
1030 Headers::get_optional_as(self.headers(), &CONTENT_TYPE)
1031 }
1032
1033 fn etag(&self) -> Result<Option<Etag>> {
1035 Headers::get_optional_as(self.headers(), &ETAG)
1036 }
1037
1038 fn last_modified(&self) -> Result<Option<OffsetDateTime>> {
1040 Headers::get_optional_with(self.headers(), &LAST_MODIFIED, |h| {
1041 parse_rfc7231(h.as_str())
1042 })
1043 }
1044
1045 fn access_tier(&self) -> Result<Option<String>> {
1047 Headers::get_optional_as(self.headers(), &ACCESS_TIER)
1048 }
1049
1050 fn access_tier_change_time(&self) -> Result<Option<OffsetDateTime>> {
1052 Headers::get_optional_with(self.headers(), &ACCESS_TIER_CHANGE_TIME, |h| {
1053 parse_rfc7231(h.as_str())
1054 })
1055 }
1056
1057 fn access_tier_inferred(&self) -> Result<Option<bool>> {
1059 Headers::get_optional_as(self.headers(), &ACCESS_TIER_INFERRED)
1060 }
1061
1062 fn archive_status(&self) -> Result<Option<ArchiveStatus>> {
1064 Headers::get_optional_as(self.headers(), &ARCHIVE_STATUS)
1065 }
1066
1067 fn blob_committed_block_count(&self) -> Result<Option<i32>> {
1069 Headers::get_optional_as(self.headers(), &BLOB_COMMITTED_BLOCK_COUNT)
1070 }
1071
1072 fn is_sealed(&self) -> Result<Option<bool>> {
1074 Headers::get_optional_as(self.headers(), &BLOB_SEALED)
1075 }
1076
1077 fn blob_sequence_number(&self) -> Result<Option<i64>> {
1079 Headers::get_optional_as(self.headers(), &BLOB_SEQUENCE_NUMBER)
1080 }
1081
1082 fn blob_type(&self) -> Result<Option<BlobType>> {
1084 Headers::get_optional_as(self.headers(), &BLOB_TYPE)
1085 }
1086
1087 fn copy_completion_time(&self) -> Result<Option<OffsetDateTime>> {
1089 Headers::get_optional_with(self.headers(), ©_COMPLETION_TIME, |h| {
1090 parse_rfc7231(h.as_str())
1091 })
1092 }
1093
1094 fn destination_snapshot(&self) -> Result<Option<String>> {
1096 Headers::get_optional_as(self.headers(), ©_DESTINATION_SNAPSHOT)
1097 }
1098
1099 fn copy_id(&self) -> Result<Option<String>> {
1101 Headers::get_optional_as(self.headers(), ©_ID)
1102 }
1103
1104 fn copy_progress(&self) -> Result<Option<String>> {
1106 Headers::get_optional_as(self.headers(), ©_PROGRESS)
1107 }
1108
1109 fn copy_source(&self) -> Result<Option<String>> {
1111 Headers::get_optional_as(self.headers(), ©_SOURCE)
1112 }
1113
1114 fn copy_status(&self) -> Result<Option<CopyStatus>> {
1116 Headers::get_optional_as(self.headers(), ©_STATUS)
1117 }
1118
1119 fn copy_status_description(&self) -> Result<Option<String>> {
1121 Headers::get_optional_as(self.headers(), ©_STATUS_DESCRIPTION)
1122 }
1123
1124 fn creation_time(&self) -> Result<Option<OffsetDateTime>> {
1126 Headers::get_optional_with(self.headers(), &CREATION_TIME, |h| {
1127 parse_rfc7231(h.as_str())
1128 })
1129 }
1130
1131 fn encryption_key_sha256(&self) -> Result<Option<String>> {
1133 Headers::get_optional_as(self.headers(), &ENCRYPTION_KEY_SHA256)
1134 }
1135
1136 fn encryption_scope(&self) -> Result<Option<String>> {
1138 Headers::get_optional_as(self.headers(), &ENCRYPTION_SCOPE)
1139 }
1140
1141 fn expires_on(&self) -> Result<Option<OffsetDateTime>> {
1143 Headers::get_optional_with(self.headers(), &EXPIRY_TIME, |h| parse_rfc7231(h.as_str()))
1144 }
1145
1146 fn immutability_policy_mode(&self) -> Result<Option<ImmutabilityPolicyMode>> {
1148 Headers::get_optional_as(self.headers(), &IMMUTABILITY_POLICY_MODE)
1149 }
1150
1151 fn immutability_policy_expires_on(&self) -> Result<Option<OffsetDateTime>> {
1153 Headers::get_optional_with(self.headers(), &IMMUTABILITY_POLICY_UNTIL_DATE, |h| {
1154 parse_rfc7231(h.as_str())
1155 })
1156 }
1157
1158 fn is_incremental_copy(&self) -> Result<Option<bool>> {
1160 Headers::get_optional_as(self.headers(), &INCREMENTAL_COPY)
1161 }
1162
1163 fn is_current_version(&self) -> Result<Option<bool>> {
1165 Headers::get_optional_as(self.headers(), &IS_CURRENT_VERSION)
1166 }
1167
1168 fn last_accessed(&self) -> Result<Option<OffsetDateTime>> {
1170 Headers::get_optional_with(self.headers(), &LAST_ACCESS_TIME, |h| {
1171 parse_rfc7231(h.as_str())
1172 })
1173 }
1174
1175 fn duration(&self) -> Result<Option<LeaseDuration>> {
1177 Headers::get_optional_as(self.headers(), &LEASE_DURATION)
1178 }
1179
1180 fn lease_state(&self) -> Result<Option<LeaseState>> {
1182 Headers::get_optional_as(self.headers(), &LEASE_STATE)
1183 }
1184
1185 fn lease_status(&self) -> Result<Option<LeaseStatus>> {
1187 Headers::get_optional_as(self.headers(), &LEASE_STATUS)
1188 }
1189
1190 fn legal_hold(&self) -> Result<Option<bool>> {
1192 Headers::get_optional_as(self.headers(), &LEGAL_HOLD)
1193 }
1194
1195 fn metadata(&self) -> Result<HashMap<String, String>> {
1197 let mut values = HashMap::new();
1198 for h in self.headers().iter() {
1199 let name = h.0.as_str();
1200 if name.len() > META.len() && name.starts_with(META) {
1201 values.insert(name[META.len()..].to_owned(), h.1.as_str().to_owned());
1202 }
1203 }
1204 Ok(values)
1205 }
1206
1207 fn object_replication_rules(&self) -> Result<HashMap<String, String>> {
1209 let mut values = HashMap::new();
1210 for h in self.headers().iter() {
1211 let name = h.0.as_str();
1212 if name.len() > OR.len() && name.starts_with(OR) {
1213 values.insert(name[OR.len()..].to_owned(), h.1.as_str().to_owned());
1214 }
1215 }
1216 Ok(values)
1217 }
1218
1219 fn object_replication_policy_id(&self) -> Result<Option<String>> {
1221 Headers::get_optional_as(self.headers(), &OR_POLICY_ID)
1222 }
1223
1224 fn rehydrate_priority(&self) -> Result<Option<RehydratePriority>> {
1226 Headers::get_optional_as(self.headers(), &REHYDRATE_PRIORITY)
1227 }
1228
1229 fn is_server_encrypted(&self) -> Result<Option<bool>> {
1231 Headers::get_optional_as(self.headers(), &SERVER_ENCRYPTED)
1232 }
1233
1234 fn tag_count(&self) -> Result<Option<i64>> {
1236 Headers::get_optional_as(self.headers(), &TAG_COUNT)
1237 }
1238
1239 fn version_id(&self) -> Result<Option<String>> {
1241 Headers::get_optional_as(self.headers(), &VERSION_ID)
1242 }
1243}
1244
1245pub trait BlobClientReleaseLeaseResultHeaders: private::Sealed {
1265 fn etag(&self) -> Result<Option<Etag>>;
1266 fn last_modified(&self) -> Result<Option<OffsetDateTime>>;
1267}
1268
1269impl BlobClientReleaseLeaseResultHeaders for Response<BlobClientReleaseLeaseResult, NoFormat> {
1270 fn etag(&self) -> Result<Option<Etag>> {
1272 Headers::get_optional_as(self.headers(), &ETAG)
1273 }
1274
1275 fn last_modified(&self) -> Result<Option<OffsetDateTime>> {
1277 Headers::get_optional_with(self.headers(), &LAST_MODIFIED, |h| {
1278 parse_rfc7231(h.as_str())
1279 })
1280 }
1281}
1282
1283pub trait BlobClientRenewLeaseResultHeaders: private::Sealed {
1306 fn etag(&self) -> Result<Option<Etag>>;
1307 fn last_modified(&self) -> Result<Option<OffsetDateTime>>;
1308 fn lease_id(&self) -> Result<Option<String>>;
1309}
1310
1311impl BlobClientRenewLeaseResultHeaders for Response<BlobClientRenewLeaseResult, NoFormat> {
1312 fn etag(&self) -> Result<Option<Etag>> {
1314 Headers::get_optional_as(self.headers(), &ETAG)
1315 }
1316
1317 fn last_modified(&self) -> Result<Option<OffsetDateTime>> {
1319 Headers::get_optional_with(self.headers(), &LAST_MODIFIED, |h| {
1320 parse_rfc7231(h.as_str())
1321 })
1322 }
1323
1324 fn lease_id(&self) -> Result<Option<String>> {
1326 Headers::get_optional_as(self.headers(), &LEASE_ID)
1327 }
1328}
1329
1330pub trait BlobClientStartCopyFromUrlResultHeaders: private::Sealed {
1353 fn etag(&self) -> Result<Option<Etag>>;
1354 fn last_modified(&self) -> Result<Option<OffsetDateTime>>;
1355 fn copy_id(&self) -> Result<Option<String>>;
1356 fn copy_status(&self) -> Result<Option<CopyStatus>>;
1357 fn version_id(&self) -> Result<Option<String>>;
1358}
1359
1360impl BlobClientStartCopyFromUrlResultHeaders
1361 for Response<BlobClientStartCopyFromUrlResult, NoFormat>
1362{
1363 fn etag(&self) -> Result<Option<Etag>> {
1365 Headers::get_optional_as(self.headers(), &ETAG)
1366 }
1367
1368 fn last_modified(&self) -> Result<Option<OffsetDateTime>> {
1370 Headers::get_optional_with(self.headers(), &LAST_MODIFIED, |h| {
1371 parse_rfc7231(h.as_str())
1372 })
1373 }
1374
1375 fn copy_id(&self) -> Result<Option<String>> {
1377 Headers::get_optional_as(self.headers(), ©_ID)
1378 }
1379
1380 fn copy_status(&self) -> Result<Option<CopyStatus>> {
1382 Headers::get_optional_as(self.headers(), ©_STATUS)
1383 }
1384
1385 fn version_id(&self) -> Result<Option<String>> {
1387 Headers::get_optional_as(self.headers(), &VERSION_ID)
1388 }
1389}
1390
1391pub trait BlobContainerClientAcquireLeaseResultHeaders: private::Sealed {
1414 fn etag(&self) -> Result<Option<Etag>>;
1415 fn last_modified(&self) -> Result<Option<OffsetDateTime>>;
1416 fn lease_id(&self) -> Result<Option<String>>;
1417}
1418
1419impl BlobContainerClientAcquireLeaseResultHeaders
1420 for Response<BlobContainerClientAcquireLeaseResult, NoFormat>
1421{
1422 fn etag(&self) -> Result<Option<Etag>> {
1424 Headers::get_optional_as(self.headers(), &ETAG)
1425 }
1426
1427 fn last_modified(&self) -> Result<Option<OffsetDateTime>> {
1429 Headers::get_optional_with(self.headers(), &LAST_MODIFIED, |h| {
1430 parse_rfc7231(h.as_str())
1431 })
1432 }
1433
1434 fn lease_id(&self) -> Result<Option<String>> {
1436 Headers::get_optional_as(self.headers(), &LEASE_ID)
1437 }
1438}
1439
1440pub trait BlobContainerClientBreakLeaseResultHeaders: private::Sealed {
1463 fn etag(&self) -> Result<Option<Etag>>;
1464 fn last_modified(&self) -> Result<Option<OffsetDateTime>>;
1465 fn lease_time(&self) -> Result<Option<i32>>;
1466}
1467
1468impl BlobContainerClientBreakLeaseResultHeaders
1469 for Response<BlobContainerClientBreakLeaseResult, NoFormat>
1470{
1471 fn etag(&self) -> Result<Option<Etag>> {
1473 Headers::get_optional_as(self.headers(), &ETAG)
1474 }
1475
1476 fn last_modified(&self) -> Result<Option<OffsetDateTime>> {
1478 Headers::get_optional_with(self.headers(), &LAST_MODIFIED, |h| {
1479 parse_rfc7231(h.as_str())
1480 })
1481 }
1482
1483 fn lease_time(&self) -> Result<Option<i32>> {
1485 Headers::get_optional_as(self.headers(), &LEASE_TIME)
1486 }
1487}
1488
1489pub trait BlobContainerClientChangeLeaseResultHeaders: private::Sealed {
1512 fn etag(&self) -> Result<Option<Etag>>;
1513 fn last_modified(&self) -> Result<Option<OffsetDateTime>>;
1514 fn lease_id(&self) -> Result<Option<String>>;
1515}
1516
1517impl BlobContainerClientChangeLeaseResultHeaders
1518 for Response<BlobContainerClientChangeLeaseResult, NoFormat>
1519{
1520 fn etag(&self) -> Result<Option<Etag>> {
1522 Headers::get_optional_as(self.headers(), &ETAG)
1523 }
1524
1525 fn last_modified(&self) -> Result<Option<OffsetDateTime>> {
1527 Headers::get_optional_with(self.headers(), &LAST_MODIFIED, |h| {
1528 parse_rfc7231(h.as_str())
1529 })
1530 }
1531
1532 fn lease_id(&self) -> Result<Option<String>> {
1534 Headers::get_optional_as(self.headers(), &LEASE_ID)
1535 }
1536}
1537
1538pub trait BlobContainerClientGetAccountInfoResultHeaders: private::Sealed {
1561 fn account_kind(&self) -> Result<Option<AccountKind>>;
1562 fn is_hierarchical_namespace_enabled(&self) -> Result<Option<bool>>;
1563 fn sku_name(&self) -> Result<Option<SkuName>>;
1564}
1565
1566impl BlobContainerClientGetAccountInfoResultHeaders
1567 for Response<BlobContainerClientGetAccountInfoResult, NoFormat>
1568{
1569 fn account_kind(&self) -> Result<Option<AccountKind>> {
1571 Headers::get_optional_as(self.headers(), &ACCOUNT_KIND)
1572 }
1573
1574 fn is_hierarchical_namespace_enabled(&self) -> Result<Option<bool>> {
1576 Headers::get_optional_as(self.headers(), &IS_HNS_ENABLED)
1577 }
1578
1579 fn sku_name(&self) -> Result<Option<SkuName>> {
1581 Headers::get_optional_as(self.headers(), &SKU_NAME)
1582 }
1583}
1584
1585pub trait BlobContainerClientGetPropertiesResultHeaders: private::Sealed {
1608 fn etag(&self) -> Result<Option<Etag>>;
1609 fn last_modified(&self) -> Result<Option<OffsetDateTime>>;
1610 fn access(&self) -> Result<Option<PublicAccessType>>;
1611 fn default_encryption_scope(&self) -> Result<Option<String>>;
1612 fn prevent_encryption_scope_override(&self) -> Result<Option<bool>>;
1613 fn has_immutability_policy(&self) -> Result<Option<bool>>;
1614 fn has_legal_hold(&self) -> Result<Option<bool>>;
1615 fn is_immutable_storage_with_versioning_enabled(&self) -> Result<Option<bool>>;
1616 fn duration(&self) -> Result<Option<LeaseDuration>>;
1617 fn lease_state(&self) -> Result<Option<LeaseState>>;
1618 fn lease_status(&self) -> Result<Option<LeaseStatus>>;
1619 fn metadata(&self) -> Result<HashMap<String, String>>;
1620}
1621
1622impl BlobContainerClientGetPropertiesResultHeaders
1623 for Response<BlobContainerClientGetPropertiesResult, NoFormat>
1624{
1625 fn etag(&self) -> Result<Option<Etag>> {
1627 Headers::get_optional_as(self.headers(), &ETAG)
1628 }
1629
1630 fn last_modified(&self) -> Result<Option<OffsetDateTime>> {
1632 Headers::get_optional_with(self.headers(), &LAST_MODIFIED, |h| {
1633 parse_rfc7231(h.as_str())
1634 })
1635 }
1636
1637 fn access(&self) -> Result<Option<PublicAccessType>> {
1639 Headers::get_optional_as(self.headers(), &BLOB_PUBLIC_ACCESS)
1640 }
1641
1642 fn default_encryption_scope(&self) -> Result<Option<String>> {
1644 Headers::get_optional_as(self.headers(), &DEFAULT_ENCRYPTION_SCOPE)
1645 }
1646
1647 fn prevent_encryption_scope_override(&self) -> Result<Option<bool>> {
1649 Headers::get_optional_as(self.headers(), &DENY_ENCRYPTION_SCOPE_OVERRIDE)
1650 }
1651
1652 fn has_immutability_policy(&self) -> Result<Option<bool>> {
1654 Headers::get_optional_as(self.headers(), &HAS_IMMUTABILITY_POLICY)
1655 }
1656
1657 fn has_legal_hold(&self) -> Result<Option<bool>> {
1659 Headers::get_optional_as(self.headers(), &HAS_LEGAL_HOLD)
1660 }
1661
1662 fn is_immutable_storage_with_versioning_enabled(&self) -> Result<Option<bool>> {
1664 Headers::get_optional_as(self.headers(), &IMMUTABLE_STORAGE_WITH_VERSIONING_ENABLED)
1665 }
1666
1667 fn duration(&self) -> Result<Option<LeaseDuration>> {
1669 Headers::get_optional_as(self.headers(), &LEASE_DURATION)
1670 }
1671
1672 fn lease_state(&self) -> Result<Option<LeaseState>> {
1674 Headers::get_optional_as(self.headers(), &LEASE_STATE)
1675 }
1676
1677 fn lease_status(&self) -> Result<Option<LeaseStatus>> {
1679 Headers::get_optional_as(self.headers(), &LEASE_STATUS)
1680 }
1681
1682 fn metadata(&self) -> Result<HashMap<String, String>> {
1684 let mut values = HashMap::new();
1685 for h in self.headers().iter() {
1686 let name = h.0.as_str();
1687 if name.len() > META.len() && name.starts_with(META) {
1688 values.insert(name[META.len()..].to_owned(), h.1.as_str().to_owned());
1689 }
1690 }
1691 Ok(values)
1692 }
1693}
1694
1695pub trait BlobContainerClientReleaseLeaseResultHeaders: private::Sealed {
1715 fn etag(&self) -> Result<Option<Etag>>;
1716 fn last_modified(&self) -> Result<Option<OffsetDateTime>>;
1717}
1718
1719impl BlobContainerClientReleaseLeaseResultHeaders
1720 for Response<BlobContainerClientReleaseLeaseResult, NoFormat>
1721{
1722 fn etag(&self) -> Result<Option<Etag>> {
1724 Headers::get_optional_as(self.headers(), &ETAG)
1725 }
1726
1727 fn last_modified(&self) -> Result<Option<OffsetDateTime>> {
1729 Headers::get_optional_with(self.headers(), &LAST_MODIFIED, |h| {
1730 parse_rfc7231(h.as_str())
1731 })
1732 }
1733}
1734
1735pub trait BlobContainerClientRenewLeaseResultHeaders: private::Sealed {
1758 fn etag(&self) -> Result<Option<Etag>>;
1759 fn last_modified(&self) -> Result<Option<OffsetDateTime>>;
1760 fn lease_id(&self) -> Result<Option<String>>;
1761}
1762
1763impl BlobContainerClientRenewLeaseResultHeaders
1764 for Response<BlobContainerClientRenewLeaseResult, NoFormat>
1765{
1766 fn etag(&self) -> Result<Option<Etag>> {
1768 Headers::get_optional_as(self.headers(), &ETAG)
1769 }
1770
1771 fn last_modified(&self) -> Result<Option<OffsetDateTime>> {
1773 Headers::get_optional_with(self.headers(), &LAST_MODIFIED, |h| {
1774 parse_rfc7231(h.as_str())
1775 })
1776 }
1777
1778 fn lease_id(&self) -> Result<Option<String>> {
1780 Headers::get_optional_as(self.headers(), &LEASE_ID)
1781 }
1782}
1783
1784pub trait BlobServiceClientGetAccountInfoResultHeaders: private::Sealed {
1807 fn account_kind(&self) -> Result<Option<AccountKind>>;
1808 fn is_hierarchical_namespace_enabled(&self) -> Result<Option<bool>>;
1809 fn sku_name(&self) -> Result<Option<SkuName>>;
1810}
1811
1812impl BlobServiceClientGetAccountInfoResultHeaders
1813 for Response<BlobServiceClientGetAccountInfoResult, NoFormat>
1814{
1815 fn account_kind(&self) -> Result<Option<AccountKind>> {
1817 Headers::get_optional_as(self.headers(), &ACCOUNT_KIND)
1818 }
1819
1820 fn is_hierarchical_namespace_enabled(&self) -> Result<Option<bool>> {
1822 Headers::get_optional_as(self.headers(), &IS_HNS_ENABLED)
1823 }
1824
1825 fn sku_name(&self) -> Result<Option<SkuName>> {
1827 Headers::get_optional_as(self.headers(), &SKU_NAME)
1828 }
1829}
1830
1831pub trait BlockBlobClientCommitBlockListResultHeaders: private::Sealed {
1854 fn content_md5(&self) -> Result<Option<Vec<u8>>>;
1855 fn etag(&self) -> Result<Option<Etag>>;
1856 fn last_modified(&self) -> Result<Option<OffsetDateTime>>;
1857 fn content_crc64(&self) -> Result<Option<Vec<u8>>>;
1858 fn encryption_key_sha256(&self) -> Result<Option<String>>;
1859 fn encryption_scope(&self) -> Result<Option<String>>;
1860 fn is_server_encrypted(&self) -> Result<Option<bool>>;
1861 fn version_id(&self) -> Result<Option<String>>;
1862}
1863
1864impl BlockBlobClientCommitBlockListResultHeaders
1865 for Response<BlockBlobClientCommitBlockListResult, NoFormat>
1866{
1867 fn content_md5(&self) -> Result<Option<Vec<u8>>> {
1869 Headers::get_optional_with(self.headers(), &CONTENT_MD5, |h| base64::decode(h.as_str()))
1870 }
1871
1872 fn etag(&self) -> Result<Option<Etag>> {
1874 Headers::get_optional_as(self.headers(), &ETAG)
1875 }
1876
1877 fn last_modified(&self) -> Result<Option<OffsetDateTime>> {
1879 Headers::get_optional_with(self.headers(), &LAST_MODIFIED, |h| {
1880 parse_rfc7231(h.as_str())
1881 })
1882 }
1883
1884 fn content_crc64(&self) -> Result<Option<Vec<u8>>> {
1886 Headers::get_optional_with(self.headers(), &CONTENT_CRC64, |h| {
1887 base64::decode(h.as_str())
1888 })
1889 }
1890
1891 fn encryption_key_sha256(&self) -> Result<Option<String>> {
1893 Headers::get_optional_as(self.headers(), &ENCRYPTION_KEY_SHA256)
1894 }
1895
1896 fn encryption_scope(&self) -> Result<Option<String>> {
1898 Headers::get_optional_as(self.headers(), &ENCRYPTION_SCOPE)
1899 }
1900
1901 fn is_server_encrypted(&self) -> Result<Option<bool>> {
1903 Headers::get_optional_as(self.headers(), &REQUEST_SERVER_ENCRYPTED)
1904 }
1905
1906 fn version_id(&self) -> Result<Option<String>> {
1908 Headers::get_optional_as(self.headers(), &VERSION_ID)
1909 }
1910}
1911
1912pub trait BlockBlobClientStageBlockFromUrlResultHeaders: private::Sealed {
1935 fn content_md5(&self) -> Result<Option<Vec<u8>>>;
1936 fn content_crc64(&self) -> Result<Option<Vec<u8>>>;
1937 fn encryption_key_sha256(&self) -> Result<Option<String>>;
1938 fn encryption_scope(&self) -> Result<Option<String>>;
1939 fn is_server_encrypted(&self) -> Result<Option<bool>>;
1940}
1941
1942impl BlockBlobClientStageBlockFromUrlResultHeaders
1943 for Response<BlockBlobClientStageBlockFromUrlResult, NoFormat>
1944{
1945 fn content_md5(&self) -> Result<Option<Vec<u8>>> {
1947 Headers::get_optional_with(self.headers(), &CONTENT_MD5, |h| base64::decode(h.as_str()))
1948 }
1949
1950 fn content_crc64(&self) -> Result<Option<Vec<u8>>> {
1952 Headers::get_optional_with(self.headers(), &CONTENT_CRC64, |h| {
1953 base64::decode(h.as_str())
1954 })
1955 }
1956
1957 fn encryption_key_sha256(&self) -> Result<Option<String>> {
1959 Headers::get_optional_as(self.headers(), &ENCRYPTION_KEY_SHA256)
1960 }
1961
1962 fn encryption_scope(&self) -> Result<Option<String>> {
1964 Headers::get_optional_as(self.headers(), &ENCRYPTION_SCOPE)
1965 }
1966
1967 fn is_server_encrypted(&self) -> Result<Option<bool>> {
1969 Headers::get_optional_as(self.headers(), &REQUEST_SERVER_ENCRYPTED)
1970 }
1971}
1972
1973pub trait BlockBlobClientStageBlockResultHeaders: private::Sealed {
1996 fn content_md5(&self) -> Result<Option<Vec<u8>>>;
1997 fn content_crc64(&self) -> Result<Option<Vec<u8>>>;
1998 fn encryption_key_sha256(&self) -> Result<Option<String>>;
1999 fn encryption_scope(&self) -> Result<Option<String>>;
2000 fn is_server_encrypted(&self) -> Result<Option<bool>>;
2001}
2002
2003impl BlockBlobClientStageBlockResultHeaders
2004 for Response<BlockBlobClientStageBlockResult, NoFormat>
2005{
2006 fn content_md5(&self) -> Result<Option<Vec<u8>>> {
2008 Headers::get_optional_with(self.headers(), &CONTENT_MD5, |h| base64::decode(h.as_str()))
2009 }
2010
2011 fn content_crc64(&self) -> Result<Option<Vec<u8>>> {
2013 Headers::get_optional_with(self.headers(), &CONTENT_CRC64, |h| {
2014 base64::decode(h.as_str())
2015 })
2016 }
2017
2018 fn encryption_key_sha256(&self) -> Result<Option<String>> {
2020 Headers::get_optional_as(self.headers(), &ENCRYPTION_KEY_SHA256)
2021 }
2022
2023 fn encryption_scope(&self) -> Result<Option<String>> {
2025 Headers::get_optional_as(self.headers(), &ENCRYPTION_SCOPE)
2026 }
2027
2028 fn is_server_encrypted(&self) -> Result<Option<bool>> {
2030 Headers::get_optional_as(self.headers(), &REQUEST_SERVER_ENCRYPTED)
2031 }
2032}
2033
2034pub trait BlockBlobClientUploadBlobFromUrlResultHeaders: private::Sealed {
2057 fn content_md5(&self) -> Result<Option<Vec<u8>>>;
2058 fn etag(&self) -> Result<Option<Etag>>;
2059 fn last_modified(&self) -> Result<Option<OffsetDateTime>>;
2060 fn encryption_key_sha256(&self) -> Result<Option<String>>;
2061 fn encryption_scope(&self) -> Result<Option<String>>;
2062 fn is_server_encrypted(&self) -> Result<Option<bool>>;
2063 fn version_id(&self) -> Result<Option<String>>;
2064}
2065
2066impl BlockBlobClientUploadBlobFromUrlResultHeaders
2067 for Response<BlockBlobClientUploadBlobFromUrlResult, NoFormat>
2068{
2069 fn content_md5(&self) -> Result<Option<Vec<u8>>> {
2071 Headers::get_optional_with(self.headers(), &CONTENT_MD5, |h| base64::decode(h.as_str()))
2072 }
2073
2074 fn etag(&self) -> Result<Option<Etag>> {
2076 Headers::get_optional_as(self.headers(), &ETAG)
2077 }
2078
2079 fn last_modified(&self) -> Result<Option<OffsetDateTime>> {
2081 Headers::get_optional_with(self.headers(), &LAST_MODIFIED, |h| {
2082 parse_rfc7231(h.as_str())
2083 })
2084 }
2085
2086 fn encryption_key_sha256(&self) -> Result<Option<String>> {
2088 Headers::get_optional_as(self.headers(), &ENCRYPTION_KEY_SHA256)
2089 }
2090
2091 fn encryption_scope(&self) -> Result<Option<String>> {
2093 Headers::get_optional_as(self.headers(), &ENCRYPTION_SCOPE)
2094 }
2095
2096 fn is_server_encrypted(&self) -> Result<Option<bool>> {
2098 Headers::get_optional_as(self.headers(), &REQUEST_SERVER_ENCRYPTED)
2099 }
2100
2101 fn version_id(&self) -> Result<Option<String>> {
2103 Headers::get_optional_as(self.headers(), &VERSION_ID)
2104 }
2105}
2106
2107pub(crate) trait BlockBlobClientUploadInternalResultHeaders: private::Sealed {
2130 fn content_md5(&self) -> Result<Option<Vec<u8>>>;
2131 fn etag(&self) -> Result<Option<Etag>>;
2132 fn last_modified(&self) -> Result<Option<OffsetDateTime>>;
2133 fn content_crc64(&self) -> Result<Option<Vec<u8>>>;
2134 fn encryption_key_sha256(&self) -> Result<Option<String>>;
2135 fn encryption_scope(&self) -> Result<Option<String>>;
2136 fn is_server_encrypted(&self) -> Result<Option<bool>>;
2137 fn version_id(&self) -> Result<Option<String>>;
2138}
2139
2140impl BlockBlobClientUploadInternalResultHeaders
2141 for Response<BlockBlobClientUploadInternalResult, NoFormat>
2142{
2143 fn content_md5(&self) -> Result<Option<Vec<u8>>> {
2145 Headers::get_optional_with(self.headers(), &CONTENT_MD5, |h| base64::decode(h.as_str()))
2146 }
2147
2148 fn etag(&self) -> Result<Option<Etag>> {
2150 Headers::get_optional_as(self.headers(), &ETAG)
2151 }
2152
2153 fn last_modified(&self) -> Result<Option<OffsetDateTime>> {
2155 Headers::get_optional_with(self.headers(), &LAST_MODIFIED, |h| {
2156 parse_rfc7231(h.as_str())
2157 })
2158 }
2159
2160 fn content_crc64(&self) -> Result<Option<Vec<u8>>> {
2162 Headers::get_optional_with(self.headers(), &CONTENT_CRC64, |h| {
2163 base64::decode(h.as_str())
2164 })
2165 }
2166
2167 fn encryption_key_sha256(&self) -> Result<Option<String>> {
2169 Headers::get_optional_as(self.headers(), &ENCRYPTION_KEY_SHA256)
2170 }
2171
2172 fn encryption_scope(&self) -> Result<Option<String>> {
2174 Headers::get_optional_as(self.headers(), &ENCRYPTION_SCOPE)
2175 }
2176
2177 fn is_server_encrypted(&self) -> Result<Option<bool>> {
2179 Headers::get_optional_as(self.headers(), &REQUEST_SERVER_ENCRYPTED)
2180 }
2181
2182 fn version_id(&self) -> Result<Option<String>> {
2184 Headers::get_optional_as(self.headers(), &VERSION_ID)
2185 }
2186}
2187
2188pub trait BlockListHeaders: private::Sealed {
2211 fn etag(&self) -> Result<Option<Etag>>;
2212 fn last_modified(&self) -> Result<Option<OffsetDateTime>>;
2213 fn blob_content_length(&self) -> Result<Option<i64>>;
2214}
2215
2216impl BlockListHeaders for Response<BlockList, XmlFormat> {
2217 fn etag(&self) -> Result<Option<Etag>> {
2219 Headers::get_optional_as(self.headers(), &ETAG)
2220 }
2221
2222 fn last_modified(&self) -> Result<Option<OffsetDateTime>> {
2224 Headers::get_optional_with(self.headers(), &LAST_MODIFIED, |h| {
2225 parse_rfc7231(h.as_str())
2226 })
2227 }
2228
2229 fn blob_content_length(&self) -> Result<Option<i64>> {
2231 Headers::get_optional_as(self.headers(), &BLOB_CONTENT_LENGTH)
2232 }
2233}
2234
2235pub trait PageBlobClientClearPagesResultHeaders: private::Sealed {
2258 fn content_md5(&self) -> Result<Option<Vec<u8>>>;
2259 fn etag(&self) -> Result<Option<Etag>>;
2260 fn last_modified(&self) -> Result<Option<OffsetDateTime>>;
2261 fn blob_sequence_number(&self) -> Result<Option<i64>>;
2262 fn content_crc64(&self) -> Result<Option<Vec<u8>>>;
2263}
2264
2265impl PageBlobClientClearPagesResultHeaders for Response<PageBlobClientClearPagesResult, NoFormat> {
2266 fn content_md5(&self) -> Result<Option<Vec<u8>>> {
2268 Headers::get_optional_with(self.headers(), &CONTENT_MD5, |h| base64::decode(h.as_str()))
2269 }
2270
2271 fn etag(&self) -> Result<Option<Etag>> {
2273 Headers::get_optional_as(self.headers(), &ETAG)
2274 }
2275
2276 fn last_modified(&self) -> Result<Option<OffsetDateTime>> {
2278 Headers::get_optional_with(self.headers(), &LAST_MODIFIED, |h| {
2279 parse_rfc7231(h.as_str())
2280 })
2281 }
2282
2283 fn blob_sequence_number(&self) -> Result<Option<i64>> {
2285 Headers::get_optional_as(self.headers(), &BLOB_SEQUENCE_NUMBER)
2286 }
2287
2288 fn content_crc64(&self) -> Result<Option<Vec<u8>>> {
2290 Headers::get_optional_with(self.headers(), &CONTENT_CRC64, |h| {
2291 base64::decode(h.as_str())
2292 })
2293 }
2294}
2295
2296pub trait PageBlobClientCreateResultHeaders: private::Sealed {
2319 fn content_md5(&self) -> Result<Option<Vec<u8>>>;
2320 fn etag(&self) -> Result<Option<Etag>>;
2321 fn last_modified(&self) -> Result<Option<OffsetDateTime>>;
2322 fn encryption_key_sha256(&self) -> Result<Option<String>>;
2323 fn encryption_scope(&self) -> Result<Option<String>>;
2324 fn is_server_encrypted(&self) -> Result<Option<bool>>;
2325 fn version_id(&self) -> Result<Option<String>>;
2326}
2327
2328impl PageBlobClientCreateResultHeaders for Response<PageBlobClientCreateResult, NoFormat> {
2329 fn content_md5(&self) -> Result<Option<Vec<u8>>> {
2331 Headers::get_optional_with(self.headers(), &CONTENT_MD5, |h| base64::decode(h.as_str()))
2332 }
2333
2334 fn etag(&self) -> Result<Option<Etag>> {
2336 Headers::get_optional_as(self.headers(), &ETAG)
2337 }
2338
2339 fn last_modified(&self) -> Result<Option<OffsetDateTime>> {
2341 Headers::get_optional_with(self.headers(), &LAST_MODIFIED, |h| {
2342 parse_rfc7231(h.as_str())
2343 })
2344 }
2345
2346 fn encryption_key_sha256(&self) -> Result<Option<String>> {
2348 Headers::get_optional_as(self.headers(), &ENCRYPTION_KEY_SHA256)
2349 }
2350
2351 fn encryption_scope(&self) -> Result<Option<String>> {
2353 Headers::get_optional_as(self.headers(), &ENCRYPTION_SCOPE)
2354 }
2355
2356 fn is_server_encrypted(&self) -> Result<Option<bool>> {
2358 Headers::get_optional_as(self.headers(), &REQUEST_SERVER_ENCRYPTED)
2359 }
2360
2361 fn version_id(&self) -> Result<Option<String>> {
2363 Headers::get_optional_as(self.headers(), &VERSION_ID)
2364 }
2365}
2366
2367pub trait PageBlobClientResizeResultHeaders: private::Sealed {
2390 fn etag(&self) -> Result<Option<Etag>>;
2391 fn last_modified(&self) -> Result<Option<OffsetDateTime>>;
2392 fn blob_sequence_number(&self) -> Result<Option<i64>>;
2393}
2394
2395impl PageBlobClientResizeResultHeaders for Response<PageBlobClientResizeResult, NoFormat> {
2396 fn etag(&self) -> Result<Option<Etag>> {
2398 Headers::get_optional_as(self.headers(), &ETAG)
2399 }
2400
2401 fn last_modified(&self) -> Result<Option<OffsetDateTime>> {
2403 Headers::get_optional_with(self.headers(), &LAST_MODIFIED, |h| {
2404 parse_rfc7231(h.as_str())
2405 })
2406 }
2407
2408 fn blob_sequence_number(&self) -> Result<Option<i64>> {
2410 Headers::get_optional_as(self.headers(), &BLOB_SEQUENCE_NUMBER)
2411 }
2412}
2413
2414pub trait PageBlobClientSetSequenceNumberResultHeaders: private::Sealed {
2437 fn etag(&self) -> Result<Option<Etag>>;
2438 fn last_modified(&self) -> Result<Option<OffsetDateTime>>;
2439 fn blob_sequence_number(&self) -> Result<Option<i64>>;
2440}
2441
2442impl PageBlobClientSetSequenceNumberResultHeaders
2443 for Response<PageBlobClientSetSequenceNumberResult, NoFormat>
2444{
2445 fn etag(&self) -> Result<Option<Etag>> {
2447 Headers::get_optional_as(self.headers(), &ETAG)
2448 }
2449
2450 fn last_modified(&self) -> Result<Option<OffsetDateTime>> {
2452 Headers::get_optional_with(self.headers(), &LAST_MODIFIED, |h| {
2453 parse_rfc7231(h.as_str())
2454 })
2455 }
2456
2457 fn blob_sequence_number(&self) -> Result<Option<i64>> {
2459 Headers::get_optional_as(self.headers(), &BLOB_SEQUENCE_NUMBER)
2460 }
2461}
2462
2463pub trait PageBlobClientUploadPagesFromUrlResultHeaders: private::Sealed {
2486 fn content_md5(&self) -> Result<Option<Vec<u8>>>;
2487 fn etag(&self) -> Result<Option<Etag>>;
2488 fn last_modified(&self) -> Result<Option<OffsetDateTime>>;
2489 fn blob_sequence_number(&self) -> Result<Option<i64>>;
2490 fn content_crc64(&self) -> Result<Option<Vec<u8>>>;
2491 fn encryption_key_sha256(&self) -> Result<Option<String>>;
2492 fn encryption_scope(&self) -> Result<Option<String>>;
2493 fn is_server_encrypted(&self) -> Result<Option<bool>>;
2494}
2495
2496impl PageBlobClientUploadPagesFromUrlResultHeaders
2497 for Response<PageBlobClientUploadPagesFromUrlResult, NoFormat>
2498{
2499 fn content_md5(&self) -> Result<Option<Vec<u8>>> {
2501 Headers::get_optional_with(self.headers(), &CONTENT_MD5, |h| base64::decode(h.as_str()))
2502 }
2503
2504 fn etag(&self) -> Result<Option<Etag>> {
2506 Headers::get_optional_as(self.headers(), &ETAG)
2507 }
2508
2509 fn last_modified(&self) -> Result<Option<OffsetDateTime>> {
2511 Headers::get_optional_with(self.headers(), &LAST_MODIFIED, |h| {
2512 parse_rfc7231(h.as_str())
2513 })
2514 }
2515
2516 fn blob_sequence_number(&self) -> Result<Option<i64>> {
2518 Headers::get_optional_as(self.headers(), &BLOB_SEQUENCE_NUMBER)
2519 }
2520
2521 fn content_crc64(&self) -> Result<Option<Vec<u8>>> {
2523 Headers::get_optional_with(self.headers(), &CONTENT_CRC64, |h| {
2524 base64::decode(h.as_str())
2525 })
2526 }
2527
2528 fn encryption_key_sha256(&self) -> Result<Option<String>> {
2530 Headers::get_optional_as(self.headers(), &ENCRYPTION_KEY_SHA256)
2531 }
2532
2533 fn encryption_scope(&self) -> Result<Option<String>> {
2535 Headers::get_optional_as(self.headers(), &ENCRYPTION_SCOPE)
2536 }
2537
2538 fn is_server_encrypted(&self) -> Result<Option<bool>> {
2540 Headers::get_optional_as(self.headers(), &REQUEST_SERVER_ENCRYPTED)
2541 }
2542}
2543
2544pub trait PageBlobClientUploadPagesResultHeaders: private::Sealed {
2567 fn content_md5(&self) -> Result<Option<Vec<u8>>>;
2568 fn etag(&self) -> Result<Option<Etag>>;
2569 fn last_modified(&self) -> Result<Option<OffsetDateTime>>;
2570 fn blob_sequence_number(&self) -> Result<Option<i64>>;
2571 fn content_crc64(&self) -> Result<Option<Vec<u8>>>;
2572 fn encryption_key_sha256(&self) -> Result<Option<String>>;
2573 fn encryption_scope(&self) -> Result<Option<String>>;
2574 fn is_server_encrypted(&self) -> Result<Option<bool>>;
2575}
2576
2577impl PageBlobClientUploadPagesResultHeaders
2578 for Response<PageBlobClientUploadPagesResult, NoFormat>
2579{
2580 fn content_md5(&self) -> Result<Option<Vec<u8>>> {
2582 Headers::get_optional_with(self.headers(), &CONTENT_MD5, |h| base64::decode(h.as_str()))
2583 }
2584
2585 fn etag(&self) -> Result<Option<Etag>> {
2587 Headers::get_optional_as(self.headers(), &ETAG)
2588 }
2589
2590 fn last_modified(&self) -> Result<Option<OffsetDateTime>> {
2592 Headers::get_optional_with(self.headers(), &LAST_MODIFIED, |h| {
2593 parse_rfc7231(h.as_str())
2594 })
2595 }
2596
2597 fn blob_sequence_number(&self) -> Result<Option<i64>> {
2599 Headers::get_optional_as(self.headers(), &BLOB_SEQUENCE_NUMBER)
2600 }
2601
2602 fn content_crc64(&self) -> Result<Option<Vec<u8>>> {
2604 Headers::get_optional_with(self.headers(), &CONTENT_CRC64, |h| {
2605 base64::decode(h.as_str())
2606 })
2607 }
2608
2609 fn encryption_key_sha256(&self) -> Result<Option<String>> {
2611 Headers::get_optional_as(self.headers(), &ENCRYPTION_KEY_SHA256)
2612 }
2613
2614 fn encryption_scope(&self) -> Result<Option<String>> {
2616 Headers::get_optional_as(self.headers(), &ENCRYPTION_SCOPE)
2617 }
2618
2619 fn is_server_encrypted(&self) -> Result<Option<bool>> {
2621 Headers::get_optional_as(self.headers(), &REQUEST_SERVER_ENCRYPTED)
2622 }
2623}
2624
2625pub trait PageListHeaders: private::Sealed {
2648 fn etag(&self) -> Result<Option<Etag>>;
2649 fn last_modified(&self) -> Result<Option<OffsetDateTime>>;
2650 fn blob_content_length(&self) -> Result<Option<i64>>;
2651}
2652
2653impl PageListHeaders for Response<PageList, XmlFormat> {
2654 fn etag(&self) -> Result<Option<Etag>> {
2656 Headers::get_optional_as(self.headers(), &ETAG)
2657 }
2658
2659 fn last_modified(&self) -> Result<Option<OffsetDateTime>> {
2661 Headers::get_optional_with(self.headers(), &LAST_MODIFIED, |h| {
2662 parse_rfc7231(h.as_str())
2663 })
2664 }
2665
2666 fn blob_content_length(&self) -> Result<Option<i64>> {
2668 Headers::get_optional_as(self.headers(), &BLOB_CONTENT_LENGTH)
2669 }
2670}
2671
2672pub trait SignedIdentifiersHeaders: private::Sealed {
2695 fn etag(&self) -> Result<Option<Etag>>;
2696 fn last_modified(&self) -> Result<Option<OffsetDateTime>>;
2697 fn access(&self) -> Result<Option<PublicAccessType>>;
2698}
2699
2700impl SignedIdentifiersHeaders for Response<SignedIdentifiers, XmlFormat> {
2701 fn etag(&self) -> Result<Option<Etag>> {
2703 Headers::get_optional_as(self.headers(), &ETAG)
2704 }
2705
2706 fn last_modified(&self) -> Result<Option<OffsetDateTime>> {
2708 Headers::get_optional_with(self.headers(), &LAST_MODIFIED, |h| {
2709 parse_rfc7231(h.as_str())
2710 })
2711 }
2712
2713 fn access(&self) -> Result<Option<PublicAccessType>> {
2715 Headers::get_optional_as(self.headers(), &BLOB_PUBLIC_ACCESS)
2716 }
2717}
2718
2719mod private {
2720 use super::{
2721 AppendBlobClientAppendBlockFromUrlResult, AppendBlobClientAppendBlockResult,
2722 AppendBlobClientCreateResult, AppendBlobClientSealResult, BlobClientAcquireLeaseResult,
2723 BlobClientBreakLeaseResult, BlobClientChangeLeaseResult, BlobClientCreateSnapshotResult,
2724 BlobClientDownloadInternalResult, BlobClientGetAccountInfoResult,
2725 BlobClientGetPropertiesResult, BlobClientReleaseLeaseResult, BlobClientRenewLeaseResult,
2726 BlobClientStartCopyFromUrlResult, BlobContainerClientAcquireLeaseResult,
2727 BlobContainerClientBreakLeaseResult, BlobContainerClientChangeLeaseResult,
2728 BlobContainerClientGetAccountInfoResult, BlobContainerClientGetPropertiesResult,
2729 BlobContainerClientReleaseLeaseResult, BlobContainerClientRenewLeaseResult,
2730 BlobServiceClientGetAccountInfoResult, BlockBlobClientCommitBlockListResult,
2731 BlockBlobClientStageBlockFromUrlResult, BlockBlobClientStageBlockResult,
2732 BlockBlobClientUploadBlobFromUrlResult, BlockBlobClientUploadInternalResult, BlockList,
2733 PageBlobClientClearPagesResult, PageBlobClientCreateResult, PageBlobClientResizeResult,
2734 PageBlobClientSetSequenceNumberResult, PageBlobClientUploadPagesFromUrlResult,
2735 PageBlobClientUploadPagesResult, PageList, SignedIdentifiers,
2736 };
2737 use azure_core::http::{AsyncResponse, NoFormat, Response, XmlFormat};
2738
2739 pub trait Sealed {}
2740
2741 impl Sealed for AsyncResponse<BlobClientDownloadInternalResult> {}
2742 impl Sealed for Response<AppendBlobClientAppendBlockFromUrlResult, NoFormat> {}
2743 impl Sealed for Response<AppendBlobClientAppendBlockResult, NoFormat> {}
2744 impl Sealed for Response<AppendBlobClientCreateResult, NoFormat> {}
2745 impl Sealed for Response<AppendBlobClientSealResult, NoFormat> {}
2746 impl Sealed for Response<BlobClientAcquireLeaseResult, NoFormat> {}
2747 impl Sealed for Response<BlobClientBreakLeaseResult, NoFormat> {}
2748 impl Sealed for Response<BlobClientChangeLeaseResult, NoFormat> {}
2749 impl Sealed for Response<BlobClientCreateSnapshotResult, NoFormat> {}
2750 impl Sealed for Response<BlobClientGetAccountInfoResult, NoFormat> {}
2751 impl Sealed for Response<BlobClientGetPropertiesResult, NoFormat> {}
2752 impl Sealed for Response<BlobClientReleaseLeaseResult, NoFormat> {}
2753 impl Sealed for Response<BlobClientRenewLeaseResult, NoFormat> {}
2754 impl Sealed for Response<BlobClientStartCopyFromUrlResult, NoFormat> {}
2755 impl Sealed for Response<BlobContainerClientAcquireLeaseResult, NoFormat> {}
2756 impl Sealed for Response<BlobContainerClientBreakLeaseResult, NoFormat> {}
2757 impl Sealed for Response<BlobContainerClientChangeLeaseResult, NoFormat> {}
2758 impl Sealed for Response<BlobContainerClientGetAccountInfoResult, NoFormat> {}
2759 impl Sealed for Response<BlobContainerClientGetPropertiesResult, NoFormat> {}
2760 impl Sealed for Response<BlobContainerClientReleaseLeaseResult, NoFormat> {}
2761 impl Sealed for Response<BlobContainerClientRenewLeaseResult, NoFormat> {}
2762 impl Sealed for Response<BlobServiceClientGetAccountInfoResult, NoFormat> {}
2763 impl Sealed for Response<BlockBlobClientCommitBlockListResult, NoFormat> {}
2764 impl Sealed for Response<BlockBlobClientStageBlockFromUrlResult, NoFormat> {}
2765 impl Sealed for Response<BlockBlobClientStageBlockResult, NoFormat> {}
2766 impl Sealed for Response<BlockBlobClientUploadBlobFromUrlResult, NoFormat> {}
2767 impl Sealed for Response<BlockBlobClientUploadInternalResult, NoFormat> {}
2768 impl Sealed for Response<BlockList, XmlFormat> {}
2769 impl Sealed for Response<PageBlobClientClearPagesResult, NoFormat> {}
2770 impl Sealed for Response<PageBlobClientCreateResult, NoFormat> {}
2771 impl Sealed for Response<PageBlobClientResizeResult, NoFormat> {}
2772 impl Sealed for Response<PageBlobClientSetSequenceNumberResult, NoFormat> {}
2773 impl Sealed for Response<PageBlobClientUploadPagesFromUrlResult, NoFormat> {}
2774 impl Sealed for Response<PageBlobClientUploadPagesResult, NoFormat> {}
2775 impl Sealed for Response<PageList, XmlFormat> {}
2776 impl Sealed for Response<SignedIdentifiers, XmlFormat> {}
2777}