Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
47 changes: 47 additions & 0 deletions core/services/webdav/src/backend.rs
Original file line number Diff line number Diff line change
Expand Up @@ -103,6 +103,44 @@ impl WebdavBuilder {

self
}

/// Enable user metadata support via WebDAV PROPPATCH.
///
/// This feature requires the WebDAV server to support RFC4918 PROPPATCH method.
/// Not all WebDAV servers support this (e.g., nginx's basic WebDAV module doesn't).
/// Only enable this if your server supports PROPPATCH (e.g., Apache mod_dav, Nextcloud).
///
/// Default: false
pub fn enable_user_metadata(mut self, enable: bool) -> Self {
self.config.enable_user_metadata = enable;
self
}

/// Set the XML namespace prefix for user metadata properties.
///
/// This prefix is used in PROPPATCH/PROPFIND XML requests.
/// Different servers may require different prefixes.
///
/// Default: "opendal"
pub fn user_metadata_prefix(mut self, prefix: &str) -> Self {
if !prefix.is_empty() {
self.config.user_metadata_prefix = Some(prefix.to_string());
}
self
}

/// Set the XML namespace URI for user metadata properties.
///
/// This URI uniquely identifies the namespace for custom properties.
/// Different servers may require different namespace URIs.
///
/// Default: `https://opendal.apache.org/ns`
pub fn user_metadata_uri(mut self, uri: &str) -> Self {
if !uri.is_empty() {
self.config.user_metadata_uri = Some(uri.to_string());
}
self
}
}

impl Builder for WebdavBuilder {
Expand Down Expand Up @@ -155,6 +193,7 @@ impl Builder for WebdavBuilder {

write: true,
write_can_empty: true,
write_with_user_metadata: self.config.enable_user_metadata,

create_dir: true,
delete: true,
Expand All @@ -178,6 +217,14 @@ impl Builder for WebdavBuilder {
server_path,
authorization,
root,
user_metadata_prefix: self
.config
.user_metadata_prefix
.unwrap_or_else(|| DEFAULT_USER_METADATA_PREFIX.to_string()),
user_metadata_uri: self
.config
.user_metadata_uri
.unwrap_or_else(|| DEFAULT_USER_METADATA_URI.to_string()),
});
Ok(WebdavBackend { core })
}
Expand Down
26 changes: 26 additions & 0 deletions core/services/webdav/src/config.rs
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,29 @@ pub struct WebdavConfig {
pub root: Option<String>,
/// WebDAV Service doesn't support copy.
pub disable_copy: bool,
/// Enable user metadata support via WebDAV PROPPATCH.
///
/// This feature requires the WebDAV server to support RFC4918 PROPPATCH method.
/// Not all WebDAV servers support this (e.g., nginx's basic WebDAV module doesn't).
/// Only enable this if your server supports PROPPATCH (e.g., Apache mod_dav, Nextcloud).
///
/// Default: false
pub enable_user_metadata: bool,
/// The XML namespace prefix for user metadata properties.
///
/// This prefix is used in PROPPATCH/PROPFIND XML requests.
/// Different servers may require different prefixes.
///
/// Default: "opendal"
pub user_metadata_prefix: Option<String>,
/// The XML namespace URI for user metadata properties.
///
/// This URI uniquely identifies the namespace for custom properties.
/// Different servers may require different namespace URIs.
/// For example, Nextcloud might work better with its own namespace.
///
/// Default: `https://opendal.apache.org/ns`
pub user_metadata_uri: Option<String>,
}

impl Debug for WebdavConfig {
Expand All @@ -48,6 +71,9 @@ impl Debug for WebdavConfig {
.field("username", &self.username)
.field("root", &self.root)
.field("disable_copy", &self.disable_copy)
.field("enable_user_metadata", &self.enable_user_metadata)
.field("user_metadata_prefix", &self.user_metadata_prefix)
.field("user_metadata_uri", &self.user_metadata_uri)
.finish_non_exhaustive()
}
}
Expand Down
Loading
Loading