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)?;