Skip to content

Commit ebd7959

Browse files
authored
Merge pull request ceph#54837 from imtzw/urlencode
rgw: fix list obj v1 nextmarker Reviewed-by: Matt Benjamin <[email protected]> Reviewed-by: Casey Bodley <[email protected]>
2 parents 862b2ee + b5fe513 commit ebd7959

File tree

2 files changed

+22
-64
lines changed

2 files changed

+22
-64
lines changed

src/rgw/rgw_rest.h

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -706,6 +706,16 @@ extern void dump_start(req_state *s);
706706
extern void list_all_buckets_start(req_state *s);
707707
extern void dump_owner(req_state *s, const rgw_user& id,
708708
const std::string& name, const char *section = NULL);
709+
inline void dump_urlsafe(req_state *s, bool encode_key, const char* key, const std::string& val, bool encode_slash = true) {
710+
if (encode_key) {
711+
std::string _val;
712+
url_encode(val, _val, encode_slash);
713+
s->formatter->dump_string(key, _val);
714+
}
715+
else {
716+
s->formatter->dump_string(key, val);
717+
}
718+
}
709719
extern void dump_header(req_state* s,
710720
const std::string_view& name,
711721
const std::string_view& val);

src/rgw/rgw_rest_s3.cc

Lines changed: 12 additions & 64 deletions
Original file line numberDiff line numberDiff line change
@@ -1736,11 +1736,7 @@ void RGWListBucket_ObjStore_S3::send_common_versioned_response()
17361736
for (pref_iter = common_prefixes.begin();
17371737
pref_iter != common_prefixes.end(); ++pref_iter) {
17381738
s->formatter->open_array_section("CommonPrefixes");
1739-
if (encode_key) {
1740-
s->formatter->dump_string("Prefix", url_encode(pref_iter->first, false));
1741-
} else {
1742-
s->formatter->dump_string("Prefix", pref_iter->first);
1743-
}
1739+
dump_urlsafe(s, encode_key, "Prefix", pref_iter->first, false);
17441740

17451741
s->formatter->close_section();
17461742
}
@@ -1758,7 +1754,7 @@ void RGWListBucket_ObjStore_S3::send_versioned_response()
17581754
s->formatter->dump_string("KeyMarker", marker.name);
17591755
s->formatter->dump_string("VersionIdMarker", marker.instance);
17601756
if (is_truncated && !next_marker.empty()) {
1761-
s->formatter->dump_string("NextKeyMarker", next_marker.name);
1757+
dump_urlsafe(s ,encode_key, "NextKeyMarker", next_marker.name);
17621758
if (next_marker.instance.empty()) {
17631759
s->formatter->dump_string("NextVersionIdMarker", "null");
17641760
}
@@ -1781,14 +1777,7 @@ void RGWListBucket_ObjStore_S3::send_versioned_response()
17811777
s->formatter->dump_bool("IsDeleteMarker", iter->is_delete_marker());
17821778
}
17831779
rgw_obj_key key(iter->key);
1784-
if (encode_key) {
1785-
string key_name;
1786-
url_encode(key.name, key_name);
1787-
s->formatter->dump_string("Key", key_name);
1788-
}
1789-
else {
1790-
s->formatter->dump_string("Key", key.name);
1791-
}
1780+
dump_urlsafe(s ,encode_key, "Key", key.name);
17921781
string version_id = key.instance;
17931782
if (version_id.empty()) {
17941783
version_id = "null";
@@ -1836,11 +1825,7 @@ void RGWListBucket_ObjStore_S3::send_common_response()
18361825
s->formatter->dump_string("Prefix", prefix);
18371826
s->formatter->dump_int("MaxKeys", max);
18381827
if (!delimiter.empty()) {
1839-
if (encode_key) {
1840-
s->formatter->dump_string("Delimiter", url_encode(delimiter, false));
1841-
} else {
1842-
s->formatter->dump_string("Delimiter", delimiter);
1843-
}
1828+
dump_urlsafe(s, encode_key, "Delimiter", delimiter, false);
18441829
}
18451830
s->formatter->dump_string("IsTruncated", (max && is_truncated ? "true"
18461831
: "false"));
@@ -1850,11 +1835,7 @@ void RGWListBucket_ObjStore_S3::send_common_response()
18501835
for (pref_iter = common_prefixes.begin();
18511836
pref_iter != common_prefixes.end(); ++pref_iter) {
18521837
s->formatter->open_array_section("CommonPrefixes");
1853-
if (encode_key) {
1854-
s->formatter->dump_string("Prefix", url_encode(pref_iter->first, false));
1855-
} else {
1856-
s->formatter->dump_string("Prefix", pref_iter->first);
1857-
}
1838+
dump_urlsafe(s, encode_key, "Prefix", pref_iter->first, false);
18581839
s->formatter->close_section();
18591840
}
18601841
}
@@ -1895,13 +1876,6 @@ void RGWListBucket_ObjStore_S3::send_response()
18951876
for (iter = objs.begin(); iter != objs.end(); ++iter) {
18961877

18971878
rgw_obj_key key(iter->key);
1898-
std::string key_name;
1899-
1900-
if (encode_key) {
1901-
url_encode(key.name, key_name);
1902-
} else {
1903-
key_name = key.name;
1904-
}
19051879
/* conditionally format JSON in the obvious way--I'm unsure if
19061880
* AWS actually does this */
19071881
if (s->format == RGWFormat::XML) {
@@ -1910,7 +1884,7 @@ void RGWListBucket_ObjStore_S3::send_response()
19101884
// json
19111885
s->formatter->open_object_section("dummy");
19121886
}
1913-
s->formatter->dump_string("Key", key_name);
1887+
dump_urlsafe(s ,encode_key, "Key", key.name);
19141888
dump_time(s, "LastModified", iter->meta.mtime);
19151889
s->formatter->dump_format("ETag", "\"%s\"", iter->meta.etag.c_str());
19161890
s->formatter->dump_int("Size", iter->meta.accounted_size);
@@ -1934,7 +1908,7 @@ void RGWListBucket_ObjStore_S3::send_response()
19341908
}
19351909
s->formatter->dump_string("Marker", marker.name);
19361910
if (is_truncated && !next_marker.empty()) {
1937-
s->formatter->dump_string("NextMarker", next_marker.name);
1911+
dump_urlsafe(s, encode_key, "NextMarker", next_marker.name);
19381912
}
19391913
s->formatter->close_section();
19401914
rgw_flush_formatter_and_reset(s, s->formatter);
@@ -1970,14 +1944,7 @@ void RGWListBucket_ObjStore_S3v2::send_versioned_response()
19701944
s->formatter->dump_bool("IsDeleteContinuationToken", iter->is_delete_marker());
19711945
}
19721946
rgw_obj_key key(iter->key);
1973-
if (encode_key) {
1974-
string key_name;
1975-
url_encode(key.name, key_name);
1976-
s->formatter->dump_string("Key", key_name);
1977-
}
1978-
else {
1979-
s->formatter->dump_string("Key", key.name);
1980-
}
1947+
dump_urlsafe(s, encode_key, "Key", key.name);
19811948
string version_id = key.instance;
19821949
if (version_id.empty()) {
19831950
version_id = "null";
@@ -2015,11 +1982,7 @@ void RGWListBucket_ObjStore_S3v2::send_versioned_response()
20151982
for (pref_iter = common_prefixes.begin();
20161983
pref_iter != common_prefixes.end(); ++pref_iter) {
20171984
s->formatter->open_array_section("CommonPrefixes");
2018-
if (encode_key) {
2019-
s->formatter->dump_string("Prefix", url_encode(pref_iter->first, false));
2020-
} else {
2021-
s->formatter->dump_string("Prefix", pref_iter->first);
2022-
}
1985+
dump_urlsafe(s, encode_key, "Prefix", pref_iter->first, false);
20231986

20241987
s->formatter->dump_int("KeyCount",objs.size());
20251988
if (start_after_exist) {
@@ -2065,14 +2028,7 @@ void RGWListBucket_ObjStore_S3v2::send_response()
20652028
for (iter = objs.begin(); iter != objs.end(); ++iter) {
20662029
rgw_obj_key key(iter->key);
20672030
s->formatter->open_array_section("Contents");
2068-
if (encode_key) {
2069-
string key_name;
2070-
url_encode(key.name, key_name);
2071-
s->formatter->dump_string("Key", key_name);
2072-
}
2073-
else {
2074-
s->formatter->dump_string("Key", key.name);
2075-
}
2031+
dump_urlsafe(s, encode_key, "Key", key.name);
20762032
dump_time(s, "LastModified", iter->meta.mtime);
20772033
s->formatter->dump_format("ETag", "\"%s\"", iter->meta.etag.c_str());
20782034
s->formatter->dump_int("Size", iter->meta.accounted_size);
@@ -4151,11 +4107,7 @@ void RGWListBucketMultiparts_ObjStore_S3::send_response()
41514107
for (iter = uploads.begin(); iter != uploads.end(); ++iter) {
41524108
rgw::sal::MultipartUpload* upload = iter->get();
41534109
s->formatter->open_array_section("Upload");
4154-
if (encode_url) {
4155-
s->formatter->dump_string("Key", url_encode(upload->get_key(), false));
4156-
} else {
4157-
s->formatter->dump_string("Key", upload->get_key());
4158-
}
4110+
dump_urlsafe(s, encode_url, "Key", upload->get_key(), false);
41594111
s->formatter->dump_string("UploadId", upload->get_upload_id());
41604112
const ACLOwner& owner = upload->get_owner();
41614113
dump_owner(s, owner.id, owner.display_name, "Initiator");
@@ -4167,11 +4119,7 @@ void RGWListBucketMultiparts_ObjStore_S3::send_response()
41674119
if (!common_prefixes.empty()) {
41684120
s->formatter->open_array_section("CommonPrefixes");
41694121
for (const auto& kv : common_prefixes) {
4170-
if (encode_url) {
4171-
s->formatter->dump_string("Prefix", url_encode(kv.first, false));
4172-
} else {
4173-
s->formatter->dump_string("Prefix", kv.first);
4174-
}
4122+
dump_urlsafe(s, encode_url, "Prefix", kv.first, false);
41754123
}
41764124
s->formatter->close_section();
41774125
}

0 commit comments

Comments
 (0)