This is an automated email from the ASF dual-hosted git repository.

meteorgan pushed a commit to branch azblob_write_returns_metadata
in repository https://gitbox.apache.org/repos/asf/opendal.git

commit be183fe8f138fab7199236663cc4c34828f02116
Author: meteorgan <[email protected]>
AuthorDate: Sat Apr 5 17:58:22 2025 +0800

    feat(services/azblob): implement write returns metadata
---
 core/src/services/azblob/backend.rs |  4 ++++
 core/src/services/azblob/core.rs    |  4 ++++
 core/src/services/azblob/writer.rs  | 32 +++++++++++++++++++++++++++++---
 3 files changed, 37 insertions(+), 3 deletions(-)

diff --git a/core/src/services/azblob/backend.rs 
b/core/src/services/azblob/backend.rs
index eafe32ddb..db942633b 100644
--- a/core/src/services/azblob/backend.rs
+++ b/core/src/services/azblob/backend.rs
@@ -39,6 +39,7 @@ use super::lister::AzblobLister;
 use super::writer::AzblobWriter;
 use super::writer::AzblobWriters;
 use crate::raw::*;
+use crate::services::core::constants::X_MS_VERSION_ID;
 use crate::services::AzblobConfig;
 use crate::*;
 
@@ -567,6 +568,9 @@ impl Access for AzblobBackend {
             StatusCode::OK => {
                 let headers = resp.headers();
                 let mut meta = parse_into_metadata(path, headers)?;
+                if let Some(version_id) = parse_header_to_str(headers, 
X_MS_VERSION_ID)? {
+                    meta.set_version(version_id);
+                }
 
                 let user_meta = parse_prefixed_headers(headers, 
X_MS_META_PREFIX);
                 if !user_meta.is_empty() {
diff --git a/core/src/services/azblob/core.rs b/core/src/services/azblob/core.rs
index 87fd4da11..7f664e64b 100644
--- a/core/src/services/azblob/core.rs
+++ b/core/src/services/azblob/core.rs
@@ -47,6 +47,7 @@ use crate::raw::*;
 use crate::*;
 
 pub mod constants {
+    // Indicates the Blob Storage version that was used to execute the request
     pub const X_MS_VERSION: &str = "x-ms-version";
 
     pub const X_MS_BLOB_TYPE: &str = "x-ms-blob-type";
@@ -55,6 +56,9 @@ pub mod constants {
     pub const X_MS_BLOB_CONDITION_APPENDPOS: &str = 
"x-ms-blob-condition-appendpos";
     pub const X_MS_META_PREFIX: &str = "x-ms-meta-";
 
+    // indicates the version of the blob, and it can be used in subsequent 
requests to access the blob.
+    pub const X_MS_VERSION_ID: &str = "x-ms-version-id";
+
     // Server-side encryption with customer-provided headers
     pub const X_MS_ENCRYPTION_KEY: &str = "x-ms-encryption-key";
     pub const X_MS_ENCRYPTION_KEY_SHA256: &str = "x-ms-encryption-key-sha256";
diff --git a/core/src/services/azblob/writer.rs 
b/core/src/services/azblob/writer.rs
index 17cf8b676..1216d5b8b 100644
--- a/core/src/services/azblob/writer.rs
+++ b/core/src/services/azblob/writer.rs
@@ -23,6 +23,7 @@ use uuid::Uuid;
 use super::core::AzblobCore;
 use super::error::parse_error;
 use crate::raw::*;
+use crate::services::core::constants::X_MS_VERSION_ID;
 use crate::*;
 
 const X_MS_BLOB_TYPE: &str = "x-ms-blob-type";
@@ -40,6 +41,28 @@ impl AzblobWriter {
     pub fn new(core: Arc<AzblobCore>, op: OpWrite, path: String) -> Self {
         AzblobWriter { core, op, path }
     }
+
+    fn parse_metadata(headers: &http::HeaderMap) -> Result<Metadata> {
+        let mut metadata = Metadata::default();
+
+        if let Some(last_modified) = parse_last_modified(headers)? {
+            metadata.set_last_modified(last_modified);
+        }
+        let etag = parse_etag(headers)?;
+        if let Some(etag) = etag {
+            metadata.set_etag(etag);
+        }
+        let md5 = parse_content_md5(headers)?;
+        if let Some(md5) = md5 {
+            metadata.set_content_md5(md5);
+        }
+        let version_id = parse_header_to_str(headers, X_MS_VERSION_ID)?;
+        if let Some(version_id) = version_id {
+            metadata.set_version(version_id);
+        }
+
+        Ok(metadata)
+    }
 }
 
 impl oio::AppendWrite for AzblobWriter {
@@ -97,9 +120,10 @@ impl oio::AppendWrite for AzblobWriter {
 
         let resp = self.core.send(req).await?;
 
+        let meta = AzblobWriter::parse_metadata(resp.headers())?;
         let status = resp.status();
         match status {
-            StatusCode::CREATED => Ok(Metadata::default()),
+            StatusCode::CREATED => Ok(meta),
             _ => Err(parse_error(resp)),
         }
     }
@@ -116,8 +140,9 @@ impl oio::BlockWrite for AzblobWriter {
 
         let status = resp.status();
 
+        let meta = AzblobWriter::parse_metadata(resp.headers())?;
         match status {
-            StatusCode::CREATED | StatusCode::OK => Ok(Metadata::default()),
+            StatusCode::CREATED | StatusCode::OK => Ok(meta),
             _ => Err(parse_error(resp)),
         }
     }
@@ -141,9 +166,10 @@ impl oio::BlockWrite for AzblobWriter {
             .azblob_complete_put_block_list(&self.path, block_ids, &self.op)
             .await?;
 
+        let meta = AzblobWriter::parse_metadata(resp.headers())?;
         let status = resp.status();
         match status {
-            StatusCode::CREATED | StatusCode::OK => Ok(Metadata::default()),
+            StatusCode::CREATED | StatusCode::OK => Ok(meta),
             _ => Err(parse_error(resp)),
         }
     }

Reply via email to