From: Abhishek Lekshmanan Date: Fri, 18 Oct 2019 11:11:55 +0000 (+0200) Subject: rgw: support encoding-type param for list bucket multiparts X-Git-Tag: v15.1.0~415^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=dca2e87e08740476810d6a912b110377f590cb9b;p=ceph.git rgw: support encoding-type param for list bucket multiparts url encode keys, upload ids & prefixes based on encoding-type, reject invalid encoding types at the param parsing phase Fixes: https://tracker.ceph.com/issues/42372 Signed-off-by: Abhishek Lekshmanan --- diff --git a/src/rgw/rgw_op.h b/src/rgw/rgw_op.h index 38b2800118c..f9cebe95a77 100644 --- a/src/rgw/rgw_op.h +++ b/src/rgw/rgw_op.h @@ -1810,6 +1810,7 @@ protected: map common_prefixes; bool is_truncated; int default_max; + bool encode_url {false}; public: RGWListBucketMultiparts() { diff --git a/src/rgw/rgw_rest.cc b/src/rgw/rgw_rest.cc index a8fe2de62c8..e5477000e08 100644 --- a/src/rgw/rgw_rest.cc +++ b/src/rgw/rgw_rest.cc @@ -1599,6 +1599,16 @@ int RGWListBucketMultiparts_ObjStore::get_params() return op_ret; } + if (auto encoding_type = s->info.args.get_optional("encoding-type"); + encoding_type != boost::none) { + if (strcasecmp(encoding_type->c_str(), "url") != 0) { + op_ret = -EINVAL; + s->err.message="Invalid Encoding Method specified in Request"; + return op_ret; + } + encode_url = true; + } + string key_marker = s->info.args.get("key-marker"); string upload_id_marker = s->info.args.get("upload-id-marker"); if (!key_marker.empty()) diff --git a/src/rgw/rgw_rest_s3.cc b/src/rgw/rgw_rest_s3.cc index b1c75fe8715..8a292534116 100644 --- a/src/rgw/rgw_rest_s3.cc +++ b/src/rgw/rgw_rest_s3.cc @@ -3216,7 +3216,11 @@ void RGWListBucketMultiparts_ObjStore_S3::send_response() for (iter = uploads.begin(); iter != uploads.end(); ++iter) { RGWMPObj& mp = iter->mp; s->formatter->open_array_section("Upload"); - s->formatter->dump_string("Key", mp.get_key()); + if (encode_url) { + s->formatter->dump_string("Key", url_encode(mp.get_key(), false)); + } else { + s->formatter->dump_string("Key", mp.get_key()); + } s->formatter->dump_string("UploadId", mp.get_upload_id()); dump_owner(s, s->user->user_id, s->user->display_name, "Initiator"); dump_owner(s, s->user->user_id, s->user->display_name); @@ -3226,10 +3230,13 @@ void RGWListBucketMultiparts_ObjStore_S3::send_response() } if (!common_prefixes.empty()) { s->formatter->open_array_section("CommonPrefixes"); - map::iterator pref_iter; - for (pref_iter = common_prefixes.begin(); - pref_iter != common_prefixes.end(); ++pref_iter) { - s->formatter->dump_string("CommonPrefixes.Prefix", pref_iter->first); + for (const auto& kv : common_prefixes) { + if (encode_url) { + s->formatter->dump_string("CommonPrefixes.Prefix", + url_encode(kv.first, false)); + } else { + s->formatter->dump_string("CommonPrefixes.Prefix", kv.first); + } } s->formatter->close_section(); }