From: Abhishek Lekshmanan Date: Thu, 17 Oct 2019 13:10:23 +0000 (+0200) Subject: rgw: url_encode prefixes if requested for List Objects X-Git-Tag: v14.2.8~20^2~75^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=99d9af3a527290037ce0b37f7613cab85fcaada3;p=ceph.git rgw: url_encode prefixes if requested for List Objects Also doesn't encode "/" similar to S3 Fixes: https://tracker.ceph.com/issues/41870 Signed-off-by: Abhishek Lekshmanan (cherry picked from commit 4cae7a26184b98f1fb11ef180a90c5db695ea2d8) Conflicts: src/rgw/rgw_rest_s3.cc - trivial difference in white-space --- diff --git a/src/rgw/rgw_rest_s3.cc b/src/rgw/rgw_rest_s3.cc index df6547037abb..ed6e1033c34a 100644 --- a/src/rgw/rgw_rest_s3.cc +++ b/src/rgw/rgw_rest_s3.cc @@ -766,7 +766,12 @@ void RGWListBucket_ObjStore_S3::send_common_versioned_response() for (pref_iter = common_prefixes.begin(); pref_iter != common_prefixes.end(); ++pref_iter) { s->formatter->open_array_section("CommonPrefixes"); - s->formatter->dump_string("Prefix", pref_iter->first); + if (encode_key) { + s->formatter->dump_string("Prefix", url_encode(pref_iter->first, false)); + } else { + s->formatter->dump_string("Prefix", pref_iter->first); + } + s->formatter->close_section(); } } @@ -775,6 +780,10 @@ void RGWListBucket_ObjStore_S3::send_common_versioned_response() void RGWListBucket_ObjStore_S3::send_versioned_response() { s->formatter->open_object_section_in_ns("ListVersionsResult", XMLNS_AWS_S3); + if (strcasecmp(encoding_type.c_str(), "url") == 0) { + s->formatter->dump_string("EncodingType", "url"); + encode_key = true; + } RGWListBucket_ObjStore_S3::send_common_versioned_response(); s->formatter->dump_string("KeyMarker", marker.name); s->formatter->dump_string("VersionIdMarker", marker.instance); @@ -788,11 +797,6 @@ void RGWListBucket_ObjStore_S3::send_versioned_response() } } - if (strcasecmp(encoding_type.c_str(), "url") == 0) { - s->formatter->dump_string("EncodingType", "url"); - encode_key = true; - } - if (op_ret >= 0) { if (objs_container) { s->formatter->open_array_section("Entries"); @@ -872,7 +876,11 @@ void RGWListBucket_ObjStore_S3::send_common_response() for (pref_iter = common_prefixes.begin(); pref_iter != common_prefixes.end(); ++pref_iter) { s->formatter->open_array_section("CommonPrefixes"); - s->formatter->dump_string("Prefix", pref_iter->first); + if (encode_key) { + s->formatter->dump_string("Prefix", url_encode(pref_iter->first, false)); + } else { + s->formatter->dump_string("Prefix", pref_iter->first); + } s->formatter->close_section(); } } @@ -898,11 +906,11 @@ void RGWListBucket_ObjStore_S3::send_response() } s->formatter->open_object_section_in_ns("ListBucketResult", XMLNS_AWS_S3); - RGWListBucket_ObjStore_S3::send_common_response(); if (strcasecmp(encoding_type.c_str(), "url") == 0) { s->formatter->dump_string("EncodingType", "url"); encode_key = true; } + RGWListBucket_ObjStore_S3::send_common_response(); if (op_ret >= 0) { vector::iterator iter; for (iter = objs.begin(); iter != objs.end(); ++iter) { @@ -1015,7 +1023,12 @@ void RGWListBucket_ObjStore_S3v2::send_versioned_response() for (pref_iter = common_prefixes.begin(); pref_iter != common_prefixes.end(); ++pref_iter) { s->formatter->open_array_section("CommonPrefixes"); - s->formatter->dump_string("Prefix", pref_iter->first); + if (encode_key) { + s->formatter->dump_string("Prefix", url_encode(pref_iter->first, false)); + } else { + s->formatter->dump_string("Prefix", pref_iter->first); + } + s->formatter->dump_int("KeyCount",objs.size()); if (start_after_exist) { s->formatter->dump_string("StartAfter", startAfter); @@ -1049,12 +1062,12 @@ void RGWListBucket_ObjStore_S3v2::send_response() } s->formatter->open_object_section_in_ns("ListBucketResult", XMLNS_AWS_S3); - - RGWListBucket_ObjStore_S3::send_common_response(); if (strcasecmp(encoding_type.c_str(), "url") == 0) { s->formatter->dump_string("EncodingType", "url"); encode_key = true; } + + RGWListBucket_ObjStore_S3::send_common_response(); if (op_ret >= 0) { vector::iterator iter; for (iter = objs.begin(); iter != objs.end(); ++iter) {