From: csagan5 <32685696+csagan5@users.noreply.github.com> Date: Sun, 8 Jul 2018 22:42:04 +0200 Subject: Add flag to configure maximum connections per host With the introduction of this flag it is possible to increase the maximum allowed connections per host; this can however be detrimental to devices with limited CPU/memory resources and it is disabled by default. License: GPL-3.0-only - https://spdx.org/licenses/GPL-3.0-only.html --- chrome/browser/about_flags.cc | 8 ++++++++ chrome/browser/flag_descriptions.cc | 4 ++++ chrome/browser/flag_descriptions.h | 3 +++ .../common/network_features.cc | 3 +++ .../common/network_features.h | 4 ++++ .../common/network_switch_list.h | 4 ++++ .../spoof_checks/top_domains/BUILD.gn | 1 + net/socket/client_socket_pool_manager.cc | 17 +++++++++++++++++ 8 files changed, 44 insertions(+) diff --git a/chrome/browser/about_flags.cc b/chrome/browser/about_flags.cc --- a/chrome/browser/about_flags.cc +++ b/chrome/browser/about_flags.cc @@ -1270,6 +1270,11 @@ const FeatureEntry::Choice kForceColorProfileChoices[] = { switches::kForceDisplayColorProfile, "hdr10"}, }; +const FeatureEntry::Choice kMaxConnectionsPerHostChoices[] = { + {features::kMaxConnectionsPerHostChoiceDefault, "", ""}, + {features::kMaxConnectionsPerHostChoice15, switches::kMaxConnectionsPerHost, "15"}, +}; + const FeatureEntry::Choice kMemlogModeChoices[] = { {flags_ui::kGenericExperimentChoiceDisabled, "", ""}, {flag_descriptions::kMemlogModeMinimal, heap_profiling::kMemlogMode, @@ -5491,6 +5496,9 @@ const FeatureEntry kFeatureEntries[] = { FEATURE_VALUE_TYPE(chrome::android::kShareSheetCustomActionsPolish)}, #endif // BUILDFLAG(IS_ANDROID) + {"max-connections-per-host", flag_descriptions::kMaxConnectionsPerHostName, + flag_descriptions::kMaxConnectionsPerHostDescription, kOsAll, + MULTI_VALUE_TYPE(kMaxConnectionsPerHostChoices)}, {"disallow-doc-written-script-loads", flag_descriptions::kDisallowDocWrittenScriptsUiName, flag_descriptions::kDisallowDocWrittenScriptsUiDescription, kOsAll, diff --git a/chrome/browser/flag_descriptions.cc b/chrome/browser/flag_descriptions.cc --- a/chrome/browser/flag_descriptions.cc +++ b/chrome/browser/flag_descriptions.cc @@ -2231,6 +2231,10 @@ const char kUnthrottledNestedTimeoutDescription[] = "websites abusing the API will still eventually have their setTimeouts " "clamped."; +const char kMaxConnectionsPerHostName[] = "Maximum connections per host"; +const char kMaxConnectionsPerHostDescription[] = + "Customize maximum allowed connections per host."; + const char kMediaRouterCastAllowAllIPsName[] = "Connect to Cast devices on all IP addresses"; const char kMediaRouterCastAllowAllIPsDescription[] = diff --git a/chrome/browser/flag_descriptions.h b/chrome/browser/flag_descriptions.h --- a/chrome/browser/flag_descriptions.h +++ b/chrome/browser/flag_descriptions.h @@ -1264,6 +1264,9 @@ extern const char kUndoAutofillDescription[]; extern const char kUnthrottledNestedTimeoutName[]; extern const char kUnthrottledNestedTimeoutDescription[]; +extern const char kMaxConnectionsPerHostName[]; +extern const char kMaxConnectionsPerHostDescription[]; + extern const char kMediaRouterCastAllowAllIPsName[]; extern const char kMediaRouterCastAllowAllIPsDescription[]; diff --git a/components/network_session_configurator/common/network_features.cc b/components/network_session_configurator/common/network_features.cc --- a/components/network_session_configurator/common/network_features.cc +++ b/components/network_session_configurator/common/network_features.cc @@ -8,4 +8,7 @@ namespace features { +const char kMaxConnectionsPerHostChoiceDefault[] = "6", + kMaxConnectionsPerHostChoice15[] = "15"; + } // namespace features diff --git a/components/network_session_configurator/common/network_features.h b/components/network_session_configurator/common/network_features.h --- a/components/network_session_configurator/common/network_features.h +++ b/components/network_session_configurator/common/network_features.h @@ -10,6 +10,10 @@ namespace features { +NETWORK_SESSION_CONFIGURATOR_EXPORT extern const char kMaxConnectionsPerHostChoiceDefault[], + kMaxConnectionsPerHostChoice6[], + kMaxConnectionsPerHostChoice15[]; + } // namespace features #endif // COMPONENTS_NETWORK_SESSION_CONFIGURATOR_COMMON_NETWORK_FEATURES_H_ diff --git a/components/network_session_configurator/common/network_switch_list.h b/components/network_session_configurator/common/network_switch_list.h --- a/components/network_session_configurator/common/network_switch_list.h +++ b/components/network_session_configurator/common/network_switch_list.h @@ -19,6 +19,10 @@ NETWORK_SWITCH(kEnableUserAlternateProtocolPorts, // Enables the QUIC protocol. This is a temporary testing flag. NETWORK_SWITCH(kEnableQuic, "enable-quic") +// Allows specifying a higher number of maximum connections per host +// (15 instead of 6, mirroring the value Mozilla uses). +NETWORK_SWITCH(kMaxConnectionsPerHost, "max-connections-per-host") + // Ignores certificate-related errors. NETWORK_SWITCH(kIgnoreCertificateErrors, "ignore-certificate-errors") diff --git a/components/url_formatter/spoof_checks/top_domains/BUILD.gn b/components/url_formatter/spoof_checks/top_domains/BUILD.gn --- a/components/url_formatter/spoof_checks/top_domains/BUILD.gn +++ b/components/url_formatter/spoof_checks/top_domains/BUILD.gn @@ -89,6 +89,7 @@ executable("make_top_domain_list_variables") { "//base:i18n", "//components/url_formatter/spoof_checks/common_words:common", "//third_party/icu", + "//components/network_session_configurator/common" ] if (is_ios) { frameworks = [ "UIKit.framework" ] diff --git a/net/socket/client_socket_pool_manager.cc b/net/socket/client_socket_pool_manager.cc --- a/net/socket/client_socket_pool_manager.cc +++ b/net/socket/client_socket_pool_manager.cc @@ -19,6 +19,10 @@ #include "net/socket/client_socket_handle.h" #include "net/socket/client_socket_pool.h" #include "net/socket/connect_job.h" +#include "components/network_session_configurator/common/network_switches.h" + +#include "base/command_line.h" +#include "base/strings/string_number_conversions.h" #include "net/ssl/ssl_config.h" #include "third_party/abseil-cpp/absl/types/optional.h" #include "url/gurl.h" @@ -172,6 +176,19 @@ void ClientSocketPoolManager::set_max_sockets_per_pool( int ClientSocketPoolManager::max_sockets_per_group( HttpNetworkSession::SocketPoolType pool_type) { DCHECK_LT(pool_type, HttpNetworkSession::NUM_SOCKET_POOL_TYPES); + + if (pool_type == HttpNetworkSession::NORMAL_SOCKET_POOL) { + int maxConnectionsPerHost = 0; + auto value = base::CommandLine::ForCurrentProcess()->GetSwitchValueASCII(switches::kMaxConnectionsPerHost); + if (!value.empty() && !base::StringToInt(value, &maxConnectionsPerHost)) { + LOG(DFATAL) << "--" << switches::kMaxConnectionsPerHost << " only accepts integers as arguments (\"" << value << "\" is invalid)"; + } + if (maxConnectionsPerHost != 0) { + return maxConnectionsPerHost; + } + // fallthrough for default value + } + return g_max_sockets_per_group[pool_type]; } -- 2.25.1