add support for &ipv4= tracker argument

This commit is contained in:
arvidn 2018-11-19 01:56:30 +01:00 committed by Arvid Norberg
parent c1bfd696d4
commit 0d8a5a8a44
5 changed files with 38 additions and 12 deletions

View File

@ -1,5 +1,6 @@
1.2 release
* support &ipv4= tracker argument for private torrents
* renamed debug_notification to connect_notification
* when updating listen sockets, only post alerts for new ones
* deprecate anonymous_mode_alert

View File

@ -144,6 +144,7 @@ namespace libtorrent {
std::uint32_t key;
int num_want;
std::vector<address_v6> ipv6;
std::vector<address_v4> ipv4;
sha1_hash info_hash;
peer_id pid;

View File

@ -970,11 +970,13 @@ TORRENT_TEST(tracker_ipv6_argument)
{
bool got_announce = false;
bool got_ipv6 = false;
bool got_ipv4 = false;
tracker_test(
[](lt::add_torrent_params& p, lt::session& ses)
{
settings_pack pack;
pack.set_bool(settings_pack::anonymous_mode, false);
pack.set_str(settings_pack::listen_interfaces, "10.0.0.3:0,[ffff::1337]:0");
ses.apply_settings(pack);
p.ti = make_torrent(true);
return 60;
@ -984,13 +986,22 @@ TORRENT_TEST(tracker_ipv6_argument)
{
got_announce = true;
bool const stop_event = req.find("&event=stopped") != std::string::npos;
// stop events don't need to advertise the IPv6 address
std::string::size_type pos = req.find("&ipv6=");
TEST_CHECK(pos != std::string::npos || stop_event);
got_ipv6 |= pos != std::string::npos;
// make sure the IPv6 argument is url encoded
TEST_CHECK(req.substr(pos + 6, req.substr(pos + 6).find_first_of('&'))
== "ffff%3a%3a1337");
// stop events don't need to advertise the IPv6/IPv4 address
{
std::string::size_type const pos = req.find("&ipv6=");
TEST_CHECK(pos != std::string::npos || stop_event);
got_ipv6 |= pos != std::string::npos;
// make sure the IPv6 argument is url encoded
TEST_EQUAL(req.substr(pos + 6, req.substr(pos + 6).find_first_of('&'))
, "ffff%3a%3a1337");
}
{
std::string::size_type const pos = req.find("&ipv4=");
TEST_CHECK(pos != std::string::npos || stop_event);
got_ipv4 |= pos != std::string::npos;
TEST_EQUAL(req.substr(pos + 6, req.substr(pos + 6).find_first_of('&')), "10.0.0.3");
}
return sim::send_response(200, "OK", 11) + "d5:peers0:e";
}
, [](torrent_handle) {}

View File

@ -172,6 +172,17 @@ namespace libtorrent {
}
}
if (!tracker_req().ipv4.empty() && !i2p)
{
for (auto const& v4 : tracker_req().ipv4)
{
error_code err;
std::string const ip = v4.to_string(err);
if (err) continue;
url += "&ipv4=";
url += escape_string(ip);
}
}
if (!tracker_req().ipv6.empty() && !i2p)
{
for (auto const& v6 : tracker_req().ipv6)

View File

@ -2782,11 +2782,13 @@ bool is_downloading_state(int const st)
{
m_ses.for_each_listen_socket([&](aux::listen_socket_handle const& s)
{
if (s.is_ssl() != is_ssl_torrent())
return;
if (!is_v6(s.get_local_endpoint()))
return;
req.ipv6.push_back(s.get_local_endpoint().address().to_v6());
if (s.is_ssl() != is_ssl_torrent()) return;
tcp::endpoint const ep = s.get_local_endpoint();
if (is_any(ep.address())) return;
if (is_v6(ep))
req.ipv6.push_back(ep.address().to_v6());
else
req.ipv4.push_back(ep.address().to_v4());
});
}