deprecate add_torrent_params::url field. use parse_magnet_uri instead (#1864)

deprecate add_torrent_params::url field. use parse_magnet_uri instead
This commit is contained in:
Arvid Norberg 2017-03-29 02:16:07 -04:00 committed by GitHub
parent f80e95705a
commit 8ebbad19d4
12 changed files with 76 additions and 39 deletions

View File

@ -1,3 +1,4 @@
* deprecate add_torrent_params::url field. use parse_magnet_uri instead
* optimize download queue management * optimize download queue management
* deprecated (undocumented) file:// urls * deprecated (undocumented) file:// urls
* add limit for number of web seed connections * add limit for number of web seed connections

View File

@ -62,8 +62,8 @@ namespace {
ret["name"] = p.name; ret["name"] = p.name;
ret["save_path"] = p.save_path; ret["save_path"] = p.save_path;
ret["storage_mode"] = p.storage_mode; ret["storage_mode"] = p.storage_mode;
ret["url"] = p.url;
#ifndef TORRENT_NO_DEPRECATE #ifndef TORRENT_NO_DEPRECATE
ret["url"] = p.url;
ret["uuid"] = p.uuid; ret["uuid"] = p.uuid;
#endif #endif
ret["flags"] = p.flags; ret["flags"] = p.flags;

View File

@ -324,11 +324,13 @@ namespace
p.trackerid = extract<std::string>(value); p.trackerid = extract<std::string>(value);
continue; continue;
} }
#ifndef TORRENT_NO_DEPRECATE
else if(key == "url") else if(key == "url")
{ {
p.url = extract<std::string>(value); p.url = extract<std::string>(value);
continue; continue;
} }
#endif
else if(key == "renamed_files") else if(key == "renamed_files")
{ {
p.renamed_files = p.renamed_files =
@ -662,7 +664,6 @@ void bind_session()
// .def_readwrite("storage", &add_torrent_params::storage) // .def_readwrite("storage", &add_torrent_params::storage)
.add_property("file_priorities", PROP(&add_torrent_params::file_priorities)) .add_property("file_priorities", PROP(&add_torrent_params::file_priorities))
.def_readwrite("trackerid", &add_torrent_params::trackerid) .def_readwrite("trackerid", &add_torrent_params::trackerid)
.def_readwrite("url", &add_torrent_params::url)
.def_readwrite("flags", &add_torrent_params::flags) .def_readwrite("flags", &add_torrent_params::flags)
.def_readwrite("info_hash", &add_torrent_params::info_hash) .def_readwrite("info_hash", &add_torrent_params::info_hash)
.def_readwrite("max_uploads", &add_torrent_params::max_uploads) .def_readwrite("max_uploads", &add_torrent_params::max_uploads)
@ -692,6 +693,7 @@ void bind_session()
.add_property("renamed_files", PROP(&add_torrent_params::renamed_files)) .add_property("renamed_files", PROP(&add_torrent_params::renamed_files))
#ifndef TORRENT_NO_DEPRECATE #ifndef TORRENT_NO_DEPRECATE
.def_readwrite("url", &add_torrent_params::url)
.def_readwrite("uuid", &add_torrent_params::uuid) .def_readwrite("uuid", &add_torrent_params::uuid)
.def_readwrite("resume_data", &add_torrent_params::resume_data) .def_readwrite("resume_data", &add_torrent_params::resume_data)
#endif #endif

View File

@ -38,6 +38,7 @@ POSSIBILITY OF SUCH DAMAGE.
#include <libtorrent/add_torrent_params.hpp> #include <libtorrent/add_torrent_params.hpp>
#include <libtorrent/torrent_handle.hpp> #include <libtorrent/torrent_handle.hpp>
#include <libtorrent/alert_types.hpp> #include <libtorrent/alert_types.hpp>
#include <libtorrent/magnet_uri.hpp>
namespace lt = libtorrent; namespace lt = libtorrent;
int main(int argc, char const* argv[]) int main(int argc, char const* argv[])
@ -49,7 +50,12 @@ int main(int argc, char const* argv[])
lt::session ses; lt::session ses;
lt::add_torrent_params atp; lt::add_torrent_params atp;
atp.url = argv[1]; lt::error_code ec;
lt::parse_magnet_uri(argv[1], atp, ec);
if (ec) {
std::cerr << "invalid magnet URI: " << ec.message() << std::endl;
return 1;
}
atp.save_path = "."; // save in current dir atp.save_path = "."; // save in current dir
lt::torrent_handle h = ses.add_torrent(std::move(atp)); lt::torrent_handle h = ses.add_torrent(std::move(atp));

View File

@ -44,6 +44,7 @@ POSSIBILITY OF SUCH DAMAGE.
#include <libtorrent/read_resume_data.hpp> #include <libtorrent/read_resume_data.hpp>
#include <libtorrent/write_resume_data.hpp> #include <libtorrent/write_resume_data.hpp>
#include <libtorrent/error_code.hpp> #include <libtorrent/error_code.hpp>
#include <libtorrent/magnet_uri.hpp>
namespace lt = libtorrent; namespace lt = libtorrent;
using clk = std::chrono::steady_clock; using clk = std::chrono::steady_clock;
@ -87,7 +88,15 @@ int main(int argc, char const* argv[])
lt::error_code ec; lt::error_code ec;
lt::add_torrent_params atp = lt::read_resume_data(&buf[0], int(buf.size()), ec); lt::add_torrent_params atp = lt::read_resume_data(&buf[0], int(buf.size()), ec);
atp.url = argv[1]; if (ec) {
std::cerr << "failed to read resume data: " << ec.message() << std::endl;
return 1;
}
lt::parse_magnet_uri(argv[1], atp, ec);
if (ec) {
std::cerr << "invalid magnet URI: " << ec.message() << std::endl;
return 1;
}
atp.save_path = "."; // save in current dir atp.save_path = "."; // save in current dir
ses.async_add_torrent(std::move(atp)); ses.async_add_torrent(std::move(atp));

View File

@ -57,9 +57,8 @@ namespace libtorrent
// session. The key fields when adding a torrent are: // session. The key fields when adding a torrent are:
// //
// * ti - when you have loaded a .torrent file into a torrent_info object // * ti - when you have loaded a .torrent file into a torrent_info object
// * url - when you have a magnet link // * info_hash - when you don't have the metadata (.torrent file) but. This
// * info_hash - when all you have is an info-hash (this is similar to a // is set when adding a magnet link.
// magnet link)
// //
// one of those fields must be set. Another mandatory field is // one of those fields must be set. Another mandatory field is
// ``save_path``. The add_torrent_params object is passed into one of the // ``save_path``. The add_torrent_params object is passed into one of the
@ -280,7 +279,7 @@ namespace libtorrent
// for forward binary compatibility. // for forward binary compatibility.
int version = LIBTORRENT_VERSION_NUM; int version = LIBTORRENT_VERSION_NUM;
// torrent_info object with the torrent to add. Unless the url or // torrent_info object with the torrent to add. Unless the
// info_hash is set, this is required to be initialized. // info_hash is set, this is required to be initialized.
std::shared_ptr<torrent_info> ti; std::shared_ptr<torrent_info> ti;
@ -349,19 +348,6 @@ namespace libtorrent
// instead of this. // instead of this.
std::string trackerid; std::string trackerid;
// ``url`` can be set to a magnet link, in order to download the .torrent
// file (also known as the metadata), specifically the info-dictionary,
// from the bittorrent swarm. This may require access to the DHT, in case
// the magnet link does not come with trackers.
//
// In earlier versions of libtorrent, the URL could be an HTTP or file://
// url. These uses are deprecated and discouraged. When adding a torrent
// by magnet link, it will be set to the ``downloading_metadata`` state
// until the .torrent file has been downloaded. If there is any error
// while downloading, the torrent will be stopped and the torrent error
// state (``torrent_status::error``) will indicate what went wrong.
std::string url;
// flags controlling aspects of this torrent and how it's added. See // flags controlling aspects of this torrent and how it's added. See
// flags_t for details. // flags_t for details.
// //
@ -375,6 +361,8 @@ namespace libtorrent
// set this to the info hash of the torrent to add in case the info-hash // set this to the info hash of the torrent to add in case the info-hash
// is the only known property of the torrent. i.e. you don't have a // is the only known property of the torrent. i.e. you don't have a
// .torrent file nor a magnet link. // .torrent file nor a magnet link.
// To add a magnet link, use parse_magnet_uri() to populatefields in the
// add_torrent_params object.
sha1_hash info_hash; sha1_hash info_hash;
// ``max_uploads``, ``max_connections``, ``upload_limit``, // ``max_uploads``, ``max_connections``, ``upload_limit``,
@ -484,6 +472,20 @@ namespace libtorrent
#ifndef TORRENT_NO_DEPRECATE #ifndef TORRENT_NO_DEPRECATE
// deprecated in 1.2 // deprecated in 1.2
// ``url`` can be set to a magnet link, in order to download the .torrent
// file (also known as the metadata), specifically the info-dictionary,
// from the bittorrent swarm. This may require access to the DHT, in case
// the magnet link does not come with trackers.
//
// In earlier versions of libtorrent, the URL could be an HTTP or file://
// url. These uses are deprecated and discouraged. When adding a torrent
// by magnet link, it will be set to the ``downloading_metadata`` state
// until the .torrent file has been downloaded. If there is any error
// while downloading, the torrent will be stopped and the torrent error
// state (``torrent_status::error``) will indicate what went wrong.
std::string TORRENT_DEPRECATED_MEMBER url;
// if ``uuid`` is specified, it is used to find duplicates. If another // if ``uuid`` is specified, it is used to find duplicates. If another
// torrent is already running with the same UUID as the one being added, // torrent is already running with the same UUID as the one being added,
// it will be considered a duplicate. This is mainly useful for RSS feed // it will be considered a duplicate. This is mainly useful for RSS feed
@ -506,6 +508,7 @@ namespace libtorrent
#else #else
// hidden // hidden
// to maintain ABI compatibility // to maintain ABI compatibility
std::string deprecated5;
std::string deprecated1; std::string deprecated1;
std::string deprecated2; std::string deprecated2;
std::vector<char> deprecated3; std::vector<char> deprecated3;

View File

@ -100,7 +100,9 @@ void run_metadata_test(int flags)
// add torrent // add torrent
, [](lt::add_torrent_params& params) { , [](lt::add_torrent_params& params) {
// we want to add the torrent via magnet link // we want to add the torrent via magnet link
params.url = lt::make_magnet_uri(*params.ti); error_code ec;
parse_magnet_uri(lt::make_magnet_uri(*params.ti), params, ec);
TEST_CHECK(!ec);
params.ti.reset(); params.ti.reset();
params.flags &= ~add_torrent_params::flag_upload_mode; params.flags &= ~add_torrent_params::flag_upload_mode;
} }

View File

@ -1351,7 +1351,9 @@ namespace libtorrent
char const* torrent_name = info_hash; char const* torrent_name = info_hash;
if (params.ti) torrent_name = params.ti->name().c_str(); if (params.ti) torrent_name = params.ti->name().c_str();
else if (!params.name.empty()) torrent_name = params.name.c_str(); else if (!params.name.empty()) torrent_name = params.name.c_str();
#ifndef TORRENT_NO_DEPRECATE
else if (!params.url.empty()) torrent_name = params.url.c_str(); else if (!params.url.empty()) torrent_name = params.url.c_str();
#endif
else aux::to_hex(params.info_hash, info_hash); else aux::to_hex(params.info_hash, info_hash);
if (error) if (error)

View File

@ -141,9 +141,9 @@ namespace libtorrent
ret.save_path = rd.dict_find_string_value("save_path").to_string(); ret.save_path = rd.dict_find_string_value("save_path").to_string();
ret.url = rd.dict_find_string_value("url").to_string();
#ifndef TORRENT_NO_DEPRECATE #ifndef TORRENT_NO_DEPRECATE
// deprecated in 1.2 // deprecated in 1.2
ret.url = rd.dict_find_string_value("url").to_string();
ret.uuid = rd.dict_find_string_value("uuid").to_string(); ret.uuid = rd.dict_find_string_value("uuid").to_string();
#endif #endif

View File

@ -4789,6 +4789,7 @@ namespace aux {
using ptr_t = std::shared_ptr<torrent>; using ptr_t = std::shared_ptr<torrent>;
#ifndef TORRENT_NO_DEPRECATE
if (string_begins_no_case("magnet:", params.url.c_str())) if (string_begins_no_case("magnet:", params.url.c_str()))
{ {
parse_magnet_uri(params.url, params, ec); parse_magnet_uri(params.url, params, ec);
@ -4796,7 +4797,6 @@ namespace aux {
params.url.clear(); params.url.clear();
} }
#ifndef TORRENT_NO_DEPRECATE
if (!params.ti && string_begins_no_case("file://", params.url.c_str())) if (!params.ti && string_begins_no_case("file://", params.url.c_str()))
{ {
std::string const torrent_file_path = resolve_file_url(params.url); std::string const torrent_file_path = resolve_file_url(params.url);
@ -4808,7 +4808,6 @@ namespace aux {
} }
#endif #endif
if (params.ti && !params.ti->is_valid()) if (params.ti && !params.ti->is_valid())
{ {
ec = errors::no_metadata; ec = errors::no_metadata;

View File

@ -44,6 +44,7 @@ POSSIBILITY OF SUCH DAMAGE.
using namespace libtorrent; using namespace libtorrent;
namespace lt = libtorrent; namespace lt = libtorrent;
#ifndef TORRENT_NO_DEPRECATE
void test_remove_url(std::string url) void test_remove_url(std::string url)
{ {
lt::session s(settings()); lt::session s(settings());
@ -67,7 +68,6 @@ TORRENT_TEST(remove_url)
test_remove_url("magnet:?xt=urn:btih:0123456789abcdef0123456789abcdef01234567"); test_remove_url("magnet:?xt=urn:btih:0123456789abcdef0123456789abcdef01234567");
} }
#ifndef TORRENT_NO_DEPRECATE
TORRENT_TEST(remove_url2) TORRENT_TEST(remove_url2)
{ {
test_remove_url("http://non-existent.com/test.torrent"); test_remove_url("http://non-existent.com/test.torrent");
@ -111,18 +111,20 @@ TORRENT_TEST(magnet)
s->save_state(session_state); s->save_state(session_state);
// test magnet link parsing // test magnet link parsing
add_torrent_params p; add_torrent_params model;
p.flags &= ~add_torrent_params::flag_paused; model.flags &= ~add_torrent_params::flag_paused;
p.flags &= ~add_torrent_params::flag_auto_managed; model.flags &= ~add_torrent_params::flag_auto_managed;
p.save_path = "."; model.save_path = ".";
error_code ec; error_code ec;
p.url = "magnet:?xt=urn:btih:cdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcd" add_torrent_params p = model;
parse_magnet_uri("magnet:?xt=urn:btih:cdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcd"
"&tr=http://1" "&tr=http://1"
"&tr=http://2" "&tr=http://2"
"&tr=http://3" "&tr=http://3"
"&tr=http://3" "&tr=http://3"
"&dn=foo" "&dn=foo"
"&dht=127.0.0.1:43"; "&dht=127.0.0.1:43", p, ec);
TEST_CHECK(!ec);
torrent_handle t = s->add_torrent(p, ec); torrent_handle t = s->add_torrent(p, ec);
TEST_CHECK(!ec); TEST_CHECK(!ec);
if (ec) std::printf("%s\n", ec.message().c_str()); if (ec) std::printf("%s\n", ec.message().c_str());
@ -138,12 +140,14 @@ TORRENT_TEST(magnet)
TEST_CHECK(trackers_set.count("http://2") == 1); TEST_CHECK(trackers_set.count("http://2") == 1);
TEST_CHECK(trackers_set.count("http://3") == 1); TEST_CHECK(trackers_set.count("http://3") == 1);
p.url = "magnet:" p = model;
parse_magnet_uri("magnet:"
"?tr=http://1" "?tr=http://1"
"&tr=http://2" "&tr=http://2"
"&dn=foo" "&dn=foo"
"&dht=127.0.0.1:43" "&dht=127.0.0.1:43"
"&xt=urn:btih:c352cdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcd"; "&xt=urn:btih:c352cdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcd", p, ec);
TEST_CHECK(!ec);
torrent_handle t2 = s->add_torrent(p, ec); torrent_handle t2 = s->add_torrent(p, ec);
TEST_CHECK(!ec); TEST_CHECK(!ec);
if (ec) std::printf("%s\n", ec.message().c_str()); if (ec) std::printf("%s\n", ec.message().c_str());
@ -153,12 +157,14 @@ TORRENT_TEST(magnet)
TEST_EQUAL(trackers[0].tier, 0); TEST_EQUAL(trackers[0].tier, 0);
TEST_EQUAL(trackers[1].tier, 1); TEST_EQUAL(trackers[1].tier, 1);
p.url = "magnet:" p = model;
parse_magnet_uri("magnet:"
"?tr=udp%3A%2F%2Ftracker.openbittorrent.com%3A80" "?tr=udp%3A%2F%2Ftracker.openbittorrent.com%3A80"
"&tr=udp%3A%2F%2Ftracker.publicbt.com%3A80" "&tr=udp%3A%2F%2Ftracker.publicbt.com%3A80"
"&tr=udp%3A%2F%2Ftracker.ccc.de%3A80" "&tr=udp%3A%2F%2Ftracker.ccc.de%3A80"
"&xt=urn:btih:a38d02c287893842a32825aa866e00828a318f07" "&xt=urn:btih:a38d02c287893842a32825aa866e00828a318f07"
"&dn=Ubuntu+11.04+%28Final%29"; "&dn=Ubuntu+11.04+%28Final%29", p, ec);
TEST_CHECK(!ec);
torrent_handle t3 = s->add_torrent(p, ec); torrent_handle t3 = s->add_torrent(p, ec);
TEST_CHECK(!ec); TEST_CHECK(!ec);
if (ec) std::printf("%s\n", ec.message().c_str()); if (ec) std::printf("%s\n", ec.message().c_str());
@ -415,11 +421,15 @@ TORRENT_TEST(trailing_whitespace)
session ses(settings()); session ses(settings());
add_torrent_params p; add_torrent_params p;
p.save_path = "."; p.save_path = ".";
p.url = "magnet:?xt=urn:btih:abaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"; error_code ec;
parse_magnet_uri("magnet:?xt=urn:btih:abaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n", p, ec);
// invalid hash // invalid hash
TEST_CHECK(ec);
TEST_THROW(ses.add_torrent(p)); TEST_THROW(ses.add_torrent(p));
p.url = "magnet:?xt=urn:btih:abaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"; ec.clear();
parse_magnet_uri("magnet:?xt=urn:btih:abaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", p, ec);
TEST_CHECK(!ec);
// now it's valid, because there's no trailing whitespace // now it's valid, because there's no trailing whitespace
torrent_handle h = ses.add_torrent(p); torrent_handle h = ses.add_torrent(p);
TEST_CHECK(h.is_valid()); TEST_CHECK(h.is_valid());

View File

@ -40,6 +40,7 @@ POSSIBILITY OF SUCH DAMAGE.
#include "libtorrent/peer_info.hpp" #include "libtorrent/peer_info.hpp"
#include "libtorrent/extensions.hpp" #include "libtorrent/extensions.hpp"
#include "libtorrent/file.hpp" // for combine_path, current_working_directory #include "libtorrent/file.hpp" // for combine_path, current_working_directory
#include "libtorrent/magnet_uri.hpp"
#include "settings.hpp" #include "settings.hpp"
#include <tuple> #include <tuple>
#include <iostream> #include <iostream>
@ -238,7 +239,9 @@ TORRENT_TEST(added_peers)
add_torrent_params p; add_torrent_params p;
p.ti = info; p.ti = info;
p.save_path = "."; p.save_path = ".";
p.url = "magnet:?xt=urn:btih:abababababababababababababababababababab&x.pe=127.0.0.1:48081&x.pe=127.0.0.2:48082"; parse_magnet_uri("magnet:?xt=urn:btih:abababababababababababababababababababab&x.pe=127.0.0.1:48081&x.pe=127.0.0.2:48082"
, p, ec);
TEST_CHECK(!ec);
torrent_handle h = ses.add_torrent(std::move(p)); torrent_handle h = ses.add_torrent(std::move(p));