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

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


The following commit(s) were added to refs/heads/main by this push:
     new f0cc2530e feat(services/azfile): Add user defined metadata support 
(#6841)
f0cc2530e is described below

commit f0cc2530e1455ec85104af4c118a9fd06442c1b3
Author: zhan7236 <[email protected]>
AuthorDate: Mon Dec 1 14:07:42 2025 +0800

    feat(services/azfile): Add user defined metadata support (#6841)
---
 core/src/services/azfile/backend.rs | 10 +++++++++-
 core/src/services/azfile/core.rs    |  8 ++++++++
 2 files changed, 17 insertions(+), 1 deletion(-)

diff --git a/core/src/services/azfile/backend.rs 
b/core/src/services/azfile/backend.rs
index 45c02b663..27e6d411b 100644
--- a/core/src/services/azfile/backend.rs
+++ b/core/src/services/azfile/backend.rs
@@ -28,6 +28,7 @@ use reqsign::AzureStorageSigner;
 use super::AZFILE_SCHEME;
 use super::config::AzfileConfig;
 use super::core::AzfileCore;
+use super::core::X_MS_META_PREFIX;
 use super::deleter::AzfileDeleter;
 use super::error::parse_error;
 use super::lister::AzfileLister;
@@ -219,6 +220,8 @@ impl Builder for AzfileBuilder {
                             read: true,
 
                             write: true,
+                            write_with_user_metadata: true,
+
                             create_dir: true,
                             delete: true,
                             rename: true,
@@ -302,7 +305,12 @@ impl Access for AzfileBackend {
         let status = resp.status();
         match status {
             StatusCode::OK => {
-                let meta = parse_into_metadata(path, resp.headers())?;
+                let headers = resp.headers();
+                let mut meta = parse_into_metadata(path, headers)?;
+                let user_meta = parse_prefixed_headers(headers, 
X_MS_META_PREFIX);
+                if !user_meta.is_empty() {
+                    meta = meta.with_user_metadata(user_meta);
+                }
                 Ok(RpStat::new(meta))
             }
             _ => Err(parse_error(resp)),
diff --git a/core/src/services/azfile/core.rs b/core/src/services/azfile/core.rs
index 5ff0e68cb..5cd8205fc 100644
--- a/core/src/services/azfile/core.rs
+++ b/core/src/services/azfile/core.rs
@@ -42,6 +42,7 @@ const X_MS_FILE_RENAME_SOURCE: &str = 
"x-ms-file-rename-source";
 const X_MS_CONTENT_LENGTH: &str = "x-ms-content-length";
 const X_MS_TYPE: &str = "x-ms-type";
 const X_MS_FILE_RENAME_REPLACE_IF_EXISTS: &str = 
"x-ms-file-rename-replace-if-exists";
+pub const X_MS_META_PREFIX: &str = "x-ms-meta-";
 
 pub struct AzfileCore {
     pub info: Arc<AccessorInfo>,
@@ -154,6 +155,13 @@ impl AzfileCore {
             req = req.header(CONTENT_DISPOSITION, pos);
         }
 
+        // Set user metadata headers.
+        if let Some(user_metadata) = args.user_metadata() {
+            for (key, value) in user_metadata {
+                req = req.header(format!("{X_MS_META_PREFIX}{key}"), value);
+            }
+        }
+
         let req = req.extension(Operation::Write);
 
         let mut req = 
req.body(Buffer::new()).map_err(new_request_build_error)?;

Reply via email to