improve web seed connection handling

This commit is contained in:
Arvid Norberg
2010-04-14 06:22:00 +00:00
parent 2e14cfca46
commit 9a5f5562cb
4 changed files with 30 additions and 26 deletions

View File

@@ -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; }

View File

@@ -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;
}

View File

@@ -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()

View File

@@ -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;
}