From 81cfa5fba6f4048a03f6bb9edb6095629ac42c5b Mon Sep 17 00:00:00 2001 From: Chocobo1 Date: Wed, 12 Mar 2025 15:23:55 +0800 Subject: [PATCH] Add control for 'hostname cache expiry interval' Also add a few missing units in WebUI. Closes #22267. --- src/base/bittorrent/session.h | 2 ++ src/base/bittorrent/sessionimpl.cpp | 17 +++++++++++++++ src/base/bittorrent/sessionimpl.h | 3 +++ src/gui/advancedsettings.cpp | 12 ++++++++++- src/gui/advancedsettings.h | 2 +- src/webui/api/appcontroller.cpp | 5 +++++ src/webui/www/private/views/preferences.html | 22 ++++++++++++++------ 7 files changed, 55 insertions(+), 8 deletions(-) diff --git a/src/base/bittorrent/session.h b/src/base/bittorrent/session.h index 4e40833fd..52d94c18e 100644 --- a/src/base/bittorrent/session.h +++ b/src/base/bittorrent/session.h @@ -421,6 +421,8 @@ namespace BitTorrent virtual void setUTPRateLimited(bool limited) = 0; virtual MixedModeAlgorithm utpMixedMode() const = 0; virtual void setUtpMixedMode(MixedModeAlgorithm mode) = 0; + virtual int hostnameCacheTTL() const = 0; + virtual void setHostnameCacheTTL(int value) = 0; virtual bool isIDNSupportEnabled() const = 0; virtual void setIDNSupportEnabled(bool enabled) = 0; virtual bool multiConnectionsPerIpEnabled() const = 0; diff --git a/src/base/bittorrent/sessionimpl.cpp b/src/base/bittorrent/sessionimpl.cpp index e269d9c64..f183ac7db 100644 --- a/src/base/bittorrent/sessionimpl.cpp +++ b/src/base/bittorrent/sessionimpl.cpp @@ -460,6 +460,7 @@ SessionImpl::SessionImpl(QObject *parent) , m_isUTPRateLimited(BITTORRENT_SESSION_KEY(u"uTPRateLimited"_s), true) , m_utpMixedMode(BITTORRENT_SESSION_KEY(u"uTPMixedMode"_s), MixedModeAlgorithm::TCP , clampValue(MixedModeAlgorithm::TCP, MixedModeAlgorithm::Proportional)) + , m_hostnameCacheTTL(BITTORRENT_SESSION_KEY(u"HostnameCacheTTL"_s), 1200) , m_IDNSupportEnabled(BITTORRENT_SESSION_KEY(u"IDNSupportEnabled"_s), false) , m_multiConnectionsPerIpEnabled(BITTORRENT_SESSION_KEY(u"MultiConnectionsPerIp"_s), false) , m_validateHTTPSTrackerCertificate(BITTORRENT_SESSION_KEY(u"ValidateHTTPSTrackerCertificate"_s), true) @@ -2072,6 +2073,8 @@ lt::settings_pack SessionImpl::loadLTSettings() const break; } + settingsPack.set_int(lt::settings_pack::resolver_cache_timeout, hostnameCacheTTL()); + settingsPack.set_bool(lt::settings_pack::allow_idna, isIDNSupportEnabled()); settingsPack.set_bool(lt::settings_pack::allow_multiple_connections_per_ip, multiConnectionsPerIpEnabled()); @@ -5050,6 +5053,20 @@ void SessionImpl::setUtpMixedMode(const MixedModeAlgorithm mode) configureDeferred(); } +int SessionImpl::hostnameCacheTTL() const +{ + return m_hostnameCacheTTL; +} + +void SessionImpl::setHostnameCacheTTL(const int value) +{ + if (value == hostnameCacheTTL()) + return; + + m_hostnameCacheTTL = value; + configureDeferred(); +} + bool SessionImpl::isIDNSupportEnabled() const { return m_IDNSupportEnabled; diff --git a/src/base/bittorrent/sessionimpl.h b/src/base/bittorrent/sessionimpl.h index 1dbe647b2..1ad2108ff 100644 --- a/src/base/bittorrent/sessionimpl.h +++ b/src/base/bittorrent/sessionimpl.h @@ -391,6 +391,8 @@ namespace BitTorrent void setUTPRateLimited(bool limited) override; MixedModeAlgorithm utpMixedMode() const override; void setUtpMixedMode(MixedModeAlgorithm mode) override; + int hostnameCacheTTL() const override; + void setHostnameCacheTTL(int value) override; bool isIDNSupportEnabled() const override; void setIDNSupportEnabled(bool enabled) override; bool multiConnectionsPerIpEnabled() const override; @@ -686,6 +688,7 @@ namespace BitTorrent CachedSettingValue m_btProtocol; CachedSettingValue m_isUTPRateLimited; CachedSettingValue m_utpMixedMode; + CachedSettingValue m_hostnameCacheTTL; CachedSettingValue m_IDNSupportEnabled; CachedSettingValue m_multiConnectionsPerIpEnabled; CachedSettingValue m_validateHTTPSTrackerCertificate; diff --git a/src/gui/advancedsettings.cpp b/src/gui/advancedsettings.cpp index deb4cb5d3..75d779909 100644 --- a/src/gui/advancedsettings.cpp +++ b/src/gui/advancedsettings.cpp @@ -40,7 +40,6 @@ #include "base/global.h" #include "base/preferences.h" #include "base/unicodestrings.h" -#include "gui/addnewtorrentdialog.h" #include "gui/desktopintegration.h" #include "gui/mainwindow.h" #include "interfaces/iguiapplication.h" @@ -151,6 +150,7 @@ namespace UPNP_LEASE_DURATION, PEER_TOS, UTP_MIX_MODE, + HOSTNAME_CACHE_TTL, IDN_SUPPORT, MULTI_CONNECTIONS_PER_IP, VALIDATE_HTTPS_TRACKER_CERTIFICATE, @@ -278,6 +278,8 @@ void AdvancedSettings::saveAdvancedSettings() const session->setPeerToS(m_spinBoxPeerToS.value()); // uTP-TCP mixed mode session->setUtpMixedMode(m_comboBoxUtpMixedMode.currentData().value()); + // Hostname resolver cache TTL + session->setHostnameCacheTTL(m_spinBoxHostnameCacheTTL.value()); // Support internationalized domain name (IDN) session->setIDNSupportEnabled(m_checkBoxIDNSupport.isChecked()); // multiple connections per IP @@ -732,6 +734,14 @@ void AdvancedSettings::loadAdvancedSettings() addRow(UTP_MIX_MODE, (tr("%1-TCP mixed mode algorithm", "uTP-TCP mixed mode algorithm").arg(C_UTP) + u' ' + makeLink(u"https://www.libtorrent.org/reference-Settings.html#mixed_mode_algorithm", u"(?)")) , &m_comboBoxUtpMixedMode); + // Hostname resolver cache TTL + m_spinBoxHostnameCacheTTL.setMinimum(0); + m_spinBoxHostnameCacheTTL.setMaximum(std::numeric_limits::max()); + m_spinBoxHostnameCacheTTL.setValue(session->hostnameCacheTTL()); + m_spinBoxHostnameCacheTTL.setSuffix(tr(" s", " seconds")); + addRow(HOSTNAME_CACHE_TTL, (tr("Internal hostname resolver cache expiry interval") + + u' ' + makeLink(u"https://www.libtorrent.org/reference-Settings.html#resolver_cache_timeout", u"(?)")) + , &m_spinBoxHostnameCacheTTL); // Support internationalized domain name (IDN) m_checkBoxIDNSupport.setChecked(session->isIDNSupportEnabled()); addRow(IDN_SUPPORT, (tr("Support internationalized domain name (IDN)") diff --git a/src/gui/advancedsettings.h b/src/gui/advancedsettings.h index 316e68849..f89a43dd1 100644 --- a/src/gui/advancedsettings.h +++ b/src/gui/advancedsettings.h @@ -70,7 +70,7 @@ private: QSpinBox m_spinBoxSaveResumeDataInterval, m_spinBoxSaveStatisticsInterval, m_spinBoxTorrentFileSizeLimit, m_spinBoxBdecodeDepthLimit, m_spinBoxBdecodeTokenLimit, m_spinBoxAsyncIOThreads, m_spinBoxFilePoolSize, m_spinBoxCheckingMemUsage, m_spinBoxDiskQueueSize, - m_spinBoxOutgoingPortsMin, m_spinBoxOutgoingPortsMax, m_spinBoxUPnPLeaseDuration, m_spinBoxPeerToS, + m_spinBoxOutgoingPortsMin, m_spinBoxOutgoingPortsMax, m_spinBoxUPnPLeaseDuration, m_spinBoxPeerToS, m_spinBoxHostnameCacheTTL, m_spinBoxListRefresh, m_spinBoxTrackerPort, m_spinBoxSendBufferWatermark, m_spinBoxSendBufferLowWatermark, m_spinBoxSendBufferWatermarkFactor, m_spinBoxConnectionSpeed, m_spinBoxSocketSendBufferSize, m_spinBoxSocketReceiveBufferSize, m_spinBoxSocketBacklogSize, m_spinBoxAnnouncePort, m_spinBoxMaxConcurrentHTTPAnnounces, m_spinBoxStopTrackerTimeout, m_spinBoxSessionShutdownTimeout, diff --git a/src/webui/api/appcontroller.cpp b/src/webui/api/appcontroller.cpp index 95bb6e0d0..a1b3ac06a 100644 --- a/src/webui/api/appcontroller.cpp +++ b/src/webui/api/appcontroller.cpp @@ -455,6 +455,8 @@ void AppController::preferencesAction() data[u"peer_tos"_s] = session->peerToS(); // uTP-TCP mixed mode data[u"utp_tcp_mixed_mode"_s] = static_cast(session->utpMixedMode()); + // Hostname resolver cache TTL + data[u"hostname_cache_ttl"_s] = session->hostnameCacheTTL(); // Support internationalized domain name (IDN) data[u"idn_support_enabled"_s] = session->isIDNSupportEnabled(); // Multiple connections per IP @@ -1114,6 +1116,9 @@ void AppController::setPreferencesAction() // uTP-TCP mixed mode if (hasKey(u"utp_tcp_mixed_mode"_s)) session->setUtpMixedMode(static_cast(it.value().toInt())); + // Hostname resolver cache TTL + if (hasKey(u"hostname_cache_ttl"_s)) + session->setHostnameCacheTTL(it.value().toInt()); // Support internationalized domain name (IDN) if (hasKey(u"idn_support_enabled"_s)) session->setIDNSupportEnabled(it.value().toBool()); diff --git a/src/webui/www/private/views/preferences.html b/src/webui/www/private/views/preferences.html index 3ac2d988b..31542b0aa 100644 --- a/src/webui/www/private/views/preferences.html +++ b/src/webui/www/private/views/preferences.html @@ -992,7 +992,7 @@ - QBT_TR(seconds)QBT_TR[CONTEXT=OptionsDialog] + QBT_TR(sec)QBT_TR[CONTEXT=OptionsDialog] @@ -1000,7 +1000,7 @@ -   QBT_TR(seconds)QBT_TR[CONTEXT=OptionsDialog] +   QBT_TR(sec)QBT_TR[CONTEXT=OptionsDialog] @@ -1364,7 +1364,7 @@ Use ';' to split multiple entries. Can use wildcard '*'.)QBT_TR[CONTEXT=OptionsD -   QBT_TR(s)QBT_TR[CONTEXT=OptionsDialog] +   QBT_TR(sec)QBT_TR[CONTEXT=OptionsDialog] @@ -1512,7 +1512,7 @@ Use ';' to split multiple entries. Can use wildcard '*'.)QBT_TR[CONTEXT=OptionsD - +   QBT_TR(sec)QBT_TR[CONTEXT=OptionsDialog] @@ -1534,6 +1534,14 @@ Use ';' to split multiple entries. Can use wildcard '*'.)QBT_TR[CONTEXT=OptionsD + + + + + +   QBT_TR(sec)QBT_TR[CONTEXT=OptionsDialog] + + @@ -1642,7 +1650,7 @@ Use ';' to split multiple entries. Can use wildcard '*'.)QBT_TR[CONTEXT=OptionsD - +   QBT_TR(sec)QBT_TR[CONTEXT=OptionsDialog] @@ -1666,7 +1674,7 @@ Use ';' to split multiple entries. Can use wildcard '*'.)QBT_TR[CONTEXT=OptionsD -   s +   QBT_TR(sec)QBT_TR[CONTEXT=OptionsDialog] @@ -2594,6 +2602,7 @@ Use ';' to split multiple entries. Can use wildcard '*'.)QBT_TR[CONTEXT=OptionsD $("UPnPLeaseDuration").value = pref.upnp_lease_duration; $("peerToS").value = pref.peer_tos; $("utpTCPMixedModeAlgorithm").value = pref.utp_tcp_mixed_mode; + $("hostnameCacheTTL").value = pref.hostname_cache_ttl; $("IDNSupportCheckbox").checked = pref.idn_support_enabled; $("allowMultipleConnectionsFromTheSameIPAddress").checked = pref.enable_multi_connections_from_same_ip; $("validateHTTPSTrackerCertificate").checked = pref.validate_https_tracker_certificate; @@ -3070,6 +3079,7 @@ Use ';' to split multiple entries. Can use wildcard '*'.)QBT_TR[CONTEXT=OptionsD settings["upnp_lease_duration"] = Number($("UPnPLeaseDuration").value); settings["peer_tos"] = Number($("peerToS").value); settings["utp_tcp_mixed_mode"] = Number($("utpTCPMixedModeAlgorithm").value); + settings["hostname_cache_ttl"] = Number($("hostnameCacheTTL").value); settings["idn_support_enabled"] = $("IDNSupportCheckbox").checked; settings["enable_multi_connections_from_same_ip"] = $("allowMultipleConnectionsFromTheSameIPAddress").checked; settings["validate_https_tracker_certificate"] = $("validateHTTPSTrackerCertificate").checked;