]> git.apps.os.sepia.ceph.com Git - ceph-ci.git/commitdiff
rgw/swift: preserve dashes/underscores in swift user metadata names
authorJane Zhu <jzhu116@bloomberg.net>
Thu, 30 Mar 2023 05:23:55 +0000 (01:23 -0400)
committerPeter Razumovsky <prazumovsky@mirantis.com>
Mon, 1 Apr 2024 14:41:23 +0000 (18:41 +0400)
Signed-off-by: Juan Zhu <jzhu116@bloomberg.net>
(cherry picked from commit 96ca98a169d0fd6cee07355d81c11a514eb72d10)

qa/suites/rgw/tempest/tasks/rgw_tempest.yaml
src/rgw/rgw_common.cc
src/rgw/rgw_common.h
src/rgw/rgw_rest_swift.cc

index ad9dc9dd50254fe0f2f4e8216286f48baa779b21..09b8152c5f5798c5120891367cc157084b12a9c7 100644 (file)
@@ -46,8 +46,6 @@ tasks:
         - .*test_container_synchronization.*
         - .*test_object_services.PublicObjectTest.test_access_public_container_object_without_using_creds
         - .*test_object_services.ObjectTest.test_create_object_with_transfer_encoding
-        - .*test_container_services.ContainerTest.test_create_container_with_remove_metadata_key
-        - .*test_container_services.ContainerTest.test_create_container_with_remove_metadata_value
         - .*test_object_expiry.ObjectExpiryTest.test_get_object_after_expiry_time
         - .*test_object_expiry.ObjectExpiryTest.test_get_object_at_expiry_time
         - .*test_account_services.AccountTest.test_list_no_account_metadata
index f5d7912ea5be3d7bf5059d38aac00b82c0463810..56796dfcc6bd6b3d55ba3a0697153b5a140aebaa 100644 (file)
@@ -414,18 +414,9 @@ void req_info::init_meta_info(const DoutPrefixProvider *dpp, bool *found_bad_met
         if (found_bad_meta && strncmp(name, "META_", name_len) == 0)
           *found_bad_meta = true;
 
-        char name_low[meta_prefixes[0].len + name_len + 1];
-        snprintf(name_low, meta_prefixes[0].len - 5 + name_len + 1, "%s%s", meta_prefixes[0].str + 5 /* skip HTTP_ */, name); // normalize meta prefix
-        int j;
-        for (j = 0; name_low[j]; j++) {
-          if (name_low[j] == '_')
-            name_low[j] = '-';
-          else if (name_low[j] == '-')
-            name_low[j] = '_';
-          else
-            name_low[j] = tolower(name_low[j]);
-        }
-        name_low[j] = 0;
+        stringstream ss;
+        ss << meta_prefixes[0].str + 5 /* skip HTTP_ */ << name;
+        string name_low = lowercase_dash_underscore_http_attr(ss.str());
 
         auto it = x_meta_map.find(name_low);
         if (it != x_meta_map.end()) {
@@ -437,7 +428,7 @@ void req_info::init_meta_info(const DoutPrefixProvider *dpp, bool *found_bad_met
         } else {
           x_meta_map[name_low] = val;
         }
-        if (strncmp(name_low, "x-amz-server-side-encryption", 20) == 0) {
+        if (strncmp(name_low.c_str(), "x-amz-server-side-encryption", 20) == 0) {
           crypt_attribute_map[name_low] = val;
         }
       }
@@ -2193,6 +2184,31 @@ bool match_policy(std::string_view pattern, std::string_view input,
   }
 }
 
+/*
+ * make attrs look-like_this
+ * converts underscores to dashes, and dashes to underscores
+ */
+string lowercase_dash_underscore_http_attr(const string& orig)
+{
+  const char *s = orig.c_str();
+  char buf[orig.size() + 1];
+  buf[orig.size()] = '\0';
+
+  for (size_t i = 0; i < orig.size(); ++i, ++s) {
+    switch (*s) {
+      case '_':
+        buf[i] = '-';
+        break;
+      case '-':
+        buf[i] = '_';
+        break;
+      default:
+        buf[i] = tolower(*s);
+    }
+  }
+  return string(buf);
+}
+
 /*
  * make attrs look-like-this
  * converts underscores to dashes
@@ -2215,6 +2231,37 @@ string lowercase_dash_http_attr(const string& orig)
   return string(buf);
 }
 
+/*
+ * make attrs Look-Like-This or Look_Like_This
+ * converts attrs to camelcase
+ */
+string camelcase_http_attr(const string& orig)
+{
+  const char *s = orig.c_str();
+  char buf[orig.size() + 1];
+  buf[orig.size()] = '\0';
+
+  bool last_sep = true;
+
+  for (size_t i = 0; i < orig.size(); ++i, ++s) {
+    switch (*s) {
+      case '_':
+      case '-':
+        buf[i] = *s;
+        last_sep = true;
+        break;
+      default:
+        if (last_sep) {
+          buf[i] = toupper(*s);
+        } else {
+          buf[i] = tolower(*s);
+        }
+        last_sep = false;
+    }
+  }
+  return string(buf);
+}
+
 /*
  * make attrs Look-Like-This
  * converts underscores to dashes
index 648b2e087b491ea0e1b1379c2ca7557af2d09311..cf5a75e2fdb134ac323f52901f79a390d3c61900 100644 (file)
@@ -1757,7 +1757,9 @@ extern bool match_policy(std::string_view pattern, std::string_view input,
                          uint32_t flag);
 
 extern std::string camelcase_dash_http_attr(const std::string& orig);
+extern std::string camelcase_http_attr(const std::string& orig);
 extern std::string lowercase_dash_http_attr(const std::string& orig);
+extern std::string lowercase_dash_underscore_http_attr(const std::string& orig);
 
 void rgw_setup_saved_curl_handles();
 void rgw_release_all_curl_handles();
index ee943ea44ff2b2f100f32ab899acf41e9ad5c5fb..10c5f49bf7e8915f158faafdaac2e776a28c2f5c 100644 (file)
@@ -152,7 +152,7 @@ static void dump_account_metadata(req_state * const s,
       dump_header(s, geniter->second, iter->second);
     } else if (strncmp(name, RGW_ATTR_META_PREFIX, PREFIX_LEN) == 0) {
       dump_header_prefixed(s, "X-Account-Meta-",
-                           camelcase_dash_http_attr(name + PREFIX_LEN),
+                           camelcase_http_attr(name + PREFIX_LEN),
                            iter->second);
     }
   }
@@ -494,7 +494,7 @@ static void dump_container_metadata(req_state *s,
         dump_header(s, geniter->second, iter->second);
       } else if (strncmp(name, RGW_ATTR_META_PREFIX, PREFIX_LEN) == 0) {
         dump_header_prefixed(s, "X-Container-Meta-",
-                             camelcase_dash_http_attr(name + PREFIX_LEN),
+                             camelcase_http_attr(name + PREFIX_LEN),
                              iter->second);
       }
     }
@@ -668,7 +668,7 @@ static void get_rmattrs_from_headers(const req_state * const s,
 
     if (prefix_len > 0) {
       string name(RGW_ATTR_META_PREFIX);
-      name.append(lowercase_dash_http_attr(p + prefix_len));
+      name.append(lowercase_dash_underscore_http_attr(p + prefix_len));
       rmattr_names.insert(name);
     }
   }
@@ -1331,7 +1331,7 @@ static void dump_object_metadata(const DoutPrefixProvider* dpp, req_state * cons
                       sizeof(RGW_ATTR_META_PREFIX)-1) == 0) {
       name += sizeof(RGW_ATTR_META_PREFIX) - 1;
       dump_header_prefixed(s, "X-Object-Meta-",
-                           camelcase_dash_http_attr(name), kv.second);
+                           camelcase_http_attr(name), kv.second);
     }
   }