From: Casey Bodley Date: Fri, 17 Feb 2023 03:50:37 +0000 (-0500) Subject: rgw/s3: add part param and response to GetObj X-Git-Tag: v19.0.0~50^2~7 X-Git-Url: http://git.apps.os.sepia.ceph.com/?a=commitdiff_plain;h=3354b67fbdf5f37bb58ff07743426e179bed8069;p=ceph-ci.git rgw/s3: add part param and response to GetObj Signed-off-by: Casey Bodley --- diff --git a/src/rgw/rgw_op.h b/src/rgw/rgw_op.h index 09fe6cf4d7a..dc5bc8be55e 100644 --- a/src/rgw/rgw_op.h +++ b/src/rgw/rgw_op.h @@ -371,6 +371,11 @@ protected: bool get_retention; bool get_legal_hold; + // optional partNumber param for s3 + std::optional multipart_part_num; + // PartsCount response when partNumber is specified + std::optional multipart_parts_count; + int init_common(); public: RGWGetObj() { diff --git a/src/rgw/rgw_rest_s3.cc b/src/rgw/rgw_rest_s3.cc index 6d56766d10e..5425406b1eb 100644 --- a/src/rgw/rgw_rest_s3.cc +++ b/src/rgw/rgw_rest_s3.cc @@ -305,6 +305,18 @@ int RGWGetObj_ObjStore_S3::get_params(optional_yield y) 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); } @@ -451,6 +463,9 @@ int RGWGetObj_ObjStore_S3::send_response_data(bufferlist& bl, off_t bl_ofs, } } 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()) {