]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
rgw: add free function rgw_read_torrent_file() for GetObj
authorCasey Bodley <cbodley@redhat.com>
Sun, 19 Feb 2023 15:47:22 +0000 (10:47 -0500)
committerCasey Bodley <cbodley@redhat.com>
Thu, 2 Mar 2023 13:56:21 +0000 (08:56 -0500)
Signed-off-by: Casey Bodley <cbodley@redhat.com>
src/rgw/rgw_op.cc
src/rgw/rgw_torrent.cc
src/rgw/rgw_torrent.h

index 605f50f2436c32b40cd8ca9ef812896185ed48b5..50a42fc4c7f1df0b45adbc703449b531f022b35d 100644 (file)
@@ -2208,18 +2208,16 @@ void RGWGetObj::execute(optional_yield y)
       op_ret = -EINVAL;
       goto done_err;
     }
-    torrent.init(s, driver);
-    rgw_obj obj = s->object->get_obj();
-    op_ret = torrent.get_torrent_file(s->object.get(), total_len, bl, obj);
-    if (op_ret < 0)
-    {
+    // read torrent info from attr
+    bufferlist torrentbl;
+    op_ret = rgw_read_torrent_file(this, s->object.get(), torrentbl, y);
+    if (op_ret < 0) {
       ldpp_dout(this, 0) << "ERROR: failed to get_torrent_file ret= " << op_ret
                        << dendl;
       goto done_err;
     }
-    op_ret = send_response_data(bl, 0, total_len);
-    if (op_ret < 0)
-    {
+    op_ret = send_response_data(torrentbl, 0, torrentbl.length());
+    if (op_ret < 0) {
       ldpp_dout(this, 0) << "ERROR: failed to send_response_data ret= " << op_ret << dendl;
       goto done_err;
     }
index 96b56d980ddfcc301dc11922452c48e3916e2ec9..812b8cdfa5356828598468107a2816e3e3bed0a0 100644 (file)
@@ -6,6 +6,7 @@
 
 #include <ctime>
 
+#include "common/split.h"
 #include "rgw_torrent.h"
 #include "rgw_sal.h"
 #include "rgw_sal_rados.h"
@@ -43,6 +44,57 @@ void seed::init(req_state *_req, rgw::sal::Driver* _driver)
   driver = _driver;
 }
 
+int rgw_read_torrent_file(const DoutPrefixProvider* dpp,
+                          rgw::sal::Object* object,
+                          ceph::bufferlist &bl,
+                          optional_yield y)
+{
+  bufferlist infobl;
+  int r = object->get_torrent_info(dpp, y, infobl);
+  if (r < 0) {
+    ldpp_dout(dpp, 0) << "ERROR: read_torrent_info failed: " << r << dendl;
+    return r;
+  }
+
+  // add other fields from config
+  auto& conf = dpp->get_cct()->_conf;
+
+  TorrentBencode benc;
+  benc.bencode_dict(bl);
+
+  auto trackers = ceph::split(conf->rgw_torrent_tracker, ",");
+  if (auto i = trackers.begin(); i != trackers.end()) {
+    benc.bencode_key(ANNOUNCE, bl);
+    benc.bencode_key(*i, bl);
+
+    benc.bencode_key(ANNOUNCE_LIST, bl);
+    benc.bencode_list(bl);
+    for (; i != trackers.end(); ++i) {
+      benc.bencode_list(bl);
+      benc.bencode_key(*i, bl);
+      benc.bencode_end(bl);
+    }
+    benc.bencode_end(bl);
+  }
+
+  std::string_view comment = conf->rgw_torrent_comment;
+  if (!comment.empty()) {
+    benc.bencode(COMMENT, comment, bl);
+  }
+  std::string_view create_by = conf->rgw_torrent_createby;
+  if (!create_by.empty()) {
+    benc.bencode(CREATED_BY, create_by, bl);
+  }
+  std::string_view encoding = conf->rgw_torrent_encoding;
+  if (!encoding.empty()) {
+    benc.bencode(ENCODING, encoding, bl);
+  }
+
+  // append the info stored in the object
+  bl.append(std::move(infobl));
+  return 0;
+}
+
 int seed::get_torrent_file(rgw::sal::Object* object,
                            uint64_t &total_len,
                            ceph::bufferlist &bl_data,
index 08d7cc2bcbea01b6b1f5a68e8942d77387d0cee0..e863aede2202e7255545d4666207006f07432786 100644 (file)
@@ -133,6 +133,11 @@ private:
   int save_torrent_file(optional_yield y);
 };
 
+int rgw_read_torrent_file(const DoutPrefixProvider* dpp,
+                          rgw::sal::Object* object,
+                          ceph::bufferlist &bl,
+                          optional_yield y);
+
 class RGWPutObj_Torrent : public rgw::putobj::Pipe {
   size_t max_len = 0;
   size_t piece_len = 0;