summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYehuda Sadeh <yehuda@inktank.com>2013-06-17 14:46:32 -0700
committerYehuda Sadeh <yehuda@inktank.com>2013-06-17 14:46:32 -0700
commit4c89a2b695d6c56dee54fa32018dab943549c143 (patch)
tree2f8401d1a30726e50cf9ebce9e40a802a48772c8
parent1113ff02126aecac8c01d9a77221fe11ef693072 (diff)
downloadceph-4c89a2b695d6c56dee54fa32018dab943549c143.tar.gz
rgw: system user get obj returns JSON encoded metadata
instead of binary encoded metadata Signed-off-by: Yehuda Sadeh <yehuda@inktank.com>
-rw-r--r--src/rgw/rgw_rados.cc12
-rw-r--r--src/rgw/rgw_rest_s3.cc10
2 files changed, 15 insertions, 7 deletions
diff --git a/src/rgw/rgw_rados.cc b/src/rgw/rgw_rados.cc
index d6ba18a55a2..f45e1980f2a 100644
--- a/src/rgw/rgw_rados.cc
+++ b/src/rgw/rgw_rados.cc
@@ -2320,14 +2320,14 @@ int RGWRados::copy_obj(void *ctx,
bufferlist& extra_data_bl = processor.get_extra_data();
if (extra_data_bl.length()) {
- bufferlist::iterator iter = extra_data_bl.begin();
- try {
- ::decode(src_attrs, iter);
- } catch (buffer::error& err) {
- ldout(cct, 0) << "ERROR: failed to decode extra metadata info" << dendl;
- return -EIO;
+ JSONParser jp;
+ if (!jp.parse(extra_data_bl.c_str(), extra_data_bl.length())) {
+ ldout(cct, 0) << "failed to parse response extra data. len=" << extra_data_bl.length() << " data=" << extra_data_bl.c_str() << dendl;
+ return -EINVAL;
}
+ JSONDecoder::decode_json("attrs", src_attrs, &jp);
+
src_attrs.erase(RGW_ATTR_MANIFEST); // not interested in original object layout
}
diff --git a/src/rgw/rgw_rest_s3.cc b/src/rgw/rgw_rest_s3.cc
index 8a67095bc27..8912c0f5dab 100644
--- a/src/rgw/rgw_rest_s3.cc
+++ b/src/rgw/rgw_rest_s3.cc
@@ -87,7 +87,15 @@ int RGWGetObj_ObjStore_S3::send_response_data(bufferlist& bl, off_t bl_ofs, off_
if (s->system_request &&
s->info.args.exists(RGW_SYS_PARAM_PREFIX "prepend-metadata")) {
- ::encode(attrs, metadata_bl);
+
+ /* JSON encode object metadata */
+ JSONFormatter jf;
+ jf.open_object_section("obj_metadata");
+ encode_json("attrs", attrs, &jf);
+ jf.close_section();
+ stringstream ss;
+ jf.flush(ss);
+ metadata_bl.append(ss.str());
s->cio->print("Rgwx-Embedded-Metadata-Len: %lld\r\n", (long long)metadata_bl.length());
total_len += metadata_bl.length();
}