improve web seed connection handling
This commit is contained in:
@@ -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<web_seed_entry>::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<web_seed_entry>::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_seed_entry> web_seeds() const
|
||||
{ return m_web_seeds; }
|
||||
|
@@ -116,9 +116,8 @@ namespace libtorrent
|
||||
void http_seed_connection::disconnect(error_code const& ec, int error)
|
||||
{
|
||||
boost::shared_ptr<torrent> 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<piece_block_progress>
|
||||
@@ -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<url_seed_alert>())
|
||||
@@ -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;
|
||||
}
|
||||
|
@@ -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<web_seed_entry>::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()
|
||||
|
@@ -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<torrent> 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<piece_block_progress>
|
||||
@@ -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<url_seed_alert>())
|
||||
@@ -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;
|
||||
}
|
||||
|
Reference in New Issue
Block a user