From d05fdd3874b10cfb889f760409c879f3b5b4964e Mon Sep 17 00:00:00 2001 From: "lu.shasha" Date: Thu, 11 May 2017 15:23:29 +0800 Subject: [PATCH] rgw: fix X-Object-Meta-Static-Large-Object in SLO download when download SLO objects, the response header "X-Object-Meta-Static-Large-Object" doesn't decode. Expect value is "True", but there is four bytes gibberish before it. Fixes: http://tracker.ceph.com/issues/19951 Signed-off-by: Shasha Lu --- src/rgw/rgw_op.cc | 2 +- src/rgw/rgw_rest_s3.cc | 3 +++ src/rgw/rgw_rest_swift.cc | 3 +++ 3 files changed, 7 insertions(+), 1 deletion(-) diff --git a/src/rgw/rgw_op.cc b/src/rgw/rgw_op.cc index 844b1dad5b0..eb342c6ea00 100644 --- a/src/rgw/rgw_op.cc +++ b/src/rgw/rgw_op.cc @@ -3223,7 +3223,7 @@ void RGWPutObj::execute() * processing any input from user in order to prohibit overwriting. */ if (slo_info) { bufferlist slo_userindicator_bl; - ::encode("True", slo_userindicator_bl); + slo_userindicator_bl.append("True", 4); emplace_attr(RGW_ATTR_SLO_UINDICATOR, std::move(slo_userindicator_bl)); } diff --git a/src/rgw/rgw_rest_s3.cc b/src/rgw/rgw_rest_s3.cc index b41441160f5..6e53ed74c4e 100644 --- a/src/rgw/rgw_rest_s3.cc +++ b/src/rgw/rgw_rest_s3.cc @@ -276,6 +276,9 @@ int RGWGetObj_ObjStore_S3::send_response_data(bufferlist& bl, off_t bl_ofs, if (!content_type) { content_type = iter->second.c_str(); } + } else if (strcmp(name, RGW_ATTR_SLO_UINDICATOR) == 0) { + // this attr has an extra length prefix from ::encode() in prior versions + dump_header(s, "X-Object-Meta-Static-Large-Object", "True"); } else if (strncmp(name, RGW_ATTR_META_PREFIX, sizeof(RGW_ATTR_META_PREFIX)-1) == 0) { /* User custom metadata. */ diff --git a/src/rgw/rgw_rest_swift.cc b/src/rgw/rgw_rest_swift.cc index f778d87c412..60281088d63 100644 --- a/src/rgw/rgw_rest_swift.cc +++ b/src/rgw/rgw_rest_swift.cc @@ -1106,6 +1106,9 @@ static void dump_object_metadata(struct req_state * const s, if (aiter != std::end(rgw_to_http_attrs)) { response_attrs[aiter->second] = kv.second.c_str(); + } else if (strcmp(name, RGW_ATTR_SLO_UINDICATOR) == 0) { + // this attr has an extra length prefix from ::encode() in prior versions + dump_header(s, "X-Object-Meta-Static-Large-Object", "True"); } else if (strncmp(name, RGW_ATTR_META_PREFIX, sizeof(RGW_ATTR_META_PREFIX)-1) == 0) { name += sizeof(RGW_ATTR_META_PREFIX) - 1;