improved web seed retry behavior

This commit is contained in:
Arvid Norberg 2010-09-21 06:34:13 +00:00
parent d590938856
commit d894dd43d8
6 changed files with 38 additions and 23 deletions

View File

@ -43,6 +43,7 @@
incoming connection incoming connection
* added more detailed instrumentation of the disk I/O thread * added more detailed instrumentation of the disk I/O thread
* improved web seed retry behavior
* fixed announce issue * fixed announce issue
0.15.3 release 0.15.3 release

View File

@ -55,6 +55,12 @@ POSSIBILITY OF SUCH DAMAGE.
namespace libtorrent namespace libtorrent
{ {
// return true if the status code is 200, 206, or in the 300-400 range
bool is_ok_status(int http_status);
// return true if the status code is a redirect
bool is_redirect(int http_status);
class TORRENT_EXPORT http_parser class TORRENT_EXPORT http_parser
{ {
public: public:

View File

@ -46,7 +46,6 @@ namespace libtorrent {
enum { max_bottled_buffer = 1024 * 1024 }; enum { max_bottled_buffer = 1024 * 1024 };
void http_connection::get(std::string const& url, time_duration timeout, int prio void http_connection::get(std::string const& url, time_duration timeout, int prio
, proxy_settings const* ps, int handle_redirects, std::string const& user_agent , proxy_settings const* ps, int handle_redirects, std::string const& user_agent
, address const& bind_addr , address const& bind_addr

View File

@ -45,6 +45,21 @@ using namespace libtorrent;
namespace libtorrent namespace libtorrent
{ {
bool is_ok_status(int http_status)
{
return http_status == 206 // partial content
|| http_status == 200 // OK
|| (http_status >= 300 // redirect
&& http_status < 400);
}
bool is_redirect(int http_status)
{
return http_status >= 300
&& http_status < 400;
}
http_parser::http_parser() http_parser::http_parser()
: m_recv_pos(0) : m_recv_pos(0)
, m_status_code(-1) , m_status_code(-1)

View File

@ -320,12 +320,13 @@ namespace libtorrent
} }
// if the status code is not one of the accepted ones, abort // if the status code is not one of the accepted ones, abort
if (m_parser.status_code() != 200 // OK if (!is_ok_status(m_parser.status_code()))
&& m_parser.status_code() != 503
&& !(m_parser.status_code() >= 300 // redirect
&& m_parser.status_code() < 400))
{ {
t->remove_web_seed(this); int retry_time = atoi(m_parser.header("retry-after").c_str());
if (retry_time <= 0) retry_time = 5 * 60;
// temporarily unavailable, retry later
t->retry_web_seed(this, retry_time);
std::string error_msg = to_string(m_parser.status_code()).elems std::string error_msg = to_string(m_parser.status_code()).elems
+ (" " + m_parser.message()); + (" " + m_parser.message());
if (m_ses.m_alerts.should_post<url_seed_alert>()) if (m_ses.m_alerts.should_post<url_seed_alert>())
@ -347,7 +348,7 @@ namespace libtorrent
// we just completed reading the header // we just completed reading the header
if (!header_finished) if (!header_finished)
{ {
if (m_parser.status_code() >= 300 && m_parser.status_code() < 400) if (is_redirect(m_parser.status_code()))
{ {
// this means we got a redirection request // this means we got a redirection request
// look for the location header // look for the location header
@ -408,12 +409,9 @@ namespace libtorrent
if (!m_parser.finished()) return; if (!m_parser.finished()) return;
int retry_time = atol(std::string(recv_buffer.begin, recv_buffer.end).c_str()); int retry_time = atol(std::string(recv_buffer.begin, recv_buffer.end).c_str());
if (retry_time <= 0) retry_time = 0; if (retry_time <= 0) retry_time = 60;
#ifdef TORRENT_VERBOSE_LOGGING #ifdef TORRENT_VERBOSE_LOGGING
else (*m_logger) << time_now_string() << ": retrying in " << retry_time << " seconds\n";
{
(*m_logger) << time_now_string() << ": retrying in " << retry_time << " seconds\n";
}
#endif #endif
// temporarily unavailable, retry later // temporarily unavailable, retry later
@ -422,6 +420,7 @@ namespace libtorrent
return; return;
} }
// we only received the header, no data // we only received the header, no data
if (recv_buffer.left() == 0) break; if (recv_buffer.left() == 0) break;

View File

@ -423,17 +423,12 @@ namespace libtorrent
(*m_logger) << " " << i->first << ": " << i->second << "\n"; (*m_logger) << " " << i->first << ": " << i->second << "\n";
#endif #endif
// if the status code is not one of the accepted ones, abort // if the status code is not one of the accepted ones, abort
if (m_parser.status_code() != 206 // partial content if (!is_ok_status(m_parser.status_code()))
&& m_parser.status_code() != 200 // OK
&& !(m_parser.status_code() >= 300 // redirect
&& m_parser.status_code() < 400))
{ {
if (m_parser.status_code() == 503) int retry_time = atoi(m_parser.header("retry-after").c_str());
{ if (retry_time <= 0) retry_time = 5 * 60;
std::string retry_after = m_parser.header("retry-after"); // temporarily unavailable, retry later
// temporarily unavailable, retry later t->retry_web_seed(this, retry_time);
t->retry_web_seed(this, atoi(retry_after.c_str()));
}
std::string error_msg = to_string(m_parser.status_code()).elems std::string error_msg = to_string(m_parser.status_code()).elems
+ (" " + m_parser.message()); + (" " + m_parser.message());
if (m_ses.m_alerts.should_post<url_seed_alert>()) if (m_ses.m_alerts.should_post<url_seed_alert>())
@ -445,7 +440,7 @@ namespace libtorrent
disconnect(errors::http_error, 1); disconnect(errors::http_error, 1);
return; return;
} }
if (m_parser.status_code() >= 300 && m_parser.status_code() < 400) if (is_redirect(m_parser.status_code()))
{ {
// this means we got a redirection request // this means we got a redirection request
// look for the location header // look for the location header