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 41c72d8e3 feat(core): Add correctness check for read with if_xxx 
headers (#5538)
41c72d8e3 is described below

commit 41c72d8e33fa4a888a3ac611eeea30caacd75b47
Author: Xuanwo <[email protected]>
AuthorDate: Mon Jan 13 14:39:09 2025 +0800

    feat(core): Add correctness check for read with if_xxx headers (#5538)
---
 core/src/layers/correctness_check.rs | 63 +++++++++++++++++++++++++++++++++---
 1 file changed, 59 insertions(+), 4 deletions(-)

diff --git a/core/src/layers/correctness_check.rs 
b/core/src/layers/correctness_check.rs
index 61d0669a3..27383473c 100644
--- a/core/src/layers/correctness_check.rs
+++ b/core/src/layers/correctness_check.rs
@@ -56,7 +56,7 @@ pub(crate) fn new_unsupported_error(info: &AccessorInfo, op: 
Operation, args: &s
 
     Error::new(
         ErrorKind::Unsupported,
-        format!("service {scheme} doesn't support operation {op} with args 
{args}"),
+        format!("The service {scheme} does not support the operation {op} with 
the arguments {args}. Please verify if the relevant flags have been enabled, or 
submit an issue if you believe this is incorrect."),
     )
     .with_operation(op)
 }
@@ -102,6 +102,34 @@ impl<A: Access> LayeredAccess for CorrectnessAccessor<A> {
                 "version",
             ));
         }
+        if !capability.read_with_if_match && args.if_match().is_some() {
+            return Err(new_unsupported_error(
+                self.info.as_ref(),
+                Operation::Read,
+                "if_match",
+            ));
+        }
+        if !capability.read_with_if_none_match && 
args.if_none_match().is_some() {
+            return Err(new_unsupported_error(
+                self.info.as_ref(),
+                Operation::Read,
+                "if_none_match",
+            ));
+        }
+        if !capability.read_with_if_modified_since && 
args.if_modified_since().is_some() {
+            return Err(new_unsupported_error(
+                self.info.as_ref(),
+                Operation::Read,
+                "if_modified_since",
+            ));
+        }
+        if !capability.read_with_if_unmodified_since && 
args.if_unmodified_since().is_some() {
+            return Err(new_unsupported_error(
+                self.info.as_ref(),
+                Operation::Read,
+                "if_unmodified_since",
+            ));
+        }
 
         self.inner.read(path, args).await
     }
@@ -146,6 +174,34 @@ impl<A: Access> LayeredAccess for CorrectnessAccessor<A> {
                 "version",
             ));
         }
+        if !capability.stat_with_if_match && args.if_match().is_some() {
+            return Err(new_unsupported_error(
+                self.info.as_ref(),
+                Operation::Stat,
+                "if_match",
+            ));
+        }
+        if !capability.stat_with_if_none_match && 
args.if_none_match().is_some() {
+            return Err(new_unsupported_error(
+                self.info.as_ref(),
+                Operation::Stat,
+                "if_none_match",
+            ));
+        }
+        if !capability.stat_with_if_modified_since && 
args.if_modified_since().is_some() {
+            return Err(new_unsupported_error(
+                self.info.as_ref(),
+                Operation::Stat,
+                "if_modified_since",
+            ));
+        }
+        if !capability.stat_with_if_unmodified_since && 
args.if_unmodified_since().is_some() {
+            return Err(new_unsupported_error(
+                self.info.as_ref(),
+                Operation::Stat,
+                "if_unmodified_since",
+            ));
+        }
 
         self.inner.stat(path, args).await
     }
@@ -410,7 +466,7 @@ mod tests {
         assert!(res.is_err());
         assert_eq!(
             res.unwrap_err().to_string(),
-            "Unsupported (permanent) at write => service memory doesn't 
support operation write with args if_none_match"
+            "Unsupported (permanent) at write => The service memory does not 
support the operation write with the arguments if_none_match. Please verify if 
the relevant flags have been enabled, or submit an issue if you believe this is 
incorrect."
         );
 
         // Now try a wildcard if-none-match
@@ -421,8 +477,7 @@ mod tests {
         assert!(res.is_err());
         assert_eq!(
             res.unwrap_err().to_string(),
-            "Unsupported (permanent) at write, context: { hint: use 
if_not_exists instead } => \
-            service memory doesn't support operation write with args 
if_none_match"
+             "Unsupported (permanent) at write, context: { hint: use 
if_not_exists instead } => The service memory does not support the operation 
write with the arguments if_none_match. Please verify if the relevant flags 
have been enabled, or submit an issue if you believe this is incorrect."
         );
 
         let res = op

Reply via email to