]> git.apps.os.sepia.ceph.com Git - ceph-ci.git/commitdiff
rgw/s3: add part param and response to GetObj
authorCasey Bodley <cbodley@redhat.com>
Fri, 17 Feb 2023 03:50:37 +0000 (22:50 -0500)
committerCasey Bodley <cbodley@redhat.com>
Tue, 21 Nov 2023 15:24:31 +0000 (10:24 -0500)
Signed-off-by: Casey Bodley <cbodley@redhat.com>
src/rgw/rgw_op.h
src/rgw/rgw_rest_s3.cc

index 09fe6cf4d7af81992382b59a33fe583a0da375ec..dc5bc8be55ecde46e7646fed1e010c74802cc24e 100644 (file)
@@ -371,6 +371,11 @@ protected:
   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() {
index 6d56766d10eb72d1c8a1dc1388a0a91a0f5d1d61..5425406b1eb95f8f71d3c5482e265c2b6e3ed680 100644 (file)
@@ -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()) {