Commit 01cf8d6c authored by David Benjamin's avatar David Benjamin Committed by Commit Bot

Switch the NetworkContext PreconnectSockets interface to a credentials boolean.

Specifying privacy_mode and load_flags separately risks the callers
mixing the two up, which can corrupt the socket pool state. Indeed
network_context_unittest.cc itself mixes them up.

Along the way, fix the documentation which claims privacy_mode makes the
connection untrackable, which is false. The only thing it does is pools
it with different requests.

This CL should be a no-op behavior-wise.

Bug: 799935
Change-Id: Iaf770cd556d7dbfaa296abfac22c070ecc903c50
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1752628Reviewed-by: default avatarXiyuan Xia <xiyuan@chromium.org>
Reviewed-by: default avatarKen Buchanan <kenrb@chromium.org>
Reviewed-by: default avatarEgor Pasko <pasko@chromium.org>
Reviewed-by: default avatarMatt Menke <mmenke@chromium.org>
Commit-Queue: David Benjamin <davidben@chromium.org>
Cr-Commit-Position: refs/heads/master@{#688237}
parent fa9de18f
...@@ -16,7 +16,6 @@ ...@@ -16,7 +16,6 @@
#include "content/public/browser/browser_task_traits.h" #include "content/public/browser/browser_task_traits.h"
#include "content/public/browser/browser_thread.h" #include "content/public/browser/browser_thread.h"
#include "google_apis/gaia/gaia_urls.h" #include "google_apis/gaia/gaia_urls.h"
#include "net/base/load_flags.h"
#include "net/base/network_isolation_key.h" #include "net/base/network_isolation_key.h"
#include "services/network/public/mojom/network_context.mojom.h" #include "services/network/public/mojom/network_context.mojom.h"
#include "url/gurl.h" #include "url/gurl.h"
...@@ -59,16 +58,14 @@ void AuthPrewarmer::DefaultNetworkChanged(const NetworkState* network) { ...@@ -59,16 +58,14 @@ void AuthPrewarmer::DefaultNetworkChanged(const NetworkState* network) {
void AuthPrewarmer::DoPrewarm() { void AuthPrewarmer::DoPrewarm() {
const int kConnectionsNeeded = 1; const int kConnectionsNeeded = 1;
const int kLoadFlags = net::LOAD_NORMAL; const bool kAllowCredentials = true;
const bool kShouldUsePrivacyMode = false;
const GURL& url = GaiaUrls::GetInstance()->service_login_url(); const GURL& url = GaiaUrls::GetInstance()->service_login_url();
network::mojom::NetworkContext* network_context = network::mojom::NetworkContext* network_context =
login::GetSigninNetworkContext(); login::GetSigninNetworkContext();
if (network_context) { if (network_context) {
// Do nothing if NetworkContext isn't available. // Do nothing if NetworkContext isn't available.
network_context->PreconnectSockets(kConnectionsNeeded, url, kLoadFlags, network_context->PreconnectSockets(
kShouldUsePrivacyMode, kConnectionsNeeded, url, kAllowCredentials, net::NetworkIsolationKey());
net::NetworkIsolationKey());
} }
if (!completion_callback_.is_null()) { if (!completion_callback_.is_null()) {
base::PostTask(FROM_HERE, {content::BrowserThread::UI}, base::PostTask(FROM_HERE, {content::BrowserThread::UI},
......
...@@ -14,7 +14,6 @@ ...@@ -14,7 +14,6 @@
#include "content/public/browser/browser_task_traits.h" #include "content/public/browser/browser_task_traits.h"
#include "content/public/browser/browser_thread.h" #include "content/public/browser/browser_thread.h"
#include "content/public/browser/storage_partition.h" #include "content/public/browser/storage_partition.h"
#include "net/base/load_flags.h"
#include "services/network/public/mojom/network_context.mojom.h" #include "services/network/public/mojom/network_context.mojom.h"
namespace predictors { namespace predictors {
...@@ -169,16 +168,7 @@ void PreconnectManager::PreconnectUrl( ...@@ -169,16 +168,7 @@ void PreconnectManager::PreconnectUrl(
if (!network_context) if (!network_context)
return; return;
bool privacy_mode = false; network_context->PreconnectSockets(num_sockets, url, allow_credentials,
int load_flags = net::LOAD_NORMAL;
if (!allow_credentials) {
privacy_mode = true;
load_flags = net::LOAD_DO_NOT_SEND_COOKIES | net::LOAD_DO_NOT_SAVE_COOKIES |
net::LOAD_DO_NOT_SEND_AUTH_DATA;
}
network_context->PreconnectSockets(num_sockets, url, load_flags, privacy_mode,
network_isolation_key); network_isolation_key);
} }
......
...@@ -1536,8 +1536,7 @@ void NetworkContext::VerifyCertificateForTesting( ...@@ -1536,8 +1536,7 @@ void NetworkContext::VerifyCertificateForTesting(
void NetworkContext::PreconnectSockets( void NetworkContext::PreconnectSockets(
uint32_t num_streams, uint32_t num_streams,
const GURL& original_url, const GURL& original_url,
int32_t load_flags, bool allow_credentials,
bool privacy_mode_enabled,
const net::NetworkIsolationKey& network_isolation_key) { const net::NetworkIsolationKey& network_isolation_key) {
GURL url = GetHSTSRedirect(original_url); GURL url = GetHSTSRedirect(original_url);
...@@ -1557,9 +1556,15 @@ void NetworkContext::PreconnectSockets( ...@@ -1557,9 +1556,15 @@ void NetworkContext::PreconnectSockets(
request_info.extra_headers.SetHeader(net::HttpRequestHeaders::kUserAgent, request_info.extra_headers.SetHeader(net::HttpRequestHeaders::kUserAgent,
user_agent); user_agent);
request_info.load_flags = load_flags; if (allow_credentials) {
request_info.privacy_mode = privacy_mode_enabled ? net::PRIVACY_MODE_ENABLED request_info.load_flags = net::LOAD_NORMAL;
: net::PRIVACY_MODE_DISABLED; request_info.privacy_mode = net::PRIVACY_MODE_DISABLED;
} else {
request_info.load_flags = net::LOAD_DO_NOT_SEND_COOKIES |
net::LOAD_DO_NOT_SAVE_COOKIES |
net::LOAD_DO_NOT_SEND_AUTH_DATA;
request_info.privacy_mode = net::PRIVACY_MODE_ENABLED;
}
request_info.network_isolation_key = network_isolation_key; request_info.network_isolation_key = network_isolation_key;
net::HttpTransactionFactory* factory = net::HttpTransactionFactory* factory =
......
...@@ -316,8 +316,7 @@ class COMPONENT_EXPORT(NETWORK_SERVICE) NetworkContext ...@@ -316,8 +316,7 @@ class COMPONENT_EXPORT(NETWORK_SERVICE) NetworkContext
void PreconnectSockets( void PreconnectSockets(
uint32_t num_streams, uint32_t num_streams,
const GURL& url, const GURL& url,
int32_t load_flags, bool allow_credentials,
bool privacy_mode_enabled,
const net::NetworkIsolationKey& network_isolation_key) override; const net::NetworkIsolationKey& network_isolation_key) override;
void CreateP2PSocketManager( void CreateP2PSocketManager(
mojom::P2PTrustedSocketManagerClientPtr client, mojom::P2PTrustedSocketManagerClientPtr client,
......
...@@ -3482,9 +3482,9 @@ TEST_F(NetworkContextTest, PreconnectOne) { ...@@ -3482,9 +3482,9 @@ TEST_F(NetworkContextTest, PreconnectOne) {
test_server.SetConnectionListener(&connection_listener); test_server.SetConnectionListener(&connection_listener);
ASSERT_TRUE(test_server.Start()); ASSERT_TRUE(test_server.Start());
network_context->PreconnectSockets( network_context->PreconnectSockets(1, test_server.base_url(),
1, test_server.base_url(), net::LOAD_NORMAL, /*allow_credentials=*/true,
true /* privacy_mode_enabled */, net::NetworkIsolationKey()); net::NetworkIsolationKey());
connection_listener.WaitForAcceptedConnections(1u); connection_listener.WaitForAcceptedConnections(1u);
} }
...@@ -3498,8 +3498,8 @@ TEST_F(NetworkContextTest, PreconnectHSTS) { ...@@ -3498,8 +3498,8 @@ TEST_F(NetworkContextTest, PreconnectHSTS) {
ASSERT_TRUE(test_server.Start()); ASSERT_TRUE(test_server.Start());
const GURL server_http_url = GetHttpUrlFromHttps(test_server.base_url()); const GURL server_http_url = GetHttpUrlFromHttps(test_server.base_url());
network_context->PreconnectSockets(1, server_http_url, net::LOAD_NORMAL, network_context->PreconnectSockets(1, server_http_url,
true /* privacy_mode_enabled */, /*allow_credentials=*/false,
net::NetworkIsolationKey()); net::NetworkIsolationKey());
connection_listener.WaitForAcceptedConnections(1u); connection_listener.WaitForAcceptedConnections(1u);
...@@ -3512,8 +3512,8 @@ TEST_F(NetworkContextTest, PreconnectHSTS) { ...@@ -3512,8 +3512,8 @@ TEST_F(NetworkContextTest, PreconnectHSTS) {
base::Time::Now() + base::TimeDelta::FromSeconds(1000); base::Time::Now() + base::TimeDelta::FromSeconds(1000);
network_context->url_request_context()->transport_security_state()->AddHSTS( network_context->url_request_context()->transport_security_state()->AddHSTS(
server_http_url.host(), expiry, false); server_http_url.host(), expiry, false);
network_context->PreconnectSockets(1, server_http_url, net::LOAD_NORMAL, network_context->PreconnectSockets(1, server_http_url,
true /* privacy_mode_enabled */, /*allow_credentials=*/false,
net::NetworkIsolationKey()); net::NetworkIsolationKey());
connection_listener.WaitForAcceptedConnections(1u); connection_listener.WaitForAcceptedConnections(1u);
...@@ -3533,9 +3533,9 @@ TEST_F(NetworkContextTest, PreconnectZero) { ...@@ -3533,9 +3533,9 @@ TEST_F(NetworkContextTest, PreconnectZero) {
test_server.SetConnectionListener(&connection_listener); test_server.SetConnectionListener(&connection_listener);
ASSERT_TRUE(test_server.Start()); ASSERT_TRUE(test_server.Start());
network_context->PreconnectSockets( network_context->PreconnectSockets(0, test_server.base_url(),
0, test_server.base_url(), net::LOAD_NORMAL, /*allow_credentials=*/true,
true /* privacy_mode_enabled */, net::NetworkIsolationKey()); net::NetworkIsolationKey());
base::RunLoop().RunUntilIdle(); base::RunLoop().RunUntilIdle();
int num_sockets = int num_sockets =
...@@ -3555,9 +3555,9 @@ TEST_F(NetworkContextTest, PreconnectTwo) { ...@@ -3555,9 +3555,9 @@ TEST_F(NetworkContextTest, PreconnectTwo) {
test_server.SetConnectionListener(&connection_listener); test_server.SetConnectionListener(&connection_listener);
ASSERT_TRUE(test_server.Start()); ASSERT_TRUE(test_server.Start());
network_context->PreconnectSockets( network_context->PreconnectSockets(2, test_server.base_url(),
2, test_server.base_url(), net::LOAD_NORMAL, /*allow_credentials=*/true,
true /* privacy_mode_enabled */, net::NetworkIsolationKey()); net::NetworkIsolationKey());
connection_listener.WaitForAcceptedConnections(2u); connection_listener.WaitForAcceptedConnections(2u);
int num_sockets = int num_sockets =
...@@ -3574,9 +3574,9 @@ TEST_F(NetworkContextTest, PreconnectFour) { ...@@ -3574,9 +3574,9 @@ TEST_F(NetworkContextTest, PreconnectFour) {
test_server.SetConnectionListener(&connection_listener); test_server.SetConnectionListener(&connection_listener);
ASSERT_TRUE(test_server.Start()); ASSERT_TRUE(test_server.Start());
network_context->PreconnectSockets( network_context->PreconnectSockets(4, test_server.base_url(),
4, test_server.base_url(), net::LOAD_NORMAL, /*allow_credentials=*/true,
true /* privacy_mode_enabled */, net::NetworkIsolationKey()); net::NetworkIsolationKey());
connection_listener.WaitForAcceptedConnections(4u); connection_listener.WaitForAcceptedConnections(4u);
...@@ -3598,9 +3598,9 @@ TEST_F(NetworkContextTest, PreconnectMax) { ...@@ -3598,9 +3598,9 @@ TEST_F(NetworkContextTest, PreconnectMax) {
GetSocketPoolInfo(network_context.get(), "max_sockets_per_group"); GetSocketPoolInfo(network_context.get(), "max_sockets_per_group");
EXPECT_GT(76, max_num_sockets); EXPECT_GT(76, max_num_sockets);
network_context->PreconnectSockets( network_context->PreconnectSockets(76, test_server.base_url(),
76, test_server.base_url(), net::LOAD_NORMAL, /*allow_credentials=*/true,
true /* privacy_mode_enabled */, net::NetworkIsolationKey()); net::NetworkIsolationKey());
// Wait until |max_num_sockets| have been connected. // Wait until |max_num_sockets| have been connected.
connection_listener.WaitForAcceptedConnections(max_num_sockets); connection_listener.WaitForAcceptedConnections(max_num_sockets);
...@@ -3635,11 +3635,9 @@ TEST_F(NetworkContextTest, PreconnectNetworkIsolationKey) { ...@@ -3635,11 +3635,9 @@ TEST_F(NetworkContextTest, PreconnectNetworkIsolationKey) {
const net::NetworkIsolationKey kKey1(kOriginFoo, kOriginFoo); const net::NetworkIsolationKey kKey1(kOriginFoo, kOriginFoo);
const net::NetworkIsolationKey kKey2(kOriginBar, kOriginBar); const net::NetworkIsolationKey kKey2(kOriginBar, kOriginBar);
network_context->PreconnectSockets(1, test_server.base_url(), network_context->PreconnectSockets(1, test_server.base_url(),
net::LOAD_NORMAL, /*allow_credentials=*/false, kKey1);
true /* privacy_mode_enabled */, kKey1);
network_context->PreconnectSockets(2, test_server.base_url(), network_context->PreconnectSockets(2, test_server.base_url(),
net::LOAD_NORMAL, /*allow_credentials=*/false, kKey2);
true /* privacy_mode_enabled */, kKey2);
connection_listener.WaitForAcceptedConnections(3u); connection_listener.WaitForAcceptedConnections(3u);
net::ClientSocketPool::GroupId group_id1( net::ClientSocketPool::GroupId group_id1(
......
...@@ -903,18 +903,14 @@ interface NetworkContext { ...@@ -903,18 +903,14 @@ interface NetworkContext {
// Tries to preconnect to |url|. |num_streams| may be used to request more // Tries to preconnect to |url|. |num_streams| may be used to request more
// than one connection be established in parallel. // than one connection be established in parallel.
// |load_flags| is passed into the HttpRequestInfo used to make the request. // |allow_credentials| is true if the connection is to be pooled with
// See |load_flags.h| for possible values. // credentialed requests and false otherwise.
// |privacy_mode_enabled| is also passed into the HttpRequestInfo class: if
// it is true, then the request must be sent over a connection that cannot be
// tracked by the server.
// |network_isolation_key| specifies the NetworkIsolationKey to associate // |network_isolation_key| specifies the NetworkIsolationKey to associate
// with the preconnected sockets. The sockets will only be used for requests // with the preconnected sockets. The sockets will only be used for requests
// associated with the same key. // associated with the same key.
PreconnectSockets(uint32 num_streams, PreconnectSockets(uint32 num_streams,
url.mojom.Url url, url.mojom.Url url,
int32 load_flags, bool allow_credentials,
bool privacy_mode_enabled,
NetworkIsolationKey network_isolation_key); NetworkIsolationKey network_isolation_key);
// Creates a P2PSocketManager instance, used for WebRTC. // Creates a P2PSocketManager instance, used for WebRTC.
......
...@@ -196,8 +196,7 @@ class TestNetworkContext : public mojom::NetworkContext { ...@@ -196,8 +196,7 @@ class TestNetworkContext : public mojom::NetworkContext {
void PreconnectSockets( void PreconnectSockets(
uint32_t num_streams, uint32_t num_streams,
const GURL& url, const GURL& url,
int32_t load_flags, bool allow_credentials,
bool privacy_mode_enabled,
const net::NetworkIsolationKey& network_isolation_key) override {} const net::NetworkIsolationKey& network_isolation_key) override {}
void CreateP2PSocketManager( void CreateP2PSocketManager(
mojom::P2PTrustedSocketManagerClientPtr client, mojom::P2PTrustedSocketManagerClientPtr client,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment