merged all proxy settings into a single one

This commit is contained in:
Arvid Norberg 2010-08-23 06:27:18 +00:00
parent 2736a3b7ff
commit b747cdab8a
10 changed files with 92 additions and 75 deletions

View File

@ -1,3 +1,4 @@
* merged all proxy settings into a single one
* improved SOCKS5 support by proxying hostname lookups
* improved support for multi-homed clients
* added feature to not count downloaded bytes from web seeds in stats

View File

@ -304,40 +304,24 @@ namespace libtorrent
void save_state(entry* e, boost::uint32_t flags) const;
void load_state(lazy_entry const* e);
// TODO: just use a single proxy for everything. That's essentially how
// it works behind the scene anyway, with the udp socket being used for
// both DHT, uTP peers and udp trackers.
void set_peer_proxy(proxy_settings const& s)
{
m_peer_proxy = s;
// in case we just set a socks proxy, we might have to
// open the socks incoming connection
if (!m_socks_listen_socket) open_new_incoming_socks_connection();
m_udp_socket.set_proxy_settings(m_peer_proxy);
}
void set_web_seed_proxy(proxy_settings const& s)
{ m_web_seed_proxy = s; }
void set_tracker_proxy(proxy_settings const& s)
{
m_udp_socket.set_proxy_settings(s);
m_tracker_proxy = s;
}
void set_proxy(proxy_settings const& s);
proxy_settings const& proxy() const { return m_proxy; }
proxy_settings const& peer_proxy() const
{ return m_peer_proxy; }
proxy_settings const& web_seed_proxy() const
{ return m_web_seed_proxy; }
proxy_settings const& tracker_proxy() const
{ return m_tracker_proxy; }
#ifndef TORRENT_NO_DEPRECATE
void set_peer_proxy(proxy_settings const& s) { set_proxy(s); }
void set_web_seed_proxy(proxy_settings const& s) { set_proxy(s); }
void set_tracker_proxy(proxy_settings const& s) { set_proxy(s); }
proxy_settings const& peer_proxy() const { return proxy(); }
proxy_settings const& web_seed_proxy() const { return proxy(); }
proxy_settings const& tracker_proxy() const { return proxy(); }
#ifndef TORRENT_DISABLE_DHT
void set_dht_proxy(proxy_settings const& s) { set_proxy(s); }
proxy_settings const& dht_proxy() const { return proxy(); }
#endif
#endif // TORRENT_NO_DEPRECATE
#ifndef TORRENT_DISABLE_DHT
void set_dht_proxy(proxy_settings const& s)
{
m_dht_proxy = s;
m_udp_socket.set_proxy_settings(s);
}
proxy_settings const& dht_proxy() const
{ return m_dht_proxy; }
bool is_dht_running() const { return m_dht; }
#endif
@ -605,14 +589,9 @@ namespace libtorrent
// the settings for the client
session_settings m_settings;
// the proxy settings for different
// kinds of connections
proxy_settings m_peer_proxy;
proxy_settings m_web_seed_proxy;
proxy_settings m_tracker_proxy;
#ifndef TORRENT_DISABLE_DHT
proxy_settings m_dht_proxy;
#endif
// the proxy used for bittorrent
proxy_settings m_proxy;
#ifndef TORRENT_DISABLE_DHT
entry m_dht_state;

View File

@ -178,16 +178,20 @@ namespace libtorrent
enum save_state_flags_t
{
save_settings = 0x001,
save_settings = 0x001,
save_dht_settings = 0x002,
save_dht_proxy = 0x004,
save_dht_state = 0x008,
save_i2p_proxy = 0x010,
save_dht_state = 0x004,
save_proxy = 0x008,
save_i2p_proxy = 0x010,
save_encryption_settings = 0x020,
save_peer_proxy = 0x040,
save_web_proxy = 0x080,
save_tracker_proxy = 0x100,
save_as_map = 0x200
save_as_map = 0x040,
#ifndef TORRENT_NO_DEPRECATE
save_dht_proxy = save_proxy,
save_peer_proxy = save_proxy,
save_web_proxy = save_proxy,
save_tracker_proxy = save_proxy
#endif
};
void save_state(entry& e, boost::uint32_t flags = 0xffffffff) const;
void load_state(lazy_entry const& e);
@ -356,17 +360,31 @@ namespace libtorrent
void set_settings(session_settings const& s);
session_settings settings();
void set_peer_proxy(proxy_settings const& s);
void set_web_seed_proxy(proxy_settings const& s);
void set_tracker_proxy(proxy_settings const& s);
void set_proxy(proxy_settings const& s);
proxy_settings proxy() const;
proxy_settings peer_proxy() const;
proxy_settings web_seed_proxy() const;
proxy_settings tracker_proxy() const;
#ifndef TORRENT_NO_DEPRECATE
// deprecated in 0.16
TORRENT_DEPRECATED_PREFIX
void set_peer_proxy(proxy_settings const& s) TORRENT_DEPRECATED;
TORRENT_DEPRECATED_PREFIX
void set_web_seed_proxy(proxy_settings const& s) TORRENT_DEPRECATED;
TORRENT_DEPRECATED_PREFIX
void set_tracker_proxy(proxy_settings const& s) TORRENT_DEPRECATED;
TORRENT_DEPRECATED_PREFIX
proxy_settings peer_proxy() const TORRENT_DEPRECATED;
TORRENT_DEPRECATED_PREFIX
proxy_settings web_seed_proxy() const TORRENT_DEPRECATED;
TORRENT_DEPRECATED_PREFIX
proxy_settings tracker_proxy() const TORRENT_DEPRECATED;
#ifndef TORRENT_DISABLE_DHT
void set_dht_proxy(proxy_settings const& s);
proxy_settings dht_proxy() const;
TORRENT_DEPRECATED_PREFIX
void set_dht_proxy(proxy_settings const& s) TORRENT_DEPRECATED;
TORRENT_DEPRECATED_PREFIX
proxy_settings dht_proxy() const TORRENT_DEPRECATED;
#endif
#endif
#if TORRENT_USE_I2P

View File

@ -197,7 +197,7 @@ namespace libtorrent
size -= pr.length;
}
proxy_settings const& ps = m_ses.web_seed_proxy();
proxy_settings const& ps = m_ses.proxy();
bool using_proxy = ps.type == proxy_settings::http
|| ps.type == proxy_settings::http_pw;

View File

@ -738,6 +738,18 @@ namespace libtorrent
return r;
}
void session::set_proxy(proxy_settings const& s)
{
TORRENT_ASYNC_CALL1(set_proxy, s);
}
proxy_settings session::proxy() const
{
TORRENT_SYNC_CALL_RET(proxy_settings, proxy);
return r;
}
#ifndef TORRENT_NO_DEPRECATE
void session::set_peer_proxy(proxy_settings const& s)
{
TORRENT_ASYNC_CALL1(set_peer_proxy, s);
@ -784,6 +796,7 @@ namespace libtorrent
return r;
}
#endif
#endif // TORRENT_NO_DEPRECATE
#if TORRENT_USE_I2P
void session::set_i2p_proxy(proxy_settings const& s)

View File

@ -379,7 +379,7 @@ namespace aux {
TORRENT_CATEGORY("settings", save_settings, m_settings, session_settings_map)
#ifndef TORRENT_DISABLE_DHT
// TORRENT_CATEGORY("dht", save_dht_settings, m_dht_settings, dht_settings_map)
TORRENT_CATEGORY("dht proxy", save_dht_proxy, m_dht_proxy, proxy_settings_map)
TORRENT_CATEGORY("proxy", save_proxy, m_proxy, proxy_settings_map)
#endif
#if TORRENT_USE_I2P
// TORRENT_CATEGORY("i2p", save_i2p_proxy, m_i2p_proxy, proxy_settings_map)
@ -387,9 +387,6 @@ namespace aux {
#ifndef TORRENT_DISABLE_ENCRYPTION
TORRENT_CATEGORY("encryption", save_encryption_settings, m_pe_settings, pe_settings_map)
#endif
TORRENT_CATEGORY("peer proxy", save_peer_proxy, m_peer_proxy, proxy_settings_map)
TORRENT_CATEGORY("web proxy", save_web_proxy, m_web_seed_proxy, proxy_settings_map)
TORRENT_CATEGORY("tracker proxy", save_tracker_proxy, m_tracker_proxy, proxy_settings_map)
};
#undef lenof
@ -482,7 +479,7 @@ namespace aux {
#else
, m_upload_rate(peer_connection::upload_channel)
#endif
, m_tracker_manager(*this, m_tracker_proxy)
, m_tracker_manager(*this, m_proxy)
, m_listen_port_retries(listen_port_range.second - listen_port_range.first)
#if TORRENT_USE_I2P
, m_i2p_conn(m_io_service)
@ -837,6 +834,15 @@ namespace aux {
}
void session_impl::set_proxy(proxy_settings const& s)
{
m_proxy = s;
// in case we just set a socks proxy, we might have to
// open the socks incoming connection
if (!m_socks_listen_socket) open_new_incoming_socks_connection();
m_udp_socket.set_proxy_settings(m_proxy);
}
void session_impl::load_state(lazy_entry const* e)
{
lazy_entry const* settings;
@ -1566,15 +1572,15 @@ namespace aux {
void session_impl::open_new_incoming_socks_connection()
{
if (m_peer_proxy.type != proxy_settings::socks5
&& m_peer_proxy.type != proxy_settings::socks5_pw
&& m_peer_proxy.type != proxy_settings::socks4)
if (m_proxy.type != proxy_settings::socks5
&& m_proxy.type != proxy_settings::socks5_pw
&& m_proxy.type != proxy_settings::socks4)
return;
if (m_socks_listen_socket) return;
m_socks_listen_socket = boost::shared_ptr<socket_type>(new socket_type(m_io_service));
bool ret = instantiate_connection(m_io_service, m_peer_proxy
bool ret = instantiate_connection(m_io_service, m_proxy
, *m_socks_listen_socket);
TORRENT_ASSERT(ret);
@ -3321,7 +3327,7 @@ namespace aux {
// proxy, and it's the same one as we're using for the tracker
// just tell the tracker the socks5 port we're listening on
if (m_socks_listen_socket && m_socks_listen_socket->is_open()
&& m_peer_proxy.hostname == m_tracker_proxy.hostname)
&& m_proxy.hostname == m_proxy.hostname)
return m_socks_listen_port;
// if not, don't tell the tracker anything if we're in anonymous

View File

@ -1480,7 +1480,7 @@ namespace libtorrent
// in anonymous_mode we don't talk directly to trackers
// only if there is a proxy
std::string protocol = req.url.substr(0, req.url.find(':'));
int proxy_type = m_ses.m_tracker_proxy.type;
int proxy_type = m_ses.m_proxy.type;
if ((protocol == "http" || protocol == "https")
&& proxy_type == proxy_settings::none)
@ -3345,7 +3345,7 @@ namespace libtorrent
}
web->resolving = true;
proxy_settings const& ps = m_ses.web_seed_proxy();
proxy_settings const& ps = m_ses.proxy();
if (ps.type == proxy_settings::http
|| ps.type == proxy_settings::http_pw)
{
@ -3481,11 +3481,11 @@ namespace libtorrent
boost::shared_ptr<socket_type> s(new (std::nothrow) socket_type(m_ses.m_io_service));
if (!s) return;
bool ret = instantiate_connection(m_ses.m_io_service, m_ses.web_seed_proxy(), *s);
bool ret = instantiate_connection(m_ses.m_io_service, m_ses.proxy(), *s);
(void)ret;
TORRENT_ASSERT(ret);
proxy_settings const& ps = m_ses.web_seed_proxy();
proxy_settings const& ps = m_ses.proxy();
if (ps.type == proxy_settings::http
|| ps.type == proxy_settings::http_pw)
{
@ -4295,7 +4295,7 @@ namespace libtorrent
else
#endif
{
bool ret = instantiate_connection(m_ses.m_io_service, m_ses.peer_proxy(), *s);
bool ret = instantiate_connection(m_ses.m_io_service, m_ses.proxy(), *s);
(void)ret;
TORRENT_ASSERT(ret);
}

View File

@ -218,7 +218,7 @@ namespace libtorrent
size -= pr.length;
}
proxy_settings const& ps = m_ses.web_seed_proxy();
proxy_settings const& ps = m_ses.proxy();
bool using_proxy = ps.type == proxy_settings::http
|| ps.type == proxy_settings::http_pw;

View File

@ -254,8 +254,8 @@ void test_transfer(int proxy_type, bool test_disk_full = false, bool test_allowe
ps.username = "testuser";
ps.password = "testpass";
ps.type = (proxy_settings::proxy_type)proxy_type;
ses1.set_tracker_proxy(ps);
ses2.set_tracker_proxy(ps);
ses1.set_proxy(ps);
ses2.set_proxy(ps);
}
session_settings sett;

View File

@ -73,7 +73,7 @@ void test_transfer(boost::intrusive_ptr<torrent_info> torrent_file, int proxy, i
ps.username = "testuser";
ps.password = "testpass";
ps.type = (proxy_settings::proxy_type)proxy;
ses.set_web_seed_proxy(ps);
ses.set_proxy(ps);
}
add_torrent_params p;