don't attempt sending event=stopped if event=start never succeeded

This commit is contained in:
arvidn 2020-01-08 15:33:17 +01:00 committed by Arvid Norberg
parent af12f5d6b8
commit ab07eceead
3 changed files with 66 additions and 1 deletions

View File

@ -1,3 +1,4 @@
* don't attempt sending event=stopped if event=start never succeeded
* make sure &key= stays consistent between different source IPs (as mandated by BEP7)
* fix binding sockets to outgoing interface
* add new socks5_alert to trouble shoot SOCKS5 proxies

View File

@ -693,6 +693,67 @@ void announce_entry_test(Announce a, Test t, char const* url_path = "/announce")
, url_path);
}
// test that we correctly omit announcing an event=stopped to a tracker we never
// managed to send an event=start to
TORRENT_TEST(omit_stop_event)
{
using sim::asio::ip::address_v4;
sim_config network_cfg;
sim::simulation sim{network_cfg};
lt::session_proxy zombie;
asio::io_service ios(sim, { address_v4::from_string("123.0.0.3"), address_v6::from_string("ff::dead:beef")});
lt::settings_pack sett = settings();
std::unique_ptr<lt::session> ses(new lt::session(sett, ios));
print_alerts(*ses);
lt::add_torrent_params p;
p.name = "test-torrent";
p.save_path = ".";
p.info_hash.assign("abababababababababab");
p.trackers.push_back("udp://tracker.com:8080/announce");
ses->async_add_torrent(p);
// run the test 5 seconds in
sim::timer t1(sim, lt::seconds(5)
, [&ses](boost::system::error_code const&)
{
std::vector<lt::torrent_handle> torrents = ses->get_torrents();
TEST_EQUAL(torrents.size(), 1);
torrent_handle h = torrents.front();
});
int stop_announces = 0;
sim::timer t2(sim, lt::seconds(1800)
, [&](boost::system::error_code const&)
{
// make sure we don't announce a stopped event when stopping
print_alerts(*ses, [&](lt::session&, lt::alert const* a) {
if (alert_cast<lt::tracker_announce_alert>(a))
++stop_announces;
});
std::vector<lt::torrent_handle> torrents = ses->get_torrents();
TEST_EQUAL(torrents.size(), 1);
torrent_handle h = torrents.front();
h.set_flags(torrent_flags::paused, torrent_flags::paused | torrent_flags::auto_managed);
});
// then shut down 10 seconds in
sim::timer t3(sim, lt::seconds(1810)
, [&](boost::system::error_code const&)
{
zombie = ses->abort();
ses.reset();
});
sim.run();
TEST_EQUAL(stop_announces, 0);
}
TORRENT_TEST(test_error)
{
announce_entry_test(

View File

@ -2940,7 +2940,10 @@ bool is_downloading_state(int const st)
for (auto& aep : ae.endpoints)
{
if (!aep.enabled) continue;
// if we haven't sent an event=start to the tracker, there's no
// point in sending an event=stopped
if (!aep.enabled || (!aep.start_sent && req.event == tracker_request::stopped))
continue;
auto aep_state_iter = std::find_if(listen_socket_states.begin(), listen_socket_states.end()
, [&](announce_state const& s) { return s.socket == aep.socket; });