From: Jane Zhu Date: Tue, 8 Aug 2023 08:17:47 +0000 (-0400) Subject: rgw/swift: convert underscores to hyphens in swift user metadata names X-Git-Tag: testing/wip-xiubli-testing-20240812.080715-reef~15^2~2 X-Git-Url: http://git.apps.os.sepia.ceph.com/?a=commitdiff_plain;h=ad395428863f8189acfe485358dc6d0e05d989cd;p=ceph-ci.git rgw/swift: convert underscores to hyphens in swift user metadata names Signed-off-by: Juan Zhu (cherry picked from commit 72065c9c7160cb0e69de751ed4d1c6e9ffd72caf) --- diff --git a/src/rgw/rgw_common.cc b/src/rgw/rgw_common.cc index 56796dfcc6b..e89808eed4b 100644 --- a/src/rgw/rgw_common.cc +++ b/src/rgw/rgw_common.cc @@ -394,7 +394,7 @@ struct str_len meta_prefixes[] = { STR_LEN_ENTRY("HTTP_X_AMZ_"), STR_LEN_ENTRY("HTTP_X_ACCOUNT_"), {NULL, 0} }; -void req_info::init_meta_info(const DoutPrefixProvider *dpp, bool *found_bad_meta) +void req_info::init_meta_info(const DoutPrefixProvider *dpp, bool *found_bad_meta, const int prot_flags) { x_meta_map.clear(); crypt_attribute_map.clear(); @@ -414,9 +414,8 @@ 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; - stringstream ss; - ss << meta_prefixes[0].str + 5 /* skip HTTP_ */ << name; - string name_low = lowercase_dash_underscore_http_attr(ss.str()); + string name_low = lowercase_dash_http_attr(string(meta_prefixes[0].str + 5) + name, + !(prot_flags & RGW_REST_SWIFT)); auto it = x_meta_map.find(name_low); if (it != x_meta_map.end()) { @@ -2184,36 +2183,11 @@ 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 */ -string lowercase_dash_http_attr(const string& orig) +string lowercase_dash_http_attr(const string& orig, bool bidirection) { const char *s = orig.c_str(); char buf[orig.size() + 1]; @@ -2224,39 +2198,14 @@ string lowercase_dash_http_attr(const string& orig) case '_': buf[i] = '-'; break; - default: - buf[i] = tolower(*s); - } - } - 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; + if (bidirection) + buf[i] = '_'; + else + buf[i] = tolower(*s); break; default: - if (last_sep) { - buf[i] = toupper(*s); - } else { - buf[i] = tolower(*s); - } - last_sep = false; + buf[i] = tolower(*s); } } return string(buf); @@ -2266,7 +2215,7 @@ string camelcase_http_attr(const string& orig) * make attrs Look-Like-This * converts underscores to dashes */ -string camelcase_dash_http_attr(const string& orig) +string camelcase_dash_http_attr(const string& orig, bool convert2dash) { const char *s = orig.c_str(); char buf[orig.size() + 1]; @@ -2278,7 +2227,7 @@ string camelcase_dash_http_attr(const string& orig) switch (*s) { case '_': case '-': - buf[i] = '-'; + buf[i] = convert2dash ? '-' : *s; last_sep = true; break; default: diff --git a/src/rgw/rgw_common.h b/src/rgw/rgw_common.h index cf5a75e2fdb..704207cb1b2 100644 --- a/src/rgw/rgw_common.h +++ b/src/rgw/rgw_common.h @@ -1073,7 +1073,7 @@ struct req_info { req_info(CephContext *cct, const RGWEnv *env); void rebuild_from(req_info& src); - void init_meta_info(const DoutPrefixProvider *dpp, bool *found_bad_meta); + void init_meta_info(const DoutPrefixProvider *dpp, bool *found_bad_meta, const int prot_flags); }; struct req_init_state { @@ -1756,10 +1756,8 @@ static constexpr uint32_t MATCH_POLICY_STRING = 0x08; 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); +extern std::string camelcase_dash_http_attr(const std::string& orig, bool convert2dash = true); +extern std::string lowercase_dash_http_attr(const std::string& orig, bool bidirection = false); void rgw_setup_saved_curl_handles(); void rgw_release_all_curl_handles(); diff --git a/src/rgw/rgw_rest.cc b/src/rgw/rgw_rest.cc index a1741e6dc6c..0f12fb6179a 100644 --- a/src/rgw/rgw_rest.cc +++ b/src/rgw/rgw_rest.cc @@ -2287,8 +2287,6 @@ int RGWREST::preprocess(req_state *s, rgw::io::BasicClient* cio) } s->op = op_from_method(info.method); - info.init_meta_info(s, &s->has_bad_meta); - return 0; } @@ -2331,5 +2329,7 @@ RGWHandler_REST* RGWREST::get_handler( return nullptr; } + s->info.init_meta_info(s, &s->has_bad_meta, s->prot_flags); + return handler; } /* get stream handler */ diff --git a/src/rgw/rgw_rest_swift.cc b/src/rgw/rgw_rest_swift.cc index 10c5f49bf7e..69f3d742aa9 100644 --- a/src/rgw/rgw_rest_swift.cc +++ b/src/rgw/rgw_rest_swift.cc @@ -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_http_attr(name + PREFIX_LEN), + camelcase_dash_http_attr(name + PREFIX_LEN, false), 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_http_attr(name + PREFIX_LEN), + camelcase_dash_http_attr(name + PREFIX_LEN, false), iter->second); } } @@ -668,7 +668,12 @@ 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_underscore_http_attr(p + prefix_len)); + /* For backward compatibility */ + name.append(lowercase_dash_http_attr(p + prefix_len, true)); + rmattr_names.insert(name); + + name = RGW_ATTR_META_PREFIX; + name.append(lowercase_dash_http_attr(p + prefix_len, false)); rmattr_names.insert(name); } } @@ -1331,7 +1336,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_http_attr(name), kv.second); + camelcase_dash_http_attr(name, false), kv.second); } }