diff options
author | Yehuda Sadeh <yehuda@inktank.com> | 2013-06-17 14:46:32 -0700 |
---|---|---|
committer | Yehuda Sadeh <yehuda@inktank.com> | 2013-06-17 14:46:32 -0700 |
commit | 4c89a2b695d6c56dee54fa32018dab943549c143 (patch) | |
tree | 2f8401d1a30726e50cf9ebce9e40a802a48772c8 | |
parent | 1113ff02126aecac8c01d9a77221fe11ef693072 (diff) | |
download | ceph-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.cc | 12 | ||||
-rw-r--r-- | src/rgw/rgw_rest_s3.cc | 10 |
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(); } |