diff --git a/include/libtorrent/torrent.hpp b/include/libtorrent/torrent.hpp index 1ead7ea52..df3b3d96e 100644 --- a/include/libtorrent/torrent.hpp +++ b/include/libtorrent/torrent.hpp @@ -350,11 +350,10 @@ namespace libtorrent void add_web_seed(std::string const& url, web_seed_entry::type_t type) { m_web_seeds.push_back(web_seed_entry(url, type)); } - void disconnect_web_seed(std::string const& url, web_seed_entry::type_t type) + void disconnect_web_seed(peer_connection* p) { std::list::iterator i = std::find_if(m_web_seeds.begin(), m_web_seeds.end() - , (boost::bind(&web_seed_entry::url, _1) - == url && boost::bind(&web_seed_entry::type, _1) == type)); + , (boost::bind(&web_seed_entry::connection, _1) == p)); TORRENT_ASSERT(i != m_web_seeds.end()); if (i == m_web_seeds.end()) return; TORRENT_ASSERT(i->connection); @@ -369,7 +368,16 @@ namespace libtorrent if (i != m_web_seeds.end()) m_web_seeds.erase(i); } - void retry_web_seed(std::string const& url, web_seed_entry::type_t type, int retry = 0); + void retry_web_seed(peer_connection* p, int retry = 0); + + void remove_web_seed(peer_connection* p) + { + std::list::iterator i = std::find_if(m_web_seeds.begin(), m_web_seeds.end() + , (boost::bind(&web_seed_entry::connection, _1) == p)); + TORRENT_ASSERT(i != m_web_seeds.end()); + if (i == m_web_seeds.end()) return; + m_web_seeds.erase(i); + } std::list web_seeds() const { return m_web_seeds; } diff --git a/src/http_seed_connection.cpp b/src/http_seed_connection.cpp index 75bfa50bd..59d689e7d 100644 --- a/src/http_seed_connection.cpp +++ b/src/http_seed_connection.cpp @@ -116,9 +116,8 @@ namespace libtorrent void http_seed_connection::disconnect(error_code const& ec, int error) { boost::shared_ptr t = associated_torrent().lock(); - TORRENT_ASSERT(t); peer_connection::disconnect(ec, error); - if (t) t->disconnect_web_seed(m_url, web_seed_entry::http_seed); + if (t) t->disconnect_web_seed(this); } boost::optional @@ -324,7 +323,7 @@ namespace libtorrent && !(m_parser.status_code() >= 300 // redirect && m_parser.status_code() < 400)) { - t->remove_web_seed(m_url, web_seed_entry::http_seed); + t->remove_web_seed(this); std::string error_msg = to_string(m_parser.status_code()).elems + (" " + m_parser.message()); if (m_ses.m_alerts.should_post()) @@ -355,14 +354,14 @@ namespace libtorrent if (location.empty()) { // we should not try this server again. - t->remove_web_seed(m_url, web_seed_entry::http_seed); + t->remove_web_seed(this); disconnect(errors::missing_location, 2); return; } // add the redirected url and remove the current one t->add_web_seed(location, web_seed_entry::http_seed); - t->remove_web_seed(m_url, web_seed_entry::http_seed); + t->remove_web_seed(this); disconnect(errors::redirecting, 2); return; } @@ -381,7 +380,7 @@ namespace libtorrent if (m_response_left == -1) { // we should not try this server again. - t->remove_web_seed(m_url, web_seed_entry::http_seed); + t->remove_web_seed(this); disconnect(errors::no_content_length, 2); return; } @@ -416,8 +415,7 @@ namespace libtorrent #endif // temporarily unavailable, retry later - t->retry_web_seed(m_url, web_seed_entry::http_seed, retry_time); - t->remove_web_seed(m_url, web_seed_entry::http_seed); + t->retry_web_seed(this, retry_time); disconnect(errors::http_error, 1); return; } diff --git a/src/torrent.cpp b/src/torrent.cpp index 22479ecff..a3f1fff68 100644 --- a/src/torrent.cpp +++ b/src/torrent.cpp @@ -5964,14 +5964,15 @@ namespace libtorrent return ret; } - void torrent::retry_web_seed(std::string const& url, web_seed_entry::type_t type, int retry) + void torrent::retry_web_seed(peer_connection* p, int retry) { std::list::iterator i = std::find_if(m_web_seeds.begin(), m_web_seeds.end() - , (boost::bind(&web_seed_entry::url, _1) == url) - && (boost::bind(&web_seed_entry::type, _1) == type)); + , (boost::bind(&web_seed_entry::connection, _1) == p)); + TORRENT_ASSERT(i != m_web_seeds.end()); + if (i == m_web_seeds.end()) return; if (retry == 0) retry = m_ses.settings().urlseed_wait_retry; - if (i != m_web_seeds.end()) i->retry = time_now() + seconds(retry); + i->retry = time_now() + seconds(retry); } bool torrent::try_connect_peer() diff --git a/src/web_peer_connection.cpp b/src/web_peer_connection.cpp index 9dfdb70ed..1b50c2496 100644 --- a/src/web_peer_connection.cpp +++ b/src/web_peer_connection.cpp @@ -65,7 +65,6 @@ namespace libtorrent , policy::peer* peerinfo) : peer_connection(ses, t, s, remote, peerinfo) , m_url(url) - , m_original_url(url) , m_first_request(true) , m_range_pos(0) , m_block_pos(0) @@ -121,9 +120,8 @@ namespace libtorrent void web_peer_connection::disconnect(error_code const& ec, int error) { boost::shared_ptr t = associated_torrent().lock(); - TORRENT_ASSERT(t); peer_connection::disconnect(ec, error); - if (t) t->disconnect_web_seed(m_original_url, web_seed_entry::url_seed); + if (t) t->disconnect_web_seed(this); } boost::optional @@ -425,9 +423,8 @@ namespace libtorrent { std::string retry_after = m_parser.header("retry-after"); // temporarily unavailable, retry later - t->retry_web_seed(m_original_url, web_seed_entry::url_seed, atoi(retry_after.c_str())); + t->retry_web_seed(this, atoi(retry_after.c_str())); } - t->remove_web_seed(m_original_url, web_seed_entry::url_seed); std::string error_msg = to_string(m_parser.status_code()).elems + (" " + m_parser.message()); if (m_ses.m_alerts.should_post()) @@ -449,7 +446,7 @@ namespace libtorrent if (location.empty()) { // we should not try this server again. - t->remove_web_seed(m_original_url, web_seed_entry::url_seed); + t->remove_web_seed(this); disconnect(errors::missing_location, 2); return; } @@ -474,14 +471,14 @@ namespace libtorrent size_t i = location.rfind(path); if (i == std::string::npos) { - t->remove_web_seed(m_original_url, web_seed_entry::url_seed); + t->remove_web_seed(this); disconnect(errors::invalid_redirection, 2); return; } location.resize(i); } t->add_web_seed(location, web_seed_entry::url_seed); - t->remove_web_seed(m_original_url, web_seed_entry::url_seed); + t->remove_web_seed(this); disconnect(errors::redirecting, 2); return; } @@ -515,7 +512,7 @@ namespace libtorrent { m_statistics.received_bytes(0, bytes_transferred); // we should not try this server again. - t->remove_web_seed(m_original_url, web_seed_entry::url_seed); + t->remove_web_seed(this); disconnect(errors::invalid_range); return; } @@ -530,7 +527,7 @@ namespace libtorrent { m_statistics.received_bytes(0, bytes_transferred); // we should not try this server again. - t->remove_web_seed(m_original_url, web_seed_entry::url_seed); + t->remove_web_seed(this); disconnect(errors::no_content_length, 2); return; }