support for receiving multi announce messages for local peer discovery
This commit is contained in:
parent
cb6f38f056
commit
3c05e81529
|
@ -1,3 +1,4 @@
|
|||
* support for receiving multi announce messages for local peer discovery
|
||||
* added session::listen_no_system_port flag to prevent libtorrent from ever binding the listen socket to port 0
|
||||
* added option to not recheck on missing or incomplete resume data
|
||||
* extended stats logging with statistics=on builds
|
||||
|
|
|
@ -69,7 +69,7 @@ namespace libtorrent
|
|||
std::string const& header(char const* key) const
|
||||
{
|
||||
static std::string empty;
|
||||
std::map<std::string, std::string>::const_iterator i
|
||||
std::multimap<std::string, std::string>::const_iterator i
|
||||
= m_header.find(key);
|
||||
if (i == m_header.end()) return empty;
|
||||
return i->second;
|
||||
|
@ -115,7 +115,7 @@ namespace libtorrent
|
|||
// reset the whole state and start over
|
||||
void reset();
|
||||
|
||||
std::map<std::string, std::string> const& headers() const { return m_header; }
|
||||
std::multimap<std::string, std::string> const& headers() const { return m_header; }
|
||||
std::vector<std::pair<size_type, size_type> > const& chunks() const { return m_chunked_ranges; }
|
||||
|
||||
private:
|
||||
|
@ -132,7 +132,7 @@ namespace libtorrent
|
|||
|
||||
enum { read_status, read_header, read_body, error_state } m_state;
|
||||
|
||||
std::map<std::string, std::string> m_header;
|
||||
std::multimap<std::string, std::string> m_header;
|
||||
buffer::const_interval m_recv_buffer;
|
||||
int m_body_start_pos;
|
||||
|
||||
|
|
|
@ -392,7 +392,7 @@ restart_response:
|
|||
// add them to the headers in the parser
|
||||
for (std::map<std::string, std::string>::const_iterator i = tail_headers.begin();
|
||||
i != tail_headers.end(); ++i)
|
||||
m_header[i->first] = i->second;
|
||||
m_header.insert(std::make_pair(i->first, i->second));
|
||||
|
||||
return true;
|
||||
}
|
||||
|
|
61
src/lsd.cpp
61
src/lsd.cpp
|
@ -176,43 +176,52 @@ void lsd::on_announce(udp::endpoint const& from, char* buffer
|
|||
if (port_str.empty())
|
||||
{
|
||||
#if defined(TORRENT_LOGGING) || defined(TORRENT_VERBOSE_LOGGING)
|
||||
m_log << time_now_string()
|
||||
<< " <== announce: invalid BT-SEARCH, missing port" << std::endl;
|
||||
m_log << time_now_string()
|
||||
<< " <== announce: invalid BT-SEARCH, missing port" << std::endl;
|
||||
#endif
|
||||
return;
|
||||
}
|
||||
|
||||
std::string const& ih_str = p.header("infohash");
|
||||
if (ih_str.empty())
|
||||
{
|
||||
#if defined(TORRENT_LOGGING) || defined(TORRENT_VERBOSE_LOGGING)
|
||||
m_log << time_now_string()
|
||||
<< " <== announce: invalid BT-SEARCH, missing infohash" << std::endl;
|
||||
#endif
|
||||
return;
|
||||
}
|
||||
|
||||
sha1_hash ih(0);
|
||||
from_hex(ih_str.c_str(), 40, (char*)&ih[0]);
|
||||
int port = std::atoi(port_str.c_str());
|
||||
|
||||
if (!ih.is_all_zeros() && port != 0)
|
||||
typedef std::multimap<std::string, std::string> headers_t;
|
||||
headers_t const& headers = p.headers();
|
||||
std::pair<headers_t::const_iterator, headers_t::const_iterator> ihs
|
||||
= headers.equal_range("infohash");
|
||||
|
||||
for (headers_t::const_iterator i = ihs.first; i != ihs.second; ++i)
|
||||
{
|
||||
std::string const& ih_str = i->second;
|
||||
if (ih_str.size() != 40)
|
||||
{
|
||||
#if defined(TORRENT_LOGGING) || defined(TORRENT_VERBOSE_LOGGING)
|
||||
char msg[200];
|
||||
snprintf(msg, 200, "%s *** incoming local announce %s:%d ih: %s\n"
|
||||
, time_now_string(), print_address(from.address()).c_str()
|
||||
, port, ih_str.c_str());
|
||||
m_log << time_now_string()
|
||||
<< " <== announce: invalid BT-SEARCH, invalid infohash: "
|
||||
<< ih_str << std::endl;
|
||||
#endif
|
||||
// we got an announce, pass it on through the callback
|
||||
#ifndef BOOST_NO_EXCEPTIONS
|
||||
try {
|
||||
#endif
|
||||
m_callback(tcp::endpoint(from.address(), port), ih);
|
||||
#ifndef BOOST_NO_EXCEPTIONS
|
||||
continue;
|
||||
}
|
||||
catch (std::exception&) {}
|
||||
|
||||
sha1_hash ih(0);
|
||||
from_hex(ih_str.c_str(), 40, (char*)&ih[0]);
|
||||
|
||||
if (!ih.is_all_zeros() && port != 0)
|
||||
{
|
||||
#if defined(TORRENT_LOGGING) || defined(TORRENT_VERBOSE_LOGGING)
|
||||
char msg[200];
|
||||
snprintf(msg, 200, "%s *** incoming local announce %s:%d ih: %s\n"
|
||||
, time_now_string(), print_address(from.address()).c_str()
|
||||
, port, ih_str.c_str());
|
||||
#endif
|
||||
// we got an announce, pass it on through the callback
|
||||
#ifndef BOOST_NO_EXCEPTIONS
|
||||
try {
|
||||
#endif
|
||||
m_callback(tcp::endpoint(from.address(), port), ih);
|
||||
#ifndef BOOST_NO_EXCEPTIONS
|
||||
} catch (std::exception&) {}
|
||||
#endif
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -362,8 +362,8 @@ namespace libtorrent
|
|||
{
|
||||
#ifdef TORRENT_VERBOSE_LOGGING
|
||||
peer_log("*** STATUS: %d %s", m_parser.status_code(), m_parser.message().c_str());
|
||||
std::map<std::string, std::string> const& headers = m_parser.headers();
|
||||
for (std::map<std::string, std::string>::const_iterator i = headers.begin()
|
||||
std::multimap<std::string, std::string> const& headers = m_parser.headers();
|
||||
for (std::multimap<std::string, std::string>::const_iterator i = headers.begin()
|
||||
, end(headers.end()); i != end; ++i)
|
||||
peer_log(" %s: %s", i->first.c_str(), i->second.c_str());
|
||||
#endif
|
||||
|
|
|
@ -57,7 +57,7 @@ void print_http_header(http_parser const& p)
|
|||
{
|
||||
std::cerr << " < " << p.status_code() << " " << p.message() << std::endl;
|
||||
|
||||
for (std::map<std::string, std::string>::const_iterator i
|
||||
for (std::multimap<std::string, std::string>::const_iterator i
|
||||
= p.headers().begin(), end(p.headers().end()); i != end; ++i)
|
||||
{
|
||||
std::cerr << " < " << i->first << ": " << i->second << std::endl;
|
||||
|
|
Loading…
Reference in New Issue