int RGWPutObj::get_data(const off_t fst, const off_t lst, bufferlist& bl)
{
RGWPutObj_CB cb(this);
+ RGWGetDataCB* filter = &cb;
+ boost::optional<RGWGetObj_Decompress> decompress;
+ RGWCompressionInfo cs_info;
+ map<string, bufferlist> attrs;
+
int ret = 0;
uint64_t obj_size;
RGWRados::Object op_target(store, copy_source_bucket_info, *static_cast<RGWObjectCtx *>(s->obj_ctx), obj);
RGWRados::Object::Read read_op(&op_target);
read_op.params.obj_size = &obj_size;
+ read_op.params.attrs = &attrs;
+
ret = read_op.prepare();
if (ret < 0)
return ret;
+
+ bool need_decompress;
+ op_ret = rgw_compression_info_from_attrset(attrs, need_decompress, cs_info);
+ if (op_ret < 0) {
+ lderr(s->cct) << "ERROR: failed to decode compression info, cannot decompress" << dendl;
+ return -EIO;
+ }
+
+ bool partial_content = true;
+ if (need_decompress)
+ {
+ obj_size = cs_info.orig_size;
+ decompress.emplace(s->cct, &cs_info, partial_content, filter);
+ filter = &*decompress;
+ }
+
ret = read_op.range_to_ofs(obj_size, new_ofs, new_end);
if (ret < 0)
return ret;
- ret = read_op.iterate(new_ofs, new_end, &cb);
- if (ret < 0) {
- return ret;
- }
+ filter->fixup_range(new_ofs, new_end);
+ ret = read_op.iterate(new_ofs, new_end, filter);
+
+ if (ret >= 0)
+ ret = filter->flush();
bl.claim_append(bl_aux);