diff --git a/ChangeLog b/ChangeLog index 5c3c13555..8e9559f78 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,4 @@ + * support retry-after header for web seeds * replaced boost.filesystem with custom functions * replaced dependency on boost.thread by asio's internal thread primitives * added support for i2p torrents diff --git a/src/web_peer_connection.cpp b/src/web_peer_connection.cpp index 73d390937..cf9f60eae 100644 --- a/src/web_peer_connection.cpp +++ b/src/web_peer_connection.cpp @@ -386,29 +386,6 @@ namespace libtorrent break; } - // if the status code is not one of the accepted ones, abort - if (m_parser.status_code() != 206 // partial content - && m_parser.status_code() != 200 // OK - && !(m_parser.status_code() >= 300 // redirect - && m_parser.status_code() < 400)) - { - if (m_parser.status_code() == 503) - { - // temporarily unavailable, retry later - t->retry_web_seed(m_url, web_seed_entry::url_seed); - } - t->remove_web_seed(m_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()) - { - m_ses.m_alerts.post_alert(url_seed_alert(t->get_handle(), url() - , error_msg)); - } - m_statistics.received_bytes(0, bytes_transferred); - disconnect(error_code(errors::http_error, libtorrent_category), 1); - return; - } if (!m_parser.header_finished()) { TORRENT_ASSERT(payload == 0); @@ -431,6 +408,30 @@ namespace libtorrent , end(headers.end()); i != end; ++i) (*m_logger) << " " << i->first << ": " << i->second << "\n"; #endif + // if the status code is not one of the accepted ones, abort + if (m_parser.status_code() != 206 // partial content + && m_parser.status_code() != 200 // OK + && !(m_parser.status_code() >= 300 // redirect + && m_parser.status_code() < 400)) + { + if (m_parser.status_code() == 503) + { + std::string retry_after = m_parser.header("retry-after"); + // temporarily unavailable, retry later + t->retry_web_seed(m_url, web_seed_entry::url_seed, atoi(retry_after.c_str())); + } + t->remove_web_seed(m_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()) + { + m_ses.m_alerts.post_alert(url_seed_alert(t->get_handle(), url() + , error_msg)); + } + m_statistics.received_bytes(0, bytes_transferred); + disconnect(error_code(errors::http_error, libtorrent_category), 1); + return; + } if (m_parser.status_code() >= 300 && m_parser.status_code() < 400) { // this means we got a redirection request