bool get_retention;
bool get_legal_hold;
+ // optional partNumber param for s3
+ std::optional<int> multipart_part_num;
+ // PartsCount response when partNumber is specified
+ std::optional<int> multipart_parts_count;
+
int init_common();
public:
RGWGetObj() {
dst_zone_trace = s->info.args.get(RGW_SYS_PARAM_PREFIX "if-not-replicated-to");
get_torrent = s->info.args.exists("torrent");
+ // optional part number
+ auto optstr = s->info.args.get_optional("partNumber");
+ if (optstr) {
+ string err;
+ multipart_part_num = strict_strtol(optstr->c_str(), 10, &err);
+ if (!err.empty()) {
+ s->err.message = "Invalid partNumber: " + err;
+ ldpp_dout(s, 10) << "bad part number " << *optstr << ": " << err << dendl;
+ return -ERR_INVALID_PART;
+ }
+ }
+
return RGWGetObj_ObjStore::get_params(y);
}
}
} catch (const buffer::error&) {} // omit x-rgw-replicated-from headers
}
+ if (multipart_parts_count) {
+ dump_header(s, "x-amz-mp-parts-count", *multipart_parts_count);
+ }
if (! op_ret) {
if (! lo_etag.empty()) {