summaryrefslogtreecommitdiff
path: root/chromium/net/http
diff options
context:
space:
mode:
authorAllan Sandfeld Jensen <allan.jensen@qt.io>2017-11-20 15:06:40 +0100
committerAllan Sandfeld Jensen <allan.jensen@qt.io>2017-11-22 11:48:58 +0000
commitdaa093eea7c773db06799a13bd7e4e2e2a9f8f14 (patch)
tree96cc5e7b9194c1b29eab927730bfa419e7111c25 /chromium/net/http
parentbe59a35641616a4cf23c4a13fa0632624b021c1b (diff)
downloadqtwebengine-chromium-daa093eea7c773db06799a13bd7e4e2e2a9f8f14.tar.gz
BASELINE: Update Chromium to 63.0.3239.58
Change-Id: Ia93b322a00ba4dd4004f3bcf1254063ba90e1605 Reviewed-by: Alexandru Croitor <alexandru.croitor@qt.io>
Diffstat (limited to 'chromium/net/http')
-rw-r--r--chromium/net/http/BUILD.gn21
-rw-r--r--chromium/net/http/bidirectional_stream.cc1
-rw-r--r--chromium/net/http/bidirectional_stream_unittest.cc2
-rw-r--r--chromium/net/http/http_auth_controller.cc4
-rw-r--r--chromium/net/http/http_auth_controller.h14
-rw-r--r--chromium/net/http/http_auth_handler.h20
-rw-r--r--chromium/net/http/http_auth_handler_factory.cc9
-rw-r--r--chromium/net/http/http_auth_handler_ntlm.cc32
-rw-r--r--chromium/net/http/http_auth_handler_ntlm.h31
-rw-r--r--chromium/net/http/http_auth_handler_ntlm_portable.cc617
-rw-r--r--chromium/net/http/http_auth_handler_ntlm_portable_unittest.cc376
-rw-r--r--chromium/net/http/http_auth_preferences.cc10
-rw-r--r--chromium/net/http/http_auth_preferences.h7
-rw-r--r--chromium/net/http/http_auth_preferences_unittest.cc26
-rw-r--r--chromium/net/http/http_cache.cc4
-rw-r--r--chromium/net/http/http_cache_lookup_manager.cc3
-rw-r--r--chromium/net/http/http_cache_lookup_manager_unittest.cc2
-rw-r--r--chromium/net/http/http_cache_transaction.cc8
-rw-r--r--chromium/net/http/http_cache_unittest.cc27
-rw-r--r--chromium/net/http/http_network_session.cc11
-rw-r--r--chromium/net/http/http_network_session.h18
-rw-r--r--chromium/net/http/http_network_transaction.cc18
-rw-r--r--chromium/net/http/http_network_transaction_unittest.cc490
-rw-r--r--chromium/net/http/http_proxy_client_socket.cc2
-rw-r--r--chromium/net/http/http_proxy_client_socket_pool.cc7
-rw-r--r--chromium/net/http/http_proxy_client_socket_pool.h3
-rw-r--r--chromium/net/http/http_proxy_client_socket_pool_unittest.cc2
-rw-r--r--chromium/net/http/http_proxy_client_socket_wrapper.cc7
-rw-r--r--chromium/net/http/http_request_headers.cc20
-rw-r--r--chromium/net/http/http_request_headers.h13
-rw-r--r--chromium/net/http/http_response_headers.cc2
-rw-r--r--chromium/net/http/http_response_headers_unittest.cc15
-rw-r--r--chromium/net/http/http_response_info.cc3
-rw-r--r--chromium/net/http/http_response_info.h1
-rw-r--r--chromium/net/http/http_security_headers_unittest.cc43
-rw-r--r--chromium/net/http/http_server_properties.cc6
-rw-r--r--chromium/net/http/http_server_properties.h13
-rw-r--r--chromium/net/http/http_server_properties_impl.cc2
-rw-r--r--chromium/net/http/http_server_properties_impl.h3
-rw-r--r--chromium/net/http/http_server_properties_manager.cc428
-rw-r--r--chromium/net/http/http_server_properties_manager.h178
-rw-r--r--chromium/net/http/http_server_properties_manager_unittest.cc1093
-rw-r--r--chromium/net/http/http_stream_factory.cc5
-rw-r--r--chromium/net/http/http_stream_factory_impl.cc1
-rw-r--r--chromium/net/http/http_stream_factory_impl_job.cc67
-rw-r--r--chromium/net/http/http_stream_factory_impl_job.h11
-rw-r--r--chromium/net/http/http_stream_factory_impl_job_controller.cc18
-rw-r--r--chromium/net/http/http_stream_factory_impl_job_controller.h13
-rw-r--r--chromium/net/http/http_stream_factory_impl_job_controller_unittest.cc61
-rw-r--r--chromium/net/http/http_stream_factory_impl_request_unittest.cc2
-rw-r--r--chromium/net/http/http_stream_factory_impl_unittest.cc37
-rw-r--r--chromium/net/http/http_stream_factory_test_util.cc4
-rw-r--r--chromium/net/http/http_stream_factory_test_util.h4
-rw-r--r--chromium/net/http/http_stream_parser.cc6
-rw-r--r--chromium/net/http/http_stream_parser_unittest.cc2
-rw-r--r--chromium/net/http/http_util.cc3
-rw-r--r--chromium/net/http/http_util_unittest.cc16
-rw-r--r--chromium/net/http/mock_allow_http_auth_preferences.cc3
-rw-r--r--chromium/net/http/mock_http_cache.cc2
-rw-r--r--chromium/net/http/transport_security_persister.cc1
-rw-r--r--chromium/net/http/transport_security_state.cc83
-rw-r--r--chromium/net/http/transport_security_state_static.json3126
-rw-r--r--chromium/net/http/transport_security_state_static.pins43
-rw-r--r--chromium/net/http/transport_security_state_static_unittest0.json175
-rw-r--r--chromium/net/http/transport_security_state_static_unittest3.json5
-rw-r--r--chromium/net/http/transport_security_state_static_unittest_default.json51
-rw-r--r--chromium/net/http/transport_security_state_static_unittest_default.pins12
-rw-r--r--chromium/net/http/transport_security_state_unittest.cc1136
68 files changed, 5170 insertions, 3309 deletions
diff --git a/chromium/net/http/BUILD.gn b/chromium/net/http/BUILD.gn
index 8699aeffe46..d00da41da1d 100644
--- a/chromium/net/http/BUILD.gn
+++ b/chromium/net/http/BUILD.gn
@@ -4,6 +4,7 @@
import("//build/compiled_action.gni")
+# Generates a header file based on the real preload list.
compiled_action("generate_transport_security_state") {
tool = "//net/tools/transport_security_state_generator"
@@ -20,10 +21,28 @@ compiled_action("generate_transport_security_state") {
rebase_path(inputs, root_build_dir) + rebase_path(outputs, root_build_dir)
}
+# Generates a header file for use in unittests.
+compiled_action("transport_security_state_unittest_data_default") {
+ tool = "//net/tools/transport_security_state_generator"
+
+ # Inputs in order expected by the command line of the tool.
+ inputs = [
+ "transport_security_state_static_unittest_default.json",
+ "transport_security_state_static_unittest_default.pins",
+ "transport_security_state_static_unittest.template",
+ ]
+ outputs = [
+ "$target_gen_dir/transport_security_state_static_unittest_default.h",
+ ]
+ args =
+ rebase_path(inputs, root_build_dir) + rebase_path(outputs, root_build_dir)
+}
+
+# Generates a number of header files that are used by integration tests for the
+# generation process and preload format.
compiled_action_foreach("transport_security_state_unittest_data") {
tool = "//net/tools/transport_security_state_generator"
sources = [
- "transport_security_state_static_unittest0.json",
"transport_security_state_static_unittest1.json",
"transport_security_state_static_unittest2.json",
"transport_security_state_static_unittest3.json",
diff --git a/chromium/net/http/bidirectional_stream.cc b/chromium/net/http/bidirectional_stream.cc
index cbcbdd6d18c..e13e3f7d2ad 100644
--- a/chromium/net/http/bidirectional_stream.cc
+++ b/chromium/net/http/bidirectional_stream.cc
@@ -10,7 +10,6 @@
#include "base/bind.h"
#include "base/location.h"
#include "base/logging.h"
-#include "base/memory/ptr_util.h"
#include "base/metrics/histogram_macros.h"
#include "base/threading/thread_task_runner_handle.h"
#include "base/timer/timer.h"
diff --git a/chromium/net/http/bidirectional_stream_unittest.cc b/chromium/net/http/bidirectional_stream_unittest.cc
index b6dd52c873d..cbb28ae2680 100644
--- a/chromium/net/http/bidirectional_stream_unittest.cc
+++ b/chromium/net/http/bidirectional_stream_unittest.cc
@@ -372,7 +372,7 @@ class MockTimer : public base::MockTimer {
MockTimer() : base::MockTimer(false, false) {}
~MockTimer() override {}
- void Start(const tracked_objects::Location& posted_from,
+ void Start(const base::Location& posted_from,
base::TimeDelta delay,
const base::Closure& user_task) override {
// Sets a maximum delay, so the timer does not fire unless it is told to.
diff --git a/chromium/net/http/http_auth_controller.cc b/chromium/net/http/http_auth_controller.cc
index 09a8dd8aa23..16e698378c2 100644
--- a/chromium/net/http/http_auth_controller.cc
+++ b/chromium/net/http/http_auth_controller.cc
@@ -388,6 +388,10 @@ bool HttpAuthController::HaveAuth() const {
return handler_.get() && !identity_.invalid;
}
+bool HttpAuthController::NeedsHTTP11() const {
+ return handler_ && handler_->is_connection_based();
+}
+
void HttpAuthController::InvalidateCurrentHandler(
InvalidateHandlerAction action) {
DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
diff --git a/chromium/net/http/http_auth_controller.h b/chromium/net/http/http_auth_controller.h
index 769a62944aa..64e40cc860d 100644
--- a/chromium/net/http/http_auth_controller.h
+++ b/chromium/net/http/http_auth_controller.h
@@ -28,11 +28,21 @@ class NetLogWithSource;
struct HttpRequestInfo;
class SSLInfo;
+// HttpAuthController is interface between other classes and HttpAuthHandlers.
+// It handles all challenges when attempting to make a single request to a
+// server, both in the case of trying multiple sets of credentials (Possibly on
+// different sockets), and when going through multiple rounds of auth with
+// connection-based auth, creating new HttpAuthHandlers as necessary.
+//
+// It is unaware of when a round of auth uses a new socket, which can lead to
+// problems for connection-based auth.
class NET_EXPORT_PRIVATE HttpAuthController
: public base::RefCounted<HttpAuthController> {
public:
// The arguments are self explanatory except possibly for |auth_url|, which
// should be both the auth target and auth path in a single url argument.
+ // |target| indicates whether this is for authenticating with a proxy or
+ // destination server.
HttpAuthController(HttpAuth::Target target,
const GURL& auth_url,
HttpAuthCache* http_auth_cache,
@@ -66,6 +76,10 @@ class NET_EXPORT_PRIVATE HttpAuthController
bool HaveAuth() const;
+ // Return whether the authentication scheme is incompatible with HTTP/2
+ // and thus the server would presumably reject a request on HTTP/2 anyway.
+ bool NeedsHTTP11() const;
+
scoped_refptr<AuthChallengeInfo> auth_info();
bool IsAuthSchemeDisabled(HttpAuth::Scheme scheme) const;
diff --git a/chromium/net/http/http_auth_handler.h b/chromium/net/http/http_auth_handler.h
index 8d521b428b2..b0ab34007f2 100644
--- a/chromium/net/http/http_auth_handler.h
+++ b/chromium/net/http/http_auth_handler.h
@@ -21,6 +21,14 @@ class SSLInfo;
// HttpAuthHandler is the interface for the authentication schemes
// (basic, digest, NTLM, Negotiate).
// HttpAuthHandler objects are typically created by an HttpAuthHandlerFactory.
+//
+// HttpAuthHandlers and generally created and managed by an HttpAuthController,
+// which is the interaction point between the rest of net and the HTTP auth
+// code.
+//
+// For connection-based authentication, an HttpAuthHandler handles all rounds
+// related to using a single identity. If the identity is rejected, a new
+// HttpAuthHandler must be created.
class NET_EXPORT_PRIVATE HttpAuthHandler {
public:
HttpAuthHandler();
@@ -122,8 +130,16 @@ class NET_EXPORT_PRIVATE HttpAuthHandler {
return (properties_ & IS_CONNECTION_BASED) != 0;
}
- // Returns true if the response to the current authentication challenge
- // requires an identity.
+ // If NeedsIdentity() returns true, then a subsequent call to
+ // GenerateAuthToken() must indicate which identity to use. This can be done
+ // either by passing in a non-empty set of credentials, or an empty set to
+ // force the handler to use the default credentials. The latter is only an
+ // option if AllowsDefaultCredentials() returns true.
+ //
+ // If NeedsIdentity() returns false, then the handler is already bound to an
+ // identity and GenerateAuthToken() will ignore any credentials that are
+ // passed in.
+ //
// TODO(wtc): Find a better way to handle a multi-round challenge-response
// sequence used by a connection-based authentication scheme.
virtual bool NeedsIdentity();
diff --git a/chromium/net/http/http_auth_handler_factory.cc b/chromium/net/http/http_auth_handler_factory.cc
index cf3c32f3c5e..97f3f2f75db 100644
--- a/chromium/net/http/http_auth_handler_factory.cc
+++ b/chromium/net/http/http_auth_handler_factory.cc
@@ -7,6 +7,7 @@
#include "base/memory/ptr_util.h"
#include "base/stl_util.h"
#include "base/strings/string_util.h"
+#include "build/build_config.h"
#include "net/base/net_errors.h"
#include "net/http/http_auth_challenge_tokenizer.h"
#include "net/http/http_auth_filter.h"
@@ -87,10 +88,12 @@ CreateAuthHandlerRegistryFactory(const HttpAuthPreferences& prefs,
new HttpAuthHandlerNegotiate::Factory();
#if defined(OS_WIN)
negotiate_factory->set_library(std::make_unique<SSPILibraryDefault>());
-#elif defined(OS_POSIX) && !defined(OS_ANDROID)
+#elif defined(OS_POSIX) && !defined(OS_ANDROID) && !defined(OS_CHROMEOS)
negotiate_factory->set_library(
std::make_unique<GSSAPISharedLibrary>(prefs.GssapiLibraryName()));
-#endif // defined(OS_POSIX) && !defined(OS_ANDROID)
+#elif defined(OS_CHROMEOS)
+ negotiate_factory->set_library(std::make_unique<GSSAPISharedLibrary>(""));
+#endif
negotiate_factory->set_host_resolver(host_resolver);
registry_factory->RegisterSchemeFactory(kNegotiateAuthScheme,
negotiate_factory);
@@ -142,7 +145,7 @@ HttpAuthHandlerFactory::CreateDefault(HostResolver* host_resolver) {
std::vector<std::string> auth_types(std::begin(kDefaultAuthSchemes),
std::end(kDefaultAuthSchemes));
HttpAuthPreferences prefs(auth_types
-#if defined(OS_POSIX) && !defined(OS_ANDROID)
+#if defined(OS_POSIX) && !defined(OS_ANDROID) && !defined(OS_CHROMEOS)
,
std::string()
#endif
diff --git a/chromium/net/http/http_auth_handler_ntlm.cc b/chromium/net/http/http_auth_handler_ntlm.cc
index cecf3b2917d..36b2ac01ce8 100644
--- a/chromium/net/http/http_auth_handler_ntlm.cc
+++ b/chromium/net/http/http_auth_handler_ntlm.cc
@@ -49,13 +49,6 @@ int HttpAuthHandlerNTLM::GenerateAuthTokenImpl(
LOG(ERROR) << "Username and password are expected to be non-NULL.";
return ERR_MISSING_AUTH_CREDENTIALS;
}
- // TODO(wtc): See if we can use char* instead of void* for in_buf and
- // out_buf. This change will need to propagate to GetNextToken,
- // GenerateType1Msg, and GenerateType3Msg, and perhaps further.
- const void* in_buf;
- void* out_buf;
- uint32_t in_buf_len, out_buf_len;
- std::string decoded_auth_data;
// The username may be in the form "DOMAIN\user". Parse it into the two
// components.
@@ -73,32 +66,33 @@ int HttpAuthHandlerNTLM::GenerateAuthTokenImpl(
domain_ = domain;
credentials_.Set(user, credentials->password());
- // Initial challenge.
+ std::string decoded_auth_data;
if (auth_data_.empty()) {
- in_buf_len = 0;
- in_buf = NULL;
+ // There is no |auth_data_| because the client sends the first message.
int rv = InitializeBeforeFirstChallenge();
if (rv != OK)
return rv;
} else {
+ // When |auth_data_| is present it contains the Challenge message.
if (!base::Base64Decode(auth_data_, &decoded_auth_data)) {
LOG(ERROR) << "Unexpected problem Base64 decoding.";
return ERR_UNEXPECTED;
}
- in_buf_len = decoded_auth_data.length();
- in_buf = decoded_auth_data.data();
}
- int rv = GetNextToken(in_buf, in_buf_len, &out_buf, &out_buf_len);
- if (rv != OK)
- return rv;
+ ntlm::Buffer next_token = GetNextToken(
+ ntlm::Buffer(reinterpret_cast<const uint8_t*>(decoded_auth_data.data()),
+ decoded_auth_data.size()));
+ if (next_token.empty())
+ return ERR_UNEXPECTED;
// Base64 encode data in output buffer and prepend "NTLM ".
- std::string encode_input(static_cast<char*>(out_buf), out_buf_len);
std::string encode_output;
- base::Base64Encode(encode_input, &encode_output);
- // OK, we are done with |out_buf|
- free(out_buf);
+ base::Base64Encode(
+ base::StringPiece(reinterpret_cast<const char*>(next_token.data()),
+ next_token.size()),
+ &encode_output);
+
*auth_token = std::string("NTLM ") + encode_output;
return OK;
#endif
diff --git a/chromium/net/http/http_auth_handler_ntlm.h b/chromium/net/http/http_auth_handler_ntlm.h
index fed6303f834..0ab8d953c78 100644
--- a/chromium/net/http/http_auth_handler_ntlm.h
+++ b/chromium/net/http/http_auth_handler_ntlm.h
@@ -23,6 +23,8 @@
#include <windows.h>
#include <security.h>
#include "net/http/http_auth_sspi_win.h"
+#elif defined(NTLM_PORTABLE)
+#include "net/ntlm/ntlm_client.h"
#endif
#include <string>
@@ -70,6 +72,10 @@ class NET_EXPORT_PRIVATE HttpAuthHandlerNTLM : public HttpAuthHandler {
};
#if defined(NTLM_PORTABLE)
+ // A function that returns the time as the number of 100 nanosecond ticks
+ // since Jan 1, 1601 (UTC).
+ typedef uint64_t (*GetMSTimeProc)();
+
// A function that generates n random bytes in the output buffer.
typedef void (*GenerateRandomProc)(uint8_t* output, size_t n);
@@ -81,18 +87,22 @@ class NET_EXPORT_PRIVATE HttpAuthHandlerNTLM : public HttpAuthHandler {
// GetHostName functions.
class ScopedProcSetter {
public:
- ScopedProcSetter(GenerateRandomProc random_proc,
+ ScopedProcSetter(GetMSTimeProc ms_time_proc,
+ GenerateRandomProc random_proc,
HostNameProc host_name_proc) {
+ old_ms_time_proc_ = SetGetMSTimeProc(ms_time_proc);
old_random_proc_ = SetGenerateRandomProc(random_proc);
old_host_name_proc_ = SetHostNameProc(host_name_proc);
}
~ScopedProcSetter() {
+ SetGetMSTimeProc(old_ms_time_proc_);
SetGenerateRandomProc(old_random_proc_);
SetHostNameProc(old_host_name_proc_);
}
private:
+ GetMSTimeProc old_ms_time_proc_;
GenerateRandomProc old_random_proc_;
HostNameProc old_host_name_proc_;
};
@@ -130,31 +140,32 @@ class NET_EXPORT_PRIVATE HttpAuthHandlerNTLM : public HttpAuthHandler {
~HttpAuthHandlerNTLM() override;
#if defined(NTLM_PORTABLE)
- // For unit tests to override the GenerateRandom and GetHostName functions.
- // Returns the old function.
+ // For unit tests to override the GetMSTime, GenerateRandom and GetHostName
+ // functions. Returns the old function.
+ static GetMSTimeProc SetGetMSTimeProc(GetMSTimeProc proc);
static GenerateRandomProc SetGenerateRandomProc(GenerateRandomProc proc);
static HostNameProc SetHostNameProc(HostNameProc proc);
+
+ // Given an input token received from the server, generate the next output
+ // token to be sent to the server.
+ ntlm::Buffer GetNextToken(const ntlm::Buffer& in_token);
#endif
// Parse the challenge, saving the results into this instance.
HttpAuth::AuthorizationResult ParseChallenge(
HttpAuthChallengeTokenizer* tok, bool initial_challenge);
- // Given an input token received from the server, generate the next output
- // token to be sent to the server.
- int GetNextToken(const void* in_token,
- uint32_t in_token_len,
- void** out_token,
- uint32_t* out_token_len);
-
// Create an NTLM SPN to identify the |origin| server.
static std::string CreateSPN(const GURL& origin);
#if defined(NTLM_SSPI)
HttpAuthSSPI auth_sspi_;
+#elif defined(NTLM_PORTABLE)
+ ntlm::NtlmClient ntlm_client_;
#endif
#if defined(NTLM_PORTABLE)
+ static GetMSTimeProc get_ms_time_proc_;
static GenerateRandomProc generate_random_proc_;
static HostNameProc get_host_name_proc_;
#endif
diff --git a/chromium/net/http/http_auth_handler_ntlm_portable.cc b/chromium/net/http/http_auth_handler_ntlm_portable.cc
index 38c73e5cedb..fe943575d25 100644
--- a/chromium/net/http/http_auth_handler_ntlm_portable.cc
+++ b/chromium/net/http/http_auth_handler_ntlm_portable.cc
@@ -4,574 +4,28 @@
#include "net/http/http_auth_handler_ntlm.h"
-#include <stdlib.h>
-// For gethostname
-#if defined(OS_POSIX)
-#include <unistd.h>
-#elif defined(OS_WIN)
-#include <winsock2.h>
-#endif
-
-#include "base/md5.h"
#include "base/rand_util.h"
-#include "base/strings/string_util.h"
-#include "base/strings/sys_string_conversions.h"
-#include "base/strings/utf_string_conversions.h"
+#include "base/time/time.h"
#include "net/base/net_errors.h"
#include "net/base/network_interfaces.h"
-#include "net/ntlm/des.h"
-#include "net/ntlm/md4.h"
namespace net {
-// Based on mozilla/security/manager/ssl/src/nsNTLMAuthModule.cpp,
-// CVS rev. 1.14.
-//
-// TODO(wtc):
-// - The IS_BIG_ENDIAN code is not tested.
-// - Enable the logging code or just delete it.
-// - Delete or comment out the LM code, which hasn't been tested and isn't
-// being used.
-
-/* ***** BEGIN LICENSE BLOCK *****
- * Version: MPL 1.1/GPL 2.0/LGPL 2.1
- *
- * The contents of this file are subject to the Mozilla Public License Version
- * 1.1 (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- * http://www.mozilla.org/MPL/
- *
- * Software distributed under the License is distributed on an "AS IS" basis,
- * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
- * for the specific language governing rights and limitations under the
- * License.
- *
- * The Original Code is Mozilla.
- *
- * The Initial Developer of the Original Code is IBM Corporation.
- * Portions created by IBM Corporation are Copyright (C) 2003
- * IBM Corporation. All Rights Reserved.
- *
- * Contributor(s):
- * Darin Fisher <darin@meer.net>
- *
- * Alternatively, the contents of this file may be used under the terms of
- * either the GNU General Public License Version 2 or later (the "GPL"), or
- * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
- * in which case the provisions of the GPL or the LGPL are applicable instead
- * of those above. If you wish to allow use of your version of this file only
- * under the terms of either the GPL or the LGPL, and not to allow others to
- * use your version of this file under the terms of the MPL, indicate your
- * decision by deleting the provisions above and replace them with the notice
- * and other provisions required by the GPL or the LGPL. If you do not delete
- * the provisions above, a recipient may use your version of this file under
- * the terms of any one of the MPL, the GPL or the LGPL.
- *
- * ***** END LICENSE BLOCK ***** */
-
-#if defined(ARCH_CPU_LITTLE_ENDIAN)
-#define IS_LITTLE_ENDIAN 1
-#undef IS_BIG_ENDIAN
-#elif defined(ARCH_CPU_BIG_ENDIAN)
-#define IS_BIG_ENDIAN 1
-#undef IS_LITTLE_ENDIAN
-#else
-#error "Unknown endianness"
-#endif
-
-#define NTLM_LOG(x) ((void)0)
-
-//-----------------------------------------------------------------------------
-// This file contains a cross-platform NTLM authentication implementation. It
-// is based on documentation from: http://davenport.sourceforge.net/ntlm.html
-//-----------------------------------------------------------------------------
-
-enum {
- NTLM_NegotiateUnicode = 0x00000001,
- NTLM_NegotiateOEM = 0x00000002,
- NTLM_RequestTarget = 0x00000004,
- NTLM_Unknown1 = 0x00000008,
- NTLM_NegotiateSign = 0x00000010,
- NTLM_NegotiateSeal = 0x00000020,
- NTLM_NegotiateDatagramStyle = 0x00000040,
- NTLM_NegotiateLanManagerKey = 0x00000080,
- NTLM_NegotiateNetware = 0x00000100,
- NTLM_NegotiateNTLMKey = 0x00000200,
- NTLM_Unknown2 = 0x00000400,
- NTLM_Unknown3 = 0x00000800,
- NTLM_NegotiateDomainSupplied = 0x00001000,
- NTLM_NegotiateWorkstationSupplied = 0x00002000,
- NTLM_NegotiateLocalCall = 0x00004000,
- NTLM_NegotiateAlwaysSign = 0x00008000,
- NTLM_TargetTypeDomain = 0x00010000,
- NTLM_TargetTypeServer = 0x00020000,
- NTLM_TargetTypeShare = 0x00040000,
- NTLM_NegotiateNTLM2Key = 0x00080000,
- NTLM_RequestInitResponse = 0x00100000,
- NTLM_RequestAcceptResponse = 0x00200000,
- NTLM_RequestNonNTSessionKey = 0x00400000,
- NTLM_NegotiateTargetInfo = 0x00800000,
- NTLM_Unknown4 = 0x01000000,
- NTLM_Unknown5 = 0x02000000,
- NTLM_Unknown6 = 0x04000000,
- NTLM_Unknown7 = 0x08000000,
- NTLM_Unknown8 = 0x10000000,
- NTLM_Negotiate128 = 0x20000000,
- NTLM_NegotiateKeyExchange = 0x40000000,
- NTLM_Negotiate56 = 0x80000000
-};
-
-// We send these flags with our type 1 message.
-enum {
- NTLM_TYPE1_FLAGS =
- (NTLM_NegotiateUnicode | NTLM_NegotiateOEM | NTLM_RequestTarget |
- NTLM_NegotiateNTLMKey |
- NTLM_NegotiateAlwaysSign |
- NTLM_NegotiateNTLM2Key)
-};
-
-static const char NTLM_SIGNATURE[] = "NTLMSSP";
-static const char NTLM_TYPE1_MARKER[] = {0x01, 0x00, 0x00, 0x00};
-static const char NTLM_TYPE2_MARKER[] = {0x02, 0x00, 0x00, 0x00};
-static const char NTLM_TYPE3_MARKER[] = {0x03, 0x00, 0x00, 0x00};
-
-enum {
- NTLM_TYPE1_HEADER_LEN = 32,
- NTLM_TYPE2_HEADER_LEN = 32,
- NTLM_TYPE3_HEADER_LEN = 64,
-
- LM_HASH_LEN = 16,
- LM_RESP_LEN = 24,
-
- NTLM_HASH_LEN = 16,
- NTLM_RESP_LEN = 24
-};
-
-//-----------------------------------------------------------------------------
-
-#define LogFlags(x) ((void)0)
-#define LogBuf(a, b, c) ((void)0)
-#define LogToken(a, b, c) ((void)0)
-
-//-----------------------------------------------------------------------------
-
-// Byte order swapping.
-#define SWAP16(x) ((((x)&0xff) << 8) | (((x) >> 8) & 0xff))
-#define SWAP32(x) ((SWAP16((x)&0xffff) << 16) | (SWAP16((x) >> 16)))
-
-static void* WriteBytes(void* buf, const void* data, uint32_t data_len) {
- memcpy(buf, data, data_len);
- return static_cast<char*>(buf) + data_len;
-}
-
-static void* WriteDWORD(void* buf, uint32_t dword) {
-#ifdef IS_BIG_ENDIAN
- // NTLM uses little endian on the wire.
- dword = SWAP32(dword);
-#endif
- return WriteBytes(buf, &dword, sizeof(dword));
-}
-
-static void* WriteSecBuf(void* buf, uint16_t length, uint32_t offset) {
-#ifdef IS_BIG_ENDIAN
- length = SWAP16(length);
- offset = SWAP32(offset);
-#endif
- // Len: 2 bytes.
- buf = WriteBytes(buf, &length, sizeof(length));
- // MaxLen: 2 bytes. The sender should set it to the value of Len. The
- // recipient must ignore it.
- buf = WriteBytes(buf, &length, sizeof(length));
- // BufferOffset: 4 bytes.
- buf = WriteBytes(buf, &offset, sizeof(offset));
- return buf;
-}
-
-#ifdef IS_BIG_ENDIAN
-/**
- * WriteUnicodeLE copies a unicode string from one buffer to another. The
- * resulting unicode string is in little-endian format. The input string is
- * assumed to be in the native endianness of the local machine. It is safe
- * to pass the same buffer as both input and output, which is a handy way to
- * convert the unicode buffer to little-endian on big-endian platforms.
- */
-static void* WriteUnicodeLE(void* buf,
- const base::char16* str,
- uint32_t str_len) {
- // Convert input string from BE to LE.
- uint8_t* cursor = static_cast<uint8_t*>(buf);
- const uint8_t* input = reinterpret_cast<const uint8_t*>(str);
- for (uint32_t i = 0; i < str_len; ++i, input += 2, cursor += 2) {
- // Allow for the case where |buf == str|.
- uint8_t temp = input[0];
- cursor[0] = input[1];
- cursor[1] = temp;
- }
- return buf;
-}
-#endif
-
-static uint16_t ReadUint16(const uint8_t*& buf) {
- uint16_t x =
- (static_cast<uint16_t>(buf[0])) | (static_cast<uint16_t>(buf[1]) << 8);
- buf += sizeof(x);
- return x;
-}
+namespace {
-static uint32_t ReadUint32(const uint8_t*& buf) {
- uint32_t x = (static_cast<uint32_t>(buf[0])) |
- (static_cast<uint32_t>(buf[1]) << 8) |
- (static_cast<uint32_t>(buf[2]) << 16) |
- (static_cast<uint32_t>(buf[3]) << 24);
- buf += sizeof(x);
- return x;
+uint64_t GetMSTime() {
+ return base::Time::Now().since_origin().InMicroseconds() * 10;
}
-//-----------------------------------------------------------------------------
-
-// NTLM_Hash computes the NTLM hash of the given password.
-//
-// param password
-// null-terminated unicode password.
-// param hash
-// 16-byte result buffer
-static void NTLM_Hash(const base::string16& password, uint8_t* hash) {
-#ifdef IS_BIG_ENDIAN
- uint32_t len = password.length();
- uint8_t* passbuf;
-
- passbuf = static_cast<uint8_t*>(malloc(len * 2));
- WriteUnicodeLE(passbuf, password.data(), len);
- weak_crypto::MD4Sum(passbuf, len * 2, hash);
-
- free(passbuf);
-#else
- weak_crypto::MD4Sum(reinterpret_cast<const uint8_t*>(password.data()),
- password.length() * 2, hash);
-#endif
+void GenerateRandom(uint8_t* output, size_t n) {
+ base::RandBytes(output, n);
}
-//-----------------------------------------------------------------------------
-
-// LM_Response generates the LM response given a 16-byte password hash and the
-// challenge from the Type-2 message.
-//
-// param hash
-// 16-byte password hash
-// param challenge
-// 8-byte challenge from Type-2 message
-// param response
-// 24-byte buffer to contain the LM response upon return
-static void LM_Response(const uint8_t* hash,
- const uint8_t* challenge,
- uint8_t* response) {
- uint8_t keybytes[21], k1[8], k2[8], k3[8];
-
- memcpy(keybytes, hash, 16);
- memset(keybytes + 16, 0, 5);
-
- DESMakeKey(keybytes, k1);
- DESMakeKey(keybytes + 7, k2);
- DESMakeKey(keybytes + 14, k3);
-
- DESEncrypt(k1, challenge, response);
- DESEncrypt(k2, challenge, response + 8);
- DESEncrypt(k3, challenge, response + 16);
-}
-
-//-----------------------------------------------------------------------------
-
-// Returns OK or a network error code.
-static int GenerateType1Msg(void** out_buf, uint32_t* out_len) {
- //
- // Verify that buf_len is sufficient.
- //
- *out_len = NTLM_TYPE1_HEADER_LEN;
- *out_buf = malloc(*out_len);
- if (!*out_buf)
- return ERR_OUT_OF_MEMORY;
-
- //
- // Write out type 1 message.
- //
- void* cursor = *out_buf;
-
- // 0 : signature
- cursor = WriteBytes(cursor, NTLM_SIGNATURE, sizeof(NTLM_SIGNATURE));
-
- // 8 : marker
- cursor = WriteBytes(cursor, NTLM_TYPE1_MARKER, sizeof(NTLM_TYPE1_MARKER));
-
- // 12 : flags
- cursor = WriteDWORD(cursor, NTLM_TYPE1_FLAGS);
-
- //
- // NOTE: It is common for the domain and workstation fields to be empty.
- // This is true of Win2k clients, and my guess is that there is
- // little utility to sending these strings before the charset has
- // been negotiated. We follow suite -- anyways, it doesn't hurt
- // to save some bytes on the wire ;-)
- //
-
- // 16 : supplied domain security buffer (empty)
- cursor = WriteSecBuf(cursor, 0, 0);
-
- // 24 : supplied workstation security buffer (empty)
- cursor = WriteSecBuf(cursor, 0, 0);
-
- return OK;
-}
-
-struct Type2Msg {
- uint32_t flags; // NTLM_Xxx bitwise combination
- uint8_t challenge[8]; // 8 byte challenge
- const void* target; // target string (type depends on flags)
- uint32_t target_len; // target length in bytes
-};
-
-// Returns OK or a network error code.
-// TODO(wtc): This function returns ERR_UNEXPECTED when the input message is
-// invalid. We should return a better error code.
-static int ParseType2Msg(const void* in_buf, uint32_t in_len, Type2Msg* msg) {
- // Make sure in_buf is long enough to contain a meaningful type2 msg.
- //
- // 0 NTLMSSP Signature
- // 8 NTLM Message Type
- // 12 Target Name
- // 20 Flags
- // 24 Challenge
- // 32 end of header, start of optional data blocks
- //
- if (in_len < NTLM_TYPE2_HEADER_LEN)
- return ERR_UNEXPECTED;
-
- const uint8_t* cursor = (const uint8_t*)in_buf;
-
- // verify NTLMSSP signature
- if (memcmp(cursor, NTLM_SIGNATURE, sizeof(NTLM_SIGNATURE)) != 0)
- return ERR_UNEXPECTED;
- cursor += sizeof(NTLM_SIGNATURE);
+} // namespace
- // verify Type-2 marker
- if (memcmp(cursor, NTLM_TYPE2_MARKER, sizeof(NTLM_TYPE2_MARKER)) != 0)
- return ERR_UNEXPECTED;
- cursor += sizeof(NTLM_TYPE2_MARKER);
-
- // read target name security buffer
- uint32_t target_len = ReadUint16(cursor);
- ReadUint16(cursor); // discard next 16-bit value
- uint32_t offset = ReadUint32(cursor); // get offset from in_buf
- msg->target_len = 0;
- msg->target = NULL;
-
- // Target length 0 is valid and indicates no target information.
- if (target_len != 0) {
- // Check the offset / length combo is in range of the input buffer,
- // including integer overflow checking.
- if (target_len <= in_len && in_len - offset >= target_len) {
- msg->target_len = target_len;
- msg->target = ((const uint8_t*)in_buf) + offset;
- } else {
- // Reject a message with a non-zero target length that
- // would cause an overflow.
- return ERR_UNEXPECTED;
- }
- }
-
- // read flags
- msg->flags = ReadUint32(cursor);
-
- // read challenge
- memcpy(msg->challenge, cursor, sizeof(msg->challenge));
- cursor += sizeof(msg->challenge);
-
- NTLM_LOG(("NTLM type 2 message:\n"));
- LogBuf("target", (const uint8_t*)msg->target, msg->target_len);
- LogBuf("flags", (const uint8_t*)&msg->flags, 4);
- LogFlags(msg->flags);
- LogBuf("challenge", msg->challenge, sizeof(msg->challenge));
-
- // We currently do not implement LMv2/NTLMv2 or NTLM2 responses,
- // so we can ignore target information. We may want to enable
- // support for these alternate mechanisms in the future.
- return OK;
-}
-
-static void GenerateRandom(uint8_t* output, size_t n) {
- for (size_t i = 0; i < n; ++i)
- output[i] = base::RandInt(0, 255);
-}
-
-// Returns OK or a network error code.
-static int GenerateType3Msg(const base::string16& domain,
- const base::string16& username,
- const base::string16& password,
- const std::string& hostname,
- const void* rand_8_bytes,
- const void* in_buf,
- uint32_t in_len,
- void** out_buf,
- uint32_t* out_len) {
- // in_buf contains Type-2 msg (the challenge) from server.
-
- int rv;
- Type2Msg msg;
-
- rv = ParseType2Msg(in_buf, in_len, &msg);
- if (rv != OK)
- return rv;
-
- bool unicode = (msg.flags & NTLM_NegotiateUnicode) != 0;
-
-// Temporary buffers for unicode strings
-#ifdef IS_BIG_ENDIAN
- base::string16 ucs_domain_buf, ucs_user_buf;
-#endif
- base::string16 ucs_host_buf;
- // Temporary buffers for oem strings
- std::string oem_domain_buf, oem_user_buf;
- // Pointers and lengths for the string buffers; encoding is unicode if
- // the "negotiate unicode" flag was set in the Type-2 message.
- const void* domain_ptr;
- const void* user_ptr;
- const void* host_ptr;
- uint32_t domain_len, user_len, host_len;
-
- //
- // Get domain name.
- //
- if (unicode) {
-#ifdef IS_BIG_ENDIAN
- ucs_domain_buf = domain;
- domain_ptr = ucs_domain_buf.data();
- domain_len = ucs_domain_buf.length() * 2;
- WriteUnicodeLE(const_cast<void*>(domain_ptr),
- (const base::char16*)domain_ptr, ucs_domain_buf.length());
-#else
- domain_ptr = domain.data();
- domain_len = domain.length() * 2;
-#endif
- } else {
- oem_domain_buf = base::SysWideToNativeMB(base::UTF16ToWide(domain));
- domain_ptr = oem_domain_buf.data();
- domain_len = oem_domain_buf.length();
- }
-
- //
- // Get user name.
- //
- if (unicode) {
-#ifdef IS_BIG_ENDIAN
- ucs_user_buf = username;
- user_ptr = ucs_user_buf.data();
- user_len = ucs_user_buf.length() * 2;
- WriteUnicodeLE(const_cast<void*>(user_ptr), (const base::char16*)user_ptr,
- ucs_user_buf.length());
-#else
- user_ptr = username.data();
- user_len = username.length() * 2;
-#endif
- } else {
- oem_user_buf = base::SysWideToNativeMB(base::UTF16ToWide(username));
- user_ptr = oem_user_buf.data();
- user_len = oem_user_buf.length();
- }
-
- //
- // Get workstation name (use local machine's hostname).
- //
- if (unicode) {
- // hostname is ASCII, so we can do a simple zero-pad expansion:
- ucs_host_buf.assign(hostname.begin(), hostname.end());
- host_ptr = ucs_host_buf.data();
- host_len = ucs_host_buf.length() * 2;
-#ifdef IS_BIG_ENDIAN
- WriteUnicodeLE(const_cast<void*>(host_ptr), (const base::char16*)host_ptr,
- ucs_host_buf.length());
-#endif
- } else {
- host_ptr = hostname.data();
- host_len = hostname.length();
- }
-
- //
- // Now that we have generated all of the strings, we can allocate out_buf.
- //
- *out_len = NTLM_TYPE3_HEADER_LEN + host_len + domain_len + user_len +
- LM_RESP_LEN + NTLM_RESP_LEN;
- *out_buf = malloc(*out_len);
- if (!*out_buf)
- return ERR_OUT_OF_MEMORY;
-
- //
- // Next, we compute the LM and NTLM responses.
- //
- uint8_t lm_resp[LM_RESP_LEN];
- uint8_t ntlm_resp[NTLM_RESP_LEN];
- uint8_t ntlm_hash[NTLM_HASH_LEN];
-
- // compute NTLM2 session response
- base::MD5Digest session_hash;
- uint8_t temp[16];
-
- memcpy(lm_resp, rand_8_bytes, 8);
- memset(lm_resp + 8, 0, LM_RESP_LEN - 8);
-
- memcpy(temp, msg.challenge, 8);
- memcpy(temp + 8, lm_resp, 8);
- base::MD5Sum(temp, 16, &session_hash);
-
- NTLM_Hash(password, ntlm_hash);
- LM_Response(ntlm_hash, session_hash.a, ntlm_resp);
-
- //
- // Finally, we assemble the Type-3 msg :-)
- //
- void* cursor = *out_buf;
- uint32_t offset;
-
- // 0 : signature
- cursor = WriteBytes(cursor, NTLM_SIGNATURE, sizeof(NTLM_SIGNATURE));
-
- // 8 : marker
- cursor = WriteBytes(cursor, NTLM_TYPE3_MARKER, sizeof(NTLM_TYPE3_MARKER));
-
- // 12 : LM response sec buf
- offset = NTLM_TYPE3_HEADER_LEN + domain_len + user_len + host_len;
- cursor = WriteSecBuf(cursor, LM_RESP_LEN, offset);
- memcpy(static_cast<uint8_t*>(*out_buf) + offset, lm_resp, LM_RESP_LEN);
-
- // 20 : NTLM response sec buf
- offset += LM_RESP_LEN;
- cursor = WriteSecBuf(cursor, NTLM_RESP_LEN, offset);
- memcpy(static_cast<uint8_t*>(*out_buf) + offset, ntlm_resp, NTLM_RESP_LEN);
-
- // 28 : domain name sec buf
- offset = NTLM_TYPE3_HEADER_LEN;
- cursor = WriteSecBuf(cursor, domain_len, offset);
- memcpy(static_cast<uint8_t*>(*out_buf) + offset, domain_ptr, domain_len);
-
- // 36 : user name sec buf
- offset += domain_len;
- cursor = WriteSecBuf(cursor, user_len, offset);
- memcpy(static_cast<uint8_t*>(*out_buf) + offset, user_ptr, user_len);
-
- // 44 : workstation (host) name sec buf
- offset += user_len;
- cursor = WriteSecBuf(cursor, host_len, offset);
- memcpy(static_cast<uint8_t*>(*out_buf) + offset, host_ptr, host_len);
-
- // 52 : session key sec buf (not used)
- cursor = WriteSecBuf(cursor, 0, 0);
-
- // 60 : negotiated flags
- cursor = WriteDWORD(cursor, msg.flags & NTLM_TYPE1_FLAGS);
-
- return OK;
-}
-
-// NTLM authentication is specified in "NTLM Over HTTP Protocol Specification"
-// [MS-NTHT].
+// static
+HttpAuthHandlerNTLM::GetMSTimeProc HttpAuthHandlerNTLM::get_ms_time_proc_ =
+ GetMSTime;
// static
HttpAuthHandlerNTLM::GenerateRandomProc
@@ -581,7 +35,8 @@ HttpAuthHandlerNTLM::GenerateRandomProc
HttpAuthHandlerNTLM::HostNameProc HttpAuthHandlerNTLM::get_host_name_proc_ =
GetHostName;
-HttpAuthHandlerNTLM::HttpAuthHandlerNTLM() {}
+HttpAuthHandlerNTLM::HttpAuthHandlerNTLM()
+ : ntlm_client_(ntlm::NtlmFeatures(false)) {}
bool HttpAuthHandlerNTLM::NeedsIdentity() {
// This gets called for each round-trip. Only require identity on
@@ -603,6 +58,14 @@ int HttpAuthHandlerNTLM::InitializeBeforeFirstChallenge() {
HttpAuthHandlerNTLM::~HttpAuthHandlerNTLM() {}
// static
+HttpAuthHandlerNTLM::GetMSTimeProc HttpAuthHandlerNTLM::SetGetMSTimeProc(
+ GetMSTimeProc proc) {
+ GetMSTimeProc old_proc = get_ms_time_proc_;
+ get_ms_time_proc_ = proc;
+ return old_proc;
+}
+
+// static
HttpAuthHandlerNTLM::GenerateRandomProc
HttpAuthHandlerNTLM::SetGenerateRandomProc(GenerateRandomProc proc) {
GenerateRandomProc old_proc = generate_random_proc_;
@@ -622,31 +85,25 @@ HttpAuthHandlerNTLM::Factory::Factory() {}
HttpAuthHandlerNTLM::Factory::~Factory() {}
-int HttpAuthHandlerNTLM::GetNextToken(const void* in_token,
- uint32_t in_token_len,
- void** out_token,
- uint32_t* out_token_len) {
- int rv = 0;
-
- // If in_token is non-null, then assume it contains a type 2 message...
- if (in_token) {
- LogToken("in-token", in_token, in_token_len);
- std::string hostname = get_host_name_proc_();
- if (hostname.empty())
- return ERR_UNEXPECTED;
- uint8_t rand_buf[8];
- generate_random_proc_(rand_buf, 8);
- rv = GenerateType3Msg(domain_, credentials_.username(),
- credentials_.password(), hostname, rand_buf, in_token,
- in_token_len, out_token, out_token_len);
- } else {
- rv = GenerateType1Msg(out_token, out_token_len);
+ntlm::Buffer HttpAuthHandlerNTLM::GetNextToken(const ntlm::Buffer& in_token) {
+ // If in_token is non-empty, then assume it contains a challenge message,
+ // and generate the Authenticate message in reply. Otherwise return the
+ // Negotiate message.
+ if (in_token.empty()) {
+ return ntlm_client_.GetNegotiateMessage();
}
- if (rv == OK)
- LogToken("out-token", *out_token, *out_token_len);
-
- return rv;
+ std::string hostname = get_host_name_proc_();
+ if (hostname.empty())
+ return ntlm::Buffer();
+ uint8_t client_challenge[8];
+ generate_random_proc_(client_challenge, 8);
+ uint64_t client_time = get_ms_time_proc_();
+
+ return ntlm_client_.GenerateAuthenticateMessage(
+ domain_, credentials_.username(), credentials_.password(), hostname,
+ channel_bindings_, CreateSPN(origin_), client_time, client_challenge,
+ in_token);
}
int HttpAuthHandlerNTLM::Factory::CreateAuthHandler(
diff --git a/chromium/net/http/http_auth_handler_ntlm_portable_unittest.cc b/chromium/net/http/http_auth_handler_ntlm_portable_unittest.cc
index a379c717dc8..36294e8b6f2 100644
--- a/chromium/net/http/http_auth_handler_ntlm_portable_unittest.cc
+++ b/chromium/net/http/http_auth_handler_ntlm_portable_unittest.cc
@@ -5,7 +5,6 @@
#include <string>
#include "base/base64.h"
-#include "base/memory/ptr_util.h"
#include "base/strings/string_util.h"
#include "base/strings/utf_string_conversions.h"
#include "net/base/test_completion_callback.h"
@@ -142,6 +141,11 @@ class HttpAuthHandlerNtlmPortableTest : public PlatformTest {
memset(output, 0xaa, n);
}
+ static uint64_t MockGetMSTime() {
+ // Tue, 23 May 2017 20:13:07 +0000
+ return 131400439870000000;
+ }
+
static std::string MockGetHostName() { return ntlm::test::kHostnameAscii; }
private:
@@ -174,7 +178,7 @@ TEST_F(HttpAuthHandlerNtlmPortableTest, VerifyType1Message) {
// The type 1 message generated is always the same. The only variable
// part of the message is the flags and this implementation always offers
// the same set of flags.
- ASSERT_EQ("NTLM TlRMTVNTUAABAAAAB4IIAAAAAAAAAAAAAAAAAAAAAAA=", token);
+ ASSERT_EQ("NTLM TlRMTVNTUAABAAAAB4IIAAAAAAAgAAAAAAAAACAAAAA=", token);
}
TEST_F(HttpAuthHandlerNtlmPortableTest, EmptyTokenFails) {
@@ -205,373 +209,27 @@ TEST_F(HttpAuthHandlerNtlmPortableTest, CantChangeSchemeMidway) {
HandleAnotherChallenge("Negotiate SSdtIG5vdCBhIHJlYWwgdG9rZW4h"));
}
-TEST_F(HttpAuthHandlerNtlmPortableTest, MinimalStructurallyValidType2) {
- ASSERT_EQ(OK, CreateHandler());
- ASSERT_EQ(OK, GetGenerateAuthTokenResult());
- ASSERT_EQ(HttpAuth::AUTHORIZATION_RESULT_ACCEPT,
- HandleAnotherChallenge(CreateNtlmAuthHeader(
- ntlm::test::kMinChallengeMessage, ntlm::kChallengeHeaderLen)));
- ASSERT_EQ(OK, GetGenerateAuthTokenResult());
-}
-
-TEST_F(HttpAuthHandlerNtlmPortableTest, Type2MessageTooShort) {
- ASSERT_EQ(OK, CreateHandler());
- ASSERT_EQ(OK, GetGenerateAuthTokenResult());
-
- uint8_t raw[31];
- memcpy(raw, ntlm::test::kMinChallengeMessage, 31);
-
- // Fail because the minimum size valid message is 32 bytes.
- ASSERT_EQ(HttpAuth::AUTHORIZATION_RESULT_ACCEPT,
- HandleAnotherChallenge(CreateNtlmAuthHeader(raw, arraysize(raw))));
- ASSERT_EQ(ERR_UNEXPECTED, GetGenerateAuthTokenResult());
-}
-
-TEST_F(HttpAuthHandlerNtlmPortableTest, Type2MessageWrongSignature) {
- ASSERT_EQ(OK, CreateHandler());
- ASSERT_EQ(OK, GetGenerateAuthTokenResult());
-
- uint8_t raw[32];
- memcpy(raw, ntlm::test::kMinChallengeMessage, 32);
- // Modify the default valid message to overwrite the last byte of the
- // signature.
- raw[7] = 0xff;
-
- // Fail because the first 8 bytes don't match "NTLMSSP\0"
- ASSERT_EQ(HttpAuth::AUTHORIZATION_RESULT_ACCEPT,
- HandleAnotherChallenge(CreateNtlmAuthHeader(raw, arraysize(raw))));
- ASSERT_EQ(ERR_UNEXPECTED, GetGenerateAuthTokenResult());
-}
-
-TEST_F(HttpAuthHandlerNtlmPortableTest, Type2WrongMessageType) {
- ASSERT_EQ(OK, CreateHandler());
- ASSERT_EQ(OK, GetGenerateAuthTokenResult());
-
- uint8_t raw[32];
- memcpy(raw, ntlm::test::kMinChallengeMessage, 32);
- // Modify the message type so it is not 0x00000002
- raw[8] = 0x03;
-
- // Fail because the message type should be MessageType::kChallenge
- // (0x00000002)
- ASSERT_EQ(HttpAuth::AUTHORIZATION_RESULT_ACCEPT,
- HandleAnotherChallenge(CreateNtlmAuthHeader(raw, arraysize(raw))));
- ASSERT_EQ(ERR_UNEXPECTED, GetGenerateAuthTokenResult());
-}
-
-TEST_F(HttpAuthHandlerNtlmPortableTest, Type2MessageWithNoTargetName) {
- ASSERT_EQ(OK, CreateHandler());
- ASSERT_EQ(OK, GetGenerateAuthTokenResult());
-
- // The spec (2.2.1.2) states that the length SHOULD be 0 and the offset
- // SHOULD be where the payload would be if it was present. This is the
- // expected response from a compliant server when no target name is sent.
- // In reality the offset should always be ignored if the length is zero.
- // Also implementations often just write zeros.
- uint8_t raw[32];
- memcpy(raw, ntlm::test::kMinChallengeMessage, 32);
- // Modify the default valid message to overwrite the offset to zero.
- raw[16] = 0x00;
-
- ASSERT_EQ(HttpAuth::AUTHORIZATION_RESULT_ACCEPT,
- HandleAnotherChallenge(CreateNtlmAuthHeader(raw, arraysize(raw))));
- ASSERT_EQ(OK, GetGenerateAuthTokenResult());
-}
-
-TEST_F(HttpAuthHandlerNtlmPortableTest, Type2MessageWithTargetName) {
- ASSERT_EQ(OK, CreateHandler());
- ASSERT_EQ(OK, GetGenerateAuthTokenResult());
-
- // One extra byte is provided for target name.
- uint8_t raw[33];
- memcpy(raw, ntlm::test::kMinChallengeMessage, 32);
- // Modify the default valid message to indicate 1 byte is present in the
- // target name payload.
- raw[12] = 0x01;
- raw[14] = 0x01;
- // Put something in the target name.
- raw[32] = 'Z';
-
- ASSERT_EQ(HttpAuth::AUTHORIZATION_RESULT_ACCEPT,
- HandleAnotherChallenge(CreateNtlmAuthHeader(raw, arraysize(raw))));
- ASSERT_EQ(OK, GetGenerateAuthTokenResult());
-}
-
-TEST_F(HttpAuthHandlerNtlmPortableTest, NoTargetNameOverflowFromOffset) {
- ASSERT_EQ(OK, CreateHandler());
- ASSERT_EQ(OK, GetGenerateAuthTokenResult());
-
- uint8_t raw[32];
- memcpy(raw, ntlm::test::kMinChallengeMessage, 32);
- // Modify the default valid message to claim that the target name field is 1
- // byte long overrunning the end of the message message.
- raw[12] = 0x01;
- raw[14] = 0x01;
-
- // The above malformed message could cause an implementation to read outside
- // the message buffer because the offset is past the end of the message.
- // Verify it gets rejected.
- ASSERT_EQ(HttpAuth::AUTHORIZATION_RESULT_ACCEPT,
- HandleAnotherChallenge(CreateNtlmAuthHeader(raw, arraysize(raw))));
- ASSERT_EQ(ERR_UNEXPECTED, GetGenerateAuthTokenResult());
-}
-
-TEST_F(HttpAuthHandlerNtlmPortableTest, NoTargetNameOverflowFromLength) {
- ASSERT_EQ(OK, CreateHandler());
- ASSERT_EQ(OK, GetGenerateAuthTokenResult());
-
- // Message has 1 extra byte of space after the header for the target name.
- // One extra byte is provided for target name.
- uint8_t raw[33];
- memcpy(raw, ntlm::test::kMinChallengeMessage, 32);
- // Modify the default valid message to indicate 2 bytes are present in the
- // target name payload (however there is only space for 1).
- raw[12] = 0x02;
- raw[14] = 0x02;
- // Put something in the target name.
- raw[32] = 'Z';
-
- // The above malformed message could cause an implementation to read outside
- // the message buffer because the length is longer than available space.
- // Verify it gets rejected.
- ASSERT_EQ(HttpAuth::AUTHORIZATION_RESULT_ACCEPT,
- HandleAnotherChallenge(CreateNtlmAuthHeader(raw, arraysize(raw))));
- ASSERT_EQ(ERR_UNEXPECTED, GetGenerateAuthTokenResult());
-}
-
-TEST_F(HttpAuthHandlerNtlmPortableTest, Type3RespectsUnicode) {
- HttpAuthHandlerNTLM::ScopedProcSetter proc_setter(MockRandom,
- MockGetHostName);
- ASSERT_EQ(OK, CreateHandler());
- ASSERT_EQ(OK, GetGenerateAuthTokenResult());
-
- // Generate the type 2 message from the server.
- ntlm::NtlmBufferWriter writer(ntlm::kChallengeHeaderLen);
- ASSERT_TRUE(writer.WriteMessageHeader(ntlm::MessageType::kChallenge));
- // No target name. It is never used.
- ASSERT_TRUE(writer.WriteSecurityBuffer(
- ntlm::SecurityBuffer(ntlm::kChallengeHeaderLen, 0)));
- // Set the unicode flag.
- ASSERT_TRUE(writer.WriteFlags(ntlm::NegotiateFlags::kUnicode));
-
- std::string token;
- ASSERT_EQ(HttpAuth::AUTHORIZATION_RESULT_ACCEPT,
- HandleAnotherChallenge(CreateNtlmAuthHeader(writer.GetBuffer())));
- ASSERT_EQ(OK, GenerateAuthToken(&token));
-
- // Validate the type 3 message
- std::string decoded;
- ASSERT_TRUE(DecodeChallenge(token, &decoded));
- ntlm::NtlmBufferReader reader(decoded);
- ASSERT_TRUE(reader.MatchMessageHeader(ntlm::MessageType::kAuthenticate));
-
- // Skip the LM and NTLM Hash fields. This test isn't testing that.
- ASSERT_TRUE(reader.SkipSecurityBufferWithValidation());
- ASSERT_TRUE(reader.SkipSecurityBufferWithValidation());
- base::string16 domain;
- base::string16 username;
- base::string16 hostname;
- ReadString16Payload(&reader, &domain);
- ASSERT_EQ(ntlm::test::kNtlmDomain, domain);
- ReadString16Payload(&reader, &username);
- ASSERT_EQ(ntlm::test::kUser, username);
- ReadString16Payload(&reader, &hostname);
- ASSERT_EQ(ntlm::test::kHostname, hostname);
-
- // The session key is not used for the NTLM scheme in HTTP. Since
- // NTLMSSP_NEGOTIATE_KEY_EXCH was not sent this is empty.
- ASSERT_TRUE(reader.SkipSecurityBufferWithValidation());
-
- // Verify the unicode flag is set.
- ntlm::NegotiateFlags flags;
- ASSERT_TRUE(reader.ReadFlags(&flags));
- ASSERT_EQ(ntlm::NegotiateFlags::kUnicode,
- flags & ntlm::NegotiateFlags::kUnicode);
-}
-
-TEST_F(HttpAuthHandlerNtlmPortableTest, Type3WithoutUnicode) {
- HttpAuthHandlerNTLM::ScopedProcSetter proc_setter(MockRandom,
- MockGetHostName);
- ASSERT_EQ(OK, CreateHandler());
- ASSERT_EQ(OK, GetGenerateAuthTokenResult());
-
- // Generate the type 2 message from the server.
- ntlm::NtlmBufferWriter writer(ntlm::kChallengeHeaderLen);
- ASSERT_TRUE(writer.WriteMessageHeader(ntlm::MessageType::kChallenge));
- // No target name. It is never used.
- ASSERT_TRUE(writer.WriteSecurityBuffer(
- ntlm::SecurityBuffer(ntlm::kChallengeHeaderLen, 0)));
- // Set the OEM flag.
- ASSERT_TRUE(writer.WriteFlags(ntlm::NegotiateFlags::kOem));
-
- std::string token;
- ASSERT_EQ(HttpAuth::AUTHORIZATION_RESULT_ACCEPT,
- HandleAnotherChallenge(CreateNtlmAuthHeader(writer.GetBuffer())));
- ASSERT_EQ(OK, GenerateAuthToken(&token));
-
- // Validate the type 3 message
- std::string decoded;
- ASSERT_TRUE(DecodeChallenge(token, &decoded));
- ntlm::NtlmBufferReader reader(decoded);
- ASSERT_TRUE(reader.MatchMessageHeader(ntlm::MessageType::kAuthenticate));
-
- // Skip the 2 hash fields. This test isn't testing that.
- ASSERT_TRUE(reader.SkipSecurityBufferWithValidation());
- ASSERT_TRUE(reader.SkipSecurityBufferWithValidation());
- std::string domain;
- std::string username;
- std::string hostname;
- ASSERT_TRUE(ReadStringPayload(&reader, &domain));
- ASSERT_EQ(ntlm::test::kNtlmDomainAscii, domain);
- ASSERT_TRUE(ReadStringPayload(&reader, &username));
- ASSERT_EQ(ntlm::test::kUserAscii, username);
- ASSERT_TRUE(ReadStringPayload(&reader, &hostname));
- ASSERT_EQ(ntlm::test::kHostnameAscii, hostname);
-
- // The session key is not used for the NTLM scheme in HTTP. Since
- // NTLMSSP_NEGOTIATE_KEY_EXCH was not sent this is empty.
- ASSERT_TRUE(reader.SkipSecurityBufferWithValidation());
-
- // Verify the unicode flag is not set and OEM flag is.
- ntlm::NegotiateFlags flags;
- ASSERT_TRUE(reader.ReadFlags(&flags));
- ASSERT_EQ(ntlm::NegotiateFlags::kNone,
- flags & ntlm::NegotiateFlags::kUnicode);
- ASSERT_EQ(ntlm::NegotiateFlags::kOem, flags & ntlm::NegotiateFlags::kOem);
-}
-
-TEST_F(HttpAuthHandlerNtlmPortableTest, Type3UnicodeNoSessionSecurity) {
- // Verify that the client won't be downgraded if the server clears
- // the session security flag.
- HttpAuthHandlerNTLM::ScopedProcSetter proc_setter(MockRandom,
- MockGetHostName);
- ASSERT_EQ(OK, CreateHandler());
- ASSERT_EQ(OK, GetGenerateAuthTokenResult());
-
- // Generate the type 2 message from the server.
- ntlm::NtlmBufferWriter writer(ntlm::kChallengeHeaderLen);
- ASSERT_TRUE(writer.WriteMessageHeader(ntlm::MessageType::kChallenge));
- // No target name. It is never used.
- ASSERT_TRUE(writer.WriteSecurityBuffer(
- ntlm::SecurityBuffer(ntlm::kChallengeHeaderLen, 0)));
- // Set the unicode but not the session security flag.
- ASSERT_TRUE(writer.WriteFlags(ntlm::NegotiateFlags::kUnicode));
-
- ASSERT_TRUE(
- writer.WriteBytes(ntlm::test::kServerChallenge, ntlm::kChallengeLen));
- ASSERT_TRUE(writer.IsEndOfBuffer());
-
- std::string token;
- ASSERT_EQ(HttpAuth::AUTHORIZATION_RESULT_ACCEPT,
- HandleAnotherChallenge(CreateNtlmAuthHeader(writer.GetBuffer())));
- ASSERT_EQ(OK, GenerateAuthToken(&token));
-
- // Validate the type 3 message
- std::string decoded;
- ASSERT_TRUE(DecodeChallenge(token, &decoded));
- ntlm::NtlmBufferReader reader(decoded);
- ASSERT_TRUE(reader.MatchMessageHeader(ntlm::MessageType::kAuthenticate));
-
- // Read the LM and NTLM Response Payloads.
- uint8_t actual_lm_response[ntlm::kResponseLenV1];
- uint8_t actual_ntlm_response[ntlm::kResponseLenV1];
- ASSERT_TRUE(
- ReadBytesPayload(&reader, actual_lm_response, ntlm::kResponseLenV1));
- ASSERT_TRUE(
- ReadBytesPayload(&reader, actual_ntlm_response, ntlm::kResponseLenV1));
-
- // Verify that the client still generated a response that uses
- // session security.
- ASSERT_EQ(0, memcmp(ntlm::test::kExpectedLmResponseWithV1SS,
- actual_lm_response, ntlm::kResponseLenV1));
- ASSERT_EQ(0, memcmp(ntlm::test::kExpectedNtlmResponseWithV1SS,
- actual_ntlm_response, ntlm::kResponseLenV1));
-
- base::string16 domain;
- base::string16 username;
- base::string16 hostname;
- ReadString16Payload(&reader, &domain);
- ASSERT_EQ(ntlm::test::kNtlmDomain, domain);
- ReadString16Payload(&reader, &username);
- ASSERT_EQ(ntlm::test::kUser, username);
- ReadString16Payload(&reader, &hostname);
- ASSERT_EQ(ntlm::test::kHostname, hostname);
-
- // The session key is not used for the NTLM scheme in HTTP. Since
- // NTLMSSP_NEGOTIATE_KEY_EXCH was not sent this is empty.
- ASSERT_TRUE(reader.SkipSecurityBufferWithValidation());
-
- // Verify the unicode flag is set.
- ntlm::NegotiateFlags flags;
- ASSERT_TRUE(reader.ReadFlags(&flags));
- ASSERT_EQ(ntlm::NegotiateFlags::kUnicode,
- flags & ntlm::NegotiateFlags::kUnicode);
-}
-
-TEST_F(HttpAuthHandlerNtlmPortableTest, Type3UnicodeWithSessionSecurity) {
- HttpAuthHandlerNTLM::ScopedProcSetter proc_setter(MockRandom,
+TEST_F(HttpAuthHandlerNtlmPortableTest, NtlmV1AuthenticationSuccess) {
+ HttpAuthHandlerNTLM::ScopedProcSetter proc_setter(MockGetMSTime, MockRandom,
MockGetHostName);
ASSERT_EQ(OK, CreateHandler());
ASSERT_EQ(OK, GetGenerateAuthTokenResult());
- // Generate the type 2 message from the server.
- ntlm::NtlmBufferWriter writer(ntlm::kChallengeHeaderLen);
- ASSERT_TRUE(writer.WriteMessageHeader(ntlm::MessageType::kChallenge));
- // No target name. It is never used.
- ASSERT_TRUE(writer.WriteSecurityBuffer(
- ntlm::SecurityBuffer(ntlm::kChallengeHeaderLen, 0)));
- // Set the unicode and session security flag.
- ASSERT_TRUE(
- writer.WriteFlags((ntlm::NegotiateFlags::kUnicode |
- ntlm::NegotiateFlags::kExtendedSessionSecurity)));
-
- ASSERT_TRUE(
- writer.WriteBytes(ntlm::test::kServerChallenge, ntlm::kChallengeLen));
- ASSERT_TRUE(writer.IsEndOfBuffer());
-
std::string token;
ASSERT_EQ(HttpAuth::AUTHORIZATION_RESULT_ACCEPT,
- HandleAnotherChallenge(CreateNtlmAuthHeader(writer.GetBuffer())));
+ HandleAnotherChallenge(
+ CreateNtlmAuthHeader(ntlm::test::kChallengeMsgV1,
+ arraysize(ntlm::test::kChallengeMsgV1))));
ASSERT_EQ(OK, GenerateAuthToken(&token));
- // Validate the type 3 message
+ // Validate the authenticate message
std::string decoded;
ASSERT_TRUE(DecodeChallenge(token, &decoded));
- ntlm::NtlmBufferReader reader(decoded);
- ASSERT_TRUE(reader.MatchMessageHeader(ntlm::MessageType::kAuthenticate));
-
- // Read the LM and NTLM Response Payloads.
- uint8_t actual_lm_response[ntlm::kResponseLenV1];
- uint8_t actual_ntlm_response[ntlm::kResponseLenV1];
- ASSERT_TRUE(
- ReadBytesPayload(&reader, actual_lm_response, ntlm::kResponseLenV1));
- ASSERT_TRUE(
- ReadBytesPayload(&reader, actual_ntlm_response, ntlm::kResponseLenV1));
-
- ASSERT_EQ(0, memcmp(ntlm::test::kExpectedLmResponseWithV1SS,
- actual_lm_response, ntlm::kResponseLenV1));
- ASSERT_EQ(0, memcmp(ntlm::test::kExpectedNtlmResponseWithV1SS,
- actual_ntlm_response, ntlm::kResponseLenV1));
-
- base::string16 domain;
- base::string16 username;
- base::string16 hostname;
- ReadString16Payload(&reader, &domain);
- ASSERT_EQ(ntlm::test::kNtlmDomain, domain);
- ReadString16Payload(&reader, &username);
- ASSERT_EQ(ntlm::test::kUser, username);
- ReadString16Payload(&reader, &hostname);
- ASSERT_EQ(ntlm::test::kHostname, hostname);
-
- // The session key is not used for the NTLM scheme in HTTP. Since
- // NTLMSSP_NEGOTIATE_KEY_EXCH was not sent this is empty.
- ASSERT_TRUE(reader.SkipSecurityBufferWithValidation());
-
- // Verify the unicode flag is set.
- ntlm::NegotiateFlags flags;
- ASSERT_TRUE(reader.ReadFlags(&flags));
- ASSERT_EQ(ntlm::NegotiateFlags::kUnicode,
- flags & ntlm::NegotiateFlags::kUnicode);
+ ASSERT_EQ(arraysize(ntlm::test::kExpectedAuthenticateMsgSpecResponseV1),
+ decoded.size());
+ ASSERT_EQ(0, memcmp(decoded.data(),
+ ntlm::test::kExpectedAuthenticateMsgSpecResponseV1,
+ decoded.size()));
}
} // namespace net
diff --git a/chromium/net/http/http_auth_preferences.cc b/chromium/net/http/http_auth_preferences.cc
index c9b2d32a54b..ba9198b195f 100644
--- a/chromium/net/http/http_auth_preferences.cc
+++ b/chromium/net/http/http_auth_preferences.cc
@@ -2,16 +2,18 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
+#include "net/http/http_auth_preferences.h"
+
#include "base/strings/string_split.h"
+#include "build/build_config.h"
#include "net/http/http_auth_filter.h"
-#include "net/http/http_auth_preferences.h"
#include "net/http/url_security_manager.h"
namespace net {
HttpAuthPreferences::HttpAuthPreferences(
const std::vector<std::string>& auth_schemes
-#if defined(OS_POSIX) && !defined(OS_ANDROID)
+#if defined(OS_POSIX) && !defined(OS_ANDROID) && !defined(OS_CHROMEOS)
,
const std::string& gssapi_library_name
#endif
@@ -23,7 +25,7 @@ HttpAuthPreferences::HttpAuthPreferences(
: auth_schemes_(auth_schemes.begin(), auth_schemes.end()),
negotiate_disable_cname_lookup_(false),
negotiate_enable_port_(false),
-#if defined(OS_POSIX) && !defined(OS_ANDROID)
+#if defined(OS_POSIX) && !defined(OS_ANDROID) && !defined(OS_CHROMEOS)
gssapi_library_name_(gssapi_library_name),
#endif
#if defined(OS_CHROMEOS)
@@ -51,7 +53,7 @@ std::string HttpAuthPreferences::AuthAndroidNegotiateAccountType() const {
return auth_android_negotiate_account_type_;
}
#endif
-#if defined(OS_POSIX) && !defined(OS_ANDROID)
+#if defined(OS_POSIX) && !defined(OS_ANDROID) && !defined(OS_CHROMEOS)
std::string HttpAuthPreferences::GssapiLibraryName() const {
return gssapi_library_name_;
}
diff --git a/chromium/net/http/http_auth_preferences.h b/chromium/net/http/http_auth_preferences.h
index a77b193d159..b0deb5666d2 100644
--- a/chromium/net/http/http_auth_preferences.h
+++ b/chromium/net/http/http_auth_preferences.h
@@ -11,6 +11,7 @@
#include <vector>
#include "base/macros.h"
+#include "build/build_config.h"
#include "net/base/net_export.h"
#include "url/gurl.h"
@@ -23,7 +24,7 @@ class URLSecurityManager;
class NET_EXPORT HttpAuthPreferences {
public:
HttpAuthPreferences(const std::vector<std::string>& auth_schemes
-#if defined(OS_POSIX) && !defined(OS_ANDROID)
+#if defined(OS_POSIX) && !defined(OS_ANDROID) && !defined(OS_CHROMEOS)
,
const std::string& gssapi_library_name
#endif
@@ -40,7 +41,7 @@ class NET_EXPORT HttpAuthPreferences {
#if defined(OS_ANDROID)
virtual std::string AuthAndroidNegotiateAccountType() const;
#endif
-#if defined(OS_POSIX) && !defined(OS_ANDROID)
+#if defined(OS_POSIX) && !defined(OS_ANDROID) && !defined(OS_CHROMEOS)
virtual std::string GssapiLibraryName() const;
#endif
#if defined(OS_CHROMEOS)
@@ -78,7 +79,7 @@ class NET_EXPORT HttpAuthPreferences {
#if defined(OS_ANDROID)
std::string auth_android_negotiate_account_type_;
#endif
-#if defined(OS_POSIX) && !defined(OS_ANDROID)
+#if defined(OS_POSIX) && !defined(OS_ANDROID) && !defined(OS_CHROMEOS)
// GSSAPI library name cannot change after startup, since changing it
// requires unloading the existing GSSAPI library, which could cause all
// sorts of problems for, for example, active Negotiate transactions.
diff --git a/chromium/net/http/http_auth_preferences_unittest.cc b/chromium/net/http/http_auth_preferences_unittest.cc
index f59f00f5892..174089c3ede 100644
--- a/chromium/net/http/http_auth_preferences_unittest.cc
+++ b/chromium/net/http/http_auth_preferences_unittest.cc
@@ -11,6 +11,7 @@
#include "base/run_loop.h"
#include "base/single_thread_task_runner.h"
#include "base/threading/thread.h"
+#include "build/build_config.h"
#include "testing/gtest/include/gtest/gtest.h"
namespace net {
@@ -20,7 +21,7 @@ TEST(HttpAuthPreferencesTest, AuthSchemes) {
std::vector<std::string> expected_schemes_vector(
expected_schemes, expected_schemes + arraysize(expected_schemes));
HttpAuthPreferences http_auth_preferences(expected_schemes_vector
-#if defined(OS_POSIX) && !defined(OS_ANDROID)
+#if defined(OS_POSIX) && !defined(OS_ANDROID) && !defined(OS_CHROMEOS)
,
""
#endif
@@ -37,7 +38,7 @@ TEST(HttpAuthPreferencesTest, AuthSchemes) {
TEST(HttpAuthPreferencesTest, DisableCnameLookup) {
std::vector<std::string> auth_schemes;
HttpAuthPreferences http_auth_preferences(auth_schemes
-#if defined(OS_POSIX) && !defined(OS_ANDROID)
+#if defined(OS_POSIX) && !defined(OS_ANDROID) && !defined(OS_CHROMEOS)
,
""
#endif
@@ -54,7 +55,7 @@ TEST(HttpAuthPreferencesTest, DisableCnameLookup) {
TEST(HttpAuthPreferencesTest, NegotiateEnablePort) {
std::vector<std::string> auth_schemes;
HttpAuthPreferences http_auth_preferences(auth_schemes
-#if defined(OS_POSIX) && !defined(OS_ANDROID)
+#if defined(OS_POSIX) && !defined(OS_ANDROID) && !defined(OS_CHROMEOS)
,
""
#endif
@@ -72,7 +73,7 @@ TEST(HttpAuthPreferencesTest, NegotiateEnablePort) {
TEST(HttpAuthPreferencesTest, AuthAndroidhNegotiateAccountType) {
std::vector<std::string> auth_schemes;
HttpAuthPreferences http_auth_preferences(auth_schemes
-#if defined(OS_POSIX) && !defined(OS_ANDROID)
+#if defined(OS_POSIX) && !defined(OS_ANDROID) && !defined(OS_CHROMEOS)
,
""
#endif
@@ -89,15 +90,10 @@ TEST(HttpAuthPreferencesTest, AuthAndroidhNegotiateAccountType) {
}
#endif
-#if defined(OS_POSIX) && !defined(OS_ANDROID)
+#if defined(OS_POSIX) && !defined(OS_ANDROID) && !defined(OS_CHROMEOS)
TEST(HttpAuthPreferencesTest, GssApiLibraryName) {
std::vector<std::string> AuthSchemes;
- HttpAuthPreferences http_auth_preferences(AuthSchemes, "bar"
-#if defined(OS_CHROMEOS)
- ,
- true
-#endif
- );
+ HttpAuthPreferences http_auth_preferences(AuthSchemes, "bar");
EXPECT_EQ(std::string("bar"), http_auth_preferences.GssapiLibraryName());
}
#endif
@@ -105,7 +101,7 @@ TEST(HttpAuthPreferencesTest, GssApiLibraryName) {
#if defined(OS_CHROMEOS)
TEST(HttpAuthPreferencesTest, AllowGssapiLibraryLoadTrue) {
std::vector<std::string> AuthSchemes;
- HttpAuthPreferences http_auth_preferences(AuthSchemes, "foo", true);
+ HttpAuthPreferences http_auth_preferences(AuthSchemes, true);
EXPECT_TRUE(http_auth_preferences.AllowGssapiLibraryLoad());
}
#endif
@@ -113,7 +109,7 @@ TEST(HttpAuthPreferencesTest, AllowGssapiLibraryLoadTrue) {
#if defined(OS_CHROMEOS)
TEST(HttpAuthPreferencesTest, AllowGssapiLibraryLoadFalse) {
std::vector<std::string> AuthSchemes;
- HttpAuthPreferences http_auth_preferences(AuthSchemes, "foo", false);
+ HttpAuthPreferences http_auth_preferences(AuthSchemes, false);
EXPECT_FALSE(http_auth_preferences.AllowGssapiLibraryLoad());
}
#endif
@@ -121,7 +117,7 @@ TEST(HttpAuthPreferencesTest, AllowGssapiLibraryLoadFalse) {
TEST(HttpAuthPreferencesTest, AuthServerWhitelist) {
std::vector<std::string> auth_schemes;
HttpAuthPreferences http_auth_preferences(auth_schemes
-#if defined(OS_POSIX) && !defined(OS_ANDROID)
+#if defined(OS_POSIX) && !defined(OS_ANDROID) && !defined(OS_CHROMEOS)
,
""
#endif
@@ -139,7 +135,7 @@ TEST(HttpAuthPreferencesTest, AuthServerWhitelist) {
TEST(HttpAuthPreferencesTest, AuthDelegateWhitelist) {
std::vector<std::string> auth_schemes;
HttpAuthPreferences http_auth_preferences(auth_schemes
-#if defined(OS_POSIX) && !defined(OS_ANDROID)
+#if defined(OS_POSIX) && !defined(OS_ANDROID) && !defined(OS_CHROMEOS)
,
""
#endif
diff --git a/chromium/net/http/http_cache.cc b/chromium/net/http/http_cache.cc
index 1b404a79ad6..283359bf5ef 100644
--- a/chromium/net/http/http_cache.cc
+++ b/chromium/net/http/http_cache.cc
@@ -67,8 +67,8 @@ HttpCache::DefaultBackend::~DefaultBackend() {}
// static
std::unique_ptr<HttpCache::BackendFactory> HttpCache::DefaultBackend::InMemory(
int max_bytes) {
- return base::WrapUnique(new DefaultBackend(
- MEMORY_CACHE, CACHE_BACKEND_DEFAULT, base::FilePath(), max_bytes));
+ return std::make_unique<DefaultBackend>(MEMORY_CACHE, CACHE_BACKEND_DEFAULT,
+ base::FilePath(), max_bytes);
}
int HttpCache::DefaultBackend::CreateBackend(
diff --git a/chromium/net/http/http_cache_lookup_manager.cc b/chromium/net/http/http_cache_lookup_manager.cc
index e1c43eb57db..804c3843acd 100644
--- a/chromium/net/http/http_cache_lookup_manager.cc
+++ b/chromium/net/http/http_cache_lookup_manager.cc
@@ -4,7 +4,8 @@
#include "net/http/http_cache_lookup_manager.h"
-#include "base/memory/ptr_util.h"
+#include <memory>
+
#include "base/values.h"
#include "net/base/load_flags.h"
diff --git a/chromium/net/http/http_cache_lookup_manager_unittest.cc b/chromium/net/http/http_cache_lookup_manager_unittest.cc
index 81b2bfec6c5..d3d8268a81d 100644
--- a/chromium/net/http/http_cache_lookup_manager_unittest.cc
+++ b/chromium/net/http/http_cache_lookup_manager_unittest.cc
@@ -2,9 +2,9 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
+#include <memory>
#include <string>
-#include "base/memory/ptr_util.h"
#include "base/run_loop.h"
#include "net/base/net_errors.h"
#include "net/base/test_completion_callback.h"
diff --git a/chromium/net/http/http_cache_transaction.cc b/chromium/net/http/http_cache_transaction.cc
index 8912d2eb320..d87bcd65335 100644
--- a/chromium/net/http/http_cache_transaction.cc
+++ b/chromium/net/http/http_cache_transaction.cc
@@ -1936,12 +1936,12 @@ int HttpCache::Transaction::DoFinishHeaders(int result) {
TransitionToState(STATE_FINISH_HEADERS_COMPLETE);
- // If it was an auth failure or 416, this transaction should continue to be
+ // If it was an auth failure, this transaction should continue to be
// headers_transaction till consumer takes an action, so no need to do
// anything now.
- if (auth_response_.headers.get() ||
- (new_response_ && new_response_->headers &&
- new_response_->headers->response_code() == 416))
+ // TODO(crbug.com/740947). See the issue for a suggestion for cleaning the
+ // state machine to be able to remove this condition.
+ if (auth_response_.headers.get())
return OK;
// If the transaction needs to wait because another transaction is still
diff --git a/chromium/net/http/http_cache_unittest.cc b/chromium/net/http/http_cache_unittest.cc
index 89cfbab892c..5a303baa688 100644
--- a/chromium/net/http/http_cache_unittest.cc
+++ b/chromium/net/http/http_cache_unittest.cc
@@ -67,6 +67,13 @@
using net::test::IsError;
using net::test::IsOk;
+using testing::Gt;
+using testing::AllOf;
+using testing::Contains;
+using testing::Eq;
+using testing::Field;
+using testing::Contains;
+using testing::ByRef;
using base::Time;
@@ -9584,18 +9591,14 @@ TEST_P(HttpCacheMemoryDumpTest, DumpMemoryStats) {
process_memory_dump->GetAllocatorDump(
"net/url_request_context/main/0x123/http_cache");
ASSERT_NE(nullptr, dump);
- std::unique_ptr<base::Value> raw_attrs =
- dump->attributes_for_testing()->ToBaseValue();
- base::DictionaryValue* attrs;
- ASSERT_TRUE(raw_attrs->GetAsDictionary(&attrs));
- base::DictionaryValue* size_attrs;
- ASSERT_TRUE(attrs->GetDictionary(
- base::trace_event::MemoryAllocatorDump::kNameSize, &size_attrs));
- std::string size;
- ASSERT_TRUE(size_attrs->GetString("value", &size));
- int actual_size = 0;
- ASSERT_TRUE(base::HexStringToInt(size, &actual_size));
- ASSERT_LT(0, actual_size);
+
+ using Entry = base::trace_event::MemoryAllocatorDump::Entry;
+ const std::vector<Entry>& entries = dump->entries();
+ ASSERT_THAT(entries,
+ Contains(AllOf(
+ Field(&Entry::name,
+ Eq(base::trace_event::MemoryAllocatorDump::kNameSize)),
+ Field(&Entry::value_uint64, Gt(0UL)))));
}
} // namespace net
diff --git a/chromium/net/http/http_network_session.cc b/chromium/net/http/http_network_session.cc
index d85516b37b2..6f8a9e39a06 100644
--- a/chromium/net/http/http_network_session.cc
+++ b/chromium/net/http/http_network_session.cc
@@ -13,8 +13,6 @@
#include "base/debug/stack_trace.h"
#include "base/logging.h"
#include "base/memory/memory_coordinator_client_registry.h"
-#include "base/memory/ptr_util.h"
-#include "base/profiler/scoped_tracker.h"
#include "base/strings/string_number_conversions.h"
#include "base/strings/string_util.h"
#include "base/strings/stringprintf.h"
@@ -102,7 +100,7 @@ HttpNetworkSession::Params::Params()
ignore_certificate_errors(false),
testing_fixed_http_port(0),
testing_fixed_https_port(0),
- enable_tcp_fast_open_for_ssl(false),
+ tcp_fast_open_mode(TcpFastOpenMode::DISABLED),
enable_user_alternate_protocol_ports(false),
enable_spdy_ping_based_connection_checking(true),
enable_http2(true),
@@ -114,9 +112,9 @@ HttpNetworkSession::Params::Params()
quic_max_server_configs_stored_in_properties(0u),
mark_quic_broken_when_network_blackholes(false),
retry_without_alt_svc_on_quic_errors(false),
- quic_close_sessions_on_ip_change(false),
quic_idle_connection_timeout_seconds(kIdleConnectionTimeoutSeconds),
quic_reduced_ping_timeout_seconds(kPingTimeoutSecs),
+ quic_connect_using_default_network(false),
quic_migrate_sessions_on_network_change(false),
quic_migrate_sessions_early(false),
quic_allow_server_migration(false),
@@ -188,14 +186,13 @@ HttpNetworkSession::HttpNetworkSession(const Params& params,
params.quic_max_packet_length,
params.quic_user_agent_id,
params.quic_max_server_configs_stored_in_properties > 0,
- params.quic_close_sessions_on_ip_change,
params.mark_quic_broken_when_network_blackholes,
params.quic_idle_connection_timeout_seconds,
params.quic_reduced_ping_timeout_seconds,
+ params.quic_connect_using_default_network,
params.quic_migrate_sessions_on_network_change,
params.quic_migrate_sessions_early,
params.quic_allow_server_migration,
- params.quic_force_hol_blocking,
params.quic_race_cert_verification,
params.quic_estimate_initial_rtt,
params.quic_connection_options,
@@ -337,8 +334,6 @@ std::unique_ptr<base::Value> HttpNetworkSession::QuicInfoToValue() const {
params_.quic_race_cert_verification);
dict->SetBoolean("disable_bidirectional_streams",
params_.quic_disable_bidirectional_streams);
- dict->SetBoolean("close_sessions_on_ip_change",
- params_.quic_close_sessions_on_ip_change);
dict->SetBoolean("migrate_sessions_on_network_change",
params_.quic_migrate_sessions_on_network_change);
dict->SetBoolean("migrate_sessions_early",
diff --git a/chromium/net/http/http_network_session.h b/chromium/net/http/http_network_session.h
index 19411c11a07..ebbf81a60b0 100644
--- a/chromium/net/http/http_network_session.h
+++ b/chromium/net/http/http_network_session.h
@@ -84,12 +84,22 @@ class NET_EXPORT HttpNetworkSession : public base::MemoryCoordinatorClient {
Params(const Params& other);
~Params();
+ enum class TcpFastOpenMode {
+ DISABLED,
+ // If true, TCP fast open will be used for all HTTPS connections.
+ ENABLED_FOR_SSL_ONLY,
+ // TCP fast open will be used for all HTTP/HTTPS connections.
+ // TODO(mmenke): With 0-RTT session resumption, does this option make
+ // sense?
+ ENABLED_FOR_ALL,
+ };
+
bool enable_server_push_cancellation;
HostMappingRules host_mapping_rules;
bool ignore_certificate_errors;
uint16_t testing_fixed_http_port;
uint16_t testing_fixed_https_port;
- bool enable_tcp_fast_open_for_ssl;
+ TcpFastOpenMode tcp_fast_open_mode;
bool enable_user_alternate_protocol_ports;
// Use SPDY ping frames to test for connection health after idle.
@@ -110,7 +120,7 @@ class NET_EXPORT HttpNetworkSession : public base::MemoryCoordinatorClient {
// QUIC runtime configuration options.
// Versions of QUIC which may be used.
- QuicVersionVector quic_supported_versions;
+ QuicTransportVersionVector quic_supported_versions;
// User agent description to send in the QUIC handshake.
std::string quic_user_agent_id;
// Limit on the size of QUIC packets.
@@ -134,13 +144,13 @@ class NET_EXPORT HttpNetworkSession : public base::MemoryCoordinatorClient {
// Retry requests which fail with QUIC_PROTOCOL_ERROR, and mark QUIC
// broken if the retry succeeds.
bool retry_without_alt_svc_on_quic_errors;
- // If true, all QUIC sessions are closed when any local IP address changes.
- bool quic_close_sessions_on_ip_change;
// Specifies QUIC idle connection state lifetime.
int quic_idle_connection_timeout_seconds;
// Specifies the reduced ping timeout subsequent connections should use when
// a connection was timed out with open streams.
int quic_reduced_ping_timeout_seconds;
+ // If true, QUIC will attempt to explicitly use default network for sockets.
+ bool quic_connect_using_default_network;
// If true, active QUIC sessions may be migrated onto a new network when
// the platform indicates that the default network is changing.
bool quic_migrate_sessions_on_network_change;
diff --git a/chromium/net/http/http_network_transaction.cc b/chromium/net/http/http_network_transaction.cc
index 2290f32d2c4..70bd489b669 100644
--- a/chromium/net/http/http_network_transaction.cc
+++ b/chromium/net/http/http_network_transaction.cc
@@ -16,7 +16,6 @@
#include "base/metrics/field_trial.h"
#include "base/metrics/histogram_macros.h"
#include "base/metrics/sparse_histogram.h"
-#include "base/profiler/scoped_tracker.h"
#include "base/stl_util.h"
#include "base/strings/string_number_conversions.h"
#include "base/strings/string_util.h"
@@ -225,6 +224,13 @@ void HttpNetworkTransaction::PrepareForAuthRestart(HttpAuth::Target target) {
DCHECK(HaveAuth(target));
DCHECK(!stream_request_.get());
+ // Authorization schemes incompatible with HTTP/2 are unsupported for proxies.
+ if (target == HttpAuth::AUTH_SERVER &&
+ auth_controllers_[target]->NeedsHTTP11()) {
+ session_->http_server_properties()->SetHTTP11Required(
+ HostPortPair::FromURL(request_->url));
+ }
+
bool keep_alive = false;
// Even if the server says the connection is keep-alive, we have to be
// able to find the end of each response in order to reuse the connection.
@@ -853,11 +859,6 @@ int HttpNetworkTransaction::DoNotifyBeforeCreateStream() {
}
int HttpNetworkTransaction::DoCreateStream() {
- // TODO(mmenke): Remove ScopedTracker below once crbug.com/424359 is fixed.
- tracked_objects::ScopedTracker tracking_profile(
- FROM_HERE_WITH_EXPLICIT_FUNCTION(
- "424359 HttpNetworkTransaction::DoCreateStream"));
-
response_.network_accessed = true;
next_state_ = STATE_CREATE_STREAM_COMPLETE;
@@ -1187,11 +1188,6 @@ int HttpNetworkTransaction::DoBuildRequestComplete(int result) {
}
int HttpNetworkTransaction::DoSendRequest() {
- // TODO(mmenke): Remove ScopedTracker below once crbug.com/424359 is fixed.
- tracked_objects::ScopedTracker tracking_profile(
- FROM_HERE_WITH_EXPLICIT_FUNCTION(
- "424359 HttpNetworkTransaction::DoSendRequest"));
-
send_start_time_ = base::TimeTicks::Now();
next_state_ = STATE_SEND_REQUEST_COMPLETE;
diff --git a/chromium/net/http/http_network_transaction_unittest.cc b/chromium/net/http/http_network_transaction_unittest.cc
index 0f1f7ffb358..95919a6d09b 100644
--- a/chromium/net/http/http_network_transaction_unittest.cc
+++ b/chromium/net/http/http_network_transaction_unittest.cc
@@ -103,6 +103,11 @@
#include "testing/platform_test.h"
#include "url/gurl.h"
+#if defined(NTLM_PORTABLE)
+#include "base/base64.h"
+#include "net/ntlm/ntlm_test_data.h"
+#endif
+
using net::test::IsError;
using net::test::IsOk;
@@ -223,7 +228,6 @@ const base::string16 kFoo2(ASCIIToUTF16("foo2"));
const base::string16 kFoo3(ASCIIToUTF16("foo3"));
const base::string16 kFou(ASCIIToUTF16("fou"));
const base::string16 kSecond(ASCIIToUTF16("second"));
-const base::string16 kTestingNTLM(ASCIIToUTF16("testing-ntlm"));
const base::string16 kWrongPassword(ASCIIToUTF16("wrongpassword"));
const char kAlternativeServiceHttpHeader[] =
@@ -644,31 +648,21 @@ void FillLargeHeadersString(std::string* str, int size) {
}
#if defined(NTLM_PORTABLE)
-// Alternative functions that eliminate randomness and dependency on the local
-// host name so that the generated NTLM messages are reproducible.
-void MockGenerateRandom1(uint8_t* output, size_t n) {
- static const uint8_t bytes[] = {0x55, 0x29, 0x66, 0x26,
- 0x6b, 0x9c, 0x73, 0x54};
- static size_t current_byte = 0;
- for (size_t i = 0; i < n; ++i) {
- output[i] = bytes[current_byte++];
- current_byte %= arraysize(bytes);
- }
+uint64_t MockGetMSTime() {
+ // Tue, 23 May 2017 20:13:07 +0000
+ return 131400439870000000;
}
-void MockGenerateRandom2(uint8_t* output, size_t n) {
- static const uint8_t bytes[] = {0x96, 0x79, 0x85, 0xe7, 0x49, 0x93,
- 0x70, 0xa1, 0x4e, 0xe7, 0x87, 0x45,
- 0x31, 0x5b, 0xd3, 0x1f};
- static size_t current_byte = 0;
- for (size_t i = 0; i < n; ++i) {
- output[i] = bytes[current_byte++];
- current_byte %= arraysize(bytes);
- }
+// Alternative functions that eliminate randomness and dependency on the local
+// host name so that the generated NTLM messages are reproducible.
+void MockGenerateRandom(uint8_t* output, size_t n) {
+ // This is set to 0xaa because the client challenge for testing in
+ // [MS-NLMP] Section 4.2.1 is 8 bytes of 0xaa.
+ memset(output, 0xaa, n);
}
std::string MockGetHostName() {
- return "WTC-WIN7";
+ return ntlm::test::kHostnameAscii;
}
#endif // defined(NTLM_PORTABLE)
@@ -805,7 +799,7 @@ bool CheckNTLMServerAuth(const AuthChallengeInfo* auth_challenge) {
if (!auth_challenge)
return false;
EXPECT_FALSE(auth_challenge->is_proxy);
- EXPECT_EQ("http://172.22.68.17", auth_challenge->challenger.Serialize());
+ EXPECT_EQ("https://172.22.68.17", auth_challenge->challenger.Serialize());
EXPECT_EQ(std::string(), auth_challenge->realm);
EXPECT_EQ(kNtlmAuthScheme, auth_challenge->scheme);
return true;
@@ -5201,8 +5195,8 @@ TEST_F(HttpNetworkTransactionTest,
// CONNECT to mail.example.org:443 via SPDY.
SpdyHeaderBlock connect2_block;
- connect2_block[spdy_util_.GetMethodKey()] = "CONNECT";
- connect2_block[spdy_util_.GetHostKey()] = "mail.example.org:443";
+ connect2_block[kHttp2MethodHeader] = "CONNECT";
+ connect2_block[kHttp2AuthorityHeader] = "mail.example.org:443";
SpdySerializedFrame connect2(spdy_util_.ConstructSpdyHeaders(
3, std::move(connect2_block), LOWEST, false));
@@ -5942,24 +5936,47 @@ TEST_F(HttpNetworkTransactionTest, BasicAuthProxyThenServer) {
// can't hook into its internals to cause it to generate predictable NTLM
// authorization headers.
#if defined(NTLM_PORTABLE)
-// The NTLM authentication unit tests were generated by capturing the HTTP
-// requests and responses using Fiddler 2 and inspecting the generated random
-// bytes in the debugger.
+// The NTLM authentication unit tests are based on known test data from the
+// [MS-NLMP] Specification [1]. These tests are primarily of the authentication
+// flow rather than the implementation of the NTLM protocol. See net/ntlm
+// for the implementation and testing of the protocol.
+//
+// [1] https://msdn.microsoft.com/en-us/library/cc236621.aspx
// Enter the correct password and authenticate successfully.
-TEST_F(HttpNetworkTransactionTest, NTLMAuth1) {
+TEST_F(HttpNetworkTransactionTest, NTLMAuthV1) {
HttpRequestInfo request;
request.method = "GET";
- request.url = GURL("http://172.22.68.17/kids/login.aspx");
+ request.url = GURL("https://172.22.68.17/kids/login.aspx");
// Ensure load is not disrupted by flags which suppress behaviour specific
// to other auth schemes.
request.load_flags = LOAD_DO_NOT_USE_EMBEDDED_IDENTITY;
- HttpAuthHandlerNTLM::ScopedProcSetter proc_setter(MockGenerateRandom1,
- MockGetHostName);
+ HttpAuthHandlerNTLM::ScopedProcSetter proc_setter(
+ MockGetMSTime, MockGenerateRandom, MockGetHostName);
std::unique_ptr<HttpNetworkSession> session(CreateSession(&session_deps_));
+ // Generate the NTLM messages based on known test data.
+ std::string negotiate_msg;
+ std::string challenge_msg;
+ std::string authenticate_msg;
+ base::Base64Encode(
+ base::StringPiece(
+ reinterpret_cast<const char*>(ntlm::test::kExpectedNegotiateMsg),
+ arraysize(ntlm::test::kExpectedNegotiateMsg)),
+ &negotiate_msg);
+ base::Base64Encode(base::StringPiece(reinterpret_cast<const char*>(
+ ntlm::test::kChallengeMsgV1),
+ arraysize(ntlm::test::kChallengeMsgV1)),
+ &challenge_msg);
+ base::Base64Encode(
+ base::StringPiece(
+ reinterpret_cast<const char*>(
+ ntlm::test::kExpectedAuthenticateMsgSpecResponseV1),
+ arraysize(ntlm::test::kExpectedAuthenticateMsgSpecResponseV1)),
+ &authenticate_msg);
+
MockWrite data_writes1[] = {
MockWrite("GET /kids/login.aspx HTTP/1.1\r\n"
"Host: 172.22.68.17\r\n"
@@ -5976,7 +5993,6 @@ TEST_F(HttpNetworkTransactionTest, NTLMAuth1) {
MockRead("Content-Length: 42\r\n"),
MockRead("Content-Type: text/html\r\n\r\n"),
// Missing content -- won't matter, as connection will be reset.
- MockRead(SYNCHRONOUS, ERR_UNEXPECTED),
};
MockWrite data_writes2[] = {
@@ -5986,43 +6002,31 @@ TEST_F(HttpNetworkTransactionTest, NTLMAuth1) {
MockWrite("GET /kids/login.aspx HTTP/1.1\r\n"
"Host: 172.22.68.17\r\n"
"Connection: keep-alive\r\n"
- "Authorization: NTLM "
- "TlRMTVNTUAABAAAAB4IIAAAAAAAAAAAAAAAAAAAAAAA=\r\n\r\n"),
+ "Authorization: NTLM "),
+ MockWrite(negotiate_msg.c_str()), MockWrite("\r\n\r\n"),
// After calling trans.RestartWithAuth(), we should send a Type 3 message
- // (the credentials for the origin server). The second request continues
- // on the same connection.
+ // (using correct credentials). The second request continues on the
+ // same connection.
MockWrite("GET /kids/login.aspx HTTP/1.1\r\n"
"Host: 172.22.68.17\r\n"
"Connection: keep-alive\r\n"
- "Authorization: NTLM TlRMTVNTUAADAAAAGAAYAGgAAAAYABgAgA"
- "AAAAAAAABAAAAAGAAYAEAAAAAQABAAWAAAAAAAAAAAAAAABYIIAHQA"
- "ZQBzAHQAaQBuAGcALQBuAHQAbABtAFcAVABDAC0AVwBJAE4ANwBVKW"
- "Yma5xzVAAAAAAAAAAAAAAAAAAAAACH+gWcm+YsP9Tqb9zCR3WAeZZX"
- "ahlhx5I=\r\n\r\n"),
+ "Authorization: NTLM "),
+ MockWrite(authenticate_msg.c_str()), MockWrite("\r\n\r\n"),
};
MockRead data_reads2[] = {
- // The origin server responds with a Type 2 message.
- MockRead("HTTP/1.1 401 Access Denied\r\n"),
- MockRead("WWW-Authenticate: NTLM "
- "TlRMTVNTUAACAAAADAAMADgAAAAFgokCjGpMpPGlYKkAAAAAAAAAALo"
- "AugBEAAAABQEoCgAAAA9HAE8ATwBHAEwARQACAAwARwBPAE8ARwBMAE"
- "UAAQAaAEEASwBFAEUAUwBBAFIAQQAtAEMATwBSAFAABAAeAGMAbwByA"
- "HAALgBnAG8AbwBnAGwAZQAuAGMAbwBtAAMAQABhAGsAZQBlAHMAYQBy"
- "AGEALQBjAG8AcgBwAC4AYQBkAC4AYwBvAHIAcAAuAGcAbwBvAGcAbAB"
- "lAC4AYwBvAG0ABQAeAGMAbwByAHAALgBnAG8AbwBnAGwAZQAuAGMAbw"
- "BtAAAAAAA=\r\n"),
- MockRead("Content-Length: 42\r\n"),
- MockRead("Content-Type: text/html\r\n\r\n"),
- MockRead("You are not authorized to view this page\r\n"),
-
- // Lastly we get the desired content.
- MockRead("HTTP/1.1 200 OK\r\n"),
- MockRead("Content-Type: text/html; charset=utf-8\r\n"),
- MockRead("Content-Length: 13\r\n\r\n"),
- MockRead("Please Login\r\n"),
- MockRead(SYNCHRONOUS, OK),
+ // The origin server responds with a Type 2 message.
+ MockRead("HTTP/1.1 401 Access Denied\r\n"),
+ MockRead("WWW-Authenticate: NTLM "), MockRead(challenge_msg.c_str()),
+ MockRead("\r\n"), MockRead("Content-Length: 42\r\n"),
+ MockRead("Content-Type: text/html\r\n\r\n"),
+ MockRead("You are not authorized to view this page\r\n"),
+
+ // Lastly we get the desired content.
+ MockRead("HTTP/1.1 200 OK\r\n"),
+ MockRead("Content-Type: text/html; charset=utf-8\r\n"),
+ MockRead("Content-Length: 14\r\n\r\n"), MockRead("Please Login\r\n"),
};
StaticSocketDataProvider data1(data_reads1, arraysize(data_reads1),
@@ -6032,6 +6036,11 @@ TEST_F(HttpNetworkTransactionTest, NTLMAuth1) {
session_deps_.socket_factory->AddSocketDataProvider(&data1);
session_deps_.socket_factory->AddSocketDataProvider(&data2);
+ SSLSocketDataProvider ssl1(ASYNC, OK);
+ session_deps_.socket_factory->AddSSLSocketDataProvider(&ssl1);
+ SSLSocketDataProvider ssl2(ASYNC, OK);
+ session_deps_.socket_factory->AddSSLSocketDataProvider(&ssl2);
+
TestCompletionCallback callback1;
HttpNetworkTransaction trans(DEFAULT_PRIORITY, session.get());
@@ -6050,8 +6059,9 @@ TEST_F(HttpNetworkTransactionTest, NTLMAuth1) {
TestCompletionCallback callback2;
- rv = trans.RestartWithAuth(AuthCredentials(kTestingNTLM, kTestingNTLM),
- callback2.callback());
+ rv = trans.RestartWithAuth(
+ AuthCredentials(ntlm::test::kDomainUserCombined, ntlm::test::kPassword),
+ callback2.callback());
EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
rv = callback2.WaitForResult();
@@ -6074,19 +6084,66 @@ TEST_F(HttpNetworkTransactionTest, NTLMAuth1) {
response = trans.GetResponseInfo();
ASSERT_TRUE(response);
EXPECT_FALSE(response->auth_challenge);
- EXPECT_EQ(13, response->headers->GetContentLength());
+ EXPECT_EQ(14, response->headers->GetContentLength());
+
+ std::string response_data;
+ rv = ReadTransaction(&trans, &response_data);
+ EXPECT_THAT(rv, IsOk());
+ EXPECT_EQ("Please Login\r\n", response_data);
+
+ EXPECT_TRUE(data1.AllReadDataConsumed());
+ EXPECT_TRUE(data1.AllWriteDataConsumed());
+ EXPECT_TRUE(data2.AllReadDataConsumed());
+ EXPECT_TRUE(data2.AllWriteDataConsumed());
}
// Enter a wrong password, and then the correct one.
-TEST_F(HttpNetworkTransactionTest, NTLMAuth2) {
+TEST_F(HttpNetworkTransactionTest, NTLMAuthV1WrongThenRightPassword) {
HttpRequestInfo request;
request.method = "GET";
- request.url = GURL("http://172.22.68.17/kids/login.aspx");
+ request.url = GURL("https://172.22.68.17/kids/login.aspx");
- HttpAuthHandlerNTLM::ScopedProcSetter proc_setter(MockGenerateRandom2,
- MockGetHostName);
+ HttpAuthHandlerNTLM::ScopedProcSetter proc_setter(
+ MockGetMSTime, MockGenerateRandom, MockGetHostName);
std::unique_ptr<HttpNetworkSession> session(CreateSession(&session_deps_));
+ // Generate the NTLM messages based on known test data.
+ std::string negotiate_msg;
+ std::string challenge_msg;
+ std::string authenticate_msg;
+ base::Base64Encode(
+ base::StringPiece(
+ reinterpret_cast<const char*>(ntlm::test::kExpectedNegotiateMsg),
+ arraysize(ntlm::test::kExpectedNegotiateMsg)),
+ &negotiate_msg);
+ base::Base64Encode(base::StringPiece(reinterpret_cast<const char*>(
+ ntlm::test::kChallengeMsgV1),
+ arraysize(ntlm::test::kChallengeMsgV1)),
+ &challenge_msg);
+ base::Base64Encode(
+ base::StringPiece(
+ reinterpret_cast<const char*>(
+ ntlm::test::kExpectedAuthenticateMsgSpecResponseV1),
+ arraysize(ntlm::test::kExpectedAuthenticateMsgSpecResponseV1)),
+ &authenticate_msg);
+
+ // The authenticate message when |kWrongPassword| is sent.
+ std::string wrong_password_authenticate_msg(
+ "TlRMTVNTUAADAAAAGAAYAEAAAAAYABgAWAAAAAwADABwAAAACAAIAHwAAAAQABAAhAAAAAAA"
+ "AABAAAAAA4IIAKqqqqqqqqqqAAAAAAAAAAAAAAAAAAAAAF2npafgDxlql9qxEIhLlsuuJIEd"
+ "NQHk7kQAbwBtAGEAaQBuAFUAcwBlAHIAQwBPAE0AUABVAFQARQBSAA==");
+
+ // Sanity check that this is the same as |authenticate_msg| except for the
+ // 24 bytes (32 encoded chars) of the NTLM Response.
+ ASSERT_EQ(authenticate_msg.length(),
+ wrong_password_authenticate_msg.length());
+ ASSERT_EQ(authenticate_msg.length(), 200u);
+ ASSERT_EQ(base::StringPiece(authenticate_msg.data(), 117),
+ base::StringPiece(wrong_password_authenticate_msg.data(), 117));
+ ASSERT_EQ(
+ base::StringPiece(authenticate_msg.data() + 149, 51),
+ base::StringPiece(wrong_password_authenticate_msg.data() + 149, 51));
+
MockWrite data_writes1[] = {
MockWrite("GET /kids/login.aspx HTTP/1.1\r\n"
"Host: 172.22.68.17\r\n"
@@ -6103,7 +6160,6 @@ TEST_F(HttpNetworkTransactionTest, NTLMAuth2) {
MockRead("Content-Length: 42\r\n"),
MockRead("Content-Type: text/html\r\n\r\n"),
// Missing content -- won't matter, as connection will be reset.
- MockRead(SYNCHRONOUS, ERR_UNEXPECTED),
};
MockWrite data_writes2[] = {
@@ -6113,45 +6169,33 @@ TEST_F(HttpNetworkTransactionTest, NTLMAuth2) {
MockWrite("GET /kids/login.aspx HTTP/1.1\r\n"
"Host: 172.22.68.17\r\n"
"Connection: keep-alive\r\n"
- "Authorization: NTLM "
- "TlRMTVNTUAABAAAAB4IIAAAAAAAAAAAAAAAAAAAAAAA=\r\n\r\n"),
+ "Authorization: NTLM "),
+ MockWrite(negotiate_msg.c_str()), MockWrite("\r\n\r\n"),
// After calling trans.RestartWithAuth(), we should send a Type 3 message
- // (the credentials for the origin server). The second request continues
- // on the same connection.
+ // (using incorrect credentials). The second request continues on the
+ // same connection.
MockWrite("GET /kids/login.aspx HTTP/1.1\r\n"
"Host: 172.22.68.17\r\n"
"Connection: keep-alive\r\n"
- "Authorization: NTLM TlRMTVNTUAADAAAAGAAYAGgAAAAYABgAgA"
- "AAAAAAAABAAAAAGAAYAEAAAAAQABAAWAAAAAAAAAAAAAAABYIIAHQA"
- "ZQBzAHQAaQBuAGcALQBuAHQAbABtAFcAVABDAC0AVwBJAE4ANwCWeY"
- "XnSZNwoQAAAAAAAAAAAAAAAAAAAADLa34/phTTKzNTWdub+uyFleOj"
- "4Ww7b7E=\r\n\r\n"),
+ "Authorization: NTLM "),
+ MockWrite(wrong_password_authenticate_msg.c_str()), MockWrite("\r\n\r\n"),
};
MockRead data_reads2[] = {
- // The origin server responds with a Type 2 message.
- MockRead("HTTP/1.1 401 Access Denied\r\n"),
- MockRead("WWW-Authenticate: NTLM "
- "TlRMTVNTUAACAAAADAAMADgAAAAFgokCbVWUZezVGpAAAAAAAAAAALo"
- "AugBEAAAABQEoCgAAAA9HAE8ATwBHAEwARQACAAwARwBPAE8ARwBMAE"
- "UAAQAaAEEASwBFAEUAUwBBAFIAQQAtAEMATwBSAFAABAAeAGMAbwByA"
- "HAALgBnAG8AbwBnAGwAZQAuAGMAbwBtAAMAQABhAGsAZQBlAHMAYQBy"
- "AGEALQBjAG8AcgBwAC4AYQBkAC4AYwBvAHIAcAAuAGcAbwBvAGcAbAB"
- "lAC4AYwBvAG0ABQAeAGMAbwByAHAALgBnAG8AbwBnAGwAZQAuAGMAbw"
- "BtAAAAAAA=\r\n"),
- MockRead("Content-Length: 42\r\n"),
- MockRead("Content-Type: text/html\r\n\r\n"),
- MockRead("You are not authorized to view this page\r\n"),
+ // The origin server responds with a Type 2 message.
+ MockRead("HTTP/1.1 401 Access Denied\r\n"),
+ MockRead("WWW-Authenticate: NTLM "), MockRead(challenge_msg.c_str()),
+ MockRead("\r\n"), MockRead("Content-Length: 42\r\n"),
+ MockRead("Content-Type: text/html\r\n\r\n"),
+ MockRead("You are not authorized to view this page\r\n"),
- // Wrong password.
- MockRead("HTTP/1.1 401 Access Denied\r\n"),
- MockRead("WWW-Authenticate: NTLM\r\n"),
- MockRead("Connection: close\r\n"),
- MockRead("Content-Length: 42\r\n"),
- MockRead("Content-Type: text/html\r\n\r\n"),
- // Missing content -- won't matter, as connection will be reset.
- MockRead(SYNCHRONOUS, ERR_UNEXPECTED),
+ // Wrong password.
+ MockRead("HTTP/1.1 401 Access Denied\r\n"),
+ MockRead("WWW-Authenticate: NTLM\r\n"), MockRead("Connection: close\r\n"),
+ MockRead("Content-Length: 42\r\n"),
+ MockRead("Content-Type: text/html\r\n\r\n"),
+ // Missing content -- won't matter, as connection will be reset.
};
MockWrite data_writes3[] = {
@@ -6161,8 +6205,8 @@ TEST_F(HttpNetworkTransactionTest, NTLMAuth2) {
MockWrite("GET /kids/login.aspx HTTP/1.1\r\n"
"Host: 172.22.68.17\r\n"
"Connection: keep-alive\r\n"
- "Authorization: NTLM "
- "TlRMTVNTUAABAAAAB4IIAAAAAAAAAAAAAAAAAAAAAAA=\r\n\r\n"),
+ "Authorization: NTLM "),
+ MockWrite(negotiate_msg.c_str()), MockWrite("\r\n\r\n"),
// After calling trans.RestartWithAuth(), we should send a Type 3 message
// (the credentials for the origin server). The second request continues
@@ -6170,34 +6214,22 @@ TEST_F(HttpNetworkTransactionTest, NTLMAuth2) {
MockWrite("GET /kids/login.aspx HTTP/1.1\r\n"
"Host: 172.22.68.17\r\n"
"Connection: keep-alive\r\n"
- "Authorization: NTLM TlRMTVNTUAADAAAAGAAYAGgAAAAYABgAgA"
- "AAAAAAAABAAAAAGAAYAEAAAAAQABAAWAAAAAAAAAAAAAAABYIIAHQA"
- "ZQBzAHQAaQBuAGcALQBuAHQAbABtAFcAVABDAC0AVwBJAE4ANwBO54"
- "dFMVvTHwAAAAAAAAAAAAAAAAAAAACS7sT6Uzw7L0L//WUqlIaVWpbI"
- "+4MUm7c=\r\n\r\n"),
+ "Authorization: NTLM "),
+ MockWrite(authenticate_msg.c_str()), MockWrite("\r\n\r\n"),
};
MockRead data_reads3[] = {
- // The origin server responds with a Type 2 message.
- MockRead("HTTP/1.1 401 Access Denied\r\n"),
- MockRead("WWW-Authenticate: NTLM "
- "TlRMTVNTUAACAAAADAAMADgAAAAFgokCL24VN8dgOR8AAAAAAAAAALo"
- "AugBEAAAABQEoCgAAAA9HAE8ATwBHAEwARQACAAwARwBPAE8ARwBMAE"
- "UAAQAaAEEASwBFAEUAUwBBAFIAQQAtAEMATwBSAFAABAAeAGMAbwByA"
- "HAALgBnAG8AbwBnAGwAZQAuAGMAbwBtAAMAQABhAGsAZQBlAHMAYQBy"
- "AGEALQBjAG8AcgBwAC4AYQBkAC4AYwBvAHIAcAAuAGcAbwBvAGcAbAB"
- "lAC4AYwBvAG0ABQAeAGMAbwByAHAALgBnAG8AbwBnAGwAZQAuAGMAbw"
- "BtAAAAAAA=\r\n"),
- MockRead("Content-Length: 42\r\n"),
- MockRead("Content-Type: text/html\r\n\r\n"),
- MockRead("You are not authorized to view this page\r\n"),
-
- // Lastly we get the desired content.
- MockRead("HTTP/1.1 200 OK\r\n"),
- MockRead("Content-Type: text/html; charset=utf-8\r\n"),
- MockRead("Content-Length: 13\r\n\r\n"),
- MockRead("Please Login\r\n"),
- MockRead(SYNCHRONOUS, OK),
+ // The origin server responds with a Type 2 message.
+ MockRead("HTTP/1.1 401 Access Denied\r\n"),
+ MockRead("WWW-Authenticate: NTLM "), MockRead(challenge_msg.c_str()),
+ MockRead("\r\n"), MockRead("Content-Length: 42\r\n"),
+ MockRead("Content-Type: text/html\r\n\r\n"),
+ MockRead("You are not authorized to view this page\r\n"),
+
+ // Lastly we get the desired content.
+ MockRead("HTTP/1.1 200 OK\r\n"),
+ MockRead("Content-Type: text/html; charset=utf-8\r\n"),
+ MockRead("Content-Length: 14\r\n\r\n"), MockRead("Please Login\r\n"),
};
StaticSocketDataProvider data1(data_reads1, arraysize(data_reads1),
@@ -6210,6 +6242,13 @@ TEST_F(HttpNetworkTransactionTest, NTLMAuth2) {
session_deps_.socket_factory->AddSocketDataProvider(&data2);
session_deps_.socket_factory->AddSocketDataProvider(&data3);
+ SSLSocketDataProvider ssl1(ASYNC, OK);
+ session_deps_.socket_factory->AddSSLSocketDataProvider(&ssl1);
+ SSLSocketDataProvider ssl2(ASYNC, OK);
+ session_deps_.socket_factory->AddSSLSocketDataProvider(&ssl2);
+ SSLSocketDataProvider ssl3(ASYNC, OK);
+ session_deps_.socket_factory->AddSSLSocketDataProvider(&ssl3);
+
TestCompletionCallback callback1;
HttpNetworkTransaction trans(DEFAULT_PRIORITY, session.get());
@@ -6229,8 +6268,9 @@ TEST_F(HttpNetworkTransactionTest, NTLMAuth2) {
TestCompletionCallback callback2;
// Enter the wrong password.
- rv = trans.RestartWithAuth(AuthCredentials(kTestingNTLM, kWrongPassword),
- callback2.callback());
+ rv = trans.RestartWithAuth(
+ AuthCredentials(ntlm::test::kDomainUserCombined, kWrongPassword),
+ callback2.callback());
EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
rv = callback2.WaitForResult();
@@ -6251,8 +6291,9 @@ TEST_F(HttpNetworkTransactionTest, NTLMAuth2) {
TestCompletionCallback callback4;
// Now enter the right password.
- rv = trans.RestartWithAuth(AuthCredentials(kTestingNTLM, kTestingNTLM),
- callback4.callback());
+ rv = trans.RestartWithAuth(
+ AuthCredentials(ntlm::test::kDomainUserCombined, ntlm::test::kPassword),
+ callback4.callback());
EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
rv = callback4.WaitForResult();
@@ -6271,7 +6312,180 @@ TEST_F(HttpNetworkTransactionTest, NTLMAuth2) {
response = trans.GetResponseInfo();
EXPECT_FALSE(response->auth_challenge);
- EXPECT_EQ(13, response->headers->GetContentLength());
+ EXPECT_EQ(14, response->headers->GetContentLength());
+
+ std::string response_data;
+ rv = ReadTransaction(&trans, &response_data);
+ EXPECT_THAT(rv, IsOk());
+ EXPECT_EQ("Please Login\r\n", response_data);
+
+ EXPECT_TRUE(data1.AllReadDataConsumed());
+ EXPECT_TRUE(data1.AllWriteDataConsumed());
+ EXPECT_TRUE(data2.AllReadDataConsumed());
+ EXPECT_TRUE(data2.AllWriteDataConsumed());
+ EXPECT_TRUE(data3.AllReadDataConsumed());
+ EXPECT_TRUE(data3.AllWriteDataConsumed());
+}
+
+// Server requests NTLM authentication, which is not supported over HTTP/2.
+// Subsequent request with authorization header should be sent over HTTP/1.1.
+TEST_F(HttpNetworkTransactionTest, NTLMOverHttp2) {
+ HttpAuthHandlerNTLM::ScopedProcSetter proc_setter(
+ MockGetMSTime, MockGenerateRandom, MockGetHostName);
+
+ const char* kUrl = "https://172.22.68.17/kids/login.aspx";
+
+ HttpRequestInfo request;
+ request.method = "GET";
+ request.url = GURL(kUrl);
+
+ // First request without credentials.
+ SpdyHeaderBlock request_headers0(spdy_util_.ConstructGetHeaderBlock(kUrl));
+ SpdySerializedFrame request0(spdy_util_.ConstructSpdyHeaders(
+ 1, std::move(request_headers0), LOWEST, true));
+
+ SpdyHeaderBlock response_headers0;
+ response_headers0[kHttp2StatusHeader] = "401";
+ response_headers0["www-authenticate"] = "NTLM";
+ SpdySerializedFrame resp(spdy_util_.ConstructSpdyResponseHeaders(
+ 1, std::move(response_headers0), true));
+
+ // Stream 1 is closed.
+ spdy_util_.UpdateWithStreamDestruction(1);
+
+ // Generate the NTLM messages based on known test data.
+ std::string negotiate_msg;
+ std::string challenge_msg;
+ std::string authenticate_msg;
+ base::Base64Encode(
+ base::StringPiece(
+ reinterpret_cast<const char*>(ntlm::test::kExpectedNegotiateMsg),
+ arraysize(ntlm::test::kExpectedNegotiateMsg)),
+ &negotiate_msg);
+ base::Base64Encode(base::StringPiece(reinterpret_cast<const char*>(
+ ntlm::test::kChallengeMsgV1),
+ arraysize(ntlm::test::kChallengeMsgV1)),
+ &challenge_msg);
+ base::Base64Encode(
+ base::StringPiece(
+ reinterpret_cast<const char*>(
+ ntlm::test::kExpectedAuthenticateMsgSpecResponseV1),
+ arraysize(ntlm::test::kExpectedAuthenticateMsgSpecResponseV1)),
+ &authenticate_msg);
+
+ // Retry with authorization header.
+ SpdyHeaderBlock request_headers1(spdy_util_.ConstructGetHeaderBlock(kUrl));
+ request_headers1["authorization"] = std::string("NTLM ") + negotiate_msg;
+ SpdySerializedFrame request1(spdy_util_.ConstructSpdyHeaders(
+ 3, std::move(request_headers1), LOWEST, true));
+
+ SpdySerializedFrame rst(
+ spdy_util_.ConstructSpdyRstStream(3, ERROR_CODE_HTTP_1_1_REQUIRED));
+
+ MockWrite writes0[] = {CreateMockWrite(request0, 0)};
+ MockRead reads0[] = {CreateMockRead(resp, 1), MockRead(ASYNC, 0, 2)};
+
+ // Retry yet again using HTTP/1.1.
+ MockWrite writes1[] = {
+ // After restarting with a null identity, this is the
+ // request we should be issuing -- the final header line contains a Type
+ // 1 message.
+ MockWrite("GET /kids/login.aspx HTTP/1.1\r\n"
+ "Host: 172.22.68.17\r\n"
+ "Connection: keep-alive\r\n"
+ "Authorization: NTLM "),
+ MockWrite(negotiate_msg.c_str()), MockWrite("\r\n\r\n"),
+
+ // After calling trans.RestartWithAuth(), we should send a Type 3 message
+ // (the credentials for the origin server). The second request continues
+ // on the same connection.
+ MockWrite("GET /kids/login.aspx HTTP/1.1\r\n"
+ "Host: 172.22.68.17\r\n"
+ "Connection: keep-alive\r\n"
+ "Authorization: NTLM "),
+ MockWrite(authenticate_msg.c_str()), MockWrite("\r\n\r\n"),
+ };
+
+ MockRead reads1[] = {
+ // The origin server responds with a Type 2 message.
+ MockRead("HTTP/1.1 401 Access Denied\r\n"),
+ MockRead("WWW-Authenticate: NTLM "), MockRead(challenge_msg.c_str()),
+ MockRead("\r\n"), MockRead("Content-Length: 42\r\n"),
+ MockRead("Content-Type: text/html\r\n\r\n"),
+ MockRead("You are not authorized to view this page\r\n"),
+
+ // Lastly we get the desired content.
+ MockRead("HTTP/1.1 200 OK\r\n"),
+ MockRead("Content-Type: text/html; charset=utf-8\r\n"),
+ MockRead("Content-Length: 14\r\n\r\n"), MockRead("Please Login\r\n"),
+ };
+ SequencedSocketData data0(reads0, arraysize(reads0), writes0,
+ arraysize(writes0));
+ StaticSocketDataProvider data1(reads1, arraysize(reads1), writes1,
+ arraysize(writes1));
+ session_deps_.socket_factory->AddSocketDataProvider(&data0);
+ session_deps_.socket_factory->AddSocketDataProvider(&data1);
+
+ SSLSocketDataProvider ssl0(ASYNC, OK);
+ ssl0.next_proto = kProtoHTTP2;
+ SSLSocketDataProvider ssl1(ASYNC, OK);
+ session_deps_.socket_factory->AddSSLSocketDataProvider(&ssl0);
+ session_deps_.socket_factory->AddSSLSocketDataProvider(&ssl1);
+
+ std::unique_ptr<HttpNetworkSession> session(CreateSession(&session_deps_));
+ HttpNetworkTransaction trans(DEFAULT_PRIORITY, session.get());
+
+ TestCompletionCallback callback1;
+ int rv = trans.Start(&request, callback1.callback(), NetLogWithSource());
+ EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
+
+ rv = callback1.WaitForResult();
+ EXPECT_THAT(rv, IsOk());
+
+ EXPECT_FALSE(trans.IsReadyToRestartForAuth());
+
+ const HttpResponseInfo* response = trans.GetResponseInfo();
+ ASSERT_TRUE(response);
+ EXPECT_TRUE(CheckNTLMServerAuth(response->auth_challenge.get()));
+
+ TestCompletionCallback callback2;
+
+ rv = trans.RestartWithAuth(
+ AuthCredentials(ntlm::test::kDomainUserCombined, ntlm::test::kPassword),
+ callback2.callback());
+ EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
+
+ rv = callback2.WaitForResult();
+ EXPECT_THAT(rv, IsOk());
+
+ EXPECT_TRUE(trans.IsReadyToRestartForAuth());
+
+ response = trans.GetResponseInfo();
+ ASSERT_TRUE(response);
+ EXPECT_FALSE(response->auth_challenge);
+
+ TestCompletionCallback callback3;
+
+ rv = trans.RestartWithAuth(AuthCredentials(), callback3.callback());
+ EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
+
+ rv = callback3.WaitForResult();
+ EXPECT_THAT(rv, IsOk());
+
+ response = trans.GetResponseInfo();
+ ASSERT_TRUE(response);
+ EXPECT_FALSE(response->auth_challenge);
+ EXPECT_EQ(14, response->headers->GetContentLength());
+
+ std::string response_data;
+ rv = ReadTransaction(&trans, &response_data);
+ EXPECT_THAT(rv, IsOk());
+ EXPECT_EQ("Please Login\r\n", response_data);
+
+ EXPECT_TRUE(data0.AllReadDataConsumed());
+ EXPECT_TRUE(data0.AllWriteDataConsumed());
+ EXPECT_TRUE(data1.AllReadDataConsumed());
+ EXPECT_TRUE(data1.AllWriteDataConsumed());
}
#endif // NTLM_PORTABLE
@@ -13787,7 +14001,7 @@ TEST_F(HttpNetworkTransactionTest, RetryWithoutConnectionPooling) {
SpdySerializedFrame resp1(spdy_util_.ConstructSpdyGetReply(nullptr, 0, 1));
SpdySerializedFrame body1(spdy_util_.ConstructSpdyDataFrame(1, true));
SpdyHeaderBlock response_headers;
- response_headers[SpdyTestUtil::GetStatusKey()] = "421";
+ response_headers[kHttp2StatusHeader] = "421";
SpdySerializedFrame resp2(
spdy_util_.ConstructSpdyReply(3, std::move(response_headers)));
MockRead reads1[] = {CreateMockRead(resp1, 1), CreateMockRead(body1, 2),
@@ -13915,7 +14129,7 @@ TEST_F(HttpNetworkTransactionTest, ReturnHTTP421OnRetry) {
SpdySerializedFrame resp1(spdy_util_.ConstructSpdyGetReply(nullptr, 0, 1));
SpdySerializedFrame body1(spdy_util_.ConstructSpdyDataFrame(1, true));
SpdyHeaderBlock response_headers;
- response_headers[SpdyTestUtil::GetStatusKey()] = "421";
+ response_headers[kHttp2StatusHeader] = "421";
SpdySerializedFrame resp2(
spdy_util_.ConstructSpdyReply(3, response_headers.Clone()));
MockRead reads1[] = {CreateMockRead(resp1, 1), CreateMockRead(body1, 2),
@@ -14471,10 +14685,10 @@ TEST_F(HttpNetworkTransactionTest, DoNotUseSpdySessionForHttpOverTunnel) {
// SPDY GET for HTTP URL (through the proxy, but not the tunnel).
SpdyHeaderBlock req2_block;
- req2_block[spdy_util_.GetMethodKey()] = "GET";
- req2_block[spdy_util_.GetHostKey()] = "www.example.org:8080";
- req2_block[spdy_util_.GetSchemeKey()] = "http";
- req2_block[spdy_util_.GetPathKey()] = "/";
+ req2_block[kHttp2MethodHeader] = "GET";
+ req2_block[kHttp2AuthorityHeader] = "www.example.org:8080";
+ req2_block[kHttp2SchemeHeader] = "http";
+ req2_block[kHttp2PathHeader] = "/";
SpdySerializedFrame req2(
spdy_util_.ConstructSpdyHeaders(3, std::move(req2_block), MEDIUM, true));
@@ -17011,7 +17225,7 @@ TEST_F(HttpNetworkTransactionTest, ProxyResolutionFailsSync) {
MockAsyncProxyResolver resolver;
session_deps_.proxy_service.reset(new ProxyService(
std::make_unique<ProxyConfigServiceFixed>(proxy_config),
- base::WrapUnique(new FailingProxyResolverFactory), nullptr));
+ std::make_unique<FailingProxyResolverFactory>(), nullptr));
HttpRequestInfo request;
request.method = "GET";
diff --git a/chromium/net/http/http_proxy_client_socket.cc b/chromium/net/http/http_proxy_client_socket.cc
index 50847937d12..4be93e00bee 100644
--- a/chromium/net/http/http_proxy_client_socket.cc
+++ b/chromium/net/http/http_proxy_client_socket.cc
@@ -6,8 +6,6 @@
#include "base/bind.h"
#include "base/bind_helpers.h"
-#include "base/memory/ptr_util.h"
-#include "base/profiler/scoped_tracker.h"
#include "base/strings/string_util.h"
#include "base/values.h"
#include "net/base/auth.h"
diff --git a/chromium/net/http/http_proxy_client_socket_pool.cc b/chromium/net/http/http_proxy_client_socket_pool.cc
index 8a2b6c34b02..8e262e7f9a1 100644
--- a/chromium/net/http/http_proxy_client_socket_pool.cc
+++ b/chromium/net/http/http_proxy_client_socket_pool.cc
@@ -10,7 +10,6 @@
#include <utility>
#include "base/compiler_specific.h"
-#include "base/memory/ptr_util.h"
#include "base/metrics/field_trial.h"
#include "base/metrics/field_trial_params.h"
#include "base/optional.h"
@@ -296,11 +295,13 @@ void HttpProxyClientSocketPool::RequestSockets(
const std::string& group_name,
const void* params,
int num_sockets,
- const NetLogWithSource& net_log) {
+ const NetLogWithSource& net_log,
+ HttpRequestInfo::RequestMotivation motivation) {
const scoped_refptr<HttpProxySocketParams>* casted_params =
static_cast<const scoped_refptr<HttpProxySocketParams>*>(params);
- base_.RequestSockets(group_name, *casted_params, num_sockets, net_log);
+ base_.RequestSockets(group_name, *casted_params, num_sockets, net_log,
+ motivation);
}
void HttpProxyClientSocketPool::CancelRequest(
diff --git a/chromium/net/http/http_proxy_client_socket_pool.h b/chromium/net/http/http_proxy_client_socket_pool.h
index 24c45174f87..9564c033d24 100644
--- a/chromium/net/http/http_proxy_client_socket_pool.h
+++ b/chromium/net/http/http_proxy_client_socket_pool.h
@@ -163,7 +163,8 @@ class NET_EXPORT_PRIVATE HttpProxyClientSocketPool
void RequestSockets(const std::string& group_name,
const void* params,
int num_sockets,
- const NetLogWithSource& net_log) override;
+ const NetLogWithSource& net_log,
+ HttpRequestInfo::RequestMotivation motivation) override;
void SetPriority(const std::string& group_name,
ClientSocketHandle* handle,
diff --git a/chromium/net/http/http_proxy_client_socket_pool_unittest.cc b/chromium/net/http/http_proxy_client_socket_pool_unittest.cc
index 54178597d87..f442a517b30 100644
--- a/chromium/net/http/http_proxy_client_socket_pool_unittest.cc
+++ b/chromium/net/http/http_proxy_client_socket_pool_unittest.cc
@@ -323,7 +323,7 @@ TEST_P(HttpProxyClientSocketPoolTest, NeedAuth) {
CreateMockWrite(req, 0, ASYNC), CreateMockWrite(rst, 2, ASYNC),
};
SpdyHeaderBlock resp_block;
- resp_block[spdy_util_.GetStatusKey()] = "407";
+ resp_block[kHttp2StatusHeader] = "407";
resp_block["proxy-authenticate"] = "Basic realm=\"MyRealm1\"";
SpdySerializedFrame resp(
diff --git a/chromium/net/http/http_proxy_client_socket_wrapper.cc b/chromium/net/http/http_proxy_client_socket_wrapper.cc
index 2ce84c90213..d67438d1b38 100644
--- a/chromium/net/http/http_proxy_client_socket_wrapper.cc
+++ b/chromium/net/http/http_proxy_client_socket_wrapper.cc
@@ -11,7 +11,6 @@
#include "base/callback_helpers.h"
#include "base/memory/weak_ptr.h"
#include "base/metrics/histogram_macros.h"
-#include "base/profiler/scoped_tracker.h"
#include "base/values.h"
#include "net/base/proxy_delegate.h"
#include "net/http/http_proxy_client_socket.h"
@@ -432,8 +431,7 @@ int HttpProxyClientSocketWrapper::DoSSLConnect() {
SpdySessionKey key(GetDestination().host_port_pair(), ProxyServer::Direct(),
PRIVACY_MODE_DISABLED);
if (spdy_session_pool_->FindAvailableSession(
- key, GURL(),
- /* enable_ip_based_pooling = */ true, net_log_)) {
+ key, /* enable_ip_based_pooling = */ true, net_log_)) {
using_spdy_ = true;
next_state_ = STATE_SPDY_PROXY_CREATE_STREAM;
return OK;
@@ -546,8 +544,7 @@ int HttpProxyClientSocketWrapper::DoSpdyProxyCreateStream() {
PRIVACY_MODE_DISABLED);
base::WeakPtr<SpdySession> spdy_session =
spdy_session_pool_->FindAvailableSession(
- key, GURL(),
- /* enable_ip_based_pooling = */ true, net_log_);
+ key, /* enable_ip_based_pooling = */ true, net_log_);
// It's possible that a session to the proxy has recently been created
if (spdy_session) {
if (transport_socket_handle_.get()) {
diff --git a/chromium/net/http/http_request_headers.cc b/chromium/net/http/http_request_headers.cc
index b2fec436b08..cf9433e07a9 100644
--- a/chromium/net/http/http_request_headers.cc
+++ b/chromium/net/http/http_request_headers.cc
@@ -7,7 +7,6 @@
#include <utility>
#include "base/logging.h"
-#include "base/memory/ptr_util.h"
#include "base/strings/string_split.h"
#include "base/strings/string_util.h"
#include "base/strings/stringprintf.h"
@@ -94,13 +93,9 @@ void HttpRequestHeaders::Clear() {
void HttpRequestHeaders::SetHeader(const base::StringPiece& key,
const base::StringPiece& value) {
- DCHECK(HttpUtil::IsValidHeaderName(key));
- DCHECK(HttpUtil::IsValidHeaderValue(value));
- HeaderVector::iterator it = FindHeader(key);
- if (it != headers_.end())
- it->value.assign(value.data(), value.size());
- else
- headers_.push_back(HeaderKeyValuePair(key, value));
+ DCHECK(HttpUtil::IsValidHeaderName(key)) << key;
+ DCHECK(HttpUtil::IsValidHeaderValue(value)) << key << ":" << value;
+ SetHeaderInternal(key, value);
}
void HttpRequestHeaders::SetHeaderIfMissing(const base::StringPiece& key,
@@ -229,4 +224,13 @@ HttpRequestHeaders::FindHeader(const base::StringPiece& key) const {
return headers_.end();
}
+void HttpRequestHeaders::SetHeaderInternal(const base::StringPiece& key,
+ const base::StringPiece& value) {
+ HeaderVector::iterator it = FindHeader(key);
+ if (it != headers_.end())
+ it->value.assign(value.data(), value.size());
+ else
+ headers_.push_back(HeaderKeyValuePair(key, value));
+}
+
} // namespace net
diff --git a/chromium/net/http/http_request_headers.h b/chromium/net/http/http_request_headers.h
index 3c8a46ce796..c246f4f10c8 100644
--- a/chromium/net/http/http_request_headers.h
+++ b/chromium/net/http/http_request_headers.h
@@ -28,7 +28,7 @@ class NetLogCaptureMode;
class NET_EXPORT HttpRequestHeaders {
public:
- struct HeaderKeyValuePair {
+ struct NET_EXPORT HeaderKeyValuePair {
HeaderKeyValuePair();
HeaderKeyValuePair(const base::StringPiece& key,
const base::StringPiece& value);
@@ -112,6 +112,12 @@ class NET_EXPORT HttpRequestHeaders {
// |value| passes HttpUtil::IsValidHeaderValue().
void SetHeader(const base::StringPiece& key, const base::StringPiece& value);
+ // Does the same as above but without internal DCHECKs for validations.
+ void SetHeaderWithoutCheckForTesting(const base::StringPiece& key,
+ const base::StringPiece& value) {
+ SetHeaderInternal(key, value);
+ }
+
// Sets the header value pair for |key| and |value|, if |key| does not exist.
// If |key| already exists, the call is a no-op.
// When comparing |key|, case is ignored.
@@ -167,10 +173,15 @@ class NET_EXPORT HttpRequestHeaders {
const std::string* request_line,
NetLogCaptureMode capture_mode) const;
+ const HeaderVector& GetHeaderVector() const { return headers_; }
+
private:
HeaderVector::iterator FindHeader(const base::StringPiece& key);
HeaderVector::const_iterator FindHeader(const base::StringPiece& key) const;
+ void SetHeaderInternal(const base::StringPiece& key,
+ const base::StringPiece& value);
+
HeaderVector headers_;
// Allow the copy construction and operator= to facilitate copying in
diff --git a/chromium/net/http/http_response_headers.cc b/chromium/net/http/http_response_headers.cc
index ea39c29309c..9ed221a3b0a 100644
--- a/chromium/net/http/http_response_headers.cc
+++ b/chromium/net/http/http_response_headers.cc
@@ -10,12 +10,12 @@
#include "net/http/http_response_headers.h"
#include <algorithm>
+#include <memory>
#include <unordered_map>
#include <utility>
#include "base/format_macros.h"
#include "base/logging.h"
-#include "base/memory/ptr_util.h"
#include "base/metrics/histogram_macros.h"
#include "base/pickle.h"
#include "base/strings/string_number_conversions.h"
diff --git a/chromium/net/http/http_response_headers_unittest.cc b/chromium/net/http/http_response_headers_unittest.cc
index 8748de38753..6a4e6085ac4 100644
--- a/chromium/net/http/http_response_headers_unittest.cc
+++ b/chromium/net/http/http_response_headers_unittest.cc
@@ -671,6 +671,7 @@ TEST_P(ContentTypeTest, GetMimeType) {
EXPECT_EQ(test.all_content_type, value);
}
+// clang-format off
const ContentTypeTestData mimetype_tests[] = {
{ "HTTP/1.1 200 OK\n"
"Content-type: text/html\n",
@@ -714,12 +715,13 @@ const ContentTypeTestData mimetype_tests[] = {
"text/html", true,
"utf-8", true,
"text/html;charset=utf-8, text/html" },
- // Test single quotes.
+ // Regression test for https://crbug.com/772350:
+ // Single quotes are not delimiters but must be treated as part of charset.
{ "HTTP/1.1 200 OK\n"
"Content-type: text/html;charset='utf-8'\n"
"Content-type: text/html\n",
"text/html", true,
- "utf-8", true,
+ "'utf-8'", true,
"text/html;charset='utf-8', text/html" },
// Last charset wins if matching content-type.
{ "HTTP/1.1 200 OK\n"
@@ -766,16 +768,16 @@ const ContentTypeTestData mimetype_tests[] = {
"text/html ; charset=utf-8 ; bar=iso-8859-1" },
// Comma embeded in quotes.
{ "HTTP/1.1 200 OK\n"
- "Content-type: text/html ; charset='utf-8,text/plain' ;\n",
+ "Content-type: text/html ; charset=\"utf-8,text/plain\" ;\n",
"text/html", true,
"utf-8,text/plain", true,
- "text/html ; charset='utf-8,text/plain' ;" },
+ "text/html ; charset=\"utf-8,text/plain\" ;" },
// Charset with leading spaces.
{ "HTTP/1.1 200 OK\n"
- "Content-type: text/html ; charset= 'utf-8' ;\n",
+ "Content-type: text/html ; charset= \"utf-8\" ;\n",
"text/html", true,
"utf-8", true,
- "text/html ; charset= 'utf-8' ;" },
+ "text/html ; charset= \"utf-8\" ;" },
// Media type comments in mime-type.
{ "HTTP/1.1 200 OK\n"
"Content-type: text/html (html)\n",
@@ -801,6 +803,7 @@ const ContentTypeTestData mimetype_tests[] = {
"", false,
"*/*" },
};
+// clang-format on
INSTANTIATE_TEST_CASE_P(HttpResponseHeaders,
ContentTypeTest,
diff --git a/chromium/net/http/http_response_info.cc b/chromium/net/http/http_response_info.cc
index 561177797b1..e2fe9a5036f 100644
--- a/chromium/net/http/http_response_info.cc
+++ b/chromium/net/http/http_response_info.cc
@@ -446,6 +446,7 @@ bool HttpResponseInfo::DidUseQuic() const {
case CONNECTION_INFO_QUIC_39:
case CONNECTION_INFO_QUIC_40:
case CONNECTION_INFO_QUIC_41:
+ case CONNECTION_INFO_QUIC_42:
return true;
case NUM_OF_CONNECTION_INFOS:
NOTREACHED();
@@ -498,6 +499,8 @@ std::string HttpResponseInfo::ConnectionInfoToString(
return "http/2+quic/40";
case CONNECTION_INFO_QUIC_41:
return "http/2+quic/41";
+ case CONNECTION_INFO_QUIC_42:
+ return "http/2+quic/42";
case CONNECTION_INFO_HTTP0_9:
return "http/0.9";
case CONNECTION_INFO_HTTP1_0:
diff --git a/chromium/net/http/http_response_info.h b/chromium/net/http/http_response_info.h
index ef4d4274a69..7b4eb273b75 100644
--- a/chromium/net/http/http_response_info.h
+++ b/chromium/net/http/http_response_info.h
@@ -53,6 +53,7 @@ class NET_EXPORT HttpResponseInfo {
CONNECTION_INFO_QUIC_39 = 17,
CONNECTION_INFO_QUIC_40 = 18,
CONNECTION_INFO_QUIC_41 = 19,
+ CONNECTION_INFO_QUIC_42 = 20,
NUM_OF_CONNECTION_INFOS,
};
diff --git a/chromium/net/http/http_security_headers_unittest.cc b/chromium/net/http/http_security_headers_unittest.cc
index 2ea5d0a6c90..1171e333269 100644
--- a/chromium/net/http/http_security_headers_unittest.cc
+++ b/chromium/net/http/http_security_headers_unittest.cc
@@ -20,6 +20,10 @@ namespace net {
namespace {
+namespace test_default {
+#include "net/http/transport_security_state_static_unittest_default.h"
+}
+
HashValue GetTestHashValue(uint8_t label, HashValueTag tag) {
HashValue hash_value(tag);
memset(hash_value.data(), label, hash_value.size());
@@ -88,6 +92,10 @@ bool ParseAsHPKPHeader(const std::string& value,
}
class HttpSecurityHeadersTest : public testing::Test {
+ public:
+ ~HttpSecurityHeadersTest() override {
+ SetTransportSecurityStateSourceForTesting(nullptr);
+ }
};
@@ -652,19 +660,14 @@ TEST_F(HttpSecurityHeadersTest, ValidPKPHeadersSHA256) {
TestValidPKPHeaders(HASH_VALUE_SHA256);
}
-#if !BUILDFLAG(INCLUDE_TRANSPORT_SECURITY_STATE_PRELOAD_LIST)
-#define MAYBE_UpdateDynamicPKPOnly DISABLED_UpdateDynamicPKPOnly
-#else
-#define MAYBE_UpdateDynamicPKPOnly UpdateDynamicPKPOnly
-#endif
+TEST_F(HttpSecurityHeadersTest, UpdateDynamicPKPOnly) {
+ SetTransportSecurityStateSourceForTesting(&test_default::kHSTSSource);
-TEST_F(HttpSecurityHeadersTest, MAYBE_UpdateDynamicPKPOnly) {
TransportSecurityState state;
TransportSecurityState::STSState static_sts_state;
TransportSecurityState::PKPState static_pkp_state;
- // docs.google.com has preloaded pins.
- std::string domain = "docs.google.com";
+ std::string domain = "no-rejected-pins-pkp.preloaded.test";
state.enable_static_pins_ = true;
EXPECT_TRUE(
state.GetStaticDomainState(domain, &static_sts_state, &static_pkp_state));
@@ -676,7 +679,7 @@ TEST_F(HttpSecurityHeadersTest, MAYBE_UpdateDynamicPKPOnly) {
HashValue backup_hash = GetTestHashValue(2, HASH_VALUE_SHA256);
std::string good_pin = GetTestPin(1, HASH_VALUE_SHA256);
std::string backup_pin = GetTestPin(2, HASH_VALUE_SHA256);
- GURL report_uri("http://google.com");
+ GURL report_uri("http://report-uri.test/pkp");
std::string header = "max-age = 10000; " + good_pin + "; " + backup_pin +
";report-uri=\"" + report_uri.spec() + "\"";
@@ -727,19 +730,14 @@ TEST_F(HttpSecurityHeadersTest, MAYBE_UpdateDynamicPKPOnly) {
base::ContainsValue(new_dynamic_pkp_state.spki_hashes, backup_hash));
}
-#if !BUILDFLAG(INCLUDE_TRANSPORT_SECURITY_STATE_PRELOAD_LIST)
-#define MAYBE_UpdateDynamicPKPMaxAge0 DISABLED_UpdateDynamicPKPMaxAge0
-#else
-#define MAYBE_UpdateDynamicPKPMaxAge0 UpdateDynamicPKPMaxAge0
-#endif
+TEST_F(HttpSecurityHeadersTest, UpdateDynamicPKPMaxAge0) {
+ SetTransportSecurityStateSourceForTesting(&test_default::kHSTSSource);
-TEST_F(HttpSecurityHeadersTest, MAYBE_UpdateDynamicPKPMaxAge0) {
TransportSecurityState state;
TransportSecurityState::STSState static_sts_state;
TransportSecurityState::PKPState static_pkp_state;
- // docs.google.com has preloaded pins.
- std::string domain = "docs.google.com";
+ std::string domain = "no-rejected-pins-pkp.preloaded.test";
state.enable_static_pins_ = true;
ASSERT_TRUE(
state.GetStaticDomainState(domain, &static_sts_state, &static_pkp_state));
@@ -811,19 +809,14 @@ TEST_F(HttpSecurityHeadersTest, MAYBE_UpdateDynamicPKPMaxAge0) {
// Tests that when a static HSTS and a static HPKP entry are present, adding a
// dynamic HSTS header does not clobber the static HPKP entry. Further, adding a
// dynamic HPKP entry could not affect the HSTS entry for the site.
-#if !BUILDFLAG(INCLUDE_TRANSPORT_SECURITY_STATE_PRELOAD_LIST)
-#define MAYBE_NoClobberPins DISABLED_NoClobberPins
-#else
-#define MAYBE_NoClobberPins NoClobberPins
-#endif
+TEST_F(HttpSecurityHeadersTest, NoClobberPins) {
+ SetTransportSecurityStateSourceForTesting(&test_default::kHSTSSource);
-TEST_F(HttpSecurityHeadersTest, MAYBE_NoClobberPins) {
TransportSecurityState state;
TransportSecurityState::STSState sts_state;
TransportSecurityState::PKPState pkp_state;
- // accounts.google.com has preloaded pins.
- std::string domain = "accounts.google.com";
+ std::string domain = "hsts-hpkp-preloaded.test";
state.enable_static_pins_ = true;
// Retrieve the static STS and PKP states as it is by default, including its
diff --git a/chromium/net/http/http_server_properties.cc b/chromium/net/http/http_server_properties.cc
index a1289cae280..b28084586ad 100644
--- a/chromium/net/http/http_server_properties.cc
+++ b/chromium/net/http/http_server_properties.cc
@@ -86,14 +86,14 @@ AlternativeServiceInfo::CreateHttp2AlternativeServiceInfo(
base::Time expiration) {
DCHECK_EQ(alternative_service.protocol, kProtoHTTP2);
return AlternativeServiceInfo(alternative_service, expiration,
- QuicVersionVector());
+ QuicTransportVersionVector());
}
// static
AlternativeServiceInfo AlternativeServiceInfo::CreateQuicAlternativeServiceInfo(
const AlternativeService& alternative_service,
base::Time expiration,
- const QuicVersionVector& advertised_versions) {
+ const QuicTransportVersionVector& advertised_versions) {
DCHECK_EQ(alternative_service.protocol, kProtoQUIC);
return AlternativeServiceInfo(alternative_service, expiration,
advertised_versions);
@@ -106,7 +106,7 @@ AlternativeServiceInfo::~AlternativeServiceInfo() {}
AlternativeServiceInfo::AlternativeServiceInfo(
const AlternativeService& alternative_service,
base::Time expiration,
- const QuicVersionVector& advertised_versions)
+ const QuicTransportVersionVector& advertised_versions)
: alternative_service_(alternative_service), expiration_(expiration) {
if (alternative_service_.protocol == kProtoQUIC) {
advertised_versions_ = advertised_versions;
diff --git a/chromium/net/http/http_server_properties.h b/chromium/net/http/http_server_properties.h
index bdcbfc51d16..698340322c5 100644
--- a/chromium/net/http/http_server_properties.h
+++ b/chromium/net/http/http_server_properties.h
@@ -131,7 +131,7 @@ class NET_EXPORT_PRIVATE AlternativeServiceInfo {
static AlternativeServiceInfo CreateQuicAlternativeServiceInfo(
const AlternativeService& alternative_service,
base::Time expiration,
- const QuicVersionVector& advertised_versions);
+ const QuicTransportVersionVector& advertised_versions);
AlternativeServiceInfo();
~AlternativeServiceInfo();
@@ -170,7 +170,8 @@ class NET_EXPORT_PRIVATE AlternativeServiceInfo {
expiration_ = expiration;
}
- void set_advertised_versions(const QuicVersionVector& advertised_versions) {
+ void set_advertised_versions(
+ const QuicTransportVersionVector& advertised_versions) {
if (alternative_service_.protocol != kProtoQUIC)
return;
@@ -190,14 +191,14 @@ class NET_EXPORT_PRIVATE AlternativeServiceInfo {
base::Time expiration() const { return expiration_; }
- const QuicVersionVector& advertised_versions() const {
+ const QuicTransportVersionVector& advertised_versions() const {
return advertised_versions_;
}
private:
AlternativeServiceInfo(const AlternativeService& alternative_service,
base::Time expiration,
- const QuicVersionVector& advertised_versions);
+ const QuicTransportVersionVector& advertised_versions);
AlternativeService alternative_service_;
base::Time expiration_;
@@ -206,7 +207,7 @@ class NET_EXPORT_PRIVATE AlternativeServiceInfo {
// by Chrome. If empty, defaults to versions used by the current instance of
// the netstack.
// This list MUST be sorted in ascending order.
- QuicVersionVector advertised_versions_;
+ QuicTransportVersionVector advertised_versions_;
};
struct NET_EXPORT SupportsQuic {
@@ -328,7 +329,7 @@ class NET_EXPORT HttpServerProperties {
const url::SchemeHostPort& origin,
const AlternativeService& alternative_service,
base::Time expiration,
- const QuicVersionVector& advertised_versions) = 0;
+ const QuicTransportVersionVector& advertised_versions) = 0;
// Set alternative services for |origin|. Previous alternative services for
// |origin| are discarded.
diff --git a/chromium/net/http/http_server_properties_impl.cc b/chromium/net/http/http_server_properties_impl.cc
index e614a783f76..523a4b0b425 100644
--- a/chromium/net/http/http_server_properties_impl.cc
+++ b/chromium/net/http/http_server_properties_impl.cc
@@ -383,7 +383,7 @@ bool HttpServerPropertiesImpl::SetQuicAlternativeService(
const url::SchemeHostPort& origin,
const AlternativeService& alternative_service,
base::Time expiration,
- const QuicVersionVector& advertised_versions) {
+ const QuicTransportVersionVector& advertised_versions) {
DCHECK(alternative_service.protocol == kProtoQUIC);
return SetAlternativeServices(
diff --git a/chromium/net/http/http_server_properties_impl.h b/chromium/net/http/http_server_properties_impl.h
index 6bde8224c9f..9a0dfa36eef 100644
--- a/chromium/net/http/http_server_properties_impl.h
+++ b/chromium/net/http/http_server_properties_impl.h
@@ -8,7 +8,6 @@
#include <stddef.h>
#include <stdint.h>
-#include <deque>
#include <map>
#include <set>
#include <string>
@@ -108,7 +107,7 @@ class NET_EXPORT HttpServerPropertiesImpl
const url::SchemeHostPort& origin,
const AlternativeService& alternative_service,
base::Time expiration,
- const QuicVersionVector& advertised_versions) override;
+ const QuicTransportVersionVector& advertised_versions) override;
bool SetAlternativeServices(const url::SchemeHostPort& origin,
const AlternativeServiceInfoVector&
alternative_service_info_vector) override;
diff --git a/chromium/net/http/http_server_properties_manager.cc b/chromium/net/http/http_server_properties_manager.cc
index db96b915dfb..30361742ee8 100644
--- a/chromium/net/http/http_server_properties_manager.cc
+++ b/chromium/net/http/http_server_properties_manager.cc
@@ -7,12 +7,9 @@
#include <utility>
#include "base/bind.h"
-#include "base/memory/ptr_util.h"
#include "base/metrics/histogram_macros.h"
-#include "base/single_thread_task_runner.h"
#include "base/stl_util.h"
#include "base/strings/string_number_conversions.h"
-#include "base/threading/thread_task_runner_handle.h"
#include "base/values.h"
#include "net/base/ip_address.h"
#include "net/base/port_util.h"
@@ -89,11 +86,20 @@ void AddAlternativeServiceFieldsToDictionaryValue(
}
std::unique_ptr<base::Value> NetLogCallback(
- const base::Value& http_server_properties_dict,
+ const base::Value* http_server_properties_dict,
NetLogCaptureMode capture_mode) {
- return std::make_unique<base::Value>(http_server_properties_dict.Clone());
+ return http_server_properties_dict->CreateDeepCopy();
}
+// A local or temporary data structure to hold preferences for a server.
+// This is used only in UpdatePrefs.
+struct ServerPref {
+ bool supports_spdy = false;
+ const AlternativeServiceInfoVector* alternative_service_info_vector = nullptr;
+ const SupportsQuic* supports_quic = nullptr;
+ const ServerNetworkStats* server_network_stats = nullptr;
+};
+
} // namespace
////////////////////////////////////////////////////////////////////////////////
@@ -102,77 +108,30 @@ std::unique_ptr<base::Value> NetLogCallback(
HttpServerPropertiesManager::PrefDelegate::~PrefDelegate() {}
HttpServerPropertiesManager::HttpServerPropertiesManager(
- PrefDelegate* pref_delegate,
- scoped_refptr<base::SingleThreadTaskRunner> pref_task_runner,
- scoped_refptr<base::SingleThreadTaskRunner> network_task_runner,
- NetLog* net_log)
- : HttpServerPropertiesManager(pref_delegate,
- std::move(pref_task_runner),
- std::move(network_task_runner),
- net_log,
- nullptr) {}
-
-HttpServerPropertiesManager::HttpServerPropertiesManager(
- PrefDelegate* pref_delegate,
- scoped_refptr<base::SingleThreadTaskRunner> pref_task_runner,
- scoped_refptr<base::SingleThreadTaskRunner> network_task_runner,
+ std::unique_ptr<PrefDelegate> pref_delegate,
NetLog* net_log,
base::TickClock* clock)
- : pref_task_runner_(std::move(pref_task_runner)),
- pref_delegate_(pref_delegate),
- setting_prefs_(false),
+ : pref_delegate_(std::move(pref_delegate)),
clock_(clock ? clock : &default_clock_),
- is_initialized_(false),
- network_task_runner_(std::move(network_task_runner)),
net_log_(
NetLogWithSource::Make(net_log,
NetLogSourceType::HTTP_SERVER_PROPERTIES)) {
- DCHECK(pref_task_runner_->RunsTasksInCurrentSequence());
+ DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
DCHECK(pref_delegate_);
DCHECK(clock_);
- pref_weak_ptr_factory_.reset(
- new base::WeakPtrFactory<HttpServerPropertiesManager>(this));
- pref_weak_ptr_ = pref_weak_ptr_factory_->GetWeakPtr();
- pref_cache_update_timer_.reset(new base::OneShotTimer);
- pref_cache_update_timer_->SetTaskRunner(pref_task_runner_);
+
pref_delegate_->StartListeningForUpdates(
base::Bind(&HttpServerPropertiesManager::OnHttpServerPropertiesChanged,
base::Unretained(this)));
-}
-
-HttpServerPropertiesManager::~HttpServerPropertiesManager() {
- DCHECK(network_task_runner_->RunsTasksInCurrentSequence());
- network_weak_ptr_factory_.reset();
-}
-
-void HttpServerPropertiesManager::InitializeOnNetworkSequence() {
- DCHECK(network_task_runner_->RunsTasksInCurrentSequence());
net_log_.BeginEvent(NetLogEventType::HTTP_SERVER_PROPERTIES_INITIALIZATION);
- network_weak_ptr_factory_.reset(
- new base::WeakPtrFactory<HttpServerPropertiesManager>(this));
http_server_properties_impl_.reset(new HttpServerPropertiesImpl(clock_));
-
- network_prefs_update_timer_.reset(new base::OneShotTimer);
- network_prefs_update_timer_->SetTaskRunner(network_task_runner_);
- // UpdateCacheFromPrefsOnPrefSequence() will post a task to network thread to
- // update server properties. SetInitialized() will be run after that task is
- // run as |network_task_runner_| is single threaded.
- pref_task_runner_->PostTaskAndReply(
- FROM_HERE,
- base::Bind(
- &HttpServerPropertiesManager::UpdateCacheFromPrefsOnPrefSequence,
- pref_weak_ptr_),
- base::Bind(&HttpServerPropertiesManager::SetInitialized,
- network_weak_ptr_factory_->GetWeakPtr()));
}
-void HttpServerPropertiesManager::ShutdownOnPrefSequence() {
- DCHECK(pref_task_runner_->RunsTasksInCurrentSequence());
- // Cancel any pending updates, and stop listening for pref change updates.
- pref_cache_update_timer_->Stop();
- pref_weak_ptr_factory_.reset();
- pref_delegate_->StopListeningForUpdates();
+HttpServerPropertiesManager::~HttpServerPropertiesManager() {
+ DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+ // Flush settings on destruction.
+ UpdatePrefsFromCache();
}
// static
@@ -187,63 +146,59 @@ void HttpServerPropertiesManager::SetVersion(
}
void HttpServerPropertiesManager::Clear() {
- Clear(base::Closure());
-}
-
-void HttpServerPropertiesManager::Clear(const base::Closure& completion) {
- DCHECK(network_task_runner_->RunsTasksInCurrentSequence());
+ DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
http_server_properties_impl_->Clear();
- UpdatePrefsFromCacheOnNetworkSequence(completion);
+ UpdatePrefsFromCache();
}
bool HttpServerPropertiesManager::SupportsRequestPriority(
const url::SchemeHostPort& server) {
- DCHECK(network_task_runner_->RunsTasksInCurrentSequence());
+ DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
return http_server_properties_impl_->SupportsRequestPriority(server);
}
bool HttpServerPropertiesManager::GetSupportsSpdy(
const url::SchemeHostPort& server) {
- DCHECK(network_task_runner_->RunsTasksInCurrentSequence());
+ DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
return http_server_properties_impl_->GetSupportsSpdy(server);
}
void HttpServerPropertiesManager::SetSupportsSpdy(
const url::SchemeHostPort& server,
bool support_spdy) {
- DCHECK(network_task_runner_->RunsTasksInCurrentSequence());
+ DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
bool old_support_spdy = http_server_properties_impl_->GetSupportsSpdy(server);
http_server_properties_impl_->SetSupportsSpdy(server, support_spdy);
bool new_support_spdy = http_server_properties_impl_->GetSupportsSpdy(server);
if (old_support_spdy != new_support_spdy)
- ScheduleUpdatePrefsOnNetworkSequence(SUPPORTS_SPDY);
+ ScheduleUpdatePrefs(SUPPORTS_SPDY);
}
bool HttpServerPropertiesManager::RequiresHTTP11(const HostPortPair& server) {
- DCHECK(network_task_runner_->RunsTasksInCurrentSequence());
+ DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
return http_server_properties_impl_->RequiresHTTP11(server);
}
void HttpServerPropertiesManager::SetHTTP11Required(
const HostPortPair& server) {
- DCHECK(network_task_runner_->RunsTasksInCurrentSequence());
+ DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
http_server_properties_impl_->SetHTTP11Required(server);
- ScheduleUpdatePrefsOnNetworkSequence(HTTP_11_REQUIRED);
+ ScheduleUpdatePrefs(HTTP_11_REQUIRED);
}
void HttpServerPropertiesManager::MaybeForceHTTP11(const HostPortPair& server,
SSLConfig* ssl_config) {
- DCHECK(network_task_runner_->RunsTasksInCurrentSequence());
+ DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
http_server_properties_impl_->MaybeForceHTTP11(server, ssl_config);
}
AlternativeServiceInfoVector
HttpServerPropertiesManager::GetAlternativeServiceInfos(
const url::SchemeHostPort& origin) {
- DCHECK(network_task_runner_->RunsTasksInCurrentSequence());
+ DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
return http_server_properties_impl_->GetAlternativeServiceInfos(origin);
}
@@ -251,11 +206,11 @@ bool HttpServerPropertiesManager::SetHttp2AlternativeService(
const url::SchemeHostPort& origin,
const AlternativeService& alternative_service,
base::Time expiration) {
- DCHECK(network_task_runner_->RunsTasksInCurrentSequence());
+ DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
const bool changed = http_server_properties_impl_->SetHttp2AlternativeService(
origin, alternative_service, expiration);
if (changed) {
- ScheduleUpdatePrefsOnNetworkSequence(SET_ALTERNATIVE_SERVICES);
+ ScheduleUpdatePrefs(SET_ALTERNATIVE_SERVICES);
}
return changed;
}
@@ -264,12 +219,12 @@ bool HttpServerPropertiesManager::SetQuicAlternativeService(
const url::SchemeHostPort& origin,
const AlternativeService& alternative_service,
base::Time expiration,
- const QuicVersionVector& advertised_versions) {
- DCHECK(network_task_runner_->RunsTasksInCurrentSequence());
+ const QuicTransportVersionVector& advertised_versions) {
+ DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
const bool changed = http_server_properties_impl_->SetQuicAlternativeService(
origin, alternative_service, expiration, advertised_versions);
if (changed) {
- ScheduleUpdatePrefsOnNetworkSequence(SET_ALTERNATIVE_SERVICES);
+ ScheduleUpdatePrefs(SET_ALTERNATIVE_SERVICES);
}
return changed;
}
@@ -277,49 +232,48 @@ bool HttpServerPropertiesManager::SetQuicAlternativeService(
bool HttpServerPropertiesManager::SetAlternativeServices(
const url::SchemeHostPort& origin,
const AlternativeServiceInfoVector& alternative_service_info_vector) {
- DCHECK(network_task_runner_->RunsTasksInCurrentSequence());
+ DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
const bool changed = http_server_properties_impl_->SetAlternativeServices(
origin, alternative_service_info_vector);
if (changed) {
- ScheduleUpdatePrefsOnNetworkSequence(SET_ALTERNATIVE_SERVICES);
+ ScheduleUpdatePrefs(SET_ALTERNATIVE_SERVICES);
}
return changed;
}
void HttpServerPropertiesManager::MarkAlternativeServiceBroken(
const AlternativeService& alternative_service) {
- DCHECK(network_task_runner_->RunsTasksInCurrentSequence());
+ DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
http_server_properties_impl_->MarkAlternativeServiceBroken(
alternative_service);
- ScheduleUpdatePrefsOnNetworkSequence(MARK_ALTERNATIVE_SERVICE_BROKEN);
+ ScheduleUpdatePrefs(MARK_ALTERNATIVE_SERVICE_BROKEN);
}
void HttpServerPropertiesManager::MarkAlternativeServiceRecentlyBroken(
const AlternativeService& alternative_service) {
- DCHECK(network_task_runner_->RunsTasksInCurrentSequence());
+ DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
http_server_properties_impl_->MarkAlternativeServiceRecentlyBroken(
alternative_service);
- ScheduleUpdatePrefsOnNetworkSequence(
- MARK_ALTERNATIVE_SERVICE_RECENTLY_BROKEN);
+ ScheduleUpdatePrefs(MARK_ALTERNATIVE_SERVICE_RECENTLY_BROKEN);
}
bool HttpServerPropertiesManager::IsAlternativeServiceBroken(
const AlternativeService& alternative_service) const {
- DCHECK(network_task_runner_->RunsTasksInCurrentSequence());
+ DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
return http_server_properties_impl_->IsAlternativeServiceBroken(
alternative_service);
}
bool HttpServerPropertiesManager::WasAlternativeServiceRecentlyBroken(
const AlternativeService& alternative_service) {
- DCHECK(network_task_runner_->RunsTasksInCurrentSequence());
+ DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
return http_server_properties_impl_->WasAlternativeServiceRecentlyBroken(
alternative_service);
}
void HttpServerPropertiesManager::ConfirmAlternativeService(
const AlternativeService& alternative_service) {
- DCHECK(network_task_runner_->RunsTasksInCurrentSequence());
+ DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
bool old_value = http_server_properties_impl_->IsAlternativeServiceBroken(
alternative_service);
http_server_properties_impl_->ConfirmAlternativeService(alternative_service);
@@ -328,43 +282,43 @@ void HttpServerPropertiesManager::ConfirmAlternativeService(
// For persisting, we only care about the value returned by
// IsAlternativeServiceBroken. If that value changes, then call persist.
if (old_value != new_value)
- ScheduleUpdatePrefsOnNetworkSequence(CONFIRM_ALTERNATIVE_SERVICE);
+ ScheduleUpdatePrefs(CONFIRM_ALTERNATIVE_SERVICE);
}
const AlternativeServiceMap&
HttpServerPropertiesManager::alternative_service_map() const {
- DCHECK(network_task_runner_->RunsTasksInCurrentSequence());
+ DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
return http_server_properties_impl_->alternative_service_map();
}
std::unique_ptr<base::Value>
HttpServerPropertiesManager::GetAlternativeServiceInfoAsValue() const {
- DCHECK(network_task_runner_->RunsTasksInCurrentSequence());
+ DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
return http_server_properties_impl_->GetAlternativeServiceInfoAsValue();
}
bool HttpServerPropertiesManager::GetSupportsQuic(
IPAddress* last_address) const {
- DCHECK(network_task_runner_->RunsTasksInCurrentSequence());
+ DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
return http_server_properties_impl_->GetSupportsQuic(last_address);
}
void HttpServerPropertiesManager::SetSupportsQuic(bool used_quic,
const IPAddress& address) {
- DCHECK(network_task_runner_->RunsTasksInCurrentSequence());
+ DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
IPAddress old_last_quic_addr;
http_server_properties_impl_->GetSupportsQuic(&old_last_quic_addr);
http_server_properties_impl_->SetSupportsQuic(used_quic, address);
IPAddress new_last_quic_addr;
http_server_properties_impl_->GetSupportsQuic(&new_last_quic_addr);
if (old_last_quic_addr != new_last_quic_addr)
- ScheduleUpdatePrefsOnNetworkSequence(SET_SUPPORTS_QUIC);
+ ScheduleUpdatePrefs(SET_SUPPORTS_QUIC);
}
void HttpServerPropertiesManager::SetServerNetworkStats(
const url::SchemeHostPort& server,
ServerNetworkStats stats) {
- DCHECK(network_task_runner_->RunsTasksInCurrentSequence());
+ DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
ServerNetworkStats old_stats;
const ServerNetworkStats* old_stats_ptr =
http_server_properties_impl_->GetServerNetworkStats(server);
@@ -374,70 +328,70 @@ void HttpServerPropertiesManager::SetServerNetworkStats(
ServerNetworkStats new_stats =
*(http_server_properties_impl_->GetServerNetworkStats(server));
if (old_stats != new_stats)
- ScheduleUpdatePrefsOnNetworkSequence(SET_SERVER_NETWORK_STATS);
+ ScheduleUpdatePrefs(SET_SERVER_NETWORK_STATS);
}
void HttpServerPropertiesManager::ClearServerNetworkStats(
const url::SchemeHostPort& server) {
- DCHECK(network_task_runner_->RunsTasksInCurrentSequence());
+ DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
bool need_update =
http_server_properties_impl_->GetServerNetworkStats(server) != nullptr;
http_server_properties_impl_->ClearServerNetworkStats(server);
if (need_update)
- ScheduleUpdatePrefsOnNetworkSequence(CLEAR_SERVER_NETWORK_STATS);
+ ScheduleUpdatePrefs(CLEAR_SERVER_NETWORK_STATS);
}
const ServerNetworkStats* HttpServerPropertiesManager::GetServerNetworkStats(
const url::SchemeHostPort& server) {
- DCHECK(network_task_runner_->RunsTasksInCurrentSequence());
+ DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
return http_server_properties_impl_->GetServerNetworkStats(server);
}
const ServerNetworkStatsMap&
HttpServerPropertiesManager::server_network_stats_map() const {
- DCHECK(network_task_runner_->RunsTasksInCurrentSequence());
+ DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
return http_server_properties_impl_->server_network_stats_map();
}
bool HttpServerPropertiesManager::SetQuicServerInfo(
const QuicServerId& server_id,
const std::string& server_info) {
- DCHECK(network_task_runner_->RunsTasksInCurrentSequence());
+ DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
bool changed =
http_server_properties_impl_->SetQuicServerInfo(server_id, server_info);
if (changed)
- ScheduleUpdatePrefsOnNetworkSequence(SET_QUIC_SERVER_INFO);
+ ScheduleUpdatePrefs(SET_QUIC_SERVER_INFO);
return changed;
}
const std::string* HttpServerPropertiesManager::GetQuicServerInfo(
const QuicServerId& server_id) {
- DCHECK(network_task_runner_->RunsTasksInCurrentSequence());
+ DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
return http_server_properties_impl_->GetQuicServerInfo(server_id);
}
const QuicServerInfoMap& HttpServerPropertiesManager::quic_server_info_map()
const {
- DCHECK(network_task_runner_->RunsTasksInCurrentSequence());
+ DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
return http_server_properties_impl_->quic_server_info_map();
}
size_t HttpServerPropertiesManager::max_server_configs_stored_in_properties()
const {
- DCHECK(network_task_runner_->RunsTasksInCurrentSequence());
+ DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
return http_server_properties_impl_
->max_server_configs_stored_in_properties();
}
void HttpServerPropertiesManager::SetMaxServerConfigsStoredInProperties(
size_t max_server_configs_stored_in_properties) {
- DCHECK(network_task_runner_->RunsTasksInCurrentSequence());
+ DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
return http_server_properties_impl_->SetMaxServerConfigsStoredInProperties(
max_server_configs_stored_in_properties);
}
bool HttpServerPropertiesManager::IsInitialized() const {
- DCHECK(network_task_runner_->RunsTasksInCurrentSequence());
+ DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
return is_initialized_;
}
@@ -452,37 +406,46 @@ base::TimeDelta HttpServerPropertiesManager::GetUpdatePrefsDelayForTesting() {
return kUpdatePrefsDelay;
}
-//
-// Update the HttpServerPropertiesImpl's cache with data from preferences.
-//
-void HttpServerPropertiesManager::ScheduleUpdateCacheOnPrefThread() {
- DCHECK(pref_task_runner_->RunsTasksInCurrentSequence());
+void HttpServerPropertiesManager::ScheduleUpdateCacheForTesting() {
+ ScheduleUpdateCache();
+}
+
+void HttpServerPropertiesManager::ScheduleUpdateCache() {
+ DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
// Do not schedule a new update if there is already one scheduled.
- if (pref_cache_update_timer_->IsRunning())
+ if (pref_cache_update_timer_.IsRunning())
return;
- pref_cache_update_timer_->Start(
+ if (!is_initialized_) {
+ UpdateCacheFromPrefs();
+ return;
+ }
+
+ pref_cache_update_timer_.Start(
FROM_HERE, kUpdateCacheDelay, this,
- &HttpServerPropertiesManager::UpdateCacheFromPrefsOnPrefSequence);
+ &HttpServerPropertiesManager::UpdateCacheFromPrefs);
}
-void HttpServerPropertiesManager::UpdateCacheFromPrefsOnPrefSequence() {
- // The preferences can only be read on the pref thread.
- DCHECK(pref_task_runner_->RunsTasksInCurrentSequence());
+void HttpServerPropertiesManager::UpdateCacheFromPrefs() {
+ DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
- if (!pref_delegate_->HasServerProperties())
- return;
+ if (!is_initialized_) {
+ net_log_.EndEvent(NetLogEventType::HTTP_SERVER_PROPERTIES_INITIALIZATION);
+ is_initialized_ = true;
+ }
- bool detected_corrupted_prefs = false;
- const base::DictionaryValue& http_server_properties_dict =
+ const base::DictionaryValue* http_server_properties_dict =
pref_delegate_->GetServerProperties();
+ // If there are no preferences set, do nothing.
+ if (!http_server_properties_dict)
+ return;
- net_log_.AddEvent(
- NetLogEventType::HTTP_SERVER_PROPERTIES_UPDATE_CACHE,
- base::Bind(&NetLogCallback, http_server_properties_dict.Clone()));
+ bool detected_corrupted_prefs = false;
+ net_log_.AddEvent(NetLogEventType::HTTP_SERVER_PROPERTIES_UPDATE_CACHE,
+ base::Bind(&NetLogCallback, http_server_properties_dict));
int version = kMissingVersion;
- if (!http_server_properties_dict.GetIntegerWithoutPathExpansion(kVersionKey,
- &version)) {
+ if (!http_server_properties_dict->GetIntegerWithoutPathExpansion(kVersionKey,
+ &version)) {
DVLOG(1) << "Missing version. Clearing all properties.";
return;
}
@@ -503,7 +466,7 @@ void HttpServerPropertiesManager::UpdateCacheFromPrefsOnPrefSequence() {
// ...
// }, ...
// },
- if (!http_server_properties_dict.GetDictionaryWithoutPathExpansion(
+ if (!http_server_properties_dict->GetDictionaryWithoutPathExpansion(
kServersKey, &servers_dict)) {
DVLOG(1) << "Malformed http_server_properties for servers.";
return;
@@ -533,7 +496,7 @@ void HttpServerPropertiesManager::UpdateCacheFromPrefsOnPrefSequence() {
// ...
// ], ...
// },
- if (!http_server_properties_dict.GetListWithoutPathExpansion(
+ if (!http_server_properties_dict->GetListWithoutPathExpansion(
kServersKey, &servers_list)) {
DVLOG(1) << "Malformed http_server_properties for servers list.";
return;
@@ -541,7 +504,7 @@ void HttpServerPropertiesManager::UpdateCacheFromPrefsOnPrefSequence() {
}
std::unique_ptr<IPAddress> addr = std::make_unique<IPAddress>();
- ReadSupportsQuic(http_server_properties_dict, addr.get());
+ ReadSupportsQuic(*http_server_properties_dict, addr.get());
// String is "scheme://host:port" tuple of spdy server.
std::unique_ptr<SpdyServersMap> spdy_servers_map(
@@ -579,7 +542,7 @@ void HttpServerPropertiesManager::UpdateCacheFromPrefsOnPrefSequence() {
}
}
- if (!AddToQuicServerInfoMap(http_server_properties_dict,
+ if (!AddToQuicServerInfoMap(*http_server_properties_dict,
quic_server_info_map.get())) {
detected_corrupted_prefs = true;
}
@@ -590,7 +553,7 @@ void HttpServerPropertiesManager::UpdateCacheFromPrefsOnPrefSequence() {
std::unique_ptr<RecentlyBrokenAlternativeServices>
recently_broken_alternative_services;
const base::ListValue* broken_alt_svc_list;
- if (http_server_properties_dict.GetListWithoutPathExpansion(
+ if (http_server_properties_dict->GetListWithoutPathExpansion(
kBrokenAlternativeServicesKey, &broken_alt_svc_list)) {
broken_alternative_service_list =
std::make_unique<BrokenAlternativeServiceList>();
@@ -617,17 +580,45 @@ void HttpServerPropertiesManager::UpdateCacheFromPrefsOnPrefSequence() {
}
}
- network_task_runner_->PostTask(
- FROM_HERE,
- base::Bind(
- &HttpServerPropertiesManager::UpdateCacheFromPrefsOnNetworkSequence,
- base::Unretained(this), base::Passed(&spdy_servers_map),
- base::Passed(&alternative_service_map), base::Passed(&addr),
- base::Passed(&server_network_stats_map),
- base::Passed(&quic_server_info_map),
- base::Passed(&broken_alternative_service_list),
- base::Passed(&recently_broken_alternative_services),
- detected_corrupted_prefs));
+ // Set the properties loaded from prefs on |http_server_properties_impl_|.
+
+ UMA_HISTOGRAM_COUNTS_1M("Net.CountOfSpdyServers", spdy_servers_map->size());
+ http_server_properties_impl_->SetSpdyServers(std::move(spdy_servers_map));
+
+ // Update the cached data and use the new alternative service list from
+ // preferences.
+ UMA_HISTOGRAM_COUNTS_1M("Net.CountOfAlternateProtocolServers",
+ alternative_service_map->size());
+ http_server_properties_impl_->SetAlternativeServiceServers(
+ std::move(alternative_service_map));
+
+ http_server_properties_impl_->SetSupportsQuic(*addr);
+
+ http_server_properties_impl_->SetServerNetworkStats(
+ std::move(server_network_stats_map));
+
+ UMA_HISTOGRAM_COUNTS_1000("Net.CountOfQuicServerInfos",
+ quic_server_info_map->size());
+
+ http_server_properties_impl_->SetQuicServerInfoMap(
+ std::move(quic_server_info_map));
+
+ if (recently_broken_alternative_services) {
+ DCHECK(broken_alternative_service_list);
+
+ UMA_HISTOGRAM_COUNTS_1000("Net.CountOfBrokenAlternativeServices",
+ broken_alternative_service_list->size());
+ UMA_HISTOGRAM_COUNTS_1000("Net.CountOfRecentlyBrokenAlternativeServices",
+ recently_broken_alternative_services->size());
+
+ http_server_properties_impl_->SetBrokenAndRecentlyBrokenAlternativeServices(
+ std::move(broken_alternative_service_list),
+ std::move(recently_broken_alternative_services));
+ }
+
+ // Update the prefs with what we have read (delete all corrupted prefs).
+ if (detected_corrupted_prefs)
+ ScheduleUpdatePrefs(DETECTED_CORRUPTED_PREFS);
}
bool HttpServerPropertiesManager::AddToBrokenAlternativeServices(
@@ -828,7 +819,7 @@ bool HttpServerPropertiesManager::ParseAlternativeServiceInfoDictOfServer(
<< "server: " << server_str;
return false;
}
- QuicVersionVector advertised_versions;
+ QuicTransportVersionVector advertised_versions;
for (const auto& value : *versions_list) {
int version;
if (!value.GetAsInteger(&version)) {
@@ -836,7 +827,7 @@ bool HttpServerPropertiesManager::ParseAlternativeServiceInfoDictOfServer(
<< server_str;
return false;
}
- advertised_versions.push_back(QuicVersion(version));
+ advertised_versions.push_back(QuicTransportVersion(version));
}
alternative_service_info->set_advertised_versions(advertised_versions);
}
@@ -982,87 +973,26 @@ bool HttpServerPropertiesManager::AddToQuicServerInfoMap(
return !detected_corrupted_prefs;
}
-void HttpServerPropertiesManager::UpdateCacheFromPrefsOnNetworkSequence(
- std::unique_ptr<SpdyServersMap> spdy_servers_map,
- std::unique_ptr<AlternativeServiceMap> alternative_service_map,
- std::unique_ptr<IPAddress> last_quic_address,
- std::unique_ptr<ServerNetworkStatsMap> server_network_stats_map,
- std::unique_ptr<QuicServerInfoMap> quic_server_info_map,
- std::unique_ptr<BrokenAlternativeServiceList>
- broken_alternative_service_list,
- std::unique_ptr<RecentlyBrokenAlternativeServices>
- recently_broken_alternative_services,
- bool detected_corrupted_prefs) {
- // Preferences have the master data because admins might have pushed new
- // preferences. Update the cached data with new data from preferences.
- DCHECK(network_task_runner_->RunsTasksInCurrentSequence());
-
- UMA_HISTOGRAM_COUNTS_1M("Net.CountOfSpdyServers", spdy_servers_map->size());
- http_server_properties_impl_->SetSpdyServers(std::move(spdy_servers_map));
-
- // Update the cached data and use the new alternative service list from
- // preferences.
- UMA_HISTOGRAM_COUNTS_1M("Net.CountOfAlternateProtocolServers",
- alternative_service_map->size());
- http_server_properties_impl_->SetAlternativeServiceServers(
- std::move(alternative_service_map));
-
- http_server_properties_impl_->SetSupportsQuic(*last_quic_address);
-
- http_server_properties_impl_->SetServerNetworkStats(
- std::move(server_network_stats_map));
-
- UMA_HISTOGRAM_COUNTS_1000("Net.CountOfQuicServerInfos",
- quic_server_info_map->size());
-
- http_server_properties_impl_->SetQuicServerInfoMap(
- std::move(quic_server_info_map));
-
- if (recently_broken_alternative_services) {
- DCHECK(broken_alternative_service_list);
-
- UMA_HISTOGRAM_COUNTS_1000("Net.CountOfBrokenAlternativeServices",
- broken_alternative_service_list->size());
- UMA_HISTOGRAM_COUNTS_1000("Net.CountOfRecentlyBrokenAlternativeServices",
- recently_broken_alternative_services->size());
-
- http_server_properties_impl_->SetBrokenAndRecentlyBrokenAlternativeServices(
- std::move(broken_alternative_service_list),
- std::move(recently_broken_alternative_services));
- }
-
- // Update the prefs with what we have read (delete all corrupted prefs).
- if (detected_corrupted_prefs)
- ScheduleUpdatePrefsOnNetworkSequence(DETECTED_CORRUPTED_PREFS);
-}
-
//
// Update Preferences with data from the cached data.
//
-void HttpServerPropertiesManager::ScheduleUpdatePrefsOnNetworkSequence(
- Location location) {
- DCHECK(network_task_runner_->RunsTasksInCurrentSequence());
+void HttpServerPropertiesManager::ScheduleUpdatePrefs(Location location) {
+ DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
// Do not schedule a new update if there is already one scheduled.
- if (network_prefs_update_timer_->IsRunning())
+ if (network_prefs_update_timer_.IsRunning())
return;
- network_prefs_update_timer_->Start(
+ network_prefs_update_timer_.Start(
FROM_HERE, kUpdatePrefsDelay, this,
- &HttpServerPropertiesManager::UpdatePrefsFromCacheOnNetworkSequence);
+ &HttpServerPropertiesManager::UpdatePrefsFromCache);
// TODO(rtenneti): Delete the following histogram after collecting some data.
UMA_HISTOGRAM_ENUMERATION("Net.HttpServerProperties.UpdatePrefs", location,
HttpServerPropertiesManager::NUM_LOCATIONS);
}
-// This is required so we can set this as the callback for a timer.
-void HttpServerPropertiesManager::UpdatePrefsFromCacheOnNetworkSequence() {
- UpdatePrefsFromCacheOnNetworkSequence(base::Closure());
-}
-
-void HttpServerPropertiesManager::UpdatePrefsFromCacheOnNetworkSequence(
- const base::Closure& completion) {
- DCHECK(network_task_runner_->RunsTasksInCurrentSequence());
+void HttpServerPropertiesManager::UpdatePrefsFromCache() {
+ DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
// It is in MRU order.
std::unique_ptr<std::vector<std::string>> spdy_servers =
@@ -1177,44 +1107,13 @@ void HttpServerPropertiesManager::UpdatePrefsFromCacheOnNetworkSequence(
std::unique_ptr<IPAddress> last_quic_addr = std::make_unique<IPAddress>();
http_server_properties_impl_->GetSupportsQuic(last_quic_addr.get());
- // Update the preferences on the pref thread.
- pref_task_runner_->PostTask(
- FROM_HERE,
- base::Bind(&HttpServerPropertiesManager::UpdatePrefsOnPrefThread,
- pref_weak_ptr_, base::Passed(&spdy_servers),
- base::Passed(&alternative_service_map),
- base::Passed(&last_quic_addr),
- base::Passed(&server_network_stats_map),
- base::Passed(&quic_server_info_map),
- base::Passed(&broken_alt_svc_list),
- base::Passed(&recently_broken_alt_svcs), completion));
-}
-// A local or temporary data structure to hold preferences for a server.
-// This is used only in UpdatePrefsOnPrefThread.
-struct ServerPref {
- bool supports_spdy = false;
- const AlternativeServiceInfoVector* alternative_service_info_vector = nullptr;
- const SupportsQuic* supports_quic = nullptr;
- const ServerNetworkStats* server_network_stats = nullptr;
-};
-
-// All maps and lists are in MRU order.
-void HttpServerPropertiesManager::UpdatePrefsOnPrefThread(
- std::unique_ptr<std::vector<std::string>> spdy_servers,
- std::unique_ptr<AlternativeServiceMap> alternative_service_map,
- std::unique_ptr<IPAddress> last_quic_address,
- std::unique_ptr<ServerNetworkStatsMap> server_network_stats_map,
- std::unique_ptr<QuicServerInfoMap> quic_server_info_map,
- std::unique_ptr<BrokenAlternativeServiceList>
- broken_alternative_service_list,
- std::unique_ptr<RecentlyBrokenAlternativeServices>
- recently_broken_alternative_services,
- const base::Closure& completion) {
+ // Now update the prefs.
+ // TODO(mmenke): Should this be inlined above?
typedef base::MRUCache<url::SchemeHostPort, ServerPref> ServerPrefMap;
ServerPrefMap server_pref_map(ServerPrefMap::NO_AUTO_EVICT);
- DCHECK(pref_task_runner_->RunsTasksInCurrentSequence());
+ DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
// Add servers that support spdy to server_pref_map in the MRU order.
DCHECK(spdy_servers);
@@ -1296,31 +1195,24 @@ void HttpServerPropertiesManager::UpdatePrefsOnPrefThread(
std::move(servers_list));
SetVersion(&http_server_properties_dict, kVersionNumber);
- DCHECK(last_quic_address);
- SaveSupportsQuicToPrefs(*last_quic_address, &http_server_properties_dict);
+ DCHECK(last_quic_addr);
+ SaveSupportsQuicToPrefs(*last_quic_addr, &http_server_properties_dict);
if (quic_server_info_map) {
SaveQuicServerInfoMapToServerPrefs(*quic_server_info_map,
&http_server_properties_dict);
}
- SaveBrokenAlternativeServicesToPrefs(
- broken_alternative_service_list.get(),
- recently_broken_alternative_services.get(), &http_server_properties_dict);
+ SaveBrokenAlternativeServicesToPrefs(broken_alt_svc_list.get(),
+ recently_broken_alt_svcs.get(),
+ &http_server_properties_dict);
setting_prefs_ = true;
pref_delegate_->SetServerProperties(http_server_properties_dict);
setting_prefs_ = false;
- net_log_.AddEvent(
- NetLogEventType::HTTP_SERVER_PROPERTIES_UPDATE_PREFS,
- base::Bind(&NetLogCallback, http_server_properties_dict.Clone()));
- // Note that |completion| will be fired after we have written everything to
- // the Preferences, but likely before these changes are serialized to disk.
- // This is not a problem though, as JSONPrefStore guarantees that this will
- // happen, pretty soon, and even in the case we shut down immediately.
- if (!completion.is_null())
- completion.Run();
+ net_log_.AddEvent(NetLogEventType::HTTP_SERVER_PROPERTIES_UPDATE_PREFS,
+ base::Bind(&NetLogCallback, &http_server_properties_dict));
}
void HttpServerPropertiesManager::SaveAlternativeServiceToServerPrefs(
@@ -1468,15 +1360,9 @@ void HttpServerPropertiesManager::SaveBrokenAlternativeServicesToPrefs(
}
void HttpServerPropertiesManager::OnHttpServerPropertiesChanged() {
- DCHECK(pref_task_runner_->RunsTasksInCurrentSequence());
+ DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
if (!setting_prefs_)
- ScheduleUpdateCacheOnPrefThread();
-}
-
-void HttpServerPropertiesManager::SetInitialized() {
- DCHECK(network_task_runner_->RunsTasksInCurrentSequence());
- is_initialized_ = true;
- net_log_.EndEvent(NetLogEventType::HTTP_SERVER_PROPERTIES_INITIALIZATION);
+ ScheduleUpdateCache();
}
} // namespace net
diff --git a/chromium/net/http/http_server_properties_manager.h b/chromium/net/http/http_server_properties_manager.h
index c53a835943f..1d415475ac0 100644
--- a/chromium/net/http/http_server_properties_manager.h
+++ b/chromium/net/http/http_server_properties_manager.h
@@ -15,9 +15,10 @@
#include "base/gtest_prod_util.h"
#include "base/macros.h"
#include "base/memory/weak_ptr.h"
+#include "base/sequence_checker.h"
#include "base/time/default_tick_clock.h"
+#include "base/time/time.h"
#include "base/timer/timer.h"
-#include "base/values.h"
#include "net/base/host_port_pair.h"
#include "net/base/net_export.h"
#include "net/http/http_server_properties.h"
@@ -25,7 +26,7 @@
#include "net/log/net_log_with_source.h"
namespace base {
-class SingleThreadTaskRunner;
+class DictionaryValue;
}
namespace net {
@@ -37,97 +38,47 @@ class IPAddress;
// The manager for creating and updating an HttpServerProperties (for example it
// tracks if a server supports SPDY or not).
-//
-// This class interacts with both the pref thread, where notifications of pref
-// changes are received from, and the network thread, which owns it, and it
-// persists the changes from network stack whether server supports SPDY or not.
-//
-// There are two SingleThreadTaskRunners:
-// |pref_task_runner_| should be bound with the pref thread and is used to post
-// cache update to the pref thread;
-// |network_task_runner_| should be bound with the network thread and is used
-// to post pref update to the cache thread.
-//
-// It must be constructed with correct task runners passed in to set up
-// |pref_task_runner_| and |network_task_runner| as well as the prefs listeners.
-//
-// ShutdownOnPrefSequence must be called from pref thread before destruction, to
-// release the prefs listeners on the pref thread.
-//
-// Class requires that update tasks from the Pref thread can post safely to the
-// network thread, so the destruction order must guarantee that if |this|
-// exists in pref thread, then a potential destruction on network thread will
-// come after any task posted to network thread from that method on pref thread.
-// This is used to go through network thread before the actual update starts,
-// and grab a WeakPtr.
class NET_EXPORT HttpServerPropertiesManager : public HttpServerProperties {
public:
- // Provides an interface to interface with persistent preferences storage
- // implemented by the embedder.
+ // Provides an interface to interact with persistent preferences storage
+ // implemented by the embedder. The prefs are assumed not to have been loaded
+ // before HttpServerPropertiesManager construction.
class NET_EXPORT PrefDelegate {
public:
virtual ~PrefDelegate();
- // Returns true if the pref system has data for the server properties.
- virtual bool HasServerProperties() = 0;
-
// Returns the branch of the preferences system for the server properties.
- virtual const base::DictionaryValue& GetServerProperties() const = 0;
+ // Returns nullptr if the pref system has no data for the server properties.
+ virtual const base::DictionaryValue* GetServerProperties() const = 0;
// Sets the server properties to the given value.
virtual void SetServerProperties(const base::DictionaryValue& value) = 0;
- // Start and stop listening for external storage changes. There will only
- // be one callback active at a time.
+ // Starts listening for external storage changes. There will only be one
+ // callback active at a time. The first time the |callback| is invoked is
+ // expected to mean the initial pref store values have been loaded.
virtual void StartListeningForUpdates(const base::Closure& callback) = 0;
- virtual void StopListeningForUpdates() = 0;
};
// Create an instance of the HttpServerPropertiesManager.
//
- // Ownership of the PrefDelegate pointer is taken by this class. This is
- // passed as a raw pointer rather than a scoped_refptr currently because
- // the test uses gmock and it doesn't forward move semantics properly.
- //
- // There are two SingleThreadTaskRunners:
- // |pref_task_runner| should be bound with the pref thread and is used to post
- // cache update to the pref thread;
- // |network_task_runner| should be bound with the network thread and is used
- // to post pref update to the cache thread.
+ // Server propertise will be loaded from |pref_delegate| the first time it
+ // notifies the HttpServerPropertiesManager of an update, indicating the prefs
+ // have been loaded from disk.
//
// |clock| is used for setting expiration times and scheduling the
// expiration of broken alternative services. If null, the default clock will
// be used.
- HttpServerPropertiesManager(
- PrefDelegate* pref_delegate,
- scoped_refptr<base::SingleThreadTaskRunner> pref_task_runner,
- scoped_refptr<base::SingleThreadTaskRunner> network_task_runner,
- NetLog* net_log,
- base::TickClock* clock);
-
- // Default clock will be used.
- HttpServerPropertiesManager(
- PrefDelegate* pref_delegate,
- scoped_refptr<base::SingleThreadTaskRunner> pref_task_runner,
- scoped_refptr<base::SingleThreadTaskRunner> network_task_runner,
- NetLog* net_log);
+ HttpServerPropertiesManager(std::unique_ptr<PrefDelegate> pref_delegate,
+ NetLog* net_log,
+ base::TickClock* clock = nullptr);
~HttpServerPropertiesManager() override;
- // Initialize on Network thread.
- void InitializeOnNetworkSequence();
-
- // Prepare for shutdown. Must be called on the Pref thread before destruction.
- void ShutdownOnPrefSequence();
-
// Helper function for unit tests to set the version in the dictionary.
static void SetVersion(base::DictionaryValue* http_server_properties_dict,
int version_number);
- // Deletes all data. Works asynchronously, but if a |completion| callback is
- // provided, it will be fired on the pref thread when everything is done.
- void Clear(const base::Closure& completion);
-
// ----------------------------------
// HttpServerProperties methods:
// ----------------------------------
@@ -150,7 +101,7 @@ class NET_EXPORT HttpServerPropertiesManager : public HttpServerProperties {
const url::SchemeHostPort& origin,
const AlternativeService& alternative_service,
base::Time expiration,
- const QuicVersionVector& advertised_versions) override;
+ const QuicTransportVersionVector& advertised_versions) override;
bool SetAlternativeServices(const url::SchemeHostPort& origin,
const AlternativeServiceInfoVector&
alternative_service_info_vector) override;
@@ -187,8 +138,10 @@ class NET_EXPORT HttpServerPropertiesManager : public HttpServerProperties {
static base::TimeDelta GetUpdateCacheDelayForTesting();
static base::TimeDelta GetUpdatePrefsDelayForTesting();
+ void ScheduleUpdateCacheForTesting();
+
protected:
- // The location where ScheduleUpdatePrefsOnNetworkSequence was called.
+ // The location where ScheduleUpdatePrefs was called.
// Must be kept up to date with HttpServerPropertiesUpdatePrefsLocation in
// histograms.xml.
enum Location {
@@ -216,58 +169,21 @@ class NET_EXPORT HttpServerPropertiesManager : public HttpServerProperties {
// These are used to delay updating of the cached data in
// |http_server_properties_impl_| while the preferences are changing, and
// execute only one update per simultaneous prefs changes.
- void ScheduleUpdateCacheOnPrefThread();
+ void ScheduleUpdateCache();
// Update cached prefs in |http_server_properties_impl_| with data from
- // preferences. It gets the data on pref thread and calls
- // UpdateSpdyServersFromPrefsOnNetworkThread() to perform the update on
- // network thread.
- virtual void UpdateCacheFromPrefsOnPrefSequence();
-
- // Starts the update of cached prefs in |http_server_properties_impl_| on the
- // network thread. Protected for testing.
- void UpdateCacheFromPrefsOnNetworkSequence(
- std::unique_ptr<SpdyServersMap> spdy_servers_map,
- std::unique_ptr<AlternativeServiceMap> alternative_service_map,
- std::unique_ptr<IPAddress> last_quic_address,
- std::unique_ptr<ServerNetworkStatsMap> server_network_stats_map,
- std::unique_ptr<QuicServerInfoMap> quic_server_info_map,
- std::unique_ptr<BrokenAlternativeServiceList>
- broken_alternative_service_list,
- std::unique_ptr<RecentlyBrokenAlternativeServices>
- recently_broken_alternative_services,
- bool detected_corrupted_prefs);
+ // preferences.
+ void UpdateCacheFromPrefs();
// These are used to delay updating the preferences when cached data in
// |http_server_properties_impl_| is changing, and execute only one update per
// simultaneous changes.
- // |location| specifies where this method is called from. Virtual for testing.
- virtual void ScheduleUpdatePrefsOnNetworkSequence(Location location);
+ // |location| specifies where this method is called from.
+ void ScheduleUpdatePrefs(Location location);
// Update prefs::kHttpServerProperties in preferences with the cached data
- // from |http_server_properties_impl_|. This gets the data on network thread
- // and posts a task (UpdatePrefsOnPrefThread) to update preferences on pref
- // thread.
- void UpdatePrefsFromCacheOnNetworkSequence();
-
- // Same as above, but fires an optional |completion| callback on pref thread
- // when finished. Virtual for testing.
- virtual void UpdatePrefsFromCacheOnNetworkSequence(
- const base::Closure& completion);
-
- // Update prefs::kHttpServerProperties preferences on pref thread. Executes an
- // optional |completion| callback when finished. Protected for testing.
- void UpdatePrefsOnPrefThread(
- std::unique_ptr<std::vector<std::string>> spdy_servers,
- std::unique_ptr<AlternativeServiceMap> alternative_service_map,
- std::unique_ptr<IPAddress> last_quic_address,
- std::unique_ptr<ServerNetworkStatsMap> server_network_stats_map,
- std::unique_ptr<QuicServerInfoMap> quic_server_info_map,
- std::unique_ptr<BrokenAlternativeServiceList>
- broken_alternative_service_list,
- std::unique_ptr<RecentlyBrokenAlternativeServices>
- recently_broken_alternative_services,
- const base::Closure& completion);
+ // from |http_server_properties_impl_|.
+ void UpdatePrefsFromCache();
private:
FRIEND_TEST_ALL_PREFIXES(HttpServerPropertiesManagerTest,
@@ -336,50 +252,30 @@ class NET_EXPORT HttpServerPropertiesManager : public HttpServerProperties {
recently_broken_alternative_services,
base::DictionaryValue* http_server_properties_dict);
- void SetInitialized();
-
base::DefaultTickClock default_clock_;
- // -----------
- // Pref thread
- // -----------
-
- const scoped_refptr<base::SingleThreadTaskRunner> pref_task_runner_;
-
- base::WeakPtr<HttpServerPropertiesManager> pref_weak_ptr_;
-
// Used to post cache update tasks.
- std::unique_ptr<base::OneShotTimer> pref_cache_update_timer_;
+ base::OneShotTimer pref_cache_update_timer_;
std::unique_ptr<PrefDelegate> pref_delegate_;
- bool setting_prefs_;
+ // Set to true while modifying prefs, to avoid loading those prefs again as a
+ // result of them being changed by the changes just made by this class.
+ bool setting_prefs_ = false;
base::TickClock* clock_; // Unowned
- // --------------
- // Network thread
- // --------------
-
- // Whether InitializeOnNetworkSequence() has completed.
- bool is_initialized_;
-
- const scoped_refptr<base::SingleThreadTaskRunner> network_task_runner_;
+ // Set to true once the initial prefs have been loaded.
+ bool is_initialized_ = false;
// Used to post |prefs::kHttpServerProperties| pref update tasks.
- std::unique_ptr<base::OneShotTimer> network_prefs_update_timer_;
+ base::OneShotTimer network_prefs_update_timer_;
std::unique_ptr<HttpServerPropertiesImpl> http_server_properties_impl_;
- // Used to get |weak_ptr_| to self on the pref thread.
- std::unique_ptr<base::WeakPtrFactory<HttpServerPropertiesManager>>
- pref_weak_ptr_factory_;
-
- // Used to get |weak_ptr_| to self on the network thread.
- std::unique_ptr<base::WeakPtrFactory<HttpServerPropertiesManager>>
- network_weak_ptr_factory_;
-
const NetLogWithSource net_log_;
+ SEQUENCE_CHECKER(sequence_checker_);
+
DISALLOW_COPY_AND_ASSIGN(HttpServerPropertiesManager);
};
diff --git a/chromium/net/http/http_server_properties_manager_unittest.cc b/chromium/net/http/http_server_properties_manager_unittest.cc
index bcac29d3c86..75fbb888fc9 100644
--- a/chromium/net/http/http_server_properties_manager_unittest.cc
+++ b/chromium/net/http/http_server_properties_manager_unittest.cc
@@ -4,14 +4,12 @@
#include "net/http/http_server_properties_manager.h"
-#include <memory>
#include <utility>
#include "base/bind.h"
#include "base/json/json_reader.h"
#include "base/json/json_writer.h"
#include "base/macros.h"
-#include "base/memory/ptr_util.h"
#include "base/memory/ref_counted.h"
#include "base/single_thread_task_runner.h"
#include "base/strings/string_number_conversions.h"
@@ -45,24 +43,22 @@ class MockPrefDelegate : public net::HttpServerPropertiesManager::PrefDelegate {
~MockPrefDelegate() override {}
// HttpServerPropertiesManager::PrefDelegate implementation.
- bool HasServerProperties() override { return true; }
- const base::DictionaryValue& GetServerProperties() const override {
- return prefs_;
+ const base::DictionaryValue* GetServerProperties() const override {
+ return &prefs_;
}
void SetServerProperties(const base::DictionaryValue& value) override {
prefs_.Clear();
prefs_.MergeDictionary(&value);
+ ++num_pref_updates_;
if (!prefs_changed_callback_.is_null())
prefs_changed_callback_.Run();
+ if (!extra_prefs_changed_callback_.is_null())
+ extra_prefs_changed_callback_.Run();
}
void StartListeningForUpdates(const base::Closure& callback) override {
CHECK(prefs_changed_callback_.is_null());
prefs_changed_callback_ = callback;
}
- void StopListeningForUpdates() override {
- CHECK(!prefs_changed_callback_.is_null());
- prefs_changed_callback_ = base::Closure();
- }
void SetPrefs(const base::DictionaryValue& value) {
// prefs_ = value;
@@ -72,87 +68,25 @@ class MockPrefDelegate : public net::HttpServerPropertiesManager::PrefDelegate {
prefs_changed_callback_.Run();
}
- private:
- base::DictionaryValue prefs_;
- base::Closure prefs_changed_callback_;
-
- DISALLOW_COPY_AND_ASSIGN(MockPrefDelegate);
-};
-
-class TestingHttpServerPropertiesManager : public HttpServerPropertiesManager {
- public:
- TestingHttpServerPropertiesManager(
- HttpServerPropertiesManager::PrefDelegate* pref_delegate,
- scoped_refptr<TestMockTimeTaskRunner> pref_task_runner,
- scoped_refptr<TestMockTimeTaskRunner> net_task_runner,
- base::TickClock* clock)
- : HttpServerPropertiesManager(pref_delegate,
- pref_task_runner,
- net_task_runner,
- nullptr,
- clock),
- pref_task_runner_(std::move(pref_task_runner)),
- net_task_runner_(std::move(net_task_runner)) {
- // This call must run in the context of |net_task_runner_|.
- TestMockTimeTaskRunner::ScopedContext scoped_context(net_task_runner_);
- HttpServerPropertiesManager::InitializeOnNetworkSequence();
- }
-
- ~TestingHttpServerPropertiesManager() override {}
-
- // Make these methods public for testing.
- using HttpServerPropertiesManager::ScheduleUpdateCacheOnPrefThread;
-
- void UpdateCacheFromPrefsOnUIConcrete() {
- TestMockTimeTaskRunner::ScopedContext scoped_context(pref_task_runner_);
- HttpServerPropertiesManager::UpdateCacheFromPrefsOnPrefSequence();
- }
-
- void UpdatePrefsFromCacheOnNetworkSequenceConcrete(
- const base::Closure& callback) {
- TestMockTimeTaskRunner::ScopedContext scoped_context(net_task_runner_);
- HttpServerPropertiesManager::UpdatePrefsFromCacheOnNetworkSequence(
- callback);
- }
-
- void ScheduleUpdatePrefsOnNetworkSequenceConcrete(Location location) {
- TestMockTimeTaskRunner::ScopedContext scoped_context(net_task_runner_);
- HttpServerPropertiesManager::ScheduleUpdatePrefsOnNetworkSequence(location);
+ int GetAndClearNumPrefUpdates() {
+ int out = num_pref_updates_;
+ num_pref_updates_ = 0;
+ return out;
}
- void ScheduleUpdatePrefsOnNetworkSequenceDefault() {
- TestMockTimeTaskRunner::ScopedContext scoped_context(net_task_runner_);
- // Picked a random Location as caller.
- HttpServerPropertiesManager::ScheduleUpdatePrefsOnNetworkSequence(
- DETECTED_CORRUPTED_PREFS);
+ // Additional callback to call when prefs are updated, used to check prefs are
+ // updated on destruction.
+ void set_extra_update_prefs_callback(const base::Closure& callback) {
+ extra_prefs_changed_callback_ = callback;
}
- MOCK_METHOD0(UpdateCacheFromPrefsOnPrefSequence, void());
- MOCK_METHOD1(UpdatePrefsFromCacheOnNetworkSequence,
- void(const base::Closure&));
- MOCK_METHOD1(ScheduleUpdatePrefsOnNetworkSequence, void(Location location));
- MOCK_METHOD6(UpdateCacheFromPrefsOnNetworkSequence,
- void(std::vector<std::string>* spdy_servers,
- AlternativeServiceMap* alternative_service_map,
- IPAddress* last_quic_address,
- ServerNetworkStatsMap* server_network_stats_map,
- QuicServerInfoMap* quic_server_info_map,
- bool detected_corrupted_prefs));
- MOCK_METHOD6(UpdatePrefsOnPrefThread,
- void(base::ListValue* spdy_server_list,
- AlternativeServiceMap* alternative_service_map,
- IPAddress* last_quic_address,
- ServerNetworkStatsMap* server_network_stats_map,
- QuicServerInfoMap* quic_server_info_map,
- const base::Closure& completion));
-
private:
- // References to the underlying task runners, used to simulate running in
- // their contexts where required.
- scoped_refptr<TestMockTimeTaskRunner> pref_task_runner_;
- scoped_refptr<TestMockTimeTaskRunner> net_task_runner_;
+ base::DictionaryValue prefs_;
+ base::Closure prefs_changed_callback_;
+ base::Closure extra_prefs_changed_callback_;
+ int num_pref_updates_ = 0;
- DISALLOW_COPY_AND_ASSIGN(TestingHttpServerPropertiesManager);
+ DISALLOW_COPY_AND_ASSIGN(MockPrefDelegate);
};
} // namespace
@@ -169,71 +103,29 @@ class HttpServerPropertiesManagerTest : public testing::TestWithParam<int> {
one_day_from_now_ = base::Time::Now() + base::TimeDelta::FromDays(1);
advertised_versions_ = HttpNetworkSession::Params().quic_supported_versions;
pref_delegate_ = new MockPrefDelegate;
- net_test_task_runner_clock_ = net_test_task_runner_->GetMockTickClock();
- http_server_props_manager_.reset(
- new StrictMock<TestingHttpServerPropertiesManager>(
- pref_delegate_, pref_test_task_runner_.task_runner(),
- net_test_task_runner_, net_test_task_runner_clock_.get()));
+
+ net_test_task_runner_clock_ = test_task_runner_->GetMockTickClock();
+ http_server_props_manager_ = std::make_unique<HttpServerPropertiesManager>(
+ base::WrapUnique(pref_delegate_), /*net_log=*/nullptr,
+ net_test_task_runner_clock_.get());
EXPECT_FALSE(http_server_props_manager_->IsInitialized());
- ExpectCacheUpdate();
- EXPECT_FALSE(net_test_task_runner_->HasPendingTask());
- pref_test_task_runner_->RunUntilIdle();
- net_test_task_runner_->RunUntilIdle();
+ pref_delegate_->SetPrefs(base::DictionaryValue());
EXPECT_TRUE(http_server_props_manager_->IsInitialized());
- EXPECT_FALSE(net_test_task_runner_->HasPendingTask());
- EXPECT_FALSE(pref_test_task_runner_->HasPendingTask());
+ EXPECT_FALSE(test_task_runner_->HasPendingTask());
+ EXPECT_EQ(0, pref_delegate_->GetAndClearNumPrefUpdates());
}
void TearDown() override {
- if (http_server_props_manager_.get())
- http_server_props_manager_->ShutdownOnPrefSequence();
// Run pending non-delayed tasks but don't FastForwardUntilNoTasksRemain()
// as some delayed tasks may forever repost (e.g. because impl doesn't use a
// mock clock and doesn't see timings as having expired, ref.
// HttpServerPropertiesImpl::
// ScheduleBrokenAlternateProtocolMappingsExpiration()).
- pref_test_task_runner_->RunUntilIdle();
- net_test_task_runner_->RunUntilIdle();
+ test_task_runner_->RunUntilIdle();
http_server_props_manager_.reset();
}
- void ExpectCacheUpdate() {
- EXPECT_CALL(*http_server_props_manager_,
- UpdateCacheFromPrefsOnPrefSequence())
- .WillOnce(Invoke(http_server_props_manager_.get(),
- &TestingHttpServerPropertiesManager::
- UpdateCacheFromPrefsOnUIConcrete));
- }
-
- void ExpectScheduleUpdatePrefsOnNetworkSequence() {
- EXPECT_CALL(*http_server_props_manager_,
- ScheduleUpdatePrefsOnNetworkSequence(_))
- .WillOnce(Invoke(http_server_props_manager_.get(),
- &TestingHttpServerPropertiesManager::
- ScheduleUpdatePrefsOnNetworkSequenceConcrete));
- }
-
- void ExpectScheduleUpdatePrefsOnNetworkSequenceRepeatedly(int times) {
- EXPECT_CALL(*http_server_props_manager_,
- ScheduleUpdatePrefsOnNetworkSequence(_))
- .Times(AtLeast(times))
- .WillRepeatedly(
- Invoke(http_server_props_manager_.get(),
- &TestingHttpServerPropertiesManager::
- ScheduleUpdatePrefsOnNetworkSequenceConcrete));
- }
-
- void ExpectPrefsUpdate(int times) {
- EXPECT_CALL(*http_server_props_manager_,
- UpdatePrefsFromCacheOnNetworkSequence(_))
- .Times(times)
- .WillRepeatedly(
- Invoke(http_server_props_manager_.get(),
- &TestingHttpServerPropertiesManager::
- UpdatePrefsFromCacheOnNetworkSequenceConcrete));
- }
-
bool HasAlternativeService(const url::SchemeHostPort& server) {
const AlternativeServiceInfoVector alternative_service_info_vector =
http_server_props_manager_->GetAlternativeServiceInfos(server);
@@ -241,20 +133,12 @@ class HttpServerPropertiesManagerTest : public testing::TestWithParam<int> {
}
MockPrefDelegate* pref_delegate_; // Owned by HttpServerPropertiesManager.
- std::unique_ptr<TestingHttpServerPropertiesManager>
- http_server_props_manager_;
+ std::unique_ptr<HttpServerPropertiesManager> http_server_props_manager_;
base::Time one_day_from_now_;
- QuicVersionVector advertised_versions_;
-
- // Overrides the main thread's message loop with a mock tick clock. Making the
- // main thread the |pref_test_task_runner_| matches expectations better than
- // having an independent TestMockTimeTaskRunner and makes tests easier to
- // write.
- base::ScopedMockTimeMessageLoopTaskRunner pref_test_task_runner_;
+ QuicTransportVersionVector advertised_versions_;
- // Mock the net task runner as well.
- scoped_refptr<TestMockTimeTaskRunner> net_test_task_runner_ =
- new TestMockTimeTaskRunner;
+ // Overrides the main thread's message loop with a mock tick clock.
+ base::ScopedMockTimeMessageLoopTaskRunner test_task_runner_;
std::unique_ptr<base::TickClock> net_test_task_runner_clock_;
@@ -268,8 +152,6 @@ INSTANTIATE_TEST_CASE_P(/* no prefix */,
TEST_P(HttpServerPropertiesManagerTest,
SingleUpdateForTwoSpdyServerPrefChanges) {
- ExpectCacheUpdate();
-
// Set up the prefs for https://www.google.com and https://mail.google.com and
// then set it twice. Only expect a single cache update.
@@ -390,15 +272,9 @@ TEST_P(HttpServerPropertiesManagerTest,
pref_delegate_->SetPrefs(http_server_properties_dict);
pref_delegate_->SetPrefs(http_server_properties_dict);
- EXPECT_TRUE(pref_test_task_runner_->HasPendingTask());
- EXPECT_FALSE(net_test_task_runner_->HasPendingTask());
- pref_test_task_runner_->FastForwardUntilNoTasksRemain();
- EXPECT_TRUE(net_test_task_runner_->HasPendingTask());
- net_test_task_runner_->FastForwardUntilNoTasksRemain();
- EXPECT_FALSE(pref_test_task_runner_->HasPendingTask());
- EXPECT_FALSE(net_test_task_runner_->HasPendingTask());
-
- Mock::VerifyAndClearExpectations(http_server_props_manager_.get());
+ // Should be a delayed task to update the cache from the prefs file.
+ EXPECT_TRUE(test_task_runner_->HasPendingTask());
+ test_task_runner_->FastForwardUntilNoTasksRemain();
// Verify SupportsSpdy.
EXPECT_TRUE(
@@ -464,11 +340,6 @@ TEST_P(HttpServerPropertiesManagerTest,
}
TEST_P(HttpServerPropertiesManagerTest, BadCachedHostPortPair) {
- ExpectCacheUpdate();
- // The prefs are automatically updated in the case corruption is detected.
- ExpectPrefsUpdate(1);
- ExpectScheduleUpdatePrefsOnNetworkSequence();
-
auto server_pref_dict = std::make_unique<base::DictionaryValue>();
// Set supports_spdy for www.google.com:65536.
@@ -525,17 +396,11 @@ TEST_P(HttpServerPropertiesManagerTest, BadCachedHostPortPair) {
// Set up the pref.
pref_delegate_->SetPrefs(http_server_properties_dict);
- EXPECT_TRUE(pref_test_task_runner_->HasPendingTask());
- EXPECT_FALSE(net_test_task_runner_->HasPendingTask());
- pref_test_task_runner_->FastForwardUntilNoTasksRemain();
- EXPECT_FALSE(pref_test_task_runner_->HasPendingTask());
- EXPECT_TRUE(net_test_task_runner_->HasPendingTask());
- net_test_task_runner_->FastForwardUntilNoTasksRemain();
- EXPECT_TRUE(pref_test_task_runner_->HasPendingTask());
- pref_test_task_runner_->FastForwardUntilNoTasksRemain();
- EXPECT_FALSE(net_test_task_runner_->HasPendingTask());
- EXPECT_FALSE(net_test_task_runner_->HasPendingTask());
- Mock::VerifyAndClearExpectations(http_server_props_manager_.get());
+ EXPECT_EQ(0, pref_delegate_->GetAndClearNumPrefUpdates());
+ EXPECT_TRUE(test_task_runner_->HasPendingTask());
+ test_task_runner_->FastForwardUntilNoTasksRemain();
+ // Prefs should have been overwritten, due to the bad data.
+ EXPECT_EQ(1, pref_delegate_->GetAndClearNumPrefUpdates());
// Verify that nothing is set.
HostPortPair google_host_port_pair =
@@ -553,11 +418,6 @@ TEST_P(HttpServerPropertiesManagerTest, BadCachedHostPortPair) {
}
TEST_P(HttpServerPropertiesManagerTest, BadCachedAltProtocolPort) {
- ExpectCacheUpdate();
- // The prefs are automatically updated in the case corruption is detected.
- ExpectPrefsUpdate(1);
- ExpectScheduleUpdatePrefsOnNetworkSequence();
-
auto server_pref_dict = std::make_unique<base::DictionaryValue>();
// Set supports_spdy for www.google.com:80.
@@ -598,17 +458,11 @@ TEST_P(HttpServerPropertiesManagerTest, BadCachedAltProtocolPort) {
// Set up the pref.
pref_delegate_->SetPrefs(http_server_properties_dict);
- EXPECT_TRUE(pref_test_task_runner_->HasPendingTask());
- EXPECT_FALSE(net_test_task_runner_->HasPendingTask());
- pref_test_task_runner_->FastForwardUntilNoTasksRemain();
- EXPECT_FALSE(pref_test_task_runner_->HasPendingTask());
- EXPECT_TRUE(net_test_task_runner_->HasPendingTask());
- net_test_task_runner_->FastForwardUntilNoTasksRemain();
- EXPECT_TRUE(pref_test_task_runner_->HasPendingTask());
- pref_test_task_runner_->FastForwardUntilNoTasksRemain();
- EXPECT_FALSE(net_test_task_runner_->HasPendingTask());
- EXPECT_FALSE(net_test_task_runner_->HasPendingTask());
- Mock::VerifyAndClearExpectations(http_server_props_manager_.get());
+ EXPECT_EQ(0, pref_delegate_->GetAndClearNumPrefUpdates());
+ EXPECT_TRUE(test_task_runner_->HasPendingTask());
+ test_task_runner_->FastForwardUntilNoTasksRemain();
+ // Prefs should have been overwritten, due to the bad data.
+ EXPECT_EQ(1, pref_delegate_->GetAndClearNumPrefUpdates());
// Verify alternative service is not set.
EXPECT_FALSE(
@@ -616,31 +470,28 @@ TEST_P(HttpServerPropertiesManagerTest, BadCachedAltProtocolPort) {
}
TEST_P(HttpServerPropertiesManagerTest, SupportsSpdy) {
- ExpectPrefsUpdate(1);
- ExpectScheduleUpdatePrefsOnNetworkSequence();
-
- // Post an update task to the network thread. SetSupportsSpdy calls
- // ScheduleUpdatePrefsOnNetworkSequence.
-
// Add mail.google.com:443 as a supporting spdy server.
url::SchemeHostPort spdy_server("https", "mail.google.com", 443);
EXPECT_FALSE(
http_server_props_manager_->SupportsRequestPriority(spdy_server));
http_server_props_manager_->SetSupportsSpdy(spdy_server, true);
- // ExpectScheduleUpdatePrefsOnNetworkSequence() should be called only once.
+ // Setting the value to the same thing again should not trigger another pref
+ // update.
http_server_props_manager_->SetSupportsSpdy(spdy_server, true);
// Run the task.
- EXPECT_TRUE(net_test_task_runner_->HasPendingTask());
- EXPECT_FALSE(pref_test_task_runner_->HasPendingTask());
- net_test_task_runner_->FastForwardUntilNoTasksRemain();
- EXPECT_TRUE(pref_test_task_runner_->HasPendingTask());
- pref_test_task_runner_->FastForwardUntilNoTasksRemain();
- EXPECT_FALSE(net_test_task_runner_->HasPendingTask());
- EXPECT_FALSE(pref_test_task_runner_->HasPendingTask());
+ EXPECT_EQ(0, pref_delegate_->GetAndClearNumPrefUpdates());
+ EXPECT_TRUE(test_task_runner_->HasPendingTask());
+ test_task_runner_->FastForwardUntilNoTasksRemain();
+ EXPECT_EQ(1, pref_delegate_->GetAndClearNumPrefUpdates());
+
+ // Setting the value to the same thing again should not trigger another pref
+ // update.
+ http_server_props_manager_->SetSupportsSpdy(spdy_server, true);
+ EXPECT_EQ(0, pref_delegate_->GetAndClearNumPrefUpdates());
+ EXPECT_FALSE(test_task_runner_->HasPendingTask());
EXPECT_TRUE(http_server_props_manager_->SupportsRequestPriority(spdy_server));
- Mock::VerifyAndClearExpectations(http_server_props_manager_.get());
}
// Regression test for crbug.com/670519. Test that there is only one pref update
@@ -649,86 +500,64 @@ TEST_P(HttpServerPropertiesManagerTest, SupportsSpdy) {
// completed.
TEST_P(HttpServerPropertiesManagerTest,
SinglePrefUpdateForTwoSpdyServerCacheChanges) {
- ExpectPrefsUpdate(2);
- ExpectScheduleUpdatePrefsOnNetworkSequenceRepeatedly(3);
-
- // Post an update task to the network thread. SetSupportsSpdy calls
- // ScheduleUpdatePrefsOnNetworkSequence with a delay of 60ms.
+ // Post an update task. SetSupportsSpdy calls ScheduleUpdatePrefs with a delay
+ // of 60ms.
url::SchemeHostPort spdy_server("https", "mail.google.com", 443);
EXPECT_FALSE(
http_server_props_manager_->SupportsRequestPriority(spdy_server));
http_server_props_manager_->SetSupportsSpdy(spdy_server, true);
- // The pref update task should be scheduled to network thread.
- EXPECT_EQ(1u, net_test_task_runner_->GetPendingTaskCount());
+ // The pref update task should be scheduled.
+ EXPECT_EQ(1u, test_task_runner_->GetPendingTaskCount());
// Move forward the task runner short by 20ms.
- net_test_task_runner_->FastForwardBy(
+ test_task_runner_->FastForwardBy(
HttpServerPropertiesManager::GetUpdatePrefsDelayForTesting() -
base::TimeDelta::FromMilliseconds(20));
// Set another spdy server to trigger another call to
- // ScheduleUpdatePrefsOnNetworkSequence. There should be no new update posted
- // to the network thread.
+ // ScheduleUpdatePrefs. There should be no new update posted.
url::SchemeHostPort spdy_server2("https", "drive.google.com", 443);
http_server_props_manager_->SetSupportsSpdy(spdy_server2, true);
- EXPECT_EQ(1u, net_test_task_runner_->GetPendingTaskCount());
- EXPECT_FALSE(pref_test_task_runner_->HasPendingTask());
+ EXPECT_EQ(1u, test_task_runner_->GetPendingTaskCount());
// Move forward the extra 20ms. The pref update should be executed.
- net_test_task_runner_->FastForwardBy(base::TimeDelta::FromMilliseconds(20));
- EXPECT_FALSE(net_test_task_runner_->HasPendingTask());
- EXPECT_TRUE(pref_test_task_runner_->HasPendingTask());
- pref_test_task_runner_->FastForwardUntilNoTasksRemain();
- EXPECT_FALSE(net_test_task_runner_->HasPendingTask());
- EXPECT_FALSE(pref_test_task_runner_->HasPendingTask());
+ EXPECT_EQ(0, pref_delegate_->GetAndClearNumPrefUpdates());
+ test_task_runner_->FastForwardBy(base::TimeDelta::FromMilliseconds(20));
+ EXPECT_EQ(1, pref_delegate_->GetAndClearNumPrefUpdates());
+ EXPECT_FALSE(test_task_runner_->HasPendingTask());
EXPECT_TRUE(http_server_props_manager_->SupportsRequestPriority(spdy_server));
EXPECT_TRUE(
http_server_props_manager_->SupportsRequestPriority(spdy_server2));
// Set the third spdy server to trigger one more call to
- // ScheduleUpdatePrefsOnNetworkSequence. A new update task should be posted to
- // network thread now since the previous one is completed.
+ // ScheduleUpdatePrefs. A new update task should be posted now since the
+ // previous one is completed.
url::SchemeHostPort spdy_server3("https", "maps.google.com", 443);
http_server_props_manager_->SetSupportsSpdy(spdy_server3, true);
- EXPECT_FALSE(pref_test_task_runner_->HasPendingTask());
- EXPECT_EQ(1u, net_test_task_runner_->GetPendingTaskCount());
+ EXPECT_EQ(1u, test_task_runner_->GetPendingTaskCount());
// Run the task.
- EXPECT_TRUE(net_test_task_runner_->HasPendingTask());
- EXPECT_FALSE(pref_test_task_runner_->HasPendingTask());
- net_test_task_runner_->FastForwardUntilNoTasksRemain();
- EXPECT_TRUE(pref_test_task_runner_->HasPendingTask());
- pref_test_task_runner_->FastForwardUntilNoTasksRemain();
- EXPECT_FALSE(net_test_task_runner_->HasPendingTask());
- EXPECT_FALSE(pref_test_task_runner_->HasPendingTask());
-
- Mock::VerifyAndClearExpectations(http_server_props_manager_.get());
+ EXPECT_EQ(0, pref_delegate_->GetAndClearNumPrefUpdates());
+ test_task_runner_->FastForwardUntilNoTasksRemain();
+ EXPECT_EQ(1, pref_delegate_->GetAndClearNumPrefUpdates());
}
TEST_P(HttpServerPropertiesManagerTest, GetAlternativeServiceInfos) {
- ExpectPrefsUpdate(1);
- ExpectScheduleUpdatePrefsOnNetworkSequence();
-
url::SchemeHostPort spdy_server_mail("http", "mail.google.com", 80);
EXPECT_FALSE(HasAlternativeService(spdy_server_mail));
const AlternativeService alternative_service(kProtoHTTP2, "mail.google.com",
443);
http_server_props_manager_->SetHttp2AlternativeService(
spdy_server_mail, alternative_service, one_day_from_now_);
- // ExpectScheduleUpdatePrefsOnNetworkSequence() should be called only once.
+ // ExpectScheduleUpdatePrefs() should be called only once.
http_server_props_manager_->SetHttp2AlternativeService(
spdy_server_mail, alternative_service, one_day_from_now_);
// Run the task.
- EXPECT_FALSE(pref_test_task_runner_->HasPendingTask());
- EXPECT_TRUE(net_test_task_runner_->HasPendingTask());
- net_test_task_runner_->FastForwardUntilNoTasksRemain();
- EXPECT_TRUE(pref_test_task_runner_->HasPendingTask());
- EXPECT_FALSE(net_test_task_runner_->HasPendingTask());
- pref_test_task_runner_->FastForwardUntilNoTasksRemain();
- EXPECT_FALSE(pref_test_task_runner_->HasPendingTask());
- EXPECT_FALSE(net_test_task_runner_->HasPendingTask());
- Mock::VerifyAndClearExpectations(http_server_props_manager_.get());
+ EXPECT_EQ(0, pref_delegate_->GetAndClearNumPrefUpdates());
+ EXPECT_TRUE(test_task_runner_->HasPendingTask());
+ test_task_runner_->FastForwardUntilNoTasksRemain();
+ EXPECT_EQ(1, pref_delegate_->GetAndClearNumPrefUpdates());
AlternativeServiceInfoVector alternative_service_info_vector =
http_server_props_manager_->GetAlternativeServiceInfos(spdy_server_mail);
@@ -738,9 +567,6 @@ TEST_P(HttpServerPropertiesManagerTest, GetAlternativeServiceInfos) {
}
TEST_P(HttpServerPropertiesManagerTest, SetAlternativeServices) {
- ExpectPrefsUpdate(1);
- ExpectScheduleUpdatePrefsOnNetworkSequence();
-
url::SchemeHostPort spdy_server_mail("http", "mail.google.com", 80);
EXPECT_FALSE(HasAlternativeService(spdy_server_mail));
AlternativeServiceInfoVector alternative_service_info_vector;
@@ -756,20 +582,14 @@ TEST_P(HttpServerPropertiesManagerTest, SetAlternativeServices) {
alternative_service2, one_day_from_now_, advertised_versions_));
http_server_props_manager_->SetAlternativeServices(
spdy_server_mail, alternative_service_info_vector);
- // ExpectScheduleUpdatePrefsOnNetworkSequence() should be called only once.
+ // ExpectScheduleUpdatePrefs() should be called only once.
http_server_props_manager_->SetAlternativeServices(
spdy_server_mail, alternative_service_info_vector);
// Run the task.
- EXPECT_FALSE(pref_test_task_runner_->HasPendingTask());
- EXPECT_TRUE(net_test_task_runner_->HasPendingTask());
- net_test_task_runner_->FastForwardUntilNoTasksRemain();
- EXPECT_TRUE(pref_test_task_runner_->HasPendingTask());
- EXPECT_FALSE(net_test_task_runner_->HasPendingTask());
- pref_test_task_runner_->FastForwardUntilNoTasksRemain();
- EXPECT_FALSE(pref_test_task_runner_->HasPendingTask());
- EXPECT_FALSE(net_test_task_runner_->HasPendingTask());
- Mock::VerifyAndClearExpectations(http_server_props_manager_.get());
+ EXPECT_EQ(0, pref_delegate_->GetAndClearNumPrefUpdates());
+ test_task_runner_->FastForwardUntilNoTasksRemain();
+ EXPECT_EQ(1, pref_delegate_->GetAndClearNumPrefUpdates());
AlternativeServiceInfoVector alternative_service_info_vector2 =
http_server_props_manager_->GetAlternativeServiceInfos(spdy_server_mail);
@@ -788,114 +608,83 @@ TEST_P(HttpServerPropertiesManagerTest, SetAlternativeServicesEmpty) {
http_server_props_manager_->SetAlternativeServices(
spdy_server_mail, AlternativeServiceInfoVector());
- // ExpectScheduleUpdatePrefsOnNetworkSequence() should not be called.
- EXPECT_FALSE(pref_test_task_runner_->HasPendingTask());
- EXPECT_FALSE(net_test_task_runner_->HasPendingTask());
- Mock::VerifyAndClearExpectations(http_server_props_manager_.get());
+ EXPECT_FALSE(test_task_runner_->HasPendingTask());
+ EXPECT_EQ(0, pref_delegate_->GetAndClearNumPrefUpdates());
EXPECT_FALSE(HasAlternativeService(spdy_server_mail));
}
TEST_P(HttpServerPropertiesManagerTest, ConfirmAlternativeService) {
- ExpectPrefsUpdate(1);
-
url::SchemeHostPort spdy_server_mail;
AlternativeService alternative_service;
- {
- TestMockTimeTaskRunner::ScopedContext scoped_context(net_test_task_runner_);
+ spdy_server_mail = url::SchemeHostPort("http", "mail.google.com", 80);
+ EXPECT_FALSE(HasAlternativeService(spdy_server_mail));
+ alternative_service = AlternativeService(kProtoHTTP2, "mail.google.com", 443);
- spdy_server_mail = url::SchemeHostPort("http", "mail.google.com", 80);
- EXPECT_FALSE(HasAlternativeService(spdy_server_mail));
- alternative_service =
- AlternativeService(kProtoHTTP2, "mail.google.com", 443);
+ http_server_props_manager_->SetHttp2AlternativeService(
+ spdy_server_mail, alternative_service, one_day_from_now_);
+ EXPECT_FALSE(http_server_props_manager_->IsAlternativeServiceBroken(
+ alternative_service));
+ EXPECT_FALSE(http_server_props_manager_->WasAlternativeServiceRecentlyBroken(
+ alternative_service));
- ExpectScheduleUpdatePrefsOnNetworkSequence();
- http_server_props_manager_->SetHttp2AlternativeService(
- spdy_server_mail, alternative_service, one_day_from_now_);
+ EXPECT_EQ(1u, test_task_runner_->GetPendingTaskCount());
- EXPECT_FALSE(http_server_props_manager_->IsAlternativeServiceBroken(
- alternative_service));
- EXPECT_FALSE(
- http_server_props_manager_->WasAlternativeServiceRecentlyBroken(
- alternative_service));
+ http_server_props_manager_->MarkAlternativeServiceBroken(alternative_service);
+ EXPECT_TRUE(http_server_props_manager_->IsAlternativeServiceBroken(
+ alternative_service));
+ EXPECT_TRUE(http_server_props_manager_->WasAlternativeServiceRecentlyBroken(
+ alternative_service));
- ExpectScheduleUpdatePrefsOnNetworkSequence();
- http_server_props_manager_->MarkAlternativeServiceBroken(
- alternative_service);
- EXPECT_TRUE(http_server_props_manager_->IsAlternativeServiceBroken(
- alternative_service));
- EXPECT_TRUE(http_server_props_manager_->WasAlternativeServiceRecentlyBroken(
- alternative_service));
+ // In addition to the pref update task, there's now a task to mark the
+ // alternative service as no longer broken.
+ EXPECT_EQ(2u, test_task_runner_->GetPendingTaskCount());
- ExpectScheduleUpdatePrefsOnNetworkSequence();
- http_server_props_manager_->ConfirmAlternativeService(alternative_service);
- EXPECT_FALSE(http_server_props_manager_->IsAlternativeServiceBroken(
- alternative_service));
- EXPECT_FALSE(
- http_server_props_manager_->WasAlternativeServiceRecentlyBroken(
- alternative_service));
- // ExpectScheduleUpdatePrefsOnNetworkSequence() should be called only once.
- http_server_props_manager_->ConfirmAlternativeService(alternative_service);
- EXPECT_FALSE(http_server_props_manager_->IsAlternativeServiceBroken(
- alternative_service));
- EXPECT_FALSE(
- http_server_props_manager_->WasAlternativeServiceRecentlyBroken(
- alternative_service));
- }
+ http_server_props_manager_->ConfirmAlternativeService(alternative_service);
+ EXPECT_FALSE(http_server_props_manager_->IsAlternativeServiceBroken(
+ alternative_service));
+ EXPECT_FALSE(http_server_props_manager_->WasAlternativeServiceRecentlyBroken(
+ alternative_service));
+
+ EXPECT_EQ(2u, test_task_runner_->GetPendingTaskCount());
// Run the task.
- EXPECT_FALSE(pref_test_task_runner_->HasPendingTask());
- EXPECT_TRUE(net_test_task_runner_->HasPendingTask());
- net_test_task_runner_->FastForwardUntilNoTasksRemain();
- EXPECT_TRUE(pref_test_task_runner_->HasPendingTask());
- pref_test_task_runner_->FastForwardUntilNoTasksRemain();
- EXPECT_FALSE(net_test_task_runner_->HasPendingTask());
- EXPECT_FALSE(pref_test_task_runner_->HasPendingTask());
-
- Mock::VerifyAndClearExpectations(http_server_props_manager_.get());
-
- {
- TestMockTimeTaskRunner::ScopedContext scoped_context(net_test_task_runner_);
- EXPECT_FALSE(http_server_props_manager_->IsAlternativeServiceBroken(
- alternative_service));
- EXPECT_FALSE(
- http_server_props_manager_->WasAlternativeServiceRecentlyBroken(
- alternative_service));
- }
+ EXPECT_TRUE(test_task_runner_->HasPendingTask());
+ test_task_runner_->FastForwardUntilNoTasksRemain();
+ EXPECT_EQ(1, pref_delegate_->GetAndClearNumPrefUpdates());
+
+ EXPECT_FALSE(http_server_props_manager_->IsAlternativeServiceBroken(
+ alternative_service));
+ EXPECT_FALSE(http_server_props_manager_->WasAlternativeServiceRecentlyBroken(
+ alternative_service));
}
TEST_P(HttpServerPropertiesManagerTest, SupportsQuic) {
- ExpectPrefsUpdate(1);
- ExpectScheduleUpdatePrefsOnNetworkSequence();
-
IPAddress address;
EXPECT_FALSE(http_server_props_manager_->GetSupportsQuic(&address));
IPAddress actual_address(127, 0, 0, 1);
http_server_props_manager_->SetSupportsQuic(true, actual_address);
- // ExpectScheduleUpdatePrefsOnNetworkSequence() should be called only once.
+ // Another task should not be scheduled.
http_server_props_manager_->SetSupportsQuic(true, actual_address);
// Run the task.
- EXPECT_FALSE(pref_test_task_runner_->HasPendingTask());
- EXPECT_TRUE(net_test_task_runner_->HasPendingTask());
- net_test_task_runner_->FastForwardUntilNoTasksRemain();
- EXPECT_TRUE(pref_test_task_runner_->HasPendingTask());
- pref_test_task_runner_->FastForwardUntilNoTasksRemain();
- EXPECT_FALSE(net_test_task_runner_->HasPendingTask());
- EXPECT_FALSE(pref_test_task_runner_->HasPendingTask());
-
- Mock::VerifyAndClearExpectations(http_server_props_manager_.get());
+ EXPECT_EQ(0, pref_delegate_->GetAndClearNumPrefUpdates());
+ EXPECT_TRUE(test_task_runner_->HasPendingTask());
+ test_task_runner_->FastForwardUntilNoTasksRemain();
+ EXPECT_EQ(1, pref_delegate_->GetAndClearNumPrefUpdates());
EXPECT_TRUE(http_server_props_manager_->GetSupportsQuic(&address));
EXPECT_EQ(actual_address, address);
+
+ // Another task should not be scheduled.
+ http_server_props_manager_->SetSupportsQuic(true, actual_address);
+ EXPECT_EQ(0, pref_delegate_->GetAndClearNumPrefUpdates());
+ EXPECT_FALSE(test_task_runner_->HasPendingTask());
}
TEST_P(HttpServerPropertiesManagerTest, ServerNetworkStats) {
- ExpectPrefsUpdate(1);
- ExpectScheduleUpdatePrefsOnNetworkSequence();
-
url::SchemeHostPort mail_server("http", "mail.google.com", 80);
const ServerNetworkStats* stats =
http_server_props_manager_->GetServerNetworkStats(mail_server);
@@ -903,76 +692,64 @@ TEST_P(HttpServerPropertiesManagerTest, ServerNetworkStats) {
ServerNetworkStats stats1;
stats1.srtt = base::TimeDelta::FromMicroseconds(10);
http_server_props_manager_->SetServerNetworkStats(mail_server, stats1);
- // ExpectScheduleUpdatePrefsOnNetworkSequence() should be called only once.
+ // Another task should not be scheduled.
http_server_props_manager_->SetServerNetworkStats(mail_server, stats1);
// Run the task.
- EXPECT_FALSE(pref_test_task_runner_->HasPendingTask());
- EXPECT_TRUE(net_test_task_runner_->HasPendingTask());
- net_test_task_runner_->FastForwardUntilNoTasksRemain();
- EXPECT_TRUE(pref_test_task_runner_->HasPendingTask());
- pref_test_task_runner_->FastForwardUntilNoTasksRemain();
- EXPECT_FALSE(net_test_task_runner_->HasPendingTask());
- EXPECT_FALSE(pref_test_task_runner_->HasPendingTask());
+ EXPECT_EQ(0, pref_delegate_->GetAndClearNumPrefUpdates());
+ EXPECT_TRUE(test_task_runner_->HasPendingTask());
+ test_task_runner_->FastForwardUntilNoTasksRemain();
+ EXPECT_EQ(1, pref_delegate_->GetAndClearNumPrefUpdates());
- Mock::VerifyAndClearExpectations(http_server_props_manager_.get());
+ // Another task should not be scheduled.
+ http_server_props_manager_->SetServerNetworkStats(mail_server, stats1);
+ EXPECT_EQ(0, pref_delegate_->GetAndClearNumPrefUpdates());
+ EXPECT_FALSE(test_task_runner_->HasPendingTask());
const ServerNetworkStats* stats2 =
http_server_props_manager_->GetServerNetworkStats(mail_server);
EXPECT_EQ(10, stats2->srtt.ToInternalValue());
- ExpectPrefsUpdate(1);
- ExpectScheduleUpdatePrefsOnNetworkSequence();
-
http_server_props_manager_->ClearServerNetworkStats(mail_server);
// Run the task.
- EXPECT_FALSE(pref_test_task_runner_->HasPendingTask());
- EXPECT_TRUE(net_test_task_runner_->HasPendingTask());
- net_test_task_runner_->FastForwardUntilNoTasksRemain();
- EXPECT_TRUE(pref_test_task_runner_->HasPendingTask());
- pref_test_task_runner_->FastForwardUntilNoTasksRemain();
- EXPECT_FALSE(net_test_task_runner_->HasPendingTask());
- EXPECT_FALSE(pref_test_task_runner_->HasPendingTask());
-
- Mock::VerifyAndClearExpectations(http_server_props_manager_.get());
+ EXPECT_EQ(0, pref_delegate_->GetAndClearNumPrefUpdates());
+ EXPECT_TRUE(test_task_runner_->HasPendingTask());
+ test_task_runner_->FastForwardUntilNoTasksRemain();
+ EXPECT_EQ(1, pref_delegate_->GetAndClearNumPrefUpdates());
+
EXPECT_EQ(nullptr,
http_server_props_manager_->GetServerNetworkStats(mail_server));
}
TEST_P(HttpServerPropertiesManagerTest, QuicServerInfo) {
- ExpectPrefsUpdate(1);
- ExpectScheduleUpdatePrefsOnNetworkSequence();
-
QuicServerId mail_quic_server_id("mail.google.com", 80);
EXPECT_EQ(nullptr,
http_server_props_manager_->GetQuicServerInfo(mail_quic_server_id));
std::string quic_server_info1("quic_server_info1");
http_server_props_manager_->SetQuicServerInfo(mail_quic_server_id,
quic_server_info1);
- // ExpectScheduleUpdatePrefsOnNetworkSequence() should be called only once.
+ // Another task should not be scheduled.
http_server_props_manager_->SetQuicServerInfo(mail_quic_server_id,
quic_server_info1);
// Run the task.
- EXPECT_FALSE(pref_test_task_runner_->HasPendingTask());
- EXPECT_TRUE(net_test_task_runner_->HasPendingTask());
- net_test_task_runner_->FastForwardUntilNoTasksRemain();
- EXPECT_TRUE(pref_test_task_runner_->HasPendingTask());
- pref_test_task_runner_->FastForwardUntilNoTasksRemain();
- EXPECT_FALSE(net_test_task_runner_->HasPendingTask());
- EXPECT_FALSE(pref_test_task_runner_->HasPendingTask());
-
- Mock::VerifyAndClearExpectations(http_server_props_manager_.get());
+ EXPECT_EQ(0, pref_delegate_->GetAndClearNumPrefUpdates());
+ EXPECT_TRUE(test_task_runner_->HasPendingTask());
+ test_task_runner_->FastForwardUntilNoTasksRemain();
+ EXPECT_EQ(1, pref_delegate_->GetAndClearNumPrefUpdates());
EXPECT_EQ(quic_server_info1, *http_server_props_manager_->GetQuicServerInfo(
mail_quic_server_id));
+
+ // Another task should not be scheduled.
+ http_server_props_manager_->SetQuicServerInfo(mail_quic_server_id,
+ quic_server_info1);
+ EXPECT_EQ(0, pref_delegate_->GetAndClearNumPrefUpdates());
+ EXPECT_FALSE(test_task_runner_->HasPendingTask());
}
TEST_P(HttpServerPropertiesManagerTest, Clear) {
- ExpectPrefsUpdate(1);
- ExpectScheduleUpdatePrefsOnNetworkSequenceRepeatedly(5);
-
const url::SchemeHostPort spdy_server("https", "mail.google.com", 443);
const IPAddress actual_address(127, 0, 0, 1);
const QuicServerId mail_quic_server_id("mail.google.com", 80);
@@ -981,38 +758,34 @@ TEST_P(HttpServerPropertiesManagerTest, Clear) {
1234);
const AlternativeService broken_alternative_service(
kProtoHTTP2, "broken.google.com", 1234);
- {
- TestMockTimeTaskRunner::ScopedContext scoped_context(net_test_task_runner_);
-
- AlternativeServiceInfoVector alt_svc_info_vector;
- alt_svc_info_vector.push_back(
- AlternativeServiceInfo::CreateHttp2AlternativeServiceInfo(
- alternative_service, one_day_from_now_));
- alt_svc_info_vector.push_back(
- AlternativeServiceInfo::CreateHttp2AlternativeServiceInfo(
- broken_alternative_service, one_day_from_now_));
- http_server_props_manager_->SetAlternativeServices(spdy_server,
- alt_svc_info_vector);
- http_server_props_manager_->MarkAlternativeServiceBroken(
- broken_alternative_service);
- http_server_props_manager_->SetSupportsSpdy(spdy_server, true);
- http_server_props_manager_->SetSupportsQuic(true, actual_address);
- ServerNetworkStats stats;
- stats.srtt = base::TimeDelta::FromMicroseconds(10);
- http_server_props_manager_->SetServerNetworkStats(spdy_server, stats);
-
- http_server_props_manager_->SetQuicServerInfo(mail_quic_server_id,
- quic_server_info1);
- }
+ AlternativeServiceInfoVector alt_svc_info_vector;
+ alt_svc_info_vector.push_back(
+ AlternativeServiceInfo::CreateHttp2AlternativeServiceInfo(
+ alternative_service, one_day_from_now_));
+ alt_svc_info_vector.push_back(
+ AlternativeServiceInfo::CreateHttp2AlternativeServiceInfo(
+ broken_alternative_service, one_day_from_now_));
+ http_server_props_manager_->SetAlternativeServices(spdy_server,
+ alt_svc_info_vector);
+
+ http_server_props_manager_->MarkAlternativeServiceBroken(
+ broken_alternative_service);
+ http_server_props_manager_->SetSupportsSpdy(spdy_server, true);
+ http_server_props_manager_->SetSupportsQuic(true, actual_address);
+ ServerNetworkStats stats;
+ stats.srtt = base::TimeDelta::FromMicroseconds(10);
+ http_server_props_manager_->SetServerNetworkStats(spdy_server, stats);
+
+ http_server_props_manager_->SetQuicServerInfo(mail_quic_server_id,
+ quic_server_info1);
// Advance time by just enough so that the prefs update task is executed but
// not the task to expire the brokenness of |broken_alternative_service|.
- EXPECT_FALSE(pref_test_task_runner_->HasPendingTask());
- EXPECT_TRUE(net_test_task_runner_->HasPendingTask());
- net_test_task_runner_->FastForwardBy(
+ test_task_runner_->FastForwardBy(
HttpServerPropertiesManager::GetUpdatePrefsDelayForTesting());
- EXPECT_TRUE(net_test_task_runner_->HasPendingTask());
+ EXPECT_TRUE(test_task_runner_->HasPendingTask());
+ EXPECT_EQ(1, pref_delegate_->GetAndClearNumPrefUpdates());
EXPECT_TRUE(http_server_props_manager_->IsAlternativeServiceBroken(
broken_alternative_service));
@@ -1027,18 +800,10 @@ TEST_P(HttpServerPropertiesManagerTest, Clear) {
EXPECT_EQ(quic_server_info1, *http_server_props_manager_->GetQuicServerInfo(
mail_quic_server_id));
- Mock::VerifyAndClearExpectations(http_server_props_manager_.get());
-
- ExpectPrefsUpdate(1);
-
- // Clear http server data and run the ensuing non-delayed prefs update.
- {
- TestMockTimeTaskRunner::ScopedContext scoped_context(net_test_task_runner_);
- http_server_props_manager_->Clear();
- }
- EXPECT_TRUE(pref_test_task_runner_->HasPendingTask());
- pref_test_task_runner_->RunUntilIdle();
- EXPECT_FALSE(pref_test_task_runner_->HasPendingTask());
+ // Clear http server data, which should instantly update prefs.
+ EXPECT_EQ(0, pref_delegate_->GetAndClearNumPrefUpdates());
+ http_server_props_manager_->Clear();
+ EXPECT_EQ(1, pref_delegate_->GetAndClearNumPrefUpdates());
EXPECT_FALSE(http_server_props_manager_->IsAlternativeServiceBroken(
broken_alternative_service));
@@ -1051,15 +816,11 @@ TEST_P(HttpServerPropertiesManagerTest, Clear) {
EXPECT_EQ(nullptr, stats2);
EXPECT_EQ(nullptr,
http_server_props_manager_->GetQuicServerInfo(mail_quic_server_id));
-
- Mock::VerifyAndClearExpectations(http_server_props_manager_.get());
}
// https://crbug.com/444956: Add 200 alternative_service servers followed by
// supports_quic and verify we have read supports_quic from prefs.
TEST_P(HttpServerPropertiesManagerTest, BadSupportsQuic) {
- ExpectCacheUpdate();
-
auto servers_dict = std::make_unique<base::DictionaryValue>();
std::unique_ptr<base::ListValue> servers_list;
if (GetParam() >= 4)
@@ -1125,16 +886,7 @@ TEST_P(HttpServerPropertiesManagerTest, BadSupportsQuic) {
// Set up the pref.
pref_delegate_->SetPrefs(http_server_properties_dict);
-
- EXPECT_FALSE(net_test_task_runner_->HasPendingTask());
- EXPECT_TRUE(pref_test_task_runner_->HasPendingTask());
- pref_test_task_runner_->FastForwardUntilNoTasksRemain();
- EXPECT_TRUE(net_test_task_runner_->HasPendingTask());
- net_test_task_runner_->FastForwardUntilNoTasksRemain();
- EXPECT_FALSE(net_test_task_runner_->HasPendingTask());
- EXPECT_FALSE(pref_test_task_runner_->HasPendingTask());
-
- Mock::VerifyAndClearExpectations(http_server_props_manager_.get());
+ test_task_runner_->FastForwardUntilNoTasksRemain();
// Verify alternative service.
for (int i = 1; i <= 200; ++i) {
@@ -1161,8 +913,6 @@ TEST_P(HttpServerPropertiesManagerTest, BadSupportsQuic) {
}
TEST_P(HttpServerPropertiesManagerTest, UpdatePrefsWithCache) {
- ExpectScheduleUpdatePrefsOnNetworkSequenceRepeatedly(7);
-
const url::SchemeHostPort server_www("https", "www.google.com", 80);
const url::SchemeHostPort server_mail("https", "mail.google.com", 80);
@@ -1191,16 +941,10 @@ TEST_P(HttpServerPropertiesManagerTest, UpdatePrefsWithCache) {
ASSERT_TRUE(http_server_props_manager_->SetHttp2AlternativeService(
server_mail, mail_alternative_service, expiration3));
- // #3 & #4: Mark alternate protocol broken/recently broken.
- {
- base::TestMockTimeTaskRunner::ScopedContext net_test_task_runner_context(
- net_test_task_runner_);
-
- http_server_props_manager_->MarkAlternativeServiceBroken(
- www_alternative_service2);
- http_server_props_manager_->MarkAlternativeServiceRecentlyBroken(
- mail_alternative_service);
- }
+ http_server_props_manager_->MarkAlternativeServiceBroken(
+ www_alternative_service2);
+ http_server_props_manager_->MarkAlternativeServiceRecentlyBroken(
+ mail_alternative_service);
// #5: Set ServerNetworkStats.
ServerNetworkStats stats;
@@ -1220,20 +964,16 @@ TEST_P(HttpServerPropertiesManagerTest, UpdatePrefsWithCache) {
base::Time time_before_prefs_update = base::Time::Now();
// Update Prefs.
- // |net_test_task_runner_| has a remaining pending task to expire
+ // |test_task_runner_| has a remaining pending task to expire
// |www_alternative_service2| in 5 minutes. Fast forward enough such
// that the prefs update task is executed but not the task to expire
// |broken_alternative_service|.
- ExpectPrefsUpdate(1);
- EXPECT_EQ(2u, net_test_task_runner_->GetPendingTaskCount());
- EXPECT_FALSE(pref_test_task_runner_->HasPendingTask());
- net_test_task_runner_->FastForwardBy(
+ EXPECT_EQ(2u, test_task_runner_->GetPendingTaskCount());
+ EXPECT_EQ(0, pref_delegate_->GetAndClearNumPrefUpdates());
+ test_task_runner_->FastForwardBy(
HttpServerPropertiesManager::GetUpdatePrefsDelayForTesting());
- EXPECT_EQ(1u, net_test_task_runner_->GetPendingTaskCount());
- EXPECT_TRUE(pref_test_task_runner_->HasPendingTask());
- pref_test_task_runner_->FastForwardUntilNoTasksRemain();
- EXPECT_EQ(1u, net_test_task_runner_->GetPendingTaskCount());
- EXPECT_FALSE(pref_test_task_runner_->HasPendingTask());
+ EXPECT_EQ(1u, test_task_runner_->GetPendingTaskCount());
+ EXPECT_EQ(1, pref_delegate_->GetAndClearNumPrefUpdates());
base::Time time_after_prefs_update = base::Time::Now();
@@ -1248,7 +988,8 @@ TEST_P(HttpServerPropertiesManagerTest, UpdatePrefsWithCache) {
// A copy of |pref_delegate_|'s server dict will be created, and the broken
// alternative service's "broken_until" field is removed and verified
// separately. The rest of the server dict copy is verified afterwards.
- base::Value server_value_copy = pref_delegate_->GetServerProperties().Clone();
+ base::Value server_value_copy =
+ pref_delegate_->GetServerProperties()->Clone();
// Extract and remove the "broken_until" string for "www.google.com:1234".
base::DictionaryValue* server_dict;
@@ -1313,39 +1054,34 @@ TEST_P(HttpServerPropertiesManagerTest, UpdatePrefsWithCache) {
TEST_P(HttpServerPropertiesManagerTest,
SingleCacheUpdateForMultipleUpdatesScheduled) {
+ EXPECT_EQ(0u, test_task_runner_->GetPendingTaskCount());
// Update cache.
- ExpectCacheUpdate();
-
- EXPECT_EQ(0u, pref_test_task_runner_->GetPendingTaskCount());
- // Update cache.
- http_server_props_manager_->ScheduleUpdateCacheOnPrefThread();
- EXPECT_EQ(1u, pref_test_task_runner_->GetPendingTaskCount());
+ http_server_props_manager_->ScheduleUpdateCacheForTesting();
+ EXPECT_EQ(1u, test_task_runner_->GetPendingTaskCount());
// Move forward the task runner short by 20ms.
- pref_test_task_runner_->FastForwardBy(
+ test_task_runner_->FastForwardBy(
HttpServerPropertiesManager::GetUpdateCacheDelayForTesting() -
base::TimeDelta::FromMilliseconds(20));
// Schedule a new cache update within the time window should be a no-op.
- http_server_props_manager_->ScheduleUpdateCacheOnPrefThread();
- EXPECT_EQ(1u, pref_test_task_runner_->GetPendingTaskCount());
+ http_server_props_manager_->ScheduleUpdateCacheForTesting();
+ EXPECT_EQ(1u, test_task_runner_->GetPendingTaskCount());
// Move forward the task runner the extra 20ms, now the cache update should be
// executed.
- pref_test_task_runner_->FastForwardBy(base::TimeDelta::FromMilliseconds(20));
+ test_task_runner_->FastForwardBy(base::TimeDelta::FromMilliseconds(20));
// Since this test has no pref corruption, there shouldn't be any pref update.
- EXPECT_FALSE(net_test_task_runner_->HasPendingTask());
- EXPECT_FALSE(pref_test_task_runner_->HasPendingTask());
+ EXPECT_EQ(0, pref_delegate_->GetAndClearNumPrefUpdates());
+ EXPECT_FALSE(test_task_runner_->HasPendingTask());
// Schedule one more cache update. The task should be successfully scheduled
- // on pref task runner.
- ExpectCacheUpdate();
- http_server_props_manager_->ScheduleUpdateCacheOnPrefThread();
- EXPECT_EQ(1u, pref_test_task_runner_->GetPendingTaskCount());
-
- pref_test_task_runner_->FastForwardUntilNoTasksRemain();
- EXPECT_FALSE(pref_test_task_runner_->HasPendingTask());
- EXPECT_FALSE(net_test_task_runner_->HasPendingTask());
+ // on the task runner.
+ http_server_props_manager_->ScheduleUpdateCacheForTesting();
+ EXPECT_EQ(1u, test_task_runner_->GetPendingTaskCount());
+
+ test_task_runner_->FastForwardUntilNoTasksRemain();
+ EXPECT_EQ(0, pref_delegate_->GetAndClearNumPrefUpdates());
}
TEST_P(HttpServerPropertiesManagerTest, AddToAlternativeServiceMap) {
@@ -1419,69 +1155,54 @@ TEST_P(HttpServerPropertiesManagerTest, DoNotLoadAltSvcForInsecureOrigins) {
// Do not persist expired alternative service entries to disk.
TEST_P(HttpServerPropertiesManagerTest, DoNotPersistExpiredAlternativeService) {
- ExpectScheduleUpdatePrefsOnNetworkSequenceRepeatedly(2);
-
- {
- TestMockTimeTaskRunner::ScopedContext scoped_context(net_test_task_runner_);
-
- AlternativeServiceInfoVector alternative_service_info_vector;
+ AlternativeServiceInfoVector alternative_service_info_vector;
- const AlternativeService broken_alternative_service(
- kProtoHTTP2, "broken.example.com", 443);
- const base::Time time_one_day_later =
- base::Time::Now() + base::TimeDelta::FromDays(1);
- alternative_service_info_vector.push_back(
- AlternativeServiceInfo::CreateHttp2AlternativeServiceInfo(
- broken_alternative_service, time_one_day_later));
- // #1: MarkAlternativeServiceBroken().
- http_server_props_manager_->MarkAlternativeServiceBroken(
- broken_alternative_service);
-
- const AlternativeService expired_alternative_service(
- kProtoHTTP2, "expired.example.com", 443);
- const base::Time time_one_day_ago =
- base::Time::Now() - base::TimeDelta::FromDays(1);
- alternative_service_info_vector.push_back(
- AlternativeServiceInfo::CreateHttp2AlternativeServiceInfo(
- expired_alternative_service, time_one_day_ago));
-
- const AlternativeService valid_alternative_service(
- kProtoHTTP2, "valid.example.com", 443);
- alternative_service_info_vector.push_back(
- AlternativeServiceInfo::CreateHttp2AlternativeServiceInfo(
- valid_alternative_service, time_one_day_later));
-
- const url::SchemeHostPort server("https", "www.example.com", 443);
- // #2: SetAlternativeServices().
- ASSERT_TRUE(http_server_props_manager_->SetAlternativeServices(
- server, alternative_service_info_vector));
- }
+ const AlternativeService broken_alternative_service(
+ kProtoHTTP2, "broken.example.com", 443);
+ const base::Time time_one_day_later =
+ base::Time::Now() + base::TimeDelta::FromDays(1);
+ alternative_service_info_vector.push_back(
+ AlternativeServiceInfo::CreateHttp2AlternativeServiceInfo(
+ broken_alternative_service, time_one_day_later));
+ // #1: MarkAlternativeServiceBroken().
+ http_server_props_manager_->MarkAlternativeServiceBroken(
+ broken_alternative_service);
+
+ const AlternativeService expired_alternative_service(
+ kProtoHTTP2, "expired.example.com", 443);
+ const base::Time time_one_day_ago =
+ base::Time::Now() - base::TimeDelta::FromDays(1);
+ alternative_service_info_vector.push_back(
+ AlternativeServiceInfo::CreateHttp2AlternativeServiceInfo(
+ expired_alternative_service, time_one_day_ago));
- // Update cache.
- ExpectPrefsUpdate(1);
+ const AlternativeService valid_alternative_service(kProtoHTTP2,
+ "valid.example.com", 443);
+ alternative_service_info_vector.push_back(
+ AlternativeServiceInfo::CreateHttp2AlternativeServiceInfo(
+ valid_alternative_service, time_one_day_later));
- EXPECT_TRUE(net_test_task_runner_->HasPendingTask());
- EXPECT_FALSE(pref_test_task_runner_->HasPendingTask());
+ const url::SchemeHostPort server("https", "www.example.com", 443);
+ // #2: SetAlternativeServices().
+ ASSERT_TRUE(http_server_props_manager_->SetAlternativeServices(
+ server, alternative_service_info_vector));
// |net_test_task_runner_| has a remaining pending task to expire
// |broken_alternative_service| at |time_one_day_later|. Fast forward enough
// such that the prefs update task is executed but not the task to expire
// |broken_alternative_service|.
- EXPECT_EQ(2U, net_test_task_runner_->GetPendingTaskCount());
- net_test_task_runner_->FastForwardBy(
+ EXPECT_EQ(2U, test_task_runner_->GetPendingTaskCount());
+ EXPECT_EQ(0, pref_delegate_->GetAndClearNumPrefUpdates());
+ test_task_runner_->FastForwardBy(
HttpServerPropertiesManager::GetUpdatePrefsDelayForTesting());
- EXPECT_EQ(1U, net_test_task_runner_->GetPendingTaskCount());
-
- EXPECT_TRUE(pref_test_task_runner_->HasPendingTask());
- pref_test_task_runner_->FastForwardUntilNoTasksRemain();
- EXPECT_EQ(1U, net_test_task_runner_->GetPendingTaskCount());
- EXPECT_FALSE(pref_test_task_runner_->HasPendingTask());
+ EXPECT_EQ(1U, test_task_runner_->GetPendingTaskCount());
+ EXPECT_EQ(1, pref_delegate_->GetAndClearNumPrefUpdates());
- const base::DictionaryValue& pref_dict =
+ const base::DictionaryValue* pref_dict =
pref_delegate_->GetServerProperties();
const base::ListValue* servers_list = nullptr;
- ASSERT_TRUE(pref_dict.GetListWithoutPathExpansion("servers", &servers_list));
+ ASSERT_TRUE(pref_dict->GetListWithoutPathExpansion("servers", &servers_list));
base::ListValue::const_iterator it = servers_list->begin();
const base::DictionaryValue* server_pref_dict;
ASSERT_TRUE(it->GetAsDictionary(&server_pref_dict));
@@ -1551,110 +1272,16 @@ TEST_P(HttpServerPropertiesManagerTest, DoNotLoadExpiredAlternativeService) {
EXPECT_EQ(one_day_from_now_, alternative_service_info_vector[0].expiration());
}
-TEST_P(HttpServerPropertiesManagerTest, ShutdownWithPendingUpdateCache0) {
- // Post an update task to the UI thread.
- http_server_props_manager_->ScheduleUpdateCacheOnPrefThread();
- // Shutdown comes before the task is executed.
- http_server_props_manager_->ShutdownOnPrefSequence();
- http_server_props_manager_.reset();
- // Run the task after shutdown and deletion.
- EXPECT_FALSE(net_test_task_runner_->HasPendingTask());
- EXPECT_TRUE(pref_test_task_runner_->HasPendingTask());
- pref_test_task_runner_->FastForwardUntilNoTasksRemain();
- EXPECT_FALSE(net_test_task_runner_->HasPendingTask());
- EXPECT_FALSE(pref_test_task_runner_->HasPendingTask());
-}
-
-TEST_P(HttpServerPropertiesManagerTest, ShutdownWithPendingUpdateCache1) {
- // Post an update task.
- http_server_props_manager_->ScheduleUpdateCacheOnPrefThread();
- // Shutdown comes before the task is executed.
- http_server_props_manager_->ShutdownOnPrefSequence();
- // Run the task after shutdown, but before deletion.
- EXPECT_FALSE(net_test_task_runner_->HasPendingTask());
- EXPECT_TRUE(pref_test_task_runner_->HasPendingTask());
- pref_test_task_runner_->FastForwardUntilNoTasksRemain();
- EXPECT_FALSE(net_test_task_runner_->HasPendingTask());
- EXPECT_FALSE(pref_test_task_runner_->HasPendingTask());
-
- Mock::VerifyAndClearExpectations(http_server_props_manager_.get());
+// Make sure prefs are updated on destruction.
+TEST_P(HttpServerPropertiesManagerTest, UpdatePrefsOnShutdown) {
+ int pref_updates = 0;
+ pref_delegate_->set_extra_update_prefs_callback(
+ base::Bind([](int* updates) { (*updates)++; }, &pref_updates));
http_server_props_manager_.reset();
- EXPECT_FALSE(net_test_task_runner_->HasPendingTask());
- EXPECT_FALSE(pref_test_task_runner_->HasPendingTask());
-}
-
-TEST_P(HttpServerPropertiesManagerTest, ShutdownWithPendingUpdateCache2) {
- http_server_props_manager_->UpdateCacheFromPrefsOnUIConcrete();
- // Shutdown comes before the task is executed.
- http_server_props_manager_->ShutdownOnPrefSequence();
- // There should be no tasks to run.
- EXPECT_FALSE(net_test_task_runner_->HasPendingTask());
- EXPECT_FALSE(pref_test_task_runner_->HasPendingTask());
- Mock::VerifyAndClearExpectations(http_server_props_manager_.get());
- http_server_props_manager_.reset();
- EXPECT_FALSE(net_test_task_runner_->HasPendingTask());
- EXPECT_FALSE(pref_test_task_runner_->HasPendingTask());
-}
-
-//
-// Tests for shutdown when updating prefs.
-//
-TEST_P(HttpServerPropertiesManagerTest, ShutdownWithPendingUpdatePrefs0) {
- // Post an update task to the IO thread.
- http_server_props_manager_->ScheduleUpdatePrefsOnNetworkSequenceDefault();
- // Shutdown comes before the task is executed.
- http_server_props_manager_->ShutdownOnPrefSequence();
- http_server_props_manager_.reset();
- // Run the task after shutdown and deletion.
- EXPECT_TRUE(net_test_task_runner_->HasPendingTask());
- EXPECT_FALSE(pref_test_task_runner_->HasPendingTask());
- net_test_task_runner_->FastForwardUntilNoTasksRemain();
- EXPECT_FALSE(net_test_task_runner_->HasPendingTask());
- EXPECT_FALSE(pref_test_task_runner_->HasPendingTask());
-}
-
-TEST_P(HttpServerPropertiesManagerTest, ShutdownWithPendingUpdatePrefs1) {
- ExpectPrefsUpdate(1);
- // Post an update task.
- http_server_props_manager_->ScheduleUpdatePrefsOnNetworkSequenceDefault();
- // Shutdown comes before the task is executed.
- http_server_props_manager_->ShutdownOnPrefSequence();
- // Run the task after shutdown, but before deletion.
- EXPECT_TRUE(net_test_task_runner_->HasPendingTask());
- EXPECT_FALSE(pref_test_task_runner_->HasPendingTask());
- net_test_task_runner_->FastForwardUntilNoTasksRemain();
- EXPECT_TRUE(pref_test_task_runner_->HasPendingTask());
- pref_test_task_runner_->FastForwardUntilNoTasksRemain();
- EXPECT_FALSE(net_test_task_runner_->HasPendingTask());
- EXPECT_FALSE(pref_test_task_runner_->HasPendingTask());
-
- Mock::VerifyAndClearExpectations(http_server_props_manager_.get());
- http_server_props_manager_.reset();
- EXPECT_FALSE(net_test_task_runner_->HasPendingTask());
- EXPECT_FALSE(pref_test_task_runner_->HasPendingTask());
-}
-
-TEST_P(HttpServerPropertiesManagerTest, ShutdownWithPendingUpdatePrefs2) {
- // This posts a task to the UI thread.
- http_server_props_manager_->UpdatePrefsFromCacheOnNetworkSequenceConcrete(
- base::Closure());
- // Shutdown comes before the task is executed.
- http_server_props_manager_->ShutdownOnPrefSequence();
- // Run the task after shutdown, but before deletion.
- EXPECT_FALSE(net_test_task_runner_->HasPendingTask());
- EXPECT_TRUE(pref_test_task_runner_->HasPendingTask());
- pref_test_task_runner_->FastForwardUntilNoTasksRemain();
- EXPECT_FALSE(net_test_task_runner_->HasPendingTask());
- EXPECT_FALSE(pref_test_task_runner_->HasPendingTask());
- Mock::VerifyAndClearExpectations(http_server_props_manager_.get());
- http_server_props_manager_.reset();
- EXPECT_FALSE(net_test_task_runner_->HasPendingTask());
- EXPECT_FALSE(pref_test_task_runner_->HasPendingTask());
+ EXPECT_EQ(1, pref_updates);
}
TEST_P(HttpServerPropertiesManagerTest, PersistAdvertisedVersionsToPref) {
- ExpectScheduleUpdatePrefsOnNetworkSequenceRepeatedly(5);
-
const url::SchemeHostPort server_www("https", "www.google.com", 80);
const url::SchemeHostPort server_mail("https", "mail.google.com", 80);
@@ -1664,7 +1291,8 @@ TEST_P(HttpServerPropertiesManagerTest, PersistAdvertisedVersionsToPref) {
AlternativeService quic_alternative_service1(kProtoQUIC, "", 443);
base::Time expiration1;
ASSERT_TRUE(base::Time::FromUTCString("2036-12-01 10:00:00", &expiration1));
- QuicVersionVector advertised_versions = {QUIC_VERSION_37, QUIC_VERSION_35};
+ QuicTransportVersionVector advertised_versions = {QUIC_VERSION_37,
+ QUIC_VERSION_35};
alternative_service_info_vector.push_back(
AlternativeServiceInfo::CreateQuicAlternativeServiceInfo(
quic_alternative_service1, expiration1, advertised_versions));
@@ -1702,14 +1330,10 @@ TEST_P(HttpServerPropertiesManagerTest, PersistAdvertisedVersionsToPref) {
http_server_props_manager_->SetSupportsQuic(true, actual_address);
// Update Prefs.
- ExpectPrefsUpdate(1);
- EXPECT_TRUE(net_test_task_runner_->HasPendingTask());
- EXPECT_FALSE(pref_test_task_runner_->HasPendingTask());
- net_test_task_runner_->FastForwardUntilNoTasksRemain();
- EXPECT_TRUE(pref_test_task_runner_->HasPendingTask());
- pref_test_task_runner_->FastForwardUntilNoTasksRemain();
- EXPECT_FALSE(net_test_task_runner_->HasPendingTask());
- EXPECT_FALSE(pref_test_task_runner_->HasPendingTask());
+ EXPECT_EQ(0, pref_delegate_->GetAndClearNumPrefUpdates());
+ EXPECT_TRUE(test_task_runner_->HasPendingTask());
+ test_task_runner_->FastForwardUntilNoTasksRemain();
+ EXPECT_EQ(1, pref_delegate_->GetAndClearNumPrefUpdates());
// Verify preferences with correct advertised version field.
const char expected_json[] =
@@ -1727,7 +1351,7 @@ TEST_P(HttpServerPropertiesManagerTest, PersistAdvertisedVersionsToPref) {
"\"address\":\"127.0.0.1\",\"used_quic\":true},\"version\":5}";
const base::Value* http_server_properties =
- &pref_delegate_->GetServerProperties();
+ pref_delegate_->GetServerProperties();
std::string preferences_json;
EXPECT_TRUE(
base::JSONWriter::Write(*http_server_properties, &preferences_json));
@@ -1774,7 +1398,7 @@ TEST_P(HttpServerPropertiesManagerTest, ReadAdvertisedVersionsFromPref) {
EXPECT_EQ(123, alternative_service_info_vector[1].alternative_service().port);
EXPECT_EQ(base::Time::Max(), alternative_service_info_vector[1].expiration());
// Verify advertised versions.
- const QuicVersionVector loaded_advertised_versions =
+ const QuicTransportVersionVector loaded_advertised_versions =
alternative_service_info_vector[1].advertised_versions();
EXPECT_EQ(2u, loaded_advertised_versions.size());
EXPECT_EQ(QUIC_VERSION_35, loaded_advertised_versions[0]);
@@ -1783,8 +1407,6 @@ TEST_P(HttpServerPropertiesManagerTest, ReadAdvertisedVersionsFromPref) {
TEST_P(HttpServerPropertiesManagerTest,
UpdatePrefWhenAdvertisedVersionsChange) {
- ExpectScheduleUpdatePrefsOnNetworkSequenceRepeatedly(4);
-
const url::SchemeHostPort server_www("https", "www.google.com", 80);
// #1: Set alternate protocol.
@@ -1810,14 +1432,10 @@ TEST_P(HttpServerPropertiesManagerTest,
http_server_props_manager_->SetSupportsQuic(true, actual_address);
// Update Prefs.
- ExpectPrefsUpdate(1);
- EXPECT_TRUE(net_test_task_runner_->HasPendingTask());
- EXPECT_FALSE(pref_test_task_runner_->HasPendingTask());
- net_test_task_runner_->FastForwardUntilNoTasksRemain();
- EXPECT_TRUE(pref_test_task_runner_->HasPendingTask());
- pref_test_task_runner_->FastForwardUntilNoTasksRemain();
- EXPECT_FALSE(net_test_task_runner_->HasPendingTask());
- EXPECT_FALSE(pref_test_task_runner_->HasPendingTask());
+ EXPECT_EQ(0, pref_delegate_->GetAndClearNumPrefUpdates());
+ EXPECT_TRUE(test_task_runner_->HasPendingTask());
+ test_task_runner_->FastForwardUntilNoTasksRemain();
+ EXPECT_EQ(1, pref_delegate_->GetAndClearNumPrefUpdates());
// Verify preferences with correct advertised version field.
const char expected_json[] =
@@ -1830,7 +1448,7 @@ TEST_P(HttpServerPropertiesManagerTest,
"{\"address\":\"127.0.0.1\",\"used_quic\":true},\"version\":5}";
const base::Value* http_server_properties =
- &pref_delegate_->GetServerProperties();
+ pref_delegate_->GetServerProperties();
std::string preferences_json;
EXPECT_TRUE(
base::JSONWriter::Write(*http_server_properties, &preferences_json));
@@ -1840,7 +1458,8 @@ TEST_P(HttpServerPropertiesManagerTest,
// AlternativeService.
AlternativeServiceInfoVector alternative_service_info_vector_2;
// Quic alternative service set with two advertised QUIC versions.
- QuicVersionVector advertised_versions = {QUIC_VERSION_37, QUIC_VERSION_35};
+ QuicTransportVersionVector advertised_versions = {QUIC_VERSION_37,
+ QUIC_VERSION_35};
alternative_service_info_vector_2.push_back(
AlternativeServiceInfo::CreateQuicAlternativeServiceInfo(
quic_alternative_service1, expiration1, advertised_versions));
@@ -1848,14 +1467,10 @@ TEST_P(HttpServerPropertiesManagerTest,
server_www, alternative_service_info_vector_2));
// Update Prefs.
- ExpectPrefsUpdate(1);
- EXPECT_TRUE(net_test_task_runner_->HasPendingTask());
- EXPECT_FALSE(pref_test_task_runner_->HasPendingTask());
- net_test_task_runner_->FastForwardUntilNoTasksRemain();
- EXPECT_TRUE(pref_test_task_runner_->HasPendingTask());
- pref_test_task_runner_->FastForwardUntilNoTasksRemain();
- EXPECT_FALSE(net_test_task_runner_->HasPendingTask());
- EXPECT_FALSE(pref_test_task_runner_->HasPendingTask());
+ EXPECT_EQ(0, pref_delegate_->GetAndClearNumPrefUpdates());
+ EXPECT_TRUE(test_task_runner_->HasPendingTask());
+ test_task_runner_->FastForwardUntilNoTasksRemain();
+ EXPECT_EQ(1, pref_delegate_->GetAndClearNumPrefUpdates());
// Verify preferences updated with new advertised versions.
const char expected_json_updated[] =
@@ -1873,7 +1488,8 @@ TEST_P(HttpServerPropertiesManagerTest,
// #3: Set AlternativeService with same advertised_versions.
AlternativeServiceInfoVector alternative_service_info_vector_3;
// A same set of QUIC versions but listed in a different order.
- QuicVersionVector advertised_versions_2 = {QUIC_VERSION_35, QUIC_VERSION_37};
+ QuicTransportVersionVector advertised_versions_2 = {QUIC_VERSION_35,
+ QUIC_VERSION_37};
alternative_service_info_vector_3.push_back(
AlternativeServiceInfo::CreateQuicAlternativeServiceInfo(
quic_alternative_service1, expiration1, advertised_versions_2));
@@ -1881,37 +1497,31 @@ TEST_P(HttpServerPropertiesManagerTest,
server_www, alternative_service_info_vector_3));
// No Prefs update.
- EXPECT_FALSE(net_test_task_runner_->HasPendingTask());
- EXPECT_FALSE(pref_test_task_runner_->HasPendingTask());
+ EXPECT_FALSE(test_task_runner_->HasPendingTask());
+ EXPECT_EQ(0, pref_delegate_->GetAndClearNumPrefUpdates());
}
TEST_P(HttpServerPropertiesManagerTest, UpdateCacheWithPrefs) {
- ExpectScheduleUpdatePrefsOnNetworkSequenceRepeatedly(3);
-
AlternativeService cached_broken_service(kProtoQUIC, "cached_broken", 443);
AlternativeService cached_broken_service2(kProtoQUIC, "cached_broken2", 443);
AlternativeService cached_recently_broken_service(kProtoQUIC,
"cached_rbroken", 443);
- {
- TestMockTimeTaskRunner::ScopedContext scoped_context(net_test_task_runner_);
+ http_server_props_manager_->MarkAlternativeServiceBroken(
+ cached_broken_service);
+ http_server_props_manager_->MarkAlternativeServiceBroken(
+ cached_broken_service2);
+ http_server_props_manager_->MarkAlternativeServiceRecentlyBroken(
+ cached_recently_broken_service);
- http_server_props_manager_->MarkAlternativeServiceBroken(
- cached_broken_service);
- http_server_props_manager_->MarkAlternativeServiceBroken(
- cached_broken_service2);
- http_server_props_manager_->MarkAlternativeServiceRecentlyBroken(
- cached_recently_broken_service);
- }
- ExpectPrefsUpdate(1);
- EXPECT_TRUE(net_test_task_runner_->HasPendingTask());
+ EXPECT_EQ(0, pref_delegate_->GetAndClearNumPrefUpdates());
+ EXPECT_TRUE(test_task_runner_->HasPendingTask());
// Run the prefs update task but not the expiration task for
// |cached_broken_service|.
- net_test_task_runner_->FastForwardBy(
+ test_task_runner_->FastForwardBy(
HttpServerPropertiesManager::GetUpdatePrefsDelayForTesting());
- EXPECT_TRUE(pref_test_task_runner_->HasPendingTask());
- pref_test_task_runner_->FastForwardUntilNoTasksRemain();
- EXPECT_FALSE(pref_test_task_runner_->HasPendingTask());
+ EXPECT_TRUE(test_task_runner_->HasPendingTask());
+ EXPECT_EQ(1, pref_delegate_->GetAndClearNumPrefUpdates());
// Load the |pref_delegate_| with some JSON to verify updating the cache from
// prefs. For the broken alternative services "www.google.com:1234" and
@@ -1964,15 +1574,11 @@ TEST_P(HttpServerPropertiesManagerTest, UpdateCacheWithPrefs) {
pref_delegate_->SetPrefs(*server_dict);
- ExpectCacheUpdate();
- EXPECT_TRUE(pref_test_task_runner_->HasPendingTask());
- pref_test_task_runner_->FastForwardUntilNoTasksRemain();
- EXPECT_TRUE(net_test_task_runner_->HasPendingTask());
+ EXPECT_TRUE(test_task_runner_->HasPendingTask());
// Run the cache update task but not the expiration task for
// |cached_broken_service|.
- net_test_task_runner_->FastForwardBy(
- net_test_task_runner_->NextPendingTaskDelay());
- EXPECT_TRUE(net_test_task_runner_->HasPendingTask());
+ test_task_runner_->FastForwardBy(test_task_runner_->NextPendingTaskDelay());
+ EXPECT_TRUE(test_task_runner_->HasPendingTask());
//
// Verify alternative service info for https://www.google.com
@@ -2037,14 +1643,14 @@ TEST_P(HttpServerPropertiesManagerTest, UpdateCacheWithPrefs) {
// expiration time should still be 5 minutes due to being marked broken.
// |prefs_broken_service|'s expiration time should be approximately 1 day from
// now which comes from the prefs.
- net_test_task_runner_->FastForwardBy(base::TimeDelta::FromMinutes(4));
+ test_task_runner_->FastForwardBy(base::TimeDelta::FromMinutes(4));
EXPECT_TRUE(http_server_props_manager_->IsAlternativeServiceBroken(
cached_broken_service));
EXPECT_FALSE(http_server_props_manager_->IsAlternativeServiceBroken(
cached_broken_service2));
EXPECT_TRUE(http_server_props_manager_->IsAlternativeServiceBroken(
prefs_broken_service));
- net_test_task_runner_->FastForwardBy(base::TimeDelta::FromDays(1));
+ test_task_runner_->FastForwardBy(base::TimeDelta::FromDays(1));
EXPECT_FALSE(http_server_props_manager_->IsAlternativeServiceBroken(
cached_broken_service));
EXPECT_FALSE(http_server_props_manager_->IsAlternativeServiceBroken(
@@ -2070,8 +1676,6 @@ TEST_P(HttpServerPropertiesManagerTest, UpdateCacheWithPrefs) {
// |cached_broken_service| should have broken-count 2 from prefs.
// |cached_broken_service2| should have broken-count 1 from being marked
// broken.
- ExpectScheduleUpdatePrefsOnNetworkSequenceRepeatedly(4);
- ExpectPrefsUpdate(4);
EXPECT_TRUE(http_server_props_manager_->WasAlternativeServiceRecentlyBroken(
prefs_broken_service));
@@ -2085,89 +1689,78 @@ TEST_P(HttpServerPropertiesManagerTest, UpdateCacheWithPrefs) {
// broken. Since |prefs_broken_service| had no broken_count specified in the
// prefs, a broken_count value of 1 should have been assumed by
// |http_server_props_manager_|.
- {
- TestMockTimeTaskRunner::ScopedContext scoped_context(net_test_task_runner_);
- http_server_props_manager_->MarkAlternativeServiceBroken(
- prefs_broken_service);
- }
- EXPECT_TRUE(net_test_task_runner_->HasPendingTask());
- net_test_task_runner_->FastForwardBy(base::TimeDelta::FromMinutes(10) -
- base::TimeDelta::FromInternalValue(1));
+ http_server_props_manager_->MarkAlternativeServiceBroken(
+ prefs_broken_service);
+ EXPECT_EQ(0, pref_delegate_->GetAndClearNumPrefUpdates());
+ EXPECT_TRUE(test_task_runner_->HasPendingTask());
+ test_task_runner_->FastForwardBy(base::TimeDelta::FromMinutes(10) -
+ base::TimeDelta::FromInternalValue(1));
EXPECT_TRUE(http_server_props_manager_->IsAlternativeServiceBroken(
prefs_broken_service));
- net_test_task_runner_->FastForwardBy(base::TimeDelta::FromInternalValue(1));
+ test_task_runner_->FastForwardBy(base::TimeDelta::FromInternalValue(1));
EXPECT_FALSE(http_server_props_manager_->IsAlternativeServiceBroken(
prefs_broken_service));
// Make sure |cached_recently_broken_service| has the right expiration delay
// when marked broken.
- {
- TestMockTimeTaskRunner::ScopedContext scoped_context(net_test_task_runner_);
- http_server_props_manager_->MarkAlternativeServiceBroken(
- cached_recently_broken_service);
- }
- EXPECT_TRUE(net_test_task_runner_->HasPendingTask());
- net_test_task_runner_->FastForwardBy(base::TimeDelta::FromMinutes(40) -
- base::TimeDelta::FromInternalValue(1));
+ http_server_props_manager_->MarkAlternativeServiceBroken(
+ cached_recently_broken_service);
+ EXPECT_TRUE(test_task_runner_->HasPendingTask());
+ test_task_runner_->FastForwardBy(base::TimeDelta::FromMinutes(40) -
+ base::TimeDelta::FromInternalValue(1));
EXPECT_TRUE(http_server_props_manager_->IsAlternativeServiceBroken(
cached_recently_broken_service));
- net_test_task_runner_->FastForwardBy(base::TimeDelta::FromInternalValue(1));
+ test_task_runner_->FastForwardBy(base::TimeDelta::FromInternalValue(1));
EXPECT_FALSE(http_server_props_manager_->IsAlternativeServiceBroken(
cached_recently_broken_service));
// Make sure |cached_broken_service| has the right expiration delay when
// marked broken.
- {
- TestMockTimeTaskRunner::ScopedContext scoped_context(net_test_task_runner_);
http_server_props_manager_->MarkAlternativeServiceBroken(
cached_broken_service);
- }
- EXPECT_TRUE(net_test_task_runner_->HasPendingTask());
- net_test_task_runner_->FastForwardBy(base::TimeDelta::FromMinutes(20) -
- base::TimeDelta::FromInternalValue(1));
- EXPECT_TRUE(http_server_props_manager_->IsAlternativeServiceBroken(
- cached_broken_service));
- net_test_task_runner_->FastForwardBy(base::TimeDelta::FromInternalValue(1));
- EXPECT_FALSE(http_server_props_manager_->IsAlternativeServiceBroken(
- cached_broken_service));
- // Make sure |cached_broken_service2| has the right expiration delay when
- // marked broken.
- {
- TestMockTimeTaskRunner::ScopedContext scoped_context(net_test_task_runner_);
+ EXPECT_TRUE(test_task_runner_->HasPendingTask());
+ test_task_runner_->FastForwardBy(base::TimeDelta::FromMinutes(20) -
+ base::TimeDelta::FromInternalValue(1));
+ EXPECT_TRUE(http_server_props_manager_->IsAlternativeServiceBroken(
+ cached_broken_service));
+ test_task_runner_->FastForwardBy(base::TimeDelta::FromInternalValue(1));
+ EXPECT_FALSE(http_server_props_manager_->IsAlternativeServiceBroken(
+ cached_broken_service));
+ // Make sure |cached_broken_service2| has the right expiration delay when
+ // marked broken.
http_server_props_manager_->MarkAlternativeServiceBroken(
cached_broken_service2);
- }
- EXPECT_TRUE(net_test_task_runner_->HasPendingTask());
- net_test_task_runner_->FastForwardBy(base::TimeDelta::FromMinutes(10) -
- base::TimeDelta::FromInternalValue(1));
- EXPECT_TRUE(http_server_props_manager_->IsAlternativeServiceBroken(
- cached_broken_service2));
- net_test_task_runner_->FastForwardBy(base::TimeDelta::FromInternalValue(1));
- EXPECT_FALSE(http_server_props_manager_->IsAlternativeServiceBroken(
- cached_broken_service2));
-
- Mock::VerifyAndClearExpectations(http_server_props_manager_.get());
-
- //
- // Verify ServerNetworkStats.
- //
- const ServerNetworkStats* server_network_stats =
- http_server_props_manager_->GetServerNetworkStats(
- url::SchemeHostPort("https", "mail.google.com", 80));
- EXPECT_TRUE(server_network_stats);
- EXPECT_EQ(server_network_stats->srtt, base::TimeDelta::FromInternalValue(42));
-
- //
- // Verify QUIC server info.
- //
- const std::string* quic_server_info =
- http_server_props_manager_->GetQuicServerInfo(
- QuicServerId("mail.google.com", 80));
- EXPECT_EQ("quic_server_info1", *quic_server_info);
-
- //
- // Verify supports QUIC.
- //
- IPAddress actual_address(127, 0, 0, 1);
- EXPECT_TRUE(http_server_props_manager_->GetSupportsQuic(&actual_address));
+ EXPECT_TRUE(test_task_runner_->HasPendingTask());
+ test_task_runner_->FastForwardBy(base::TimeDelta::FromMinutes(10) -
+ base::TimeDelta::FromInternalValue(1));
+ EXPECT_TRUE(http_server_props_manager_->IsAlternativeServiceBroken(
+ cached_broken_service2));
+ test_task_runner_->FastForwardBy(base::TimeDelta::FromInternalValue(1));
+ EXPECT_FALSE(http_server_props_manager_->IsAlternativeServiceBroken(
+ cached_broken_service2));
+
+ //
+ // Verify ServerNetworkStats.
+ //
+ const ServerNetworkStats* server_network_stats =
+ http_server_props_manager_->GetServerNetworkStats(
+ url::SchemeHostPort("https", "mail.google.com", 80));
+ EXPECT_TRUE(server_network_stats);
+ EXPECT_EQ(server_network_stats->srtt,
+ base::TimeDelta::FromInternalValue(42));
+
+ //
+ // Verify QUIC server info.
+ //
+ const std::string* quic_server_info =
+ http_server_props_manager_->GetQuicServerInfo(
+ QuicServerId("mail.google.com", 80));
+ EXPECT_EQ("quic_server_info1", *quic_server_info);
+
+ //
+ // Verify supports QUIC.
+ //
+ IPAddress actual_address(127, 0, 0, 1);
+ EXPECT_TRUE(http_server_props_manager_->GetSupportsQuic(&actual_address));
+ EXPECT_EQ(4, pref_delegate_->GetAndClearNumPrefUpdates());
}
} // namespace net
diff --git a/chromium/net/http/http_stream_factory.cc b/chromium/net/http/http_stream_factory.cc
index 4c21ffcef89..51741ffda85 100644
--- a/chromium/net/http/http_stream_factory.cc
+++ b/chromium/net/http/http_stream_factory.cc
@@ -52,10 +52,11 @@ void HttpStreamFactory::ProcessAlternativeServices(
continue;
}
// Check if QUIC version is supported. Filter supported QUIC versions.
- QuicVersionVector advertised_versions;
+ QuicTransportVersionVector advertised_versions;
if (protocol == kProtoQUIC && !alternative_service_entry.version.empty()) {
bool match_found = false;
- for (QuicVersion supported : session->params().quic_supported_versions) {
+ for (QuicTransportVersion supported :
+ session->params().quic_supported_versions) {
for (uint16_t advertised : alternative_service_entry.version) {
if (supported == advertised) {
match_found = true;
diff --git a/chromium/net/http/http_stream_factory_impl.cc b/chromium/net/http/http_stream_factory_impl.cc
index 7f2ea145f1e..d44bbe61d3e 100644
--- a/chromium/net/http/http_stream_factory_impl.cc
+++ b/chromium/net/http/http_stream_factory_impl.cc
@@ -8,7 +8,6 @@
#include <utility>
#include "base/logging.h"
-#include "base/memory/ptr_util.h"
#include "base/metrics/histogram_macros.h"
#include "base/stl_util.h"
#include "base/strings/string_util.h"
diff --git a/chromium/net/http/http_stream_factory_impl_job.cc b/chromium/net/http/http_stream_factory_impl_job.cc
index 80c600d93f2..4dfee7ffa98 100644
--- a/chromium/net/http/http_stream_factory_impl_job.cc
+++ b/chromium/net/http/http_stream_factory_impl_job.cc
@@ -12,10 +12,8 @@
#include "base/feature_list.h"
#include "base/location.h"
#include "base/logging.h"
-#include "base/memory/ptr_util.h"
#include "base/metrics/histogram_macros.h"
#include "base/metrics/sparse_histogram.h"
-#include "base/profiler/scoped_tracker.h"
#include "base/single_thread_task_runner.h"
#include "base/stl_util.h"
#include "base/strings/string_number_conversions.h"
@@ -162,7 +160,7 @@ HttpStreamFactoryImpl::Job::Job(Delegate* delegate,
HostPortPair destination,
GURL origin_url,
NextProto alternative_protocol,
- QuicVersion quic_version,
+ QuicTransportVersion quic_version,
const ProxyServer& alternative_proxy_server,
bool enable_ip_based_pooling,
NetLog* net_log)
@@ -426,6 +424,11 @@ SpdySessionKey HttpStreamFactoryImpl::Job::GetSpdySessionKey(
bool HttpStreamFactoryImpl::Job::CanUseExistingSpdySession() const {
DCHECK(!using_quic_);
+ if (proxy_info_.is_direct() &&
+ session_->http_server_properties()->RequiresHTTP11(destination_)) {
+ return false;
+ }
+
// We need to make sure that if a spdy session was created for
// https://somehost/ that we don't use that session for http://somehost:443/.
// The only time we can use an existing session is if the request URL is
@@ -543,7 +546,6 @@ void HttpStreamFactoryImpl::Job::OnPreconnectsComplete() {
int HttpStreamFactoryImpl::Job::OnHostResolution(
SpdySessionPool* spdy_session_pool,
const SpdySessionKey& spdy_session_key,
- const GURL& origin_url,
bool enable_ip_based_pooling,
const AddressList& addresses,
const NetLogWithSource& net_log) {
@@ -551,7 +553,7 @@ int HttpStreamFactoryImpl::Job::OnHostResolution(
// ClientSocketPoolManager will be destroyed in the same callback that
// destroys the SpdySessionPool.
return spdy_session_pool->FindAvailableSession(
- spdy_session_key, origin_url, enable_ip_based_pooling, net_log)
+ spdy_session_key, enable_ip_based_pooling, net_log)
? ERR_SPDY_SESSION_ALREADY_EXISTS
: OK;
}
@@ -843,10 +845,6 @@ int HttpStreamFactoryImpl::Job::DoInitConnection() {
}
int HttpStreamFactoryImpl::Job::DoInitConnectionImpl() {
- // TODO(pkasting): Remove ScopedTracker below once crbug.com/462812 is fixed.
- tracked_objects::ScopedTracker tracking_profile(
- FROM_HERE_WITH_EXPLICIT_FUNCTION(
- "462812 HttpStreamFactoryImpl::Job::DoInitConnection"));
DCHECK(!connection_->is_initialized());
if (using_quic_ && !proxy_info_.is_quic() && !proxy_info_.is_direct()) {
@@ -923,12 +921,17 @@ int HttpStreamFactoryImpl::Job::DoInitConnectionImpl() {
return rv;
}
- // Check first if we have a spdy session for this group. If so, then go
- // straight to using that.
+ // Check first if there is a pushed stream matching the request, or an HTTP/2
+ // connection this request can pool to. If so, then go straight to using
+ // that.
if (CanUseExistingSpdySession()) {
base::WeakPtr<SpdySession> spdy_session =
- session_->spdy_session_pool()->FindAvailableSession(
- spdy_session_key_, origin_url_, enable_ip_based_pooling_, net_log_);
+ session_->spdy_session_pool()->push_promise_index()->Find(
+ spdy_session_key_, origin_url_);
+ if (!spdy_session) {
+ spdy_session = session_->spdy_session_pool()->FindAvailableSession(
+ spdy_session_key_, enable_ip_based_pooling_, net_log_);
+ }
if (spdy_session) {
// If we're preconnecting, but we already have a SpdySession, we don't
// actually need to preconnect any sockets, so we're done.
@@ -960,7 +963,8 @@ int HttpStreamFactoryImpl::Job::DoInitConnectionImpl() {
GetSocketGroup(), destination_, request_info_.extra_headers,
request_info_.load_flags, priority_, session_, proxy_info_,
expect_spdy_, server_ssl_config_, proxy_ssl_config_,
- request_info_.privacy_mode, net_log_, num_streams_);
+ request_info_.privacy_mode, net_log_, num_streams_,
+ request_info_.motivation);
}
// If we can't use a SPDY session, don't bother checking for one after
@@ -968,7 +972,7 @@ int HttpStreamFactoryImpl::Job::DoInitConnectionImpl() {
OnHostResolutionCallback resolution_callback =
CanUseExistingSpdySession()
? base::Bind(&Job::OnHostResolution, session_->spdy_session_pool(),
- spdy_session_key_, origin_url_, enable_ip_based_pooling_)
+ spdy_session_key_, enable_ip_based_pooling_)
: OnHostResolutionCallback();
if (delegate_->for_websockets()) {
SSLConfig websocket_server_ssl_config = server_ssl_config_;
@@ -1002,7 +1006,7 @@ int HttpStreamFactoryImpl::Job::DoInitConnectionComplete(int result) {
// probably an IP pooled connection.
existing_spdy_session_ =
session_->spdy_session_pool()->FindAvailableSession(
- spdy_session_key_, origin_url_, enable_ip_based_pooling_, net_log_);
+ spdy_session_key_, enable_ip_based_pooling_, net_log_);
if (existing_spdy_session_) {
using_spdy_ = true;
next_state_ = STATE_CREATE_STREAM;
@@ -1156,10 +1160,6 @@ int HttpStreamFactoryImpl::Job::SetSpdyHttpStreamOrBidirectionalStreamImpl(
}
int HttpStreamFactoryImpl::Job::DoCreateStream() {
- // TODO(pkasting): Remove ScopedTracker below once crbug.com/462811 is fixed.
- tracked_objects::ScopedTracker tracking_profile(
- FROM_HERE_WITH_EXPLICIT_FUNCTION(
- "462811 HttpStreamFactoryImpl::Job::DoCreateStream"));
DCHECK(connection_->socket() || existing_spdy_session_.get() || using_quic_);
DCHECK(!using_quic_);
@@ -1172,12 +1172,6 @@ int HttpStreamFactoryImpl::Job::DoCreateStream() {
destination_.HostForURL());
}
- // We only set the socket motivation if we're the first to use
- // this socket. Is there a race for two SPDY requests? We really
- // need to plumb this through to the connect level.
- if (connection_->socket() && !connection_->is_reused())
- SetSocketMotivation();
-
if (!using_spdy_) {
DCHECK(!expect_spdy_);
// We may get ftp scheme when fetching ftp resources through proxy.
@@ -1200,10 +1194,19 @@ int HttpStreamFactoryImpl::Job::DoCreateStream() {
CHECK(!stream_.get());
+ // It is possible that a pushed stream has been opened by a server since last
+ // time Job checked above.
+ if (!existing_spdy_session_) {
+ existing_spdy_session_ =
+ session_->spdy_session_pool()->push_promise_index()->Find(
+ spdy_session_key_, origin_url_);
+ }
+ // It is also possible that an HTTP/2 connection has been established since
+ // last time Job checked above.
if (!existing_spdy_session_) {
existing_spdy_session_ =
session_->spdy_session_pool()->FindAvailableSession(
- spdy_session_key_, origin_url_, enable_ip_based_pooling_, net_log_);
+ spdy_session_key_, enable_ip_based_pooling_, net_log_);
}
if (existing_spdy_session_.get()) {
// We picked up an existing session, so we don't need our socket.
@@ -1300,14 +1303,6 @@ void HttpStreamFactoryImpl::Job::ReturnToStateInitConnection(
next_state_ = STATE_INIT_CONNECTION;
}
-void HttpStreamFactoryImpl::Job::SetSocketMotivation() {
- if (request_info_.motivation == HttpRequestInfo::PRECONNECT_MOTIVATED)
- connection_->socket()->SetSubresourceSpeculation();
- else if (request_info_.motivation == HttpRequestInfo::OMNIBOX_MOTIVATED)
- connection_->socket()->SetOmniboxSpeculation();
- // TODO(mbelshe): Add other motivations (like EARLY_LOAD_MOTIVATED).
-}
-
void HttpStreamFactoryImpl::Job::InitSSLConfig(SSLConfig* ssl_config,
bool is_proxy) const {
if (!is_proxy) {
@@ -1491,7 +1486,7 @@ HttpStreamFactoryImpl::JobFactory::CreateAltSvcJob(
HostPortPair destination,
GURL origin_url,
NextProto alternative_protocol,
- QuicVersion quic_version,
+ QuicTransportVersion quic_version,
bool enable_ip_based_pooling,
NetLog* net_log) {
return std::make_unique<HttpStreamFactoryImpl::Job>(
diff --git a/chromium/net/http/http_stream_factory_impl_job.h b/chromium/net/http/http_stream_factory_impl_job.h
index ec804910439..3fdec071b95 100644
--- a/chromium/net/http/http_stream_factory_impl_job.h
+++ b/chromium/net/http/http_stream_factory_impl_job.h
@@ -190,7 +190,7 @@ class HttpStreamFactoryImpl::Job {
HostPortPair destination,
GURL origin_url,
NextProto alternative_protocol,
- QuicVersion quic_version,
+ QuicTransportVersion quic_version,
const ProxyServer& alternative_proxy_server,
bool enable_ip_based_pooling,
NetLog* net_log);
@@ -400,7 +400,6 @@ class HttpStreamFactoryImpl::Job {
// session is found, and OK otherwise.
static int OnHostResolution(SpdySessionPool* spdy_session_pool,
const SpdySessionKey& spdy_session_key,
- const GURL& origin_url,
bool enable_ip_based_pooling,
const AddressList& addresses,
const NetLogWithSource& net_log);
@@ -448,9 +447,9 @@ class HttpStreamFactoryImpl::Job {
// True if Job uses QUIC.
const bool using_quic_;
- // QuicVersion that should be used to connect to the QUIC server if Job uses
- // QUIC.
- QuicVersion quic_version_;
+ // QuicTransportVersion that should be used to connect to the QUIC server if
+ // Job uses QUIC.
+ QuicTransportVersion quic_version_;
// True if Alternative Service protocol field requires that HTTP/2 is used.
// In this case, Job fails if it cannot pool to an existing SpdySession and
@@ -543,7 +542,7 @@ class HttpStreamFactoryImpl::JobFactory {
HostPortPair destination,
GURL origin_url,
NextProto alternative_protocol,
- QuicVersion quic_version,
+ QuicTransportVersion quic_version,
bool enable_ip_based_pooling,
NetLog* net_log);
diff --git a/chromium/net/http/http_stream_factory_impl_job_controller.cc b/chromium/net/http/http_stream_factory_impl_job_controller.cc
index ca52a77b2c3..fd6d73fc7fe 100644
--- a/chromium/net/http/http_stream_factory_impl_job_controller.cc
+++ b/chromium/net/http/http_stream_factory_impl_job_controller.cc
@@ -7,7 +7,6 @@
#include <string>
#include <utility>
-#include "base/memory/ptr_util.h"
#include "base/metrics/histogram_macros.h"
#include "base/strings/string_number_conversions.h"
#include "base/strings/string_util.h"
@@ -802,7 +801,7 @@ int HttpStreamFactoryImpl::JobController::DoCreateJobs() {
// Create an alternative job if alternative service is set up for this domain.
alternative_service_info_ =
GetAlternativeServiceInfoFor(request_info_, delegate_, stream_type_);
- QuicVersion quic_version = QUIC_VERSION_UNSUPPORTED;
+ QuicTransportVersion quic_version = QUIC_VERSION_UNSUPPORTED;
if (alternative_service_info_.protocol() == kProtoQUIC) {
quic_version =
SelectQuicVersion(alternative_service_info_.advertised_versions());
@@ -984,7 +983,8 @@ void HttpStreamFactoryImpl::JobController::OnAlternativeProxyJobFailed(
// Need to mark alt proxy as broken regardless of whether the job is bound.
ProxyDelegate* proxy_delegate = session_->context().proxy_delegate;
- if (proxy_delegate) {
+ if (proxy_delegate && net_error != ERR_NETWORK_CHANGED &&
+ net_error != ERR_INTERNET_DISCONNECTED) {
proxy_delegate->OnAlternativeProxyBroken(
alternative_job_->alternative_proxy_server());
}
@@ -1000,7 +1000,7 @@ void HttpStreamFactoryImpl::JobController::ReportBrokenAlternativeService() {
if (error_to_report == ERR_NETWORK_CHANGED ||
error_to_report == ERR_INTERNET_DISCONNECTED) {
- // No need to mark alternative service or proxy as broken.
+ // No need to mark alternative service as broken.
return;
}
@@ -1171,15 +1171,15 @@ HttpStreamFactoryImpl::JobController::GetAlternativeServiceInfoInternal(
return first_alternative_service_info;
}
-QuicVersion HttpStreamFactoryImpl::JobController::SelectQuicVersion(
- const QuicVersionVector& advertised_versions) {
- const QuicVersionVector& supported_versions =
+QuicTransportVersion HttpStreamFactoryImpl::JobController::SelectQuicVersion(
+ const QuicTransportVersionVector& advertised_versions) {
+ const QuicTransportVersionVector& supported_versions =
session_->params().quic_supported_versions;
if (advertised_versions.empty())
return supported_versions[0];
- for (const QuicVersion& supported : supported_versions) {
- for (const QuicVersion& advertised : advertised_versions) {
+ for (const QuicTransportVersion& supported : supported_versions) {
+ for (const QuicTransportVersion& advertised : advertised_versions) {
if (supported == advertised) {
DCHECK_NE(QUIC_VERSION_UNSUPPORTED, supported);
return supported;
diff --git a/chromium/net/http/http_stream_factory_impl_job_controller.h b/chromium/net/http/http_stream_factory_impl_job_controller.h
index 32ca2626daf..24a4da31d05 100644
--- a/chromium/net/http/http_stream_factory_impl_job_controller.h
+++ b/chromium/net/http/http_stream_factory_impl_job_controller.h
@@ -277,12 +277,13 @@ class HttpStreamFactoryImpl::JobController
HttpStreamRequest::Delegate* delegate,
HttpStreamRequest::StreamType stream_type);
- // Returns a QuicVersion that has been advertised in |advertised_versions|
- // and is supported. If more than one QuicVersions are supported, the first
- // matched in the supported versions will be returned. If no mutually
- // supported version is found, QUIC_VERSION_UNSUPPORTED_VERSION will be
- // returned.
- QuicVersion SelectQuicVersion(const QuicVersionVector& advertised_versions);
+ // Returns a QuicTransportVersion that has been advertised in
+ // |advertised_versions| and is supported. If more than one
+ // QuicTransportVersions are supported, the first matched in the supported
+ // versions will be returned. If no mutually supported version is found,
+ // QUIC_VERSION_UNSUPPORTED_VERSION will be returned.
+ QuicTransportVersion SelectQuicVersion(
+ const QuicTransportVersionVector& advertised_versions);
// Remove session from the SpdySessionRequestMap.
void RemoveRequestFromSpdySessionRequestMap();
diff --git a/chromium/net/http/http_stream_factory_impl_job_controller_unittest.cc b/chromium/net/http/http_stream_factory_impl_job_controller_unittest.cc
index 3ac43982b30..70c853fc6c0 100644
--- a/chromium/net/http/http_stream_factory_impl_job_controller_unittest.cc
+++ b/chromium/net/http/http_stream_factory_impl_job_controller_unittest.cc
@@ -321,7 +321,7 @@ TEST_F(HttpStreamFactoryImplJobControllerTest, ProxyResolutionFailsSync) {
proxy_config.set_pac_mandatory(true);
session_deps_.proxy_service.reset(new ProxyService(
std::make_unique<ProxyConfigServiceFixed>(proxy_config),
- base::WrapUnique(new FailingProxyResolverFactory), nullptr));
+ std::make_unique<FailingProxyResolverFactory>(), nullptr));
HttpRequestInfo request_info;
request_info.method = "GET";
request_info.url = GURL("http://www.google.com");
@@ -1562,6 +1562,53 @@ TEST_F(HttpStreamFactoryImplJobControllerTest, FailAlternativeProxy) {
EXPECT_TRUE(HttpStreamFactoryImplPeer::IsJobControllerDeleted(factory_));
}
+// Verifies that if the alternative proxy server job fails due to network
+// disconnection, then the proxy delegate is not notified.
+TEST_F(HttpStreamFactoryImplJobControllerTest,
+ InternetDisconnectedAlternativeProxy) {
+ quic_data_ = std::make_unique<MockQuicData>();
+ quic_data_->AddConnect(SYNCHRONOUS, ERR_INTERNET_DISCONNECTED);
+ tcp_data_ = std::make_unique<SequencedSocketData>(nullptr, 0, nullptr, 0);
+ tcp_data_->set_connect_data(MockConnect(SYNCHRONOUS, OK));
+ SSLSocketDataProvider ssl_data(ASYNC, OK);
+ session_deps_.socket_factory->AddSSLSocketDataProvider(&ssl_data);
+
+ UseAlternativeProxy();
+
+ HttpRequestInfo request_info;
+ request_info.method = "GET";
+ request_info.url = GURL("http://mail.example.org/");
+ Initialize(request_info);
+ EXPECT_TRUE(test_proxy_delegate()->alternative_proxy_server().is_quic());
+
+ // Enable delayed TCP and set time delay for waiting job.
+ QuicStreamFactory* quic_stream_factory = session_->quic_stream_factory();
+ quic_stream_factory->set_require_confirmation(false);
+ ServerNetworkStats stats1;
+ stats1.srtt = base::TimeDelta::FromMicroseconds(300 * 1000);
+ session_->http_server_properties()->SetServerNetworkStats(
+ url::SchemeHostPort(GURL("https://myproxy.org")), stats1);
+
+ request_ =
+ job_controller_->Start(&request_delegate_, nullptr, net_log_.bound(),
+ HttpStreamRequest::HTTP_STREAM, DEFAULT_PRIORITY);
+ EXPECT_TRUE(job_controller_->main_job());
+ EXPECT_TRUE(job_controller_->alternative_job());
+
+ EXPECT_CALL(request_delegate_, OnStreamReadyImpl(_, _, _));
+
+ base::RunLoop().RunUntilIdle();
+
+ EXPECT_FALSE(job_controller_->alternative_job());
+ EXPECT_TRUE(job_controller_->main_job());
+
+ // The alternative proxy server should not be marked as bad.
+ EXPECT_TRUE(test_proxy_delegate()->alternative_proxy_server().is_valid());
+ EXPECT_EQ(1, test_proxy_delegate()->get_alternative_proxy_invocations());
+ request_.reset();
+ EXPECT_TRUE(HttpStreamFactoryImplPeer::IsJobControllerDeleted(factory_));
+}
+
TEST_F(HttpStreamFactoryImplJobControllerTest,
AlternativeProxyServerJobFailsAfterMainJobSucceeds) {
base::HistogramTester histogram_tester;
@@ -2170,7 +2217,7 @@ TEST_F(HttpStreamFactoryImplJobControllerTest, GetAlternativeServiceInfoFor) {
// Set alternative service with no advertised version.
session_->http_server_properties()->SetQuicAlternativeService(
- server, alternative_service, expiration, QuicVersionVector());
+ server, alternative_service, expiration, QuicTransportVersionVector());
AlternativeServiceInfo alt_svc_info =
JobControllerPeer::GetAlternativeServiceInfoFor(
@@ -2181,7 +2228,7 @@ TEST_F(HttpStreamFactoryImplJobControllerTest, GetAlternativeServiceInfoFor) {
// Set alternative service for the same server with the same list of versions
// that is supported.
- QuicVersionVector supported_versions =
+ QuicTransportVersionVector supported_versions =
session_->params().quic_supported_versions;
ASSERT_TRUE(session_->http_server_properties()->SetQuicAlternativeService(
server, alternative_service, expiration, supported_versions));
@@ -2192,9 +2239,9 @@ TEST_F(HttpStreamFactoryImplJobControllerTest, GetAlternativeServiceInfoFor) {
std::sort(supported_versions.begin(), supported_versions.end());
EXPECT_EQ(supported_versions, alt_svc_info.advertised_versions());
- QuicVersion unsupported_version_1(QUIC_VERSION_UNSUPPORTED);
- QuicVersion unsupported_version_2(QUIC_VERSION_UNSUPPORTED);
- for (const QuicVersion& version : AllSupportedVersions()) {
+ QuicTransportVersion unsupported_version_1(QUIC_VERSION_UNSUPPORTED);
+ QuicTransportVersion unsupported_version_2(QUIC_VERSION_UNSUPPORTED);
+ for (const QuicTransportVersion& version : AllSupportedTransportVersions()) {
if (std::find(supported_versions.begin(), supported_versions.end(),
version) != supported_versions.end())
continue;
@@ -2209,7 +2256,7 @@ TEST_F(HttpStreamFactoryImplJobControllerTest, GetAlternativeServiceInfoFor) {
// Set alternative service for the same server with two QUIC versions:
// - one unsupported version: |unsupported_version_1|,
// - one supported version: session_->params().quic_supported_versions[0].
- QuicVersionVector mixed_quic_versions = {
+ QuicTransportVersionVector mixed_quic_versions = {
unsupported_version_1, session_->params().quic_supported_versions[0]};
ASSERT_TRUE(session_->http_server_properties()->SetQuicAlternativeService(
server, alternative_service, expiration, mixed_quic_versions));
diff --git a/chromium/net/http/http_stream_factory_impl_request_unittest.cc b/chromium/net/http/http_stream_factory_impl_request_unittest.cc
index 151049de35c..612b136d851 100644
--- a/chromium/net/http/http_stream_factory_impl_request_unittest.cc
+++ b/chromium/net/http/http_stream_factory_impl_request_unittest.cc
@@ -4,10 +4,8 @@
#include "net/http/http_stream_factory_impl_request.h"
-#include <memory>
#include <utility>
-#include "base/memory/ptr_util.h"
#include "base/run_loop.h"
#include "net/http/http_stream_factory_impl.h"
#include "net/http/http_stream_factory_impl_job.h"
diff --git a/chromium/net/http/http_stream_factory_impl_unittest.cc b/chromium/net/http/http_stream_factory_impl_unittest.cc
index 3d0a9126f57..5c3a0a09cf4 100644
--- a/chromium/net/http/http_stream_factory_impl_unittest.cc
+++ b/chromium/net/http/http_stream_factory_impl_unittest.cc
@@ -352,6 +352,7 @@ void PreconnectHelperForURL(int num_streams,
request.method = "GET";
request.url = url;
request.load_flags = 0;
+ request.motivation = HttpRequestInfo::PRECONNECT_MOTIVATED;
session->http_stream_factory()->PreconnectStreams(num_streams, request);
mock_factory->WaitForPreconnects();
@@ -377,6 +378,10 @@ class CapturePreconnectsSocketPool : public ParentPool {
return last_num_streams_;
}
+ base::Optional<HttpRequestInfo::RequestMotivation> last_motivation() const {
+ return last_motivation_;
+ }
+
// Resets |last_num_streams_| to its default value.
void reset_last_num_streams() { last_num_streams_ = -1; }
@@ -394,8 +399,10 @@ class CapturePreconnectsSocketPool : public ParentPool {
void RequestSockets(const std::string& group_name,
const void* socket_params,
int num_sockets,
- const NetLogWithSource& net_log) override {
+ const NetLogWithSource& net_log,
+ HttpRequestInfo::RequestMotivation motivation) override {
last_num_streams_ = num_sockets;
+ last_motivation_ = motivation;
}
void CancelRequest(const std::string& group_name,
@@ -427,6 +434,7 @@ class CapturePreconnectsSocketPool : public ParentPool {
private:
int last_num_streams_;
+ base::Optional<HttpRequestInfo::RequestMotivation> last_motivation_;
};
typedef CapturePreconnectsSocketPool<TransportClientSocketPool>
@@ -646,6 +654,26 @@ TEST_F(HttpStreamFactoryTest, PreconnectUnsafePort) {
EXPECT_EQ(-1, transport_conn_pool->last_num_streams());
}
+// Verify that preconnects correctly set motivation for the SocketPool.
+TEST_F(HttpStreamFactoryTest, PreconnectSetsMotivation) {
+ SpdySessionDependencies session_deps(ProxyService::CreateDirect());
+ std::unique_ptr<HttpNetworkSession> session(
+ SpdySessionDependencies::SpdyCreateSession(&session_deps));
+ HttpNetworkSessionPeer peer(session.get());
+ CapturePreconnectsTransportSocketPool* transport_conn_pool =
+ new CapturePreconnectsTransportSocketPool(
+ session_deps.host_resolver.get(), session_deps.cert_verifier.get(),
+ session_deps.transport_security_state.get(),
+ session_deps.cert_transparency_verifier.get(),
+ session_deps.ct_policy_enforcer.get());
+ auto mock_pool_manager = std::make_unique<MockClientSocketPoolManager>();
+ mock_pool_manager->SetTransportSocketPool(transport_conn_pool);
+ peer.SetClientSocketPoolManager(std::move(mock_pool_manager));
+ PreconnectHelperForURL(1, GURL("http://www.google.com"), session.get());
+ EXPECT_EQ(HttpRequestInfo::PRECONNECT_MOTIVATED,
+ transport_conn_pool->last_motivation());
+}
+
TEST_F(HttpStreamFactoryTest, JobNotifiesProxy) {
const char* kProxyString = "PROXY bad:99; PROXY maybe:80; DIRECT";
SpdySessionDependencies session_deps(
@@ -2208,7 +2236,7 @@ TEST_F(HttpStreamFactoryTest, RequestBidirectionalStreamImpl) {
class HttpStreamFactoryBidirectionalQuicTest
: public ::testing::Test,
- public ::testing::WithParamInterface<QuicVersion> {
+ public ::testing::WithParamInterface<QuicTransportVersion> {
protected:
HttpStreamFactoryBidirectionalQuicTest()
: default_url_(kDefaultUrl),
@@ -2238,7 +2266,8 @@ class HttpStreamFactoryBidirectionalQuicTest
void Initialize() {
params_.enable_quic = true;
- params_.quic_supported_versions = test::SupportedVersions(GetParam());
+ params_.quic_supported_versions =
+ test::SupportedTransportVersions(GetParam());
HttpNetworkSession::Context session_context;
session_context.http_server_properties = &http_server_properties_;
@@ -2316,7 +2345,7 @@ class HttpStreamFactoryBidirectionalQuicTest
INSTANTIATE_TEST_CASE_P(Version,
HttpStreamFactoryBidirectionalQuicTest,
- ::testing::ValuesIn(AllSupportedVersions()));
+ ::testing::ValuesIn(AllSupportedTransportVersions()));
TEST_P(HttpStreamFactoryBidirectionalQuicTest,
RequestBidirectionalStreamImplQuicAlternative) {
diff --git a/chromium/net/http/http_stream_factory_test_util.cc b/chromium/net/http/http_stream_factory_test_util.cc
index 8333f70411f..fff12f7e88c 100644
--- a/chromium/net/http/http_stream_factory_test_util.cc
+++ b/chromium/net/http/http_stream_factory_test_util.cc
@@ -27,7 +27,7 @@ MockHttpStreamFactoryImplJob::MockHttpStreamFactoryImplJob(
HostPortPair destination,
GURL origin_url,
NextProto alternative_protocol,
- QuicVersion quic_version,
+ QuicTransportVersion quic_version,
const ProxyServer& alternative_proxy_server,
bool enable_ip_based_pooling,
NetLog* net_log)
@@ -98,7 +98,7 @@ std::unique_ptr<HttpStreamFactoryImpl::Job> TestJobFactory::CreateAltSvcJob(
HostPortPair destination,
GURL origin_url,
NextProto alternative_protocol,
- QuicVersion quic_version,
+ QuicTransportVersion quic_version,
bool enable_ip_based_pooling,
NetLog* net_log) {
auto alternative_job = std::make_unique<MockHttpStreamFactoryImplJob>(
diff --git a/chromium/net/http/http_stream_factory_test_util.h b/chromium/net/http/http_stream_factory_test_util.h
index 736fda1e85e..238cc508744 100644
--- a/chromium/net/http/http_stream_factory_test_util.h
+++ b/chromium/net/http/http_stream_factory_test_util.h
@@ -118,7 +118,7 @@ class MockHttpStreamFactoryImplJob : public HttpStreamFactoryImpl::Job {
HostPortPair destination,
GURL origin_url,
NextProto alternative_protocol,
- QuicVersion quic_version,
+ QuicTransportVersion quic_version,
const ProxyServer& alternative_proxy_server,
bool enable_ip_based_pooling,
NetLog* net_log);
@@ -162,7 +162,7 @@ class TestJobFactory : public HttpStreamFactoryImpl::JobFactory {
HostPortPair destination,
GURL origin_url,
NextProto alternative_protocol,
- QuicVersion quic_version,
+ QuicTransportVersion quic_version,
bool enable_ip_based_pooling,
NetLog* net_log) override;
diff --git a/chromium/net/http/http_stream_parser.cc b/chromium/net/http/http_stream_parser.cc
index 7da5adaf13d..1d5dec4926f 100644
--- a/chromium/net/http/http_stream_parser.cc
+++ b/chromium/net/http/http_stream_parser.cc
@@ -10,7 +10,6 @@
#include "base/compiler_specific.h"
#include "base/logging.h"
#include "base/metrics/histogram_macros.h"
-#include "base/profiler/scoped_tracker.h"
#include "base/strings/string_util.h"
#include "base/values.h"
#include "net/base/io_buffer.h"
@@ -448,11 +447,6 @@ int HttpStreamParser::DoLoop(int result) {
}
int HttpStreamParser::DoSendHeaders() {
- // TODO(mmenke): Remove ScopedTracker below once crbug.com/424359 is fixed.
- tracked_objects::ScopedTracker tracking_profile(
- FROM_HERE_WITH_EXPLICIT_FUNCTION(
- "424359 HttpStreamParser::DoSendHeaders"));
-
int bytes_remaining = request_headers_->BytesRemaining();
DCHECK_GT(bytes_remaining, 0);
diff --git a/chromium/net/http/http_stream_parser_unittest.cc b/chromium/net/http/http_stream_parser_unittest.cc
index 7a16d42391c..0ad717f10b1 100644
--- a/chromium/net/http/http_stream_parser_unittest.cc
+++ b/chromium/net/http/http_stream_parser_unittest.cc
@@ -7,7 +7,6 @@
#include <stdint.h>
#include <algorithm>
-#include <memory>
#include <string>
#include <utility>
#include <vector>
@@ -15,7 +14,6 @@
#include "base/files/file_path.h"
#include "base/files/file_util.h"
#include "base/files/scoped_temp_dir.h"
-#include "base/memory/ptr_util.h"
#include "base/memory/ref_counted.h"
#include "base/run_loop.h"
#include "base/strings/string_piece.h"
diff --git a/chromium/net/http/http_util.cc b/chromium/net/http/http_util.cc
index 98abf9631d6..b73f6516808 100644
--- a/chromium/net/http/http_util.cc
+++ b/chromium/net/http/http_util.cc
@@ -127,7 +127,8 @@ void HttpUtil::ParseContentType(const std::string& content_type_str,
charset_val = content_type_str.find_first_not_of(HTTP_LWS, charset_val);
charset_val = std::min(charset_val, charset_end);
char first_char = content_type_str[charset_val];
- if (first_char == '"' || first_char == '\'') {
+ // RFC 7231 Section 3.1.1.1 allows double quotes around charset.
+ if (first_char == '"') {
charset_end = FindStringEnd(content_type_str, charset_val, first_char);
++charset_val;
DCHECK(charset_end >= charset_val);
diff --git a/chromium/net/http/http_util_unittest.cc b/chromium/net/http/http_util_unittest.cc
index d0b78023332..ee27ba65b3f 100644
--- a/chromium/net/http/http_util_unittest.cc
+++ b/chromium/net/http/http_util_unittest.cc
@@ -726,6 +726,7 @@ TEST(HttpUtilTest, GenerateAcceptLanguageHeader) {
// HttpResponseHeadersTest.GetMimeType also tests ParseContentType.
TEST(HttpUtilTest, ParseContentType) {
+ // clang-format off
const struct {
const char* const content_type;
const char* const expected_mime_type;
@@ -793,8 +794,23 @@ TEST(HttpUtilTest, ParseContentType) {
false,
"WebKit-ada-df-dsf-adsfadsfs"
},
+ { "text/html; charset=\"utf-8\"",
+ "text/html",
+ "utf-8",
+ true,
+ ""
+ },
+ // Regression test for https://crbug.com/772350:
+ // Single quotes are not delimiters but must be treated as part of charset.
+ { "text/html; charset='utf-8'",
+ "text/html",
+ "'utf-8'",
+ true,
+ ""
+ },
// TODO(abarth): Add more interesting test cases.
};
+ // clang-format on
for (size_t i = 0; i < arraysize(tests); ++i) {
std::string mime_type;
std::string charset;
diff --git a/chromium/net/http/mock_allow_http_auth_preferences.cc b/chromium/net/http/mock_allow_http_auth_preferences.cc
index 37539e56ee6..afa600d7cad 100644
--- a/chromium/net/http/mock_allow_http_auth_preferences.cc
+++ b/chromium/net/http/mock_allow_http_auth_preferences.cc
@@ -3,12 +3,13 @@
// found in the LICENSE file.
#include "net/http/mock_allow_http_auth_preferences.h"
+#include "build/build_config.h"
namespace net {
MockAllowHttpAuthPreferences::MockAllowHttpAuthPreferences()
: HttpAuthPreferences(std::vector<std::string>()
-#if defined(OS_POSIX) && !defined(OS_ANDROID)
+#if defined(OS_POSIX) && !defined(OS_ANDROID) && !defined(OS_CHROMEOS)
,
std::string()
#endif
diff --git a/chromium/net/http/mock_http_cache.cc b/chromium/net/http/mock_http_cache.cc
index fcafea32c0d..7846cf80906 100644
--- a/chromium/net/http/mock_http_cache.cc
+++ b/chromium/net/http/mock_http_cache.cc
@@ -5,11 +5,11 @@
#include "net/http/mock_http_cache.h"
#include <limits>
+#include <memory>
#include <utility>
#include "base/bind.h"
#include "base/location.h"
-#include "base/memory/ptr_util.h"
#include "base/single_thread_task_runner.h"
#include "base/threading/thread_task_runner_handle.h"
#include "net/base/completion_callback.h"
diff --git a/chromium/net/http/transport_security_persister.cc b/chromium/net/http/transport_security_persister.cc
index edd8724b8ed..c4fe8c05fd7 100644
--- a/chromium/net/http/transport_security_persister.cc
+++ b/chromium/net/http/transport_security_persister.cc
@@ -15,7 +15,6 @@
#include "base/json/json_reader.h"
#include "base/json/json_writer.h"
#include "base/location.h"
-#include "base/memory/ptr_util.h"
#include "base/sequenced_task_runner.h"
#include "base/task_runner_util.h"
#include "base/threading/thread_task_runner_handle.h"
diff --git a/chromium/net/http/transport_security_state.cc b/chromium/net/http/transport_security_state.cc
index b8d57e4546f..5af15d92ef4 100644
--- a/chromium/net/http/transport_security_state.cc
+++ b/chromium/net/http/transport_security_state.cc
@@ -12,7 +12,6 @@
#include "base/build_time.h"
#include "base/json/json_writer.h"
#include "base/logging.h"
-#include "base/memory/ptr_util.h"
#include "base/metrics/histogram_macros.h"
#include "base/metrics/sparse_histogram.h"
#include "base/stl_util.h"
@@ -394,19 +393,19 @@ class HuffmanDecoder {
// PreloadResult is the result of resolving a specific name in the preloaded
// data.
struct PreloadResult {
- uint32_t pinset_id;
+ uint32_t pinset_id = 0;
// hostname_offset contains the number of bytes from the start of the given
// hostname where the name of the matching entry starts.
- size_t hostname_offset;
- bool sts_include_subdomains;
- bool pkp_include_subdomains;
- bool force_https;
- bool has_pins;
- bool expect_ct;
- uint32_t expect_ct_report_uri_id;
- bool expect_staple;
- bool expect_staple_include_subdomains;
- uint32_t expect_staple_report_uri_id;
+ size_t hostname_offset = 0;
+ bool sts_include_subdomains = false;
+ bool pkp_include_subdomains = false;
+ bool force_https = false;
+ bool has_pins = false;
+ bool expect_ct = false;
+ uint32_t expect_ct_report_uri_id = 0;
+ bool expect_staple = false;
+ bool expect_staple_include_subdomains = false;
+ uint32_t expect_staple_report_uri_id = 0;
};
// DecodeHSTSPreloadRaw resolves |hostname| in the preloaded data. It returns
@@ -520,37 +519,51 @@ bool DecodeHSTSPreloadRaw(const std::string& search_hostname,
if (c == kEndOfString) {
PreloadResult tmp;
- if (!reader.Next(&tmp.sts_include_subdomains) ||
- !reader.Next(&tmp.force_https) || !reader.Next(&tmp.has_pins)) {
+ bool is_simple_entry;
+ if (!reader.Next(&is_simple_entry)) {
return false;
}
- tmp.pkp_include_subdomains = tmp.sts_include_subdomains;
-
- if (tmp.has_pins) {
- if (!reader.Read(4, &tmp.pinset_id) ||
- (!tmp.sts_include_subdomains &&
- !reader.Next(&tmp.pkp_include_subdomains))) {
+ // Simple entries only configure HSTS with IncludeSubdomains and use a
+ // compact serialization format where the other policy flags are
+ // omitted. The omitted flags are assumed to be 0 and the associated
+ // policies are disabled.
+ if (is_simple_entry) {
+ tmp.force_https = true;
+ tmp.sts_include_subdomains = true;
+ } else {
+ if (!reader.Next(&tmp.sts_include_subdomains) ||
+ !reader.Next(&tmp.force_https) || !reader.Next(&tmp.has_pins)) {
return false;
}
- }
- if (!reader.Next(&tmp.expect_ct))
- return false;
+ tmp.pkp_include_subdomains = tmp.sts_include_subdomains;
- if (tmp.expect_ct) {
- if (!reader.Read(4, &tmp.expect_ct_report_uri_id))
- return false;
- }
+ if (tmp.has_pins) {
+ if (!reader.Read(4, &tmp.pinset_id) ||
+ (!tmp.sts_include_subdomains &&
+ !reader.Next(&tmp.pkp_include_subdomains))) {
+ return false;
+ }
+ }
- if (!reader.Next(&tmp.expect_staple))
- return false;
- tmp.expect_staple_include_subdomains = false;
- if (tmp.expect_staple) {
- if (!reader.Next(&tmp.expect_staple_include_subdomains))
+ if (!reader.Next(&tmp.expect_ct))
return false;
- if (!reader.Read(4, &tmp.expect_staple_report_uri_id))
+
+ if (tmp.expect_ct) {
+ if (!reader.Read(4, &tmp.expect_ct_report_uri_id))
+ return false;
+ }
+
+ if (!reader.Next(&tmp.expect_staple))
return false;
+ tmp.expect_staple_include_subdomains = false;
+ if (tmp.expect_staple) {
+ if (!reader.Next(&tmp.expect_staple_include_subdomains))
+ return false;
+ if (!reader.Read(4, &tmp.expect_staple_report_uri_id))
+ return false;
+ }
}
tmp.hostname_offset = hostname_offset;
@@ -1481,7 +1494,9 @@ void TransportSecurityState::ProcessExpectCTHeader(
base::TimeDelta max_age;
bool enforce;
GURL report_uri;
- if (!ParseExpectCTHeader(value, &max_age, &enforce, &report_uri))
+ bool parsed = ParseExpectCTHeader(value, &max_age, &enforce, &report_uri);
+ UMA_HISTOGRAM_BOOLEAN("Net.ExpectCTHeader.ParseSuccess", parsed);
+ if (!parsed)
return;
// Do not persist Expect-CT headers if the connection was not chained to a
// public root or did not comply with CT policy.
diff --git a/chromium/net/http/transport_security_state_static.json b/chromium/net/http/transport_security_state_static.json
index 4349812ab4d..698980a564b 100644
--- a/chromium/net/http/transport_security_state_static.json
+++ b/chromium/net/http/transport_security_state_static.json
@@ -232,6 +232,15 @@
"COMODOECCCertificationAuthority"
],
"report_uri": "https://log.ncsccs.com/report/hpkp"
+ },
+ {
+ "name": "tumblr",
+ "static_spki_hashes": [
+ "DigiCertEVRoot",
+ "DigiCertSHA2HighAssuranceServerCA",
+ "TumblrBackup"
+ ],
+ "report_uri": "https://cspreports.srvcs.tumblr.com/hpkp"
}
],
@@ -244,9 +253,14 @@
{ "name": "preloaded-expect-staple-include-subdomains.badssl.com", "expect_staple": true, "expect_staple_report_uri": "https://report.badssl.com/expect-staple", "include_subdomains_for_expect_staple": true },
// eTLDs
- // At the moment, this only includes a Google-owned gTLD,
+ // At the moment, this only includes Google-owned gTLDs,
// but other gTLDs and eTLDs are welcome to preload if they are interested.
{ "name": "google", "include_subdomains": true, "mode": "force-https", "pins": "google" },
+ { "name": "dev", "include_subdomains": true, "mode": "force-https" },
+ { "name": "foo", "include_subdomains": true, "mode": "force-https" },
+ { "name": "page", "include_subdomains": true, "mode": "force-https" },
+ { "name": "app", "include_subdomains": true, "mode": "force-https" },
+ { "name": "chrome", "include_subdomains": true, "mode": "force-https" },
// Google domains using Expect-CT.
{ "name": "mail.google.com", "include_subdomains": true, "mode": "force-https", "pins": "google", "expect_ct": true, "expect_ct_report_uri": "https://clients3.google.com/ct_upload" },
@@ -326,6 +340,7 @@
{ "name": "google-analytics.com", "include_subdomains": true, "mode": "force-https", "pins": "google" },
{ "name": "stats.g.doubleclick.net", "include_subdomains": true, "mode": "force-https", "pins": "google" },
{ "name": "chromiumbugs.appspot.com", "include_subdomains": true, "mode": "force-https", "pins": "google" },
+ { "name": "youtube.com", "mode": "force-https", "include_subdomains": true, "pins": "google" },
{ "name": "webfilings.appspot.com", "include_subdomains": true, "mode": "force-https", "pins": "google" },
{ "name": "webfilings-eu.appspot.com", "include_subdomains": true, "mode": "force-https", "pins": "google" },
@@ -589,7 +604,6 @@
{ "name": "static.googleadsserving.cn", "include_subdomains": true, "pins": "google" },
{ "name": "urchin.com", "include_subdomains": true, "pins": "google" },
{ "name": "www.googlegroups.com", "include_subdomains": true, "pins": "google", "expect_ct": true, "expect_ct_report_uri": "https://clients3.google.com/ct_upload" },
- { "name": "youtube.com", "include_subdomains": true, "pins": "google" },
{ "name": "youtu.be", "include_subdomains": true, "pins": "google" },
{ "name": "youtube-nocookie.com", "include_subdomains": true, "pins": "google" },
{ "name": "ytimg.com", "include_subdomains": true, "pins": "google" },
@@ -3381,7 +3395,6 @@
{ "name": "uploadbeta.com", "include_subdomains": true, "mode": "force-https" },
{ "name": "wholebites.com", "include_subdomains": true, "mode": "force-https" },
{ "name": "wikipedia.org", "include_subdomains": true, "mode": "force-https" },
- { "name": "woresite.jp", "include_subdomains": true, "mode": "force-https" },
{ "name": "agonswim.com", "include_subdomains": true, "mode": "force-https" },
{ "name": "appharbor.com", "include_subdomains": true, "mode": "force-https" },
{ "name": "armory.consulting", "include_subdomains": true, "mode": "force-https" },
@@ -4996,7 +5009,6 @@
{ "name": "sandbagexpress.com", "include_subdomains": true, "mode": "force-https" },
{ "name": "schelberts.de", "include_subdomains": true, "mode": "force-https" },
{ "name": "selfici.cz", "include_subdomains": true, "mode": "force-https" },
- { "name": "simply-premium.com", "include_subdomains": true, "mode": "force-https" },
{ "name": "slovakiana.sk", "include_subdomains": true, "mode": "force-https" },
{ "name": "sniep.net", "include_subdomains": true, "mode": "force-https" },
{ "name": "solsystems.ru", "include_subdomains": true, "mode": "force-https" },
@@ -6152,7 +6164,6 @@
{ "name": "esko.bar", "include_subdomains": true, "mode": "force-https" },
{ "name": "esocweb.com", "include_subdomains": true, "mode": "force-https" },
{ "name": "ethanfaust.com", "include_subdomains": true, "mode": "force-https" },
- { "name": "ethlan.fr", "include_subdomains": true, "mode": "force-https" },
{ "name": "eulerpi.io", "include_subdomains": true, "mode": "force-https" },
{ "name": "euph.eu", "include_subdomains": true, "mode": "force-https" },
{ "name": "everwaking.com", "include_subdomains": true, "mode": "force-https" },
@@ -10400,7 +10411,6 @@
{ "name": "pagetoimage.com", "include_subdomains": true, "mode": "force-https" },
{ "name": "painosso.org", "include_subdomains": true, "mode": "force-https" },
{ "name": "paisaone.com", "include_subdomains": true, "mode": "force-https" },
- { "name": "pajowu.de", "include_subdomains": true, "mode": "force-https" },
{ "name": "paperturn.com", "include_subdomains": true, "mode": "force-https" },
{ "name": "paperwork.co.za", "include_subdomains": true, "mode": "force-https" },
{ "name": "paragreen.net", "include_subdomains": true, "mode": "force-https" },
@@ -10827,7 +10837,6 @@
{ "name": "square-src.de", "include_subdomains": true, "mode": "force-https" },
{ "name": "squeezemetrics.com", "include_subdomains": true, "mode": "force-https" },
{ "name": "srchub.org", "include_subdomains": true, "mode": "force-https" },
- { "name": "srv47.de", "include_subdomains": true, "mode": "force-https" },
{ "name": "ssl247.co.uk", "include_subdomains": true, "mode": "force-https" },
{ "name": "ssl247.com.mx", "include_subdomains": true, "mode": "force-https" },
{ "name": "ssl247.de", "include_subdomains": true, "mode": "force-https" },
@@ -11678,7 +11687,6 @@
{ "name": "geeklair.net", "include_subdomains": true, "mode": "force-https" },
{ "name": "gamerslair.org", "include_subdomains": true, "mode": "force-https" },
{ "name": "gamepad.vg", "include_subdomains": true, "mode": "force-https" },
- { "name": "gersting.net", "include_subdomains": true, "mode": "force-https" },
{ "name": "gameisbest.jp", "include_subdomains": true, "mode": "force-https" },
{ "name": "geneau.net", "include_subdomains": true, "mode": "force-https" },
{ "name": "gameparade.de", "include_subdomains": true, "mode": "force-https" },
@@ -11700,7 +11708,6 @@
{ "name": "groupebaillargeon.com", "include_subdomains": true, "mode": "force-https" },
{ "name": "grokker.com", "include_subdomains": true, "mode": "force-https" },
{ "name": "gtchipsi.org", "include_subdomains": true, "mode": "force-https" },
- { "name": "greiners.net", "include_subdomains": true, "mode": "force-https" },
{ "name": "grieg.com", "include_subdomains": true, "mode": "force-https" },
{ "name": "gryffin.tk", "include_subdomains": true, "mode": "force-https" },
{ "name": "gycis.me", "include_subdomains": true, "mode": "force-https" },
@@ -11897,7 +11904,6 @@
{ "name": "loveyounastya.com", "include_subdomains": true, "mode": "force-https" },
{ "name": "magicball.co", "include_subdomains": true, "mode": "force-https" },
{ "name": "lzkill.com", "include_subdomains": true, "mode": "force-https" },
- { "name": "lwl-foej-bewerbung.de", "include_subdomains": true, "mode": "force-https" },
{ "name": "luohua.im", "include_subdomains": true, "mode": "force-https" },
{ "name": "luoh.cc", "include_subdomains": true, "mode": "force-https" },
{ "name": "mailing-jbgg.com", "include_subdomains": true, "mode": "force-https" },
@@ -12094,7 +12100,6 @@
{ "name": "potpourrifestival.de", "include_subdomains": true, "mode": "force-https" },
{ "name": "prgslab.net", "include_subdomains": true, "mode": "force-https" },
{ "name": "prettytunesapp.com", "include_subdomains": true, "mode": "force-https" },
- { "name": "prescriptiondrugs.com", "include_subdomains": true, "mode": "force-https" },
{ "name": "proxybay.tv", "include_subdomains": true, "mode": "force-https" },
{ "name": "proslimdiets.com", "include_subdomains": true, "mode": "force-https" },
{ "name": "priolkar.com", "include_subdomains": true, "mode": "force-https" },
@@ -12262,7 +12267,6 @@
{ "name": "stargatepartners.com", "include_subdomains": true, "mode": "force-https" },
{ "name": "stayokhotelscdc-mailing.com", "include_subdomains": true, "mode": "force-https" },
{ "name": "stevenhumphrey.uk", "include_subdomains": true, "mode": "force-https" },
- { "name": "stig.io", "include_subdomains": true, "mode": "force-https" },
{ "name": "stillblackhat.id", "include_subdomains": true, "mode": "force-https" },
{ "name": "stpatricksguild.com", "include_subdomains": true, "mode": "force-https" },
{ "name": "stardanceacademy.net", "include_subdomains": true, "mode": "force-https" },
@@ -13320,7 +13324,6 @@
{ "name": "anthonyavon.com", "include_subdomains": true, "mode": "force-https" },
{ "name": "anystack.xyz", "include_subdomains": true, "mode": "force-https" },
{ "name": "apis.world", "include_subdomains": true, "mode": "force-https" },
- { "name": "aponkral.net", "include_subdomains": true, "mode": "force-https" },
{ "name": "aponkralsunucu.com", "include_subdomains": true, "mode": "force-https" },
{ "name": "appelboomdefilm.nl", "include_subdomains": true, "mode": "force-https" },
{ "name": "applelife.ru", "include_subdomains": true, "mode": "force-https" },
@@ -13654,7 +13657,6 @@
{ "name": "draugr.de", "include_subdomains": true, "mode": "force-https" },
{ "name": "drewgle.net", "include_subdomains": true, "mode": "force-https" },
{ "name": "drivercopilot.com", "include_subdomains": true, "mode": "force-https" },
- { "name": "drivya.com", "include_subdomains": true, "mode": "force-https" },
{ "name": "dronografia.es", "include_subdomains": true, "mode": "force-https" },
{ "name": "dubaieveningsafari.com", "include_subdomains": true, "mode": "force-https" },
{ "name": "duch.cloud", "include_subdomains": true, "mode": "force-https" },
@@ -13713,7 +13715,6 @@
{ "name": "eurekaarchitecture.com", "include_subdomains": true, "mode": "force-https" },
{ "name": "euren.se", "include_subdomains": true, "mode": "force-https" },
{ "name": "european-agency.org", "include_subdomains": true, "mode": "force-https" },
- { "name": "eurotravelstar.eu", "include_subdomains": true, "mode": "force-https" },
{ "name": "evanhandgraaf.nl", "include_subdomains": true, "mode": "force-https" },
{ "name": "evelyndayman.com", "include_subdomains": true, "mode": "force-https" },
{ "name": "evlear.com", "include_subdomains": true, "mode": "force-https" },
@@ -14103,7 +14104,6 @@
{ "name": "lattyware.com", "include_subdomains": true, "mode": "force-https" },
{ "name": "lauftrainer-ausbildung.com", "include_subdomains": true, "mode": "force-https" },
{ "name": "lavita.de", "include_subdomains": true, "mode": "force-https" },
- { "name": "lavoieducoeur.be", "include_subdomains": true, "mode": "force-https" },
{ "name": "lawrencemurgatroyd.com", "include_subdomains": true, "mode": "force-https" },
{ "name": "lazerus.net", "include_subdomains": true, "mode": "force-https" },
{ "name": "lebanesearmy.gov.lb", "include_subdomains": true, "mode": "force-https" },
@@ -14135,7 +14135,6 @@
{ "name": "lolicon.eu", "include_subdomains": true, "mode": "force-https" },
{ "name": "lolkot.ru", "include_subdomains": true, "mode": "force-https" },
{ "name": "loopower.com", "include_subdomains": true, "mode": "force-https" },
- { "name": "loveismore.ru", "include_subdomains": true, "mode": "force-https" },
{ "name": "lovelivewiki.com", "include_subdomains": true, "mode": "force-https" },
{ "name": "lowhangingfruitgrabber.com", "include_subdomains": true, "mode": "force-https" },
{ "name": "loxis.be", "include_subdomains": true, "mode": "force-https" },
@@ -16953,7 +16952,6 @@
{ "name": "britton-photography.com", "include_subdomains": true, "mode": "force-https" },
{ "name": "bqp.io", "include_subdomains": true, "mode": "force-https" },
{ "name": "bitstorm.org", "include_subdomains": true, "mode": "force-https" },
- { "name": "azbuki.by", "include_subdomains": true, "mode": "force-https" },
{ "name": "backpacker.dating", "include_subdomains": true, "mode": "force-https" },
{ "name": "bluepostbox.de", "include_subdomains": true, "mode": "force-https" },
{ "name": "black-khat.com", "include_subdomains": true, "mode": "force-https" },
@@ -17183,7 +17181,6 @@
{ "name": "elmar-kraamzorg.nl", "include_subdomains": true, "mode": "force-https" },
{ "name": "dyrkar.com", "include_subdomains": true, "mode": "force-https" },
{ "name": "especificosba.com.ar", "include_subdomains": true, "mode": "force-https" },
- { "name": "everpcpc.com", "include_subdomains": true, "mode": "force-https" },
{ "name": "ehito.ovh", "include_subdomains": true, "mode": "force-https" },
{ "name": "enaah.de", "include_subdomains": true, "mode": "force-https" },
{ "name": "enersec.co.uk", "include_subdomains": true, "mode": "force-https" },
@@ -17365,7 +17362,6 @@
{ "name": "herbweb.net", "include_subdomains": true, "mode": "force-https" },
{ "name": "hexe.net", "include_subdomains": true, "mode": "force-https" },
{ "name": "herbweb.org", "include_subdomains": true, "mode": "force-https" },
- { "name": "hornblasters.com", "include_subdomains": true, "mode": "force-https" },
{ "name": "hbdesign.work", "include_subdomains": true, "mode": "force-https" },
{ "name": "hunter.io", "include_subdomains": true, "mode": "force-https" },
{ "name": "hilnu.tk", "include_subdomains": true, "mode": "force-https" },
@@ -17425,7 +17421,6 @@
{ "name": "johnvanhese.nl", "include_subdomains": true, "mode": "force-https" },
{ "name": "joshharmon.me", "include_subdomains": true, "mode": "force-https" },
{ "name": "homecoming.city", "include_subdomains": true, "mode": "force-https" },
- { "name": "idecode.net", "include_subdomains": true, "mode": "force-https" },
{ "name": "ioover.net", "include_subdomains": true, "mode": "force-https" },
{ "name": "jinja.ai", "include_subdomains": true, "mode": "force-https" },
{ "name": "hirte-digital.de", "include_subdomains": true, "mode": "force-https" },
@@ -18579,7 +18574,6 @@
{ "name": "car24portal.de", "include_subdomains": true, "mode": "force-https" },
{ "name": "casc.cz", "include_subdomains": true, "mode": "force-https" },
{ "name": "chonghe.org", "include_subdomains": true, "mode": "force-https" },
- { "name": "christiangaetano.com", "include_subdomains": true, "mode": "force-https" },
{ "name": "caletka.cz", "include_subdomains": true, "mode": "force-https" },
{ "name": "ciderclub.com", "include_subdomains": true, "mode": "force-https" },
{ "name": "cbintermountainrealty.com", "include_subdomains": true, "mode": "force-https" },
@@ -18626,7 +18620,6 @@
{ "name": "clipclip.com", "include_subdomains": true, "mode": "force-https" },
{ "name": "chewey.de", "include_subdomains": true, "mode": "force-https" },
{ "name": "chokladfantasi.net", "include_subdomains": true, "mode": "force-https" },
- { "name": "chrisu3050.at", "include_subdomains": true, "mode": "force-https" },
{ "name": "celina-reads.de", "include_subdomains": true, "mode": "force-https" },
{ "name": "chenky.com", "include_subdomains": true, "mode": "force-https" },
{ "name": "clickgram.biz", "include_subdomains": true, "mode": "force-https" },
@@ -18682,7 +18675,6 @@
{ "name": "cocodemy.com", "include_subdomains": true, "mode": "force-https" },
{ "name": "content-design.de", "include_subdomains": true, "mode": "force-https" },
{ "name": "countryattire.com", "include_subdomains": true, "mode": "force-https" },
- { "name": "creditstar.lt", "include_subdomains": true, "mode": "force-https" },
{ "name": "cubekrowd.net", "include_subdomains": true, "mode": "force-https" },
{ "name": "dalingk.com", "include_subdomains": true, "mode": "force-https" },
{ "name": "crescent.gr.jp", "include_subdomains": true, "mode": "force-https" },
@@ -19347,7 +19339,6 @@
{ "name": "keinefilterblase.de", "include_subdomains": true, "mode": "force-https" },
{ "name": "kirillpokrovsky.de", "include_subdomains": true, "mode": "force-https" },
{ "name": "kourpe.online", "include_subdomains": true, "mode": "force-https" },
- { "name": "itpros.ru", "include_subdomains": true, "mode": "force-https" },
{ "name": "katja-nikolic-design.de", "include_subdomains": true, "mode": "force-https" },
{ "name": "kalterersee.ch", "include_subdomains": true, "mode": "force-https" },
{ "name": "karlstabo.se", "include_subdomains": true, "mode": "force-https" },
@@ -21099,7 +21090,6 @@
{ "name": "bush41.org", "include_subdomains": true, "mode": "force-https" },
{ "name": "channellife.com.au", "include_subdomains": true, "mode": "force-https" },
{ "name": "channellife.co.nz", "include_subdomains": true, "mode": "force-https" },
- { "name": "coerthas.com", "include_subdomains": true, "mode": "force-https" },
{ "name": "chrpaul.de", "include_subdomains": true, "mode": "force-https" },
{ "name": "baitulongbaycruises.com", "include_subdomains": true, "mode": "force-https" },
{ "name": "co-yutaka.com", "include_subdomains": true, "mode": "force-https" },
@@ -21438,7 +21428,6 @@
{ "name": "f43.me", "include_subdomains": true, "mode": "force-https" },
{ "name": "fcsic.gov", "include_subdomains": true, "mode": "force-https" },
{ "name": "fairedeseconomies.info", "include_subdomains": true, "mode": "force-https" },
- { "name": "ffxiv.cc", "include_subdomains": true, "mode": "force-https" },
{ "name": "centralfor.me", "include_subdomains": true, "mode": "force-https" },
{ "name": "esaborit.ddns.net", "include_subdomains": true, "mode": "force-https" },
{ "name": "fiareapp.red", "include_subdomains": true, "mode": "force-https" },
@@ -21708,7 +21697,6 @@
{ "name": "ifightsurveillance.com", "include_subdomains": true, "mode": "force-https" },
{ "name": "ifightsurveillance.net", "include_subdomains": true, "mode": "force-https" },
{ "name": "hotelaustria-wien.at", "include_subdomains": true, "mode": "force-https" },
- { "name": "hydaelyn.com", "include_subdomains": true, "mode": "force-https" },
{ "name": "htaps.com", "include_subdomains": true, "mode": "force-https" },
{ "name": "http2.eu", "include_subdomains": true, "mode": "force-https" },
{ "name": "hotel-rosner.at", "include_subdomains": true, "mode": "force-https" },
@@ -21924,7 +21912,6 @@
{ "name": "kodiaklabs.org", "include_subdomains": true, "mode": "force-https" },
{ "name": "kiddyboom.ua", "include_subdomains": true, "mode": "force-https" },
{ "name": "jutlander.dk", "include_subdomains": true, "mode": "force-https" },
- { "name": "katzen.me", "include_subdomains": true, "mode": "force-https" },
{ "name": "jonkermedia.nl", "include_subdomains": true, "mode": "force-https" },
{ "name": "julian-witusch.de", "include_subdomains": true, "mode": "force-https" },
{ "name": "knutur.is", "include_subdomains": true, "mode": "force-https" },
@@ -22017,7 +22004,6 @@
{ "name": "lifecoach.tw", "include_subdomains": true, "mode": "force-https" },
{ "name": "lonesomecosmonaut.com", "include_subdomains": true, "mode": "force-https" },
{ "name": "kyoto-tomikawa.jp", "include_subdomains": true, "mode": "force-https" },
- { "name": "lega3.dk", "include_subdomains": true, "mode": "force-https" },
{ "name": "lidl-gewinnspiel.de", "include_subdomains": true, "mode": "force-https" },
{ "name": "lebens-fluss.at", "include_subdomains": true, "mode": "force-https" },
{ "name": "legadental.com", "include_subdomains": true, "mode": "force-https" },
@@ -22173,7 +22159,6 @@
{ "name": "mjhsc.nl", "include_subdomains": true, "mode": "force-https" },
{ "name": "millanova.wedding", "include_subdomains": true, "mode": "force-https" },
{ "name": "mbardot.com", "include_subdomains": true, "mode": "force-https" },
- { "name": "moeyi.xyz", "include_subdomains": true, "mode": "force-https" },
{ "name": "michael-steinhauer.eu", "include_subdomains": true, "mode": "force-https" },
{ "name": "michaelsulzer.eu", "include_subdomains": true, "mode": "force-https" },
{ "name": "mht-travel.com", "include_subdomains": true, "mode": "force-https" },
@@ -22280,7 +22265,6 @@
{ "name": "nalepte.cz", "include_subdomains": true, "mode": "force-https" },
{ "name": "newbieboss.com", "include_subdomains": true, "mode": "force-https" },
{ "name": "neko-nyan.org", "include_subdomains": true, "mode": "force-https" },
- { "name": "newbietech.cn", "include_subdomains": true, "mode": "force-https" },
{ "name": "nautsch.de", "include_subdomains": true, "mode": "force-https" },
{ "name": "nadejeproninu.cz", "include_subdomains": true, "mode": "force-https" },
{ "name": "mariannenan.nl", "include_subdomains": true, "mode": "force-https" },
@@ -23186,7 +23170,6 @@
{ "name": "valoremtax.ch", "include_subdomains": true, "mode": "force-https" },
{ "name": "winbuzzer.com", "include_subdomains": true, "mode": "force-https" },
{ "name": "viafinance.cz", "include_subdomains": true, "mode": "force-https" },
- { "name": "warflame.net", "include_subdomains": true, "mode": "force-https" },
{ "name": "windholz.us", "include_subdomains": true, "mode": "force-https" },
{ "name": "windwoodmedia.com", "include_subdomains": true, "mode": "force-https" },
{ "name": "windwoodweb.com", "include_subdomains": true, "mode": "force-https" },
@@ -23352,7 +23335,6 @@
{ "name": "3dproteinimaging.com", "include_subdomains": true, "mode": "force-https" },
{ "name": "762.ch", "include_subdomains": true, "mode": "force-https" },
{ "name": "9651678.ru", "include_subdomains": true, "mode": "force-https" },
- { "name": "a.ai", "include_subdomains": true, "mode": "force-https" },
{ "name": "a3workshop.swiss", "include_subdomains": true, "mode": "force-https" },
{ "name": "abdullah.pw", "include_subdomains": true, "mode": "force-https" },
{ "name": "abhisharma.me", "include_subdomains": true, "mode": "force-https" },
@@ -23825,7 +23807,6 @@
{ "name": "isthnew.com", "include_subdomains": true, "mode": "force-https" },
{ "name": "it-cave.com", "include_subdomains": true, "mode": "force-https" },
{ "name": "jacobi-server.de", "include_subdomains": true, "mode": "force-https" },
- { "name": "jadefalcons.de", "include_subdomains": true, "mode": "force-https" },
{ "name": "jahanaisamu.com", "include_subdomains": true, "mode": "force-https" },
{ "name": "jamberrynails.co.uk", "include_subdomains": true, "mode": "force-https" },
{ "name": "jan-bucher.ch", "include_subdomains": true, "mode": "force-https" },
@@ -24431,7 +24412,6 @@
{ "name": "xenoworld.de", "include_subdomains": true, "mode": "force-https" },
{ "name": "xeonlab.com", "include_subdomains": true, "mode": "force-https" },
{ "name": "xeonlab.de", "include_subdomains": true, "mode": "force-https" },
- { "name": "xn--0kqx72g4gftob.com", "include_subdomains": true, "mode": "force-https" },
{ "name": "xn--cck7f515h.com", "include_subdomains": true, "mode": "force-https" },
{ "name": "xn--cctsgy36bnvprwpekc.com", "include_subdomains": true, "mode": "force-https" },
{ "name": "xn--jbs-tna.de", "include_subdomains": true, "mode": "force-https" },
@@ -25564,7 +25544,6 @@
{ "name": "eintragsservice24.de", "include_subdomains": true, "mode": "force-https" },
{ "name": "eisaev.ru", "include_subdomains": true, "mode": "force-https" },
{ "name": "ejgconsultancy.co.uk", "include_subdomains": true, "mode": "force-https" },
- { "name": "ejone.co", "include_subdomains": true, "mode": "force-https" },
{ "name": "ekonbenefits.com", "include_subdomains": true, "mode": "force-https" },
{ "name": "eldritchfiction.net", "include_subdomains": true, "mode": "force-https" },
{ "name": "elektro-adam.de", "include_subdomains": true, "mode": "force-https" },
@@ -25821,7 +25800,6 @@
{ "name": "fulilingyu.info", "include_subdomains": true, "mode": "force-https" },
{ "name": "fuliwang.info", "include_subdomains": true, "mode": "force-https" },
{ "name": "fullmatch.net", "include_subdomains": true, "mode": "force-https" },
- { "name": "funandnatural.shop", "include_subdomains": true, "mode": "force-https" },
{ "name": "funfunmstdn.tokyo", "include_subdomains": true, "mode": "force-https" },
{ "name": "fungame.eu", "include_subdomains": true, "mode": "force-https" },
{ "name": "funspins.com", "include_subdomains": true, "mode": "force-https" },
@@ -25906,7 +25884,6 @@
{ "name": "glasslikes.com", "include_subdomains": true, "mode": "force-https" },
{ "name": "glenhuntlyapartments.com.au", "include_subdomains": true, "mode": "force-https" },
{ "name": "globalbridge-japan.com", "include_subdomains": true, "mode": "force-https" },
- { "name": "globalchat.pk", "include_subdomains": true, "mode": "force-https" },
{ "name": "globalchokepoints.org", "include_subdomains": true, "mode": "force-https" },
{ "name": "globaltennis.ca", "include_subdomains": true, "mode": "force-https" },
{ "name": "globalvisions-events.com", "include_subdomains": true, "mode": "force-https" },
@@ -26003,10 +25980,8 @@
{ "name": "handgelenkbandage-test.de", "include_subdomains": true, "mode": "force-https" },
{ "name": "handsandall.com", "include_subdomains": true, "mode": "force-https" },
{ "name": "handymanlondonplease.co.uk", "include_subdomains": true, "mode": "force-https" },
- { "name": "hanglage.de", "include_subdomains": true, "mode": "force-https" },
{ "name": "hangtenseo.com", "include_subdomains": true, "mode": "force-https" },
{ "name": "hanksservice.com", "include_subdomains": true, "mode": "force-https" },
- { "name": "hanover.edu", "include_subdomains": true, "mode": "force-https" },
{ "name": "happycarb.de", "include_subdomains": true, "mode": "force-https" },
{ "name": "happydoq.ch", "include_subdomains": true, "mode": "force-https" },
{ "name": "hapsfordmill.co.uk", "include_subdomains": true, "mode": "force-https" },
@@ -26117,7 +26092,6 @@
{ "name": "htsure.ma", "include_subdomains": true, "mode": "force-https" },
{ "name": "httpsecured.net", "include_subdomains": true, "mode": "force-https" },
{ "name": "huangguancq.com", "include_subdomains": true, "mode": "force-https" },
- { "name": "hub-reisen.de", "include_subdomains": true, "mode": "force-https" },
{ "name": "huduser.gov", "include_subdomains": true, "mode": "force-https" },
{ "name": "hulsoft.co.uk", "include_subdomains": true, "mode": "force-https" },
{ "name": "human-clone.com", "include_subdomains": true, "mode": "force-https" },
@@ -26141,7 +26115,6 @@
{ "name": "hyperreal.biz", "include_subdomains": true, "mode": "force-https" },
{ "name": "hypersomnia.com", "include_subdomains": true, "mode": "force-https" },
{ "name": "hyperthymia.com", "include_subdomains": true, "mode": "force-https" },
- { "name": "hypnosegosert.ch", "include_subdomains": true, "mode": "force-https" },
{ "name": "hysg.me", "include_subdomains": true, "mode": "force-https" },
{ "name": "iadttaveras.com", "include_subdomains": true, "mode": "force-https" },
{ "name": "ialis.me", "include_subdomains": true, "mode": "force-https" },
@@ -26318,7 +26291,6 @@
{ "name": "jgwb.de", "include_subdomains": true, "mode": "force-https" },
{ "name": "jgwb.eu", "include_subdomains": true, "mode": "force-https" },
{ "name": "jhollandtranslations.com", "include_subdomains": true, "mode": "force-https" },
- { "name": "jikegu.com", "include_subdomains": true, "mode": "force-https" },
{ "name": "jinshavip.com", "include_subdomains": true, "mode": "force-https" },
{ "name": "jiogo.com", "include_subdomains": true, "mode": "force-https" },
{ "name": "jiyue.com", "include_subdomains": true, "mode": "force-https" },
@@ -26417,7 +26389,6 @@
{ "name": "kiekko.pro", "include_subdomains": true, "mode": "force-https" },
{ "name": "kiel-kind.de", "include_subdomains": true, "mode": "force-https" },
{ "name": "kikbb.com", "include_subdomains": true, "mode": "force-https" },
- { "name": "kikura.de", "include_subdomains": true, "mode": "force-https" },
{ "name": "kineto.space", "include_subdomains": true, "mode": "force-https" },
{ "name": "kingclass.cn", "include_subdomains": true, "mode": "force-https" },
{ "name": "kingdomcrc.org", "include_subdomains": true, "mode": "force-https" },
@@ -26448,7 +26419,6 @@
{ "name": "kooponline.eu", "include_subdomains": true, "mode": "force-https" },
{ "name": "kori.ml", "include_subdomains": true, "mode": "force-https" },
{ "name": "korono.de", "include_subdomains": true, "mode": "force-https" },
- { "name": "kosmetik-grothe.de", "include_subdomains": true, "mode": "force-https" },
{ "name": "kotomei.moe", "include_subdomains": true, "mode": "force-https" },
{ "name": "kovaldo.ru", "include_subdomains": true, "mode": "force-https" },
{ "name": "kovals.sk", "include_subdomains": true, "mode": "force-https" },
@@ -26742,7 +26712,6 @@
{ "name": "meat.org.uk", "include_subdomains": true, "mode": "force-https" },
{ "name": "meathealth.com", "include_subdomains": true, "mode": "force-https" },
{ "name": "mecanicadom.com", "include_subdomains": true, "mode": "force-https" },
- { "name": "medicalwikis.cz", "include_subdomains": true, "mode": "force-https" },
{ "name": "mediweed.tk", "include_subdomains": true, "mode": "force-https" },
{ "name": "meeko.cc", "include_subdomains": true, "mode": "force-https" },
{ "name": "meinstartinsleben.com", "include_subdomains": true, "mode": "force-https" },
@@ -26908,7 +26877,6 @@
{ "name": "mygeotrip.com", "include_subdomains": true, "mode": "force-https" },
{ "name": "mygreatjob.eu", "include_subdomains": true, "mode": "force-https" },
{ "name": "mygymer.ch", "include_subdomains": true, "mode": "force-https" },
- { "name": "mylittlemoppet.com", "include_subdomains": true, "mode": "force-https" },
{ "name": "mylocalsearch.co.uk", "include_subdomains": true, "mode": "force-https" },
{ "name": "mymed.de", "include_subdomains": true, "mode": "force-https" },
{ "name": "mymed.eu", "include_subdomains": true, "mode": "force-https" },
@@ -27199,7 +27167,6 @@
{ "name": "perspektivwechsel-coaching.de", "include_subdomains": true, "mode": "force-https" },
{ "name": "petangen.se", "include_subdomains": true, "mode": "force-https" },
{ "name": "petcarvers.com", "include_subdomains": true, "mode": "force-https" },
- { "name": "petrkajzar.cz", "include_subdomains": true, "mode": "force-https" },
{ "name": "peuf.shop", "include_subdomains": true, "mode": "force-https" },
{ "name": "peyote.org", "include_subdomains": true, "mode": "force-https" },
{ "name": "pferdeeinstreu-kaufen.com", "include_subdomains": true, "mode": "force-https" },
@@ -27283,7 +27250,6 @@
{ "name": "portalcentric.net", "include_subdomains": true, "mode": "force-https" },
{ "name": "portalisapres.cl", "include_subdomains": true, "mode": "force-https" },
{ "name": "portugalsko.net", "include_subdomains": true, "mode": "force-https" },
- { "name": "porzgmbh.de", "include_subdomains": true, "mode": "force-https" },
{ "name": "positionus.io", "include_subdomains": true, "mode": "force-https" },
{ "name": "positive.com.cy", "include_subdomains": true, "mode": "force-https" },
{ "name": "post-darwinian.com", "include_subdomains": true, "mode": "force-https" },
@@ -27897,7 +27863,6 @@
{ "name": "system.cf", "include_subdomains": true, "mode": "force-https" },
{ "name": "system12.pl", "include_subdomains": true, "mode": "force-https" },
{ "name": "systemd.ch", "include_subdomains": true, "mode": "force-https" },
- { "name": "sytpartners.com", "include_subdomains": true, "mode": "force-https" },
{ "name": "szyndler.ch", "include_subdomains": true, "mode": "force-https" },
{ "name": "tac-volley.com", "include_subdomains": true, "mode": "force-https" },
{ "name": "tacoma-games.com", "include_subdomains": true, "mode": "force-https" },
@@ -27951,7 +27916,6 @@
{ "name": "telly.site", "include_subdomains": true, "mode": "force-https" },
{ "name": "tenable.com.au", "include_subdomains": true, "mode": "force-https" },
{ "name": "tengu.cloud", "include_subdomains": true, "mode": "force-https" },
- { "name": "tenmm.com", "include_subdomains": true, "mode": "force-https" },
{ "name": "tenthousandcoffees.com", "include_subdomains": true, "mode": "force-https" },
{ "name": "teranacreative.com", "include_subdomains": true, "mode": "force-https" },
{ "name": "teranga.ch", "include_subdomains": true, "mode": "force-https" },
@@ -28328,7 +28292,6 @@
{ "name": "whitehathackers.com.br", "include_subdomains": true, "mode": "force-https" },
{ "name": "whitejaguars.com", "include_subdomains": true, "mode": "force-https" },
{ "name": "whiterabbit.org", "include_subdomains": true, "mode": "force-https" },
- { "name": "whyy.eu.org", "include_subdomains": true, "mode": "force-https" },
{ "name": "wiapply.com", "include_subdomains": true, "mode": "force-https" },
{ "name": "wiebetaaltdat.nl", "include_subdomains": true, "mode": "force-https" },
{ "name": "wificafehosting.com", "include_subdomains": true, "mode": "force-https" },
@@ -28392,7 +28355,6 @@
{ "name": "x0r.be", "include_subdomains": true, "mode": "force-https" },
{ "name": "x1616.tk", "include_subdomains": true, "mode": "force-https" },
{ "name": "x23.eu", "include_subdomains": true, "mode": "force-https" },
- { "name": "x2c0.net", "include_subdomains": true, "mode": "force-https" },
{ "name": "xbc.nz", "include_subdomains": true, "mode": "force-https" },
{ "name": "xenosphere.tk", "include_subdomains": true, "mode": "force-https" },
{ "name": "xfd3.de", "include_subdomains": true, "mode": "force-https" },
@@ -28473,7 +28435,6 @@
{ "name": "zavetaji.lv", "include_subdomains": true, "mode": "force-https" },
{ "name": "zcgram.com", "include_subdomains": true, "mode": "force-https" },
{ "name": "zdorovayasimya.com", "include_subdomains": true, "mode": "force-https" },
- { "name": "zdravotnickainformatika.cz", "include_subdomains": true, "mode": "force-https" },
{ "name": "zelfmoord.ga", "include_subdomains": true, "mode": "force-https" },
{ "name": "zenghx.tk", "include_subdomains": true, "mode": "force-https" },
{ "name": "zero-x-baadf00d.com", "include_subdomains": true, "mode": "force-https" },
@@ -29303,7 +29264,6 @@
{ "name": "cydetec.com", "include_subdomains": true, "mode": "force-https" },
{ "name": "curvesandwords.com", "include_subdomains": true, "mode": "force-https" },
{ "name": "coroasdefloresonline.com.br", "include_subdomains": true, "mode": "force-https" },
- { "name": "creditstar.es", "include_subdomains": true, "mode": "force-https" },
{ "name": "crox.co", "include_subdomains": true, "mode": "force-https" },
{ "name": "cqn.ch", "include_subdomains": true, "mode": "force-https" },
{ "name": "cryptofan.org", "include_subdomains": true, "mode": "force-https" },
@@ -31909,7 +31869,6 @@
{ "name": "swisscannabis.club", "include_subdomains": true, "mode": "force-https" },
{ "name": "thebakingclass.com", "include_subdomains": true, "mode": "force-https" },
{ "name": "sweetair.com", "include_subdomains": true, "mode": "force-https" },
- { "name": "thaimooc.org", "include_subdomains": true, "mode": "force-https" },
{ "name": "tekstschrijvers.net", "include_subdomains": true, "mode": "force-https" },
{ "name": "thekrewserver.com", "include_subdomains": true, "mode": "force-https" },
{ "name": "theosophie-afrique.org", "include_subdomains": true, "mode": "force-https" },
@@ -32496,7 +32455,6 @@
{ "name": "10ppm.com", "include_subdomains": true, "mode": "force-https" },
{ "name": "8887999.com", "include_subdomains": true, "mode": "force-https" },
{ "name": "233abc.com", "include_subdomains": true, "mode": "force-https" },
- { "name": "acasundayschool.com", "include_subdomains": true, "mode": "force-https" },
{ "name": "aaomidi.com", "include_subdomains": true, "mode": "force-https" },
{ "name": "acat.io", "include_subdomains": true, "mode": "force-https" },
{ "name": "420java.com", "include_subdomains": true, "mode": "force-https" },
@@ -33290,7 +33248,6 @@
{ "name": "hamking.tk", "include_subdomains": true, "mode": "force-https" },
{ "name": "flyspace.ml", "include_subdomains": true, "mode": "force-https" },
{ "name": "grupomakben.com", "include_subdomains": true, "mode": "force-https" },
- { "name": "harlan.cc", "include_subdomains": true, "mode": "force-https" },
{ "name": "gruenderlehrstuhl.de", "include_subdomains": true, "mode": "force-https" },
{ "name": "gzom.ru", "include_subdomains": true, "mode": "force-https" },
{ "name": "health-match.com.au", "include_subdomains": true, "mode": "force-https" },
@@ -33495,7 +33452,6 @@
{ "name": "kakoo.nl", "include_subdomains": true, "mode": "force-https" },
{ "name": "kd.net.nz", "include_subdomains": true, "mode": "force-https" },
{ "name": "kakoomedia.nl", "include_subdomains": true, "mode": "force-https" },
- { "name": "konjin.cn", "include_subdomains": true, "mode": "force-https" },
{ "name": "jpdeharenne.be", "include_subdomains": true, "mode": "force-https" },
{ "name": "judc-ge.ch", "include_subdomains": true, "mode": "force-https" },
{ "name": "ivystech.com", "include_subdomains": true, "mode": "force-https" },
@@ -33551,7 +33507,6 @@
{ "name": "letsgowhilewereyoung.com", "include_subdomains": true, "mode": "force-https" },
{ "name": "konicaprinterdriver.com", "include_subdomains": true, "mode": "force-https" },
{ "name": "k3nny.fr", "include_subdomains": true, "mode": "force-https" },
- { "name": "ldvsoft.net", "include_subdomains": true, "mode": "force-https" },
{ "name": "lanre.org", "include_subdomains": true, "mode": "force-https" },
{ "name": "lifemstyle.com", "include_subdomains": true, "mode": "force-https" },
{ "name": "kts-thueringen.de", "include_subdomains": true, "mode": "force-https" },
@@ -33669,7 +33624,6 @@
{ "name": "manova.cz", "include_subdomains": true, "mode": "force-https" },
{ "name": "luzeshomologadas.com.br", "include_subdomains": true, "mode": "force-https" },
{ "name": "marianwehlus.de", "include_subdomains": true, "mode": "force-https" },
- { "name": "martensen.me", "include_subdomains": true, "mode": "force-https" },
{ "name": "matcha-iga.jp", "include_subdomains": true, "mode": "force-https" },
{ "name": "mayavi.co.in", "include_subdomains": true, "mode": "force-https" },
{ "name": "lunasqu.ee", "include_subdomains": true, "mode": "force-https" },
@@ -33792,7 +33746,6 @@
{ "name": "nba.download", "include_subdomains": true, "mode": "force-https" },
{ "name": "montanana.com", "include_subdomains": true, "mode": "force-https" },
{ "name": "myfunworld.de", "include_subdomains": true, "mode": "force-https" },
- { "name": "muthai.in.th", "include_subdomains": true, "mode": "force-https" },
{ "name": "nba.gs", "include_subdomains": true, "mode": "force-https" },
{ "name": "muzgra.in", "include_subdomains": true, "mode": "force-https" },
{ "name": "mehhh.xyz", "include_subdomains": true, "mode": "force-https" },
@@ -34657,7 +34610,6 @@
{ "name": "wikibulz.com", "include_subdomains": true, "mode": "force-https" },
{ "name": "windowwellcovers.com", "include_subdomains": true, "mode": "force-https" },
{ "name": "torontocorporatelimo.services", "include_subdomains": true, "mode": "force-https" },
- { "name": "xfack.com", "include_subdomains": true, "mode": "force-https" },
{ "name": "xlfblog.com", "include_subdomains": true, "mode": "force-https" },
{ "name": "xlan.be", "include_subdomains": true, "mode": "force-https" },
{ "name": "xiangblog.com", "include_subdomains": true, "mode": "force-https" },
@@ -35009,6 +34961,3018 @@
{ "name": "rdns.cc", "include_subdomains": true, "mode": "force-https" },
{ "name": "veslosada.com", "include_subdomains": true, "mode": "force-https" },
{ "name": "www-8522.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "10og.de", "include_subdomains": true, "mode": "force-https" },
+ { "name": "2333.press", "include_subdomains": true, "mode": "force-https" },
+ { "name": "3fl.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "4baby.com.br", "include_subdomains": true, "mode": "force-https" },
+ { "name": "4xlabs.co", "include_subdomains": true, "mode": "force-https" },
+ { "name": "8522club.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "88laohu.cc", "include_subdomains": true, "mode": "force-https" },
+ { "name": "abona24.pl", "include_subdomains": true, "mode": "force-https" },
+ { "name": "accbay.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "accommodation-berry.com.au", "include_subdomains": true, "mode": "force-https" },
+ { "name": "actionsack.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "agrarking.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "agrarshop4u.de", "include_subdomains": true, "mode": "force-https" },
+ { "name": "aldien.com.br", "include_subdomains": true, "mode": "force-https" },
+ { "name": "aliantsoft.pl", "include_subdomains": true, "mode": "force-https" },
+ { "name": "allpointsblog.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "alternador.com.br", "include_subdomains": true, "mode": "force-https" },
+ { "name": "americandistribuidora.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "anchovy.nz", "include_subdomains": true, "mode": "force-https" },
+ { "name": "anime1.top", "include_subdomains": true, "mode": "force-https" },
+ { "name": "antenasmundosat.com.br", "include_subdomains": true, "mode": "force-https" },
+ { "name": "apcemporium.co.uk", "include_subdomains": true, "mode": "force-https" },
+ { "name": "apk.li", "include_subdomains": true, "mode": "force-https" },
+ { "name": "apn-dz.org", "include_subdomains": true, "mode": "force-https" },
+ { "name": "aquarium-supplement.net", "include_subdomains": true, "mode": "force-https" },
+ { "name": "arcenergy.co.uk", "include_subdomains": true, "mode": "force-https" },
+ { "name": "arcobalabs.ca", "include_subdomains": true, "mode": "force-https" },
+ { "name": "arian.io", "include_subdomains": true, "mode": "force-https" },
+ { "name": "artsinthevalley.net.au", "include_subdomains": true, "mode": "force-https" },
+ { "name": "atlantahairsurgeon.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "atwonline.org", "include_subdomains": true, "mode": "force-https" },
+ { "name": "auntie-eileens.com.au", "include_subdomains": true, "mode": "force-https" },
+ { "name": "automatethis.com.au", "include_subdomains": true, "mode": "force-https" },
+ { "name": "ayor.jp", "include_subdomains": true, "mode": "force-https" },
+ { "name": "ayor.tech", "include_subdomains": true, "mode": "force-https" },
+ { "name": "banksiaparkcottages.com.au", "include_subdomains": true, "mode": "force-https" },
+ { "name": "barsashop.com.br", "include_subdomains": true, "mode": "force-https" },
+ { "name": "bati-alu.fr", "include_subdomains": true, "mode": "force-https" },
+ { "name": "bearcosports.com.br", "include_subdomains": true, "mode": "force-https" },
+ { "name": "bellavistaoutdoor.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "bemvindoaolar.com.br", "include_subdomains": true, "mode": "force-https" },
+ { "name": "big-fluglaerm-hamburg.de", "include_subdomains": true, "mode": "force-https" },
+ { "name": "bonnieradvocaten.nl", "include_subdomains": true, "mode": "force-https" },
+ { "name": "borisschapira.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "brucemartin.net", "include_subdomains": true, "mode": "force-https" },
+ { "name": "bt123.xyz", "include_subdomains": true, "mode": "force-https" },
+ { "name": "budgetlovers.nl", "include_subdomains": true, "mode": "force-https" },
+ { "name": "bypass.sh", "include_subdomains": true, "mode": "force-https" },
+ { "name": "cestasedelicias.com.br", "include_subdomains": true, "mode": "force-https" },
+ { "name": "chentianyi.cn", "include_subdomains": true, "mode": "force-https" },
+ { "name": "chillebever.nl", "include_subdomains": true, "mode": "force-https" },
+ { "name": "chocolate13tilias.com.br", "include_subdomains": true, "mode": "force-https" },
+ { "name": "churrasqueirafacil.com.br", "include_subdomains": true, "mode": "force-https" },
+ { "name": "cirurgicalucena.com.br", "include_subdomains": true, "mode": "force-https" },
+ { "name": "civilg20.org", "include_subdomains": true, "mode": "force-https" },
+ { "name": "clinicaferrusbratos.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "club-reduc.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "coderme.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "comflores.com.br", "include_subdomains": true, "mode": "force-https" },
+ { "name": "comodesinflamarlashemorroides.org", "include_subdomains": true, "mode": "force-https" },
+ { "name": "comorecuperaratumujerpdf.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "conformax.com.br", "include_subdomains": true, "mode": "force-https" },
+ { "name": "connectedcare.md", "include_subdomains": true, "mode": "force-https" },
+ { "name": "corporatecomputingsolutions.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "cosmeticosdelivery.com.br", "include_subdomains": true, "mode": "force-https" },
+ { "name": "creativeapple.ltd", "include_subdomains": true, "mode": "force-https" },
+ { "name": "d.nf", "include_subdomains": true, "mode": "force-https" },
+ { "name": "d.nr", "include_subdomains": true, "mode": "force-https" },
+ { "name": "dbq.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "deliver.moe", "include_subdomains": true, "mode": "force-https" },
+ { "name": "denisewakeman.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "deprobe.pro", "include_subdomains": true, "mode": "force-https" },
+ { "name": "dev-talk.eu", "include_subdomains": true, "mode": "force-https" },
+ { "name": "digitaljungle.net", "include_subdomains": true, "mode": "force-https" },
+ { "name": "dimeponline.com.br", "include_subdomains": true, "mode": "force-https" },
+ { "name": "din-tools.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "dingcc.org", "include_subdomains": true, "mode": "force-https" },
+ { "name": "do.gd", "include_subdomains": true, "mode": "force-https" },
+ { "name": "dracox.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "dyyn.de", "include_subdomains": true, "mode": "force-https" },
+ { "name": "e-cottage.com.br", "include_subdomains": true, "mode": "force-https" },
+ { "name": "educatoys.com.br", "include_subdomains": true, "mode": "force-https" },
+ { "name": "emporiodosperfumes.com.br", "include_subdomains": true, "mode": "force-https" },
+ { "name": "equinecoaching.ca", "include_subdomains": true, "mode": "force-https" },
+ { "name": "equipeferramentas.com.br", "include_subdomains": true, "mode": "force-https" },
+ { "name": "equityflows.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "esite.ch", "include_subdomains": true, "mode": "force-https" },
+ { "name": "esprit-cloture.fr", "include_subdomains": true, "mode": "force-https" },
+ { "name": "faciledireto.com.br", "include_subdomains": true, "mode": "force-https" },
+ { "name": "fameuxhosting.co.uk", "include_subdomains": true, "mode": "force-https" },
+ { "name": "fatdoge.cn", "include_subdomains": true, "mode": "force-https" },
+ { "name": "feld.design", "include_subdomains": true, "mode": "force-https" },
+ { "name": "fernangp.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "fhg90.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "fitseven.ru", "include_subdomains": true, "mode": "force-https" },
+ { "name": "fl0000.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "fl010.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "fl0666.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "flunschi.goip.de", "include_subdomains": true, "mode": "force-https" },
+ { "name": "flyspace.ga", "include_subdomains": true, "mode": "force-https" },
+ { "name": "forbiddenhistory.info", "include_subdomains": true, "mode": "force-https" },
+ { "name": "fr0zenbits.io", "include_subdomains": true, "mode": "force-https" },
+ { "name": "frugalfamilyhome.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "gallicrooster.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "geaskb.nl", "include_subdomains": true, "mode": "force-https" },
+ { "name": "geleia-real.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "giftmaniabrilhos.com.br", "include_subdomains": true, "mode": "force-https" },
+ { "name": "globalprojetores.com.br", "include_subdomains": true, "mode": "force-https" },
+ { "name": "great.nagoya", "include_subdomains": true, "mode": "force-https" },
+ { "name": "grouphomes.com.au", "include_subdomains": true, "mode": "force-https" },
+ { "name": "gym-old.de", "include_subdomains": true, "mode": "force-https" },
+ { "name": "halitopuroprodutos.com.br", "include_subdomains": true, "mode": "force-https" },
+ { "name": "hanys.xyz", "include_subdomains": true, "mode": "force-https" },
+ { "name": "haogoodair.ca", "include_subdomains": true, "mode": "force-https" },
+ { "name": "hashinteractive.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "heartview.com.br", "include_subdomains": true, "mode": "force-https" },
+ { "name": "helpstarloja.com.br", "include_subdomains": true, "mode": "force-https" },
+ { "name": "homesandal.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "hotcandlestick.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "howardwatts.co.uk", "include_subdomains": true, "mode": "force-https" },
+ { "name": "hulpbijmarketing.nl", "include_subdomains": true, "mode": "force-https" },
+ { "name": "huskyduvercors.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "ineed.com.mt", "include_subdomains": true, "mode": "force-https" },
+ { "name": "injust.eu.org", "include_subdomains": true, "mode": "force-https" },
+ { "name": "injust.me", "include_subdomains": true, "mode": "force-https" },
+ { "name": "insho.fashion", "include_subdomains": true, "mode": "force-https" },
+ { "name": "instafind.nl", "include_subdomains": true, "mode": "force-https" },
+ { "name": "iosnoops.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "ishamf.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "istore.lt", "include_subdomains": true, "mode": "force-https" },
+ { "name": "itrack.in.th", "include_subdomains": true, "mode": "force-https" },
+ { "name": "ivanilla.org", "include_subdomains": true, "mode": "force-https" },
+ { "name": "jamaat.hk", "include_subdomains": true, "mode": "force-https" },
+ { "name": "jerseylvi2013.org", "include_subdomains": true, "mode": "force-https" },
+ { "name": "jiaqiang.vip", "include_subdomains": true, "mode": "force-https" },
+ { "name": "jingjo.com.au", "include_subdomains": true, "mode": "force-https" },
+ { "name": "jmotion.co.uk", "include_subdomains": true, "mode": "force-https" },
+ { "name": "kakie-kolesa.ru", "include_subdomains": true, "mode": "force-https" },
+ { "name": "kangaroovalleykayaks.com.au", "include_subdomains": true, "mode": "force-https" },
+ { "name": "kangaroovalleymuseum.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "kangaroovalleyolives.com.au", "include_subdomains": true, "mode": "force-https" },
+ { "name": "kangaroovalleyshow.org.au", "include_subdomains": true, "mode": "force-https" },
+ { "name": "kangaroovalleywoodcrafts.com.au", "include_subdomains": true, "mode": "force-https" },
+ { "name": "karlsmithmn.org", "include_subdomains": true, "mode": "force-https" },
+ { "name": "kazamasion.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "kenrogers.co", "include_subdomains": true, "mode": "force-https" },
+ { "name": "kingstclinic.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "korosiprogram.hu", "include_subdomains": true, "mode": "force-https" },
+ { "name": "kousaku.jp", "include_subdomains": true, "mode": "force-https" },
+ { "name": "kvcc.com.au", "include_subdomains": true, "mode": "force-https" },
+ { "name": "kvpc.com.au", "include_subdomains": true, "mode": "force-https" },
+ { "name": "laboiteanem.fr", "include_subdomains": true, "mode": "force-https" },
+ { "name": "lakedavid.com.au", "include_subdomains": true, "mode": "force-https" },
+ { "name": "laymans911.info", "include_subdomains": true, "mode": "force-https" },
+ { "name": "leipziger-triathlon.de", "include_subdomains": true, "mode": "force-https" },
+ { "name": "lennartheinrich.de", "include_subdomains": true, "mode": "force-https" },
+ { "name": "lheinrich.de", "include_subdomains": true, "mode": "force-https" },
+ { "name": "lheinrich.org", "include_subdomains": true, "mode": "force-https" },
+ { "name": "librazy.org", "include_subdomains": true, "mode": "force-https" },
+ { "name": "lifesafety.com.br", "include_subdomains": true, "mode": "force-https" },
+ { "name": "lingerielovers.com.br", "include_subdomains": true, "mode": "force-https" },
+ { "name": "littlenina.nz", "include_subdomains": true, "mode": "force-https" },
+ { "name": "littlepigcreek.com.au", "include_subdomains": true, "mode": "force-https" },
+ { "name": "lojaterrazul.com.br", "include_subdomains": true, "mode": "force-https" },
+ { "name": "lojavalcapelli.com.br", "include_subdomains": true, "mode": "force-https" },
+ { "name": "ls-reallife.de", "include_subdomains": true, "mode": "force-https" },
+ { "name": "lukasfunk.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "macedopesca.com.br", "include_subdomains": true, "mode": "force-https" },
+ { "name": "macleodnc.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "magyarokegyhelyen.hu", "include_subdomains": true, "mode": "force-https" },
+ { "name": "manududu.com.br", "include_subdomains": true, "mode": "force-https" },
+ { "name": "marilynmartin.com.au", "include_subdomains": true, "mode": "force-https" },
+ { "name": "mathijskingma.nl", "include_subdomains": true, "mode": "force-https" },
+ { "name": "maury-moteurs.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "medeinos.lt", "include_subdomains": true, "mode": "force-https" },
+ { "name": "mediafocus.biz", "include_subdomains": true, "mode": "force-https" },
+ { "name": "memiux.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "mexicom.org", "include_subdomains": true, "mode": "force-https" },
+ { "name": "microcomploja.com.br", "include_subdomains": true, "mode": "force-https" },
+ { "name": "mika.cat", "include_subdomains": true, "mode": "force-https" },
+ { "name": "mimbeim.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "minimbah.com.au", "include_subdomains": true, "mode": "force-https" },
+ { "name": "mittagonggardencentre.com.au", "include_subdomains": true, "mode": "force-https" },
+ { "name": "modaexecutiva.com.br", "include_subdomains": true, "mode": "force-https" },
+ { "name": "moderntld.net", "include_subdomains": true, "mode": "force-https" },
+ { "name": "mona-antenna.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "movie4kto.stream", "include_subdomains": true, "mode": "force-https" },
+ { "name": "mundoarabe.com.br", "include_subdomains": true, "mode": "force-https" },
+ { "name": "mundokinderland.com.br", "include_subdomains": true, "mode": "force-https" },
+ { "name": "mwainc.org", "include_subdomains": true, "mode": "force-https" },
+ { "name": "myamend.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "mygeneral.org", "include_subdomains": true, "mode": "force-https" },
+ { "name": "mylatestnews.org", "include_subdomains": true, "mode": "force-https" },
+ { "name": "mytruecare.org", "include_subdomains": true, "mode": "force-https" },
+ { "name": "myupdatestar.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "myupdatestudio.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "myupdatesystems.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "nairobibusinessreview.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "naoar.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "neowlan.net", "include_subdomains": true, "mode": "force-https" },
+ { "name": "netlentes.com.br", "include_subdomains": true, "mode": "force-https" },
+ { "name": "netmagicas.com.br", "include_subdomains": true, "mode": "force-https" },
+ { "name": "networkposting.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "nexusbyte.de", "include_subdomains": true, "mode": "force-https" },
+ { "name": "nkb.in.th", "include_subdomains": true, "mode": "force-https" },
+ { "name": "nordnetz-hamburg.de", "include_subdomains": true, "mode": "force-https" },
+ { "name": "notadd.io", "include_subdomains": true, "mode": "force-https" },
+ { "name": "notadd.store", "include_subdomains": true, "mode": "force-https" },
+ { "name": "nutrivisa.com.br", "include_subdomains": true, "mode": "force-https" },
+ { "name": "nycoyote.org", "include_subdomains": true, "mode": "force-https" },
+ { "name": "officiants.wedding", "include_subdomains": true, "mode": "force-https" },
+ { "name": "oleodecopayba.com.br", "include_subdomains": true, "mode": "force-https" },
+ { "name": "opcaobolsas.com.br", "include_subdomains": true, "mode": "force-https" },
+ { "name": "oticasaopaulo.com.br", "include_subdomains": true, "mode": "force-https" },
+ { "name": "oxro.co", "include_subdomains": true, "mode": "force-https" },
+ { "name": "panoxadrez.com.br", "include_subdomains": true, "mode": "force-https" },
+ { "name": "paradigi.com.br", "include_subdomains": true, "mode": "force-https" },
+ { "name": "patric-lenhart.de", "include_subdomains": true, "mode": "force-https" },
+ { "name": "pepemodelismo.com.br", "include_subdomains": true, "mode": "force-https" },
+ { "name": "petofiprogram.hu", "include_subdomains": true, "mode": "force-https" },
+ { "name": "piatabrasil.com.br", "include_subdomains": true, "mode": "force-https" },
+ { "name": "pinnacles.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "piraten-bv-nord.de", "include_subdomains": true, "mode": "force-https" },
+ { "name": "pixeame.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "placasonline.com.br", "include_subdomains": true, "mode": "force-https" },
+ { "name": "pnukee.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "pomardaserra.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "pontodogame.com.br", "include_subdomains": true, "mode": "force-https" },
+ { "name": "portalkla.com.br", "include_subdomains": true, "mode": "force-https" },
+ { "name": "powerdent.net.br", "include_subdomains": true, "mode": "force-https" },
+ { "name": "prelogica.com.br", "include_subdomains": true, "mode": "force-https" },
+ { "name": "prestonandsons.com.au", "include_subdomains": true, "mode": "force-https" },
+ { "name": "productived.net", "include_subdomains": true, "mode": "force-https" },
+ { "name": "provitec.de", "include_subdomains": true, "mode": "force-https" },
+ { "name": "pwm.jp", "include_subdomains": true, "mode": "force-https" },
+ { "name": "qwe7002.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "radicalsub.com.br", "include_subdomains": true, "mode": "force-https" },
+ { "name": "randy.pw", "include_subdomains": true, "mode": "force-https" },
+ { "name": "raraflora.com.au", "include_subdomains": true, "mode": "force-https" },
+ { "name": "rbran.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "rdfz.tech", "include_subdomains": true, "mode": "force-https" },
+ { "name": "realitea.co.uk", "include_subdomains": true, "mode": "force-https" },
+ { "name": "remedioparaherpes.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "revistapequenosolhares.com.br", "include_subdomains": true, "mode": "force-https" },
+ { "name": "rial.space", "include_subdomains": true, "mode": "force-https" },
+ { "name": "rimax.vn", "include_subdomains": true, "mode": "force-https" },
+ { "name": "rivermist.com.au", "include_subdomains": true, "mode": "force-https" },
+ { "name": "robspeed.rocks", "include_subdomains": true, "mode": "force-https" },
+ { "name": "rockuse.com.br", "include_subdomains": true, "mode": "force-https" },
+ { "name": "rohanbassett.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "rpine.net", "include_subdomains": true, "mode": "force-https" },
+ { "name": "rtsr.ch", "include_subdomains": true, "mode": "force-https" },
+ { "name": "rubymartin.com.au", "include_subdomains": true, "mode": "force-https" },
+ { "name": "salishseawhalewatching.ca", "include_subdomains": true, "mode": "force-https" },
+ { "name": "samsungxoa.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "sberbank.ch", "include_subdomains": true, "mode": "force-https" },
+ { "name": "schatmeester.be", "include_subdomains": true, "mode": "force-https" },
+ { "name": "selbys.net.au", "include_subdomains": true, "mode": "force-https" },
+ { "name": "semiocast.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "servicevie.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "shgt.jp", "include_subdomains": true, "mode": "force-https" },
+ { "name": "shobhanayogsadan.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "shotpixonline.com.br", "include_subdomains": true, "mode": "force-https" },
+ { "name": "simonsaxon.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "sinuelovirtual.com.br", "include_subdomains": true, "mode": "force-https" },
+ { "name": "sion.moe", "include_subdomains": true, "mode": "force-https" },
+ { "name": "slpower.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "smackhappy.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "sohamroy.me", "include_subdomains": true, "mode": "force-https" },
+ { "name": "solicafe.at", "include_subdomains": true, "mode": "force-https" },
+ { "name": "soundedj.com.br", "include_subdomains": true, "mode": "force-https" },
+ { "name": "spaziobenedetti.com.br", "include_subdomains": true, "mode": "force-https" },
+ { "name": "spaziopervoi.com.br", "include_subdomains": true, "mode": "force-https" },
+ { "name": "ssenberg.nl", "include_subdomains": true, "mode": "force-https" },
+ { "name": "stainedglass.net.au", "include_subdomains": true, "mode": "force-https" },
+ { "name": "stairlin.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "stannahtrapliften.nl", "include_subdomains": true, "mode": "force-https" },
+ { "name": "steplogictalent.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "stilettomoda.com.br", "include_subdomains": true, "mode": "force-https" },
+ { "name": "stonemanbrasil.com.br", "include_subdomains": true, "mode": "force-https" },
+ { "name": "streamthemeeting.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "subwayz.de", "include_subdomains": true, "mode": "force-https" },
+ { "name": "sussexwebdesigns.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "sussexwebdesigns.info", "include_subdomains": true, "mode": "force-https" },
+ { "name": "swissid.ch", "include_subdomains": true, "mode": "force-https" },
+ { "name": "talltreeskv.com.au", "include_subdomains": true, "mode": "force-https" },
+ { "name": "tdrcartuchos.com.br", "include_subdomains": true, "mode": "force-https" },
+ { "name": "teknemodus.com.au", "include_subdomains": true, "mode": "force-https" },
+ { "name": "tempdomain.ml", "include_subdomains": true, "mode": "force-https" },
+ { "name": "test02.dk", "include_subdomains": true, "mode": "force-https" },
+ { "name": "texture.net.au", "include_subdomains": true, "mode": "force-https" },
+ { "name": "thiscode.works", "include_subdomains": true, "mode": "force-https" },
+ { "name": "thrivesummit.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "tobias.gr", "include_subdomains": true, "mode": "force-https" },
+ { "name": "tokoindo.top", "include_subdomains": true, "mode": "force-https" },
+ { "name": "topnotchendings.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "tougetu.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "trainline.com.br", "include_subdomains": true, "mode": "force-https" },
+ { "name": "trainline.com.pt", "include_subdomains": true, "mode": "force-https" },
+ { "name": "trainline.dk", "include_subdomains": true, "mode": "force-https" },
+ { "name": "trainline.nl", "include_subdomains": true, "mode": "force-https" },
+ { "name": "trainline.no", "include_subdomains": true, "mode": "force-https" },
+ { "name": "trainline.pl", "include_subdomains": true, "mode": "force-https" },
+ { "name": "trainline.se", "include_subdomains": true, "mode": "force-https" },
+ { "name": "transfersummit.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "tropicalserver.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "tsedryk.ca", "include_subdomains": true, "mode": "force-https" },
+ { "name": "tyroremotes.co.uk", "include_subdomains": true, "mode": "force-https" },
+ { "name": "tyroremotes.es", "include_subdomains": true, "mode": "force-https" },
+ { "name": "tyroremotes.eu", "include_subdomains": true, "mode": "force-https" },
+ { "name": "tyroremotes.fr", "include_subdomains": true, "mode": "force-https" },
+ { "name": "tyroremotes.nl", "include_subdomains": true, "mode": "force-https" },
+ { "name": "tyroremotes.no", "include_subdomains": true, "mode": "force-https" },
+ { "name": "ucac.nz", "include_subdomains": true, "mode": "force-https" },
+ { "name": "umsapi.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "uniformebateriasheliar.com.br", "include_subdomains": true, "mode": "force-https" },
+ { "name": "uniformehope.com.br", "include_subdomains": true, "mode": "force-https" },
+ { "name": "urlachershop.com.br", "include_subdomains": true, "mode": "force-https" },
+ { "name": "valleycode.net", "include_subdomains": true, "mode": "force-https" },
+ { "name": "vcti.cloud", "include_subdomains": true, "mode": "force-https" },
+ { "name": "viladochurrasco.com.br", "include_subdomains": true, "mode": "force-https" },
+ { "name": "visitkangaroovalley.com.au", "include_subdomains": true, "mode": "force-https" },
+ { "name": "vitra-vcare.co.uk", "include_subdomains": true, "mode": "force-https" },
+ { "name": "vividlumen.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "vwsoft.de", "include_subdomains": true, "mode": "force-https" },
+ { "name": "webbx.se", "include_subdomains": true, "mode": "force-https" },
+ { "name": "webless.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "welcome-werkstatt.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "welcome-werkstatt.de", "include_subdomains": true, "mode": "force-https" },
+ { "name": "wellcomp.com.br", "include_subdomains": true, "mode": "force-https" },
+ { "name": "wiiaam.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "wireless-emergency-stop.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "wisak.eu", "include_subdomains": true, "mode": "force-https" },
+ { "name": "wombatalla.com.au", "include_subdomains": true, "mode": "force-https" },
+ { "name": "wowaffixes.info", "include_subdomains": true, "mode": "force-https" },
+ { "name": "xehost.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "xmiui.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "xn--jywq5uqwqxhd2onsij.jp", "include_subdomains": true, "mode": "force-https" },
+ { "name": "xn--n8jtcugp92n4wc738f.net", "include_subdomains": true, "mode": "force-https" },
+ { "name": "xn--xz1a.jp", "include_subdomains": true, "mode": "force-https" },
+ { "name": "xn--yj8h0m.ws", "include_subdomains": true, "mode": "force-https" },
+ { "name": "xpjcunkuan.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "yeu.io", "include_subdomains": true, "mode": "force-https" },
+ { "name": "zecrypto.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "zhaoxixiangban.cc", "include_subdomains": true, "mode": "force-https" },
+ { "name": "zoorigin.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "00220022.net", "include_subdomains": true, "mode": "force-https" },
+ { "name": "100rembourse.be", "include_subdomains": true, "mode": "force-https" },
+ { "name": "1391kj.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "1395kj.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "1396.cc", "include_subdomains": true, "mode": "force-https" },
+ { "name": "1396.net", "include_subdomains": true, "mode": "force-https" },
+ { "name": "1er-secours.ch", "include_subdomains": true, "mode": "force-https" },
+ { "name": "247medplan.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "4mybaby.ch", "include_subdomains": true, "mode": "force-https" },
+ { "name": "69mentor.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "7delights.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "7delights.in", "include_subdomains": true, "mode": "force-https" },
+ { "name": "8tuffbeers.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "aalstmotors-usedcars.be", "include_subdomains": true, "mode": "force-https" },
+ { "name": "ac0g.dyndns.org", "include_subdomains": true, "mode": "force-https" },
+ { "name": "actu-film.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "adelightfulglow.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "admins.tech", "include_subdomains": true, "mode": "force-https" },
+ { "name": "advocate-europe.eu", "include_subdomains": true, "mode": "force-https" },
+ { "name": "aero-pioneer.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "aerotheque.fr", "include_subdomains": true, "mode": "force-https" },
+ { "name": "agencymanager.be", "include_subdomains": true, "mode": "force-https" },
+ { "name": "agrekov.ru", "include_subdomains": true, "mode": "force-https" },
+ { "name": "ajdiaz.me", "include_subdomains": true, "mode": "force-https" },
+ { "name": "akiba-server.info", "include_subdomains": true, "mode": "force-https" },
+ { "name": "alexischaussy.xyz", "include_subdomains": true, "mode": "force-https" },
+ { "name": "allmend-ru.de", "include_subdomains": true, "mode": "force-https" },
+ { "name": "alloutatl.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "amandasage.ca", "include_subdomains": true, "mode": "force-https" },
+ { "name": "ambrosius.io", "include_subdomains": true, "mode": "force-https" },
+ { "name": "amg-microwave.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "amin.one", "include_subdomains": true, "mode": "force-https" },
+ { "name": "amua.fr", "include_subdomains": true, "mode": "force-https" },
+ { "name": "andel.info", "include_subdomains": true, "mode": "force-https" },
+ { "name": "andrewpeng.net", "include_subdomains": true, "mode": "force-https" },
+ { "name": "angeloventuri.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "antirepressionbayarea.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "anyfood.fi", "include_subdomains": true, "mode": "force-https" },
+ { "name": "appartement-evolene.net", "include_subdomains": true, "mode": "force-https" },
+ { "name": "apponic.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "apps4inter.net", "include_subdomains": true, "mode": "force-https" },
+ { "name": "araro.ch", "include_subdomains": true, "mode": "force-https" },
+ { "name": "areaclienti.net", "include_subdomains": true, "mode": "force-https" },
+ { "name": "arenns.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "arislight.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "arminc.tk", "include_subdomains": true, "mode": "force-https" },
+ { "name": "artmaxi.eu", "include_subdomains": true, "mode": "force-https" },
+ { "name": "asge-handel.de", "include_subdomains": true, "mode": "force-https" },
+ { "name": "astroscopy.ch", "include_subdomains": true, "mode": "force-https" },
+ { "name": "astural.org", "include_subdomains": true, "mode": "force-https" },
+ { "name": "atelierssud.ch", "include_subdomains": true, "mode": "force-https" },
+ { "name": "atelierssud.swiss", "include_subdomains": true, "mode": "force-https" },
+ { "name": "august.black", "include_subdomains": true, "mode": "force-https" },
+ { "name": "autozane.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "avidcruiser.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "aviv.nyc", "include_subdomains": true, "mode": "force-https" },
+ { "name": "ayatk.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "b9110.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "badai.at", "include_subdomains": true, "mode": "force-https" },
+ { "name": "bahnbonus-praemienwelt.de", "include_subdomains": true, "mode": "force-https" },
+ { "name": "bandally.net", "include_subdomains": true, "mode": "force-https" },
+ { "name": "basilicaknights.org", "include_subdomains": true, "mode": "force-https" },
+ { "name": "bass-pro.ru", "include_subdomains": true, "mode": "force-https" },
+ { "name": "bat909.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "bcnet.com.hk", "include_subdomains": true, "mode": "force-https" },
+ { "name": "beehive.govt.nz", "include_subdomains": true, "mode": "force-https" },
+ { "name": "ben2.co.il", "include_subdomains": true, "mode": "force-https" },
+ { "name": "bengalurugifts.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "benjaminpiquet.fr", "include_subdomains": true, "mode": "force-https" },
+ { "name": "bergevoet-fa.nl", "include_subdomains": true, "mode": "force-https" },
+ { "name": "bernadetteanderes.ch", "include_subdomains": true, "mode": "force-https" },
+ { "name": "besthotsales.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "bet-99.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "beyondtodaymediagroup.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "bfrailwayclub.cf", "include_subdomains": true, "mode": "force-https" },
+ { "name": "bilimoe.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "bingobank.org", "include_subdomains": true, "mode": "force-https" },
+ { "name": "bitcoinkarlsruhe.de", "include_subdomains": true, "mode": "force-https" },
+ { "name": "bititrain.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "bizpare.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "bkhpilates.co.uk", "include_subdomains": true, "mode": "force-https" },
+ { "name": "blenneros.net", "include_subdomains": true, "mode": "force-https" },
+ { "name": "blogpentrusuflet.ro", "include_subdomains": true, "mode": "force-https" },
+ { "name": "bluemeda.web.id", "include_subdomains": true, "mode": "force-https" },
+ { "name": "bobstronomie.fr", "include_subdomains": true, "mode": "force-https" },
+ { "name": "bodymusclejournal.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "bonamihome.ro", "include_subdomains": true, "mode": "force-https" },
+ { "name": "bonesserver.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "booox.biz", "include_subdomains": true, "mode": "force-https" },
+ { "name": "booox.net", "include_subdomains": true, "mode": "force-https" },
+ { "name": "booox.org", "include_subdomains": true, "mode": "force-https" },
+ { "name": "booter.pw", "include_subdomains": true, "mode": "force-https" },
+ { "name": "botlab.ch", "include_subdomains": true, "mode": "force-https" },
+ { "name": "bouchonville-knifemaker.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "bourqu.in", "include_subdomains": true, "mode": "force-https" },
+ { "name": "bowlsheet.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "boz.nl", "include_subdomains": true, "mode": "force-https" },
+ { "name": "bqr.ch", "include_subdomains": true, "mode": "force-https" },
+ { "name": "brasilien.guide", "include_subdomains": true, "mode": "force-https" },
+ { "name": "breathedreamgo.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "bretcarmichael.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "bricolajeux.ch", "include_subdomains": true, "mode": "force-https" },
+ { "name": "britishsciencefestival.org", "include_subdomains": true, "mode": "force-https" },
+ { "name": "bs.sb", "include_subdomains": true, "mode": "force-https" },
+ { "name": "btku.org", "include_subdomains": true, "mode": "force-https" },
+ { "name": "businessmodeler.se", "include_subdomains": true, "mode": "force-https" },
+ { "name": "butikvip.ru", "include_subdomains": true, "mode": "force-https" },
+ { "name": "bynder.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "capitainebaggy.ch", "include_subdomains": true, "mode": "force-https" },
+ { "name": "casa-mea-inteligenta.ro", "include_subdomains": true, "mode": "force-https" },
+ { "name": "catchief.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "cdbf.ch", "include_subdomains": true, "mode": "force-https" },
+ { "name": "cenatorium.pl", "include_subdomains": true, "mode": "force-https" },
+ { "name": "centurialeonina.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "certmonitor.com.au", "include_subdomains": true, "mode": "force-https" },
+ { "name": "ceso-saco.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "charlesjay.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "chdgaming.xyz", "include_subdomains": true, "mode": "force-https" },
+ { "name": "cheltik.ru", "include_subdomains": true, "mode": "force-https" },
+ { "name": "choe.fi", "include_subdomains": true, "mode": "force-https" },
+ { "name": "chrisnicholas.io", "include_subdomains": true, "mode": "force-https" },
+ { "name": "chrisvicmall.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "ciansc.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "cielly.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "cifop-numerique.fr", "include_subdomains": true, "mode": "force-https" },
+ { "name": "clairegold.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "clauseriksen.net", "include_subdomains": true, "mode": "force-https" },
+ { "name": "clayandcottonkirkwood.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "codejunkie.de", "include_subdomains": true, "mode": "force-https" },
+ { "name": "codespromo.be", "include_subdomains": true, "mode": "force-https" },
+ { "name": "compliance-management.ch", "include_subdomains": true, "mode": "force-https" },
+ { "name": "compuplast.cz", "include_subdomains": true, "mode": "force-https" },
+ { "name": "convexset.org", "include_subdomains": true, "mode": "force-https" },
+ { "name": "coonelnel.net", "include_subdomains": true, "mode": "force-https" },
+ { "name": "counselling.network", "include_subdomains": true, "mode": "force-https" },
+ { "name": "creativelaw.eu", "include_subdomains": true, "mode": "force-https" },
+ { "name": "crosspeakoms.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "crowdcloud.be", "include_subdomains": true, "mode": "force-https" },
+ { "name": "curamail.co.uk", "include_subdomains": true, "mode": "force-https" },
+ { "name": "cyph.io", "include_subdomains": true, "mode": "force-https" },
+ { "name": "dailybunda.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "dam74.com.ar", "include_subdomains": true, "mode": "force-https" },
+ { "name": "danyabanya.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "darlastudio66.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "dasgeestig.nl", "include_subdomains": true, "mode": "force-https" },
+ { "name": "datakick.org", "include_subdomains": true, "mode": "force-https" },
+ { "name": "datascience.ch", "include_subdomains": true, "mode": "force-https" },
+ { "name": "datenschutzgrundverordnung.de", "include_subdomains": true, "mode": "force-https" },
+ { "name": "datingticino.ch", "include_subdomains": true, "mode": "force-https" },
+ { "name": "ddel.de", "include_subdomains": true, "mode": "force-https" },
+ { "name": "de-mail.info", "include_subdomains": true, "mode": "force-https" },
+ { "name": "deeparamaraj.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "denis-martinez.photos", "include_subdomains": true, "mode": "force-https" },
+ { "name": "digicert-support.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "digital2web.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "dingcc.xyz", "include_subdomains": true, "mode": "force-https" },
+ { "name": "disanteimpianti.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "discoverwellness.center", "include_subdomains": true, "mode": "force-https" },
+ { "name": "dismail.de", "include_subdomains": true, "mode": "force-https" },
+ { "name": "divenwa.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "donfelino.tk", "include_subdomains": true, "mode": "force-https" },
+ { "name": "donmaldeamores.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "doriangirod.ch", "include_subdomains": true, "mode": "force-https" },
+ { "name": "dotnetsandbox.ca", "include_subdomains": true, "mode": "force-https" },
+ { "name": "doyoutax.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "doze-cloud.tech", "include_subdomains": true, "mode": "force-https" },
+ { "name": "dreamhack.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "drivewithstatetransit.com.au", "include_subdomains": true, "mode": "force-https" },
+ { "name": "dronebotworkshop.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "dureuil.info", "include_subdomains": true, "mode": "force-https" },
+ { "name": "dusmomente.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "dustyspokesbnb.ca", "include_subdomains": true, "mode": "force-https" },
+ { "name": "dwgf.xyz", "include_subdomains": true, "mode": "force-https" },
+ { "name": "easy-factures.fr", "include_subdomains": true, "mode": "force-https" },
+ { "name": "easyadsnbanners.tk", "include_subdomains": true, "mode": "force-https" },
+ { "name": "echodio.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "ecovision.com.br", "include_subdomains": true, "mode": "force-https" },
+ { "name": "ecrandouble.ch", "include_subdomains": true, "mode": "force-https" },
+ { "name": "eellak.gr", "include_subdomains": true, "mode": "force-https" },
+ { "name": "electricgatemotorgermiston.co.za", "include_subdomains": true, "mode": "force-https" },
+ { "name": "elinevanhaaften.nl", "include_subdomains": true, "mode": "force-https" },
+ { "name": "elistor6100.xyz", "include_subdomains": true, "mode": "force-https" },
+ { "name": "elixir.bzh", "include_subdomains": true, "mode": "force-https" },
+ { "name": "elvisripley.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "enamae.net", "include_subdomains": true, "mode": "force-https" },
+ { "name": "enlazaresbueno.cl", "include_subdomains": true, "mode": "force-https" },
+ { "name": "entaurus.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "eoitek.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "equinox.io", "include_subdomains": true, "mode": "force-https" },
+ { "name": "erath.fr", "include_subdomains": true, "mode": "force-https" },
+ { "name": "esb111.net", "include_subdomains": true, "mode": "force-https" },
+ { "name": "espacio-cultural.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "evelienzorgt.nl", "include_subdomains": true, "mode": "force-https" },
+ { "name": "everlong.org", "include_subdomains": true, "mode": "force-https" },
+ { "name": "evileden.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "extreme-players.de", "include_subdomains": true, "mode": "force-https" },
+ { "name": "ezakazivanje.rs", "include_subdomains": true, "mode": "force-https" },
+ { "name": "f-hd.net", "include_subdomains": true, "mode": "force-https" },
+ { "name": "f8842.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "fafatiger.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "fallofthecitadel.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "fam-stemmer.de", "include_subdomains": true, "mode": "force-https" },
+ { "name": "fameng.nl", "include_subdomains": true, "mode": "force-https" },
+ { "name": "felistirnavia.sk", "include_subdomains": true, "mode": "force-https" },
+ { "name": "fieldwork-paysage.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "firetotheprisons.org", "include_subdomains": true, "mode": "force-https" },
+ { "name": "flopy.club", "include_subdomains": true, "mode": "force-https" },
+ { "name": "flucto.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "flyboyfpv.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "flytoadventures.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "forgotten-legends.org", "include_subdomains": true, "mode": "force-https" },
+ { "name": "forum-bonn.de", "include_subdomains": true, "mode": "force-https" },
+ { "name": "foshanshequ.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "fotikpro.ru", "include_subdomains": true, "mode": "force-https" },
+ { "name": "freims.cc", "include_subdomains": true, "mode": "force-https" },
+ { "name": "frydrychit.cz", "include_subdomains": true, "mode": "force-https" },
+ { "name": "funoverip.net", "include_subdomains": true, "mode": "force-https" },
+ { "name": "fxopen.my", "include_subdomains": true, "mode": "force-https" },
+ { "name": "fzx750.ru", "include_subdomains": true, "mode": "force-https" },
+ { "name": "gaines-sodiamex.fr", "include_subdomains": true, "mode": "force-https" },
+ { "name": "gamoice.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "geekclubbooks.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "geertdegraaf.nl", "include_subdomains": true, "mode": "force-https" },
+ { "name": "gehreslaw.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "genia-life.de", "include_subdomains": true, "mode": "force-https" },
+ { "name": "gfoss.eu", "include_subdomains": true, "mode": "force-https" },
+ { "name": "gfoss.gr", "include_subdomains": true, "mode": "force-https" },
+ { "name": "ginijony.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "gisgov.be", "include_subdomains": true, "mode": "force-https" },
+ { "name": "gitep.org.uk", "include_subdomains": true, "mode": "force-https" },
+ { "name": "glavsudexpertiza.ru", "include_subdomains": true, "mode": "force-https" },
+ { "name": "globalventil.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "gosciencegirls.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "gourmetfestival.de", "include_subdomains": true, "mode": "force-https" },
+ { "name": "gozadentro.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "gpdimaranathasiantar.org", "include_subdomains": true, "mode": "force-https" },
+ { "name": "grailians.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "grandeto.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "grapee.jp", "include_subdomains": true, "mode": "force-https" },
+ { "name": "greatislandarts.ca", "include_subdomains": true, "mode": "force-https" },
+ { "name": "gregorkofler.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "grenadiercorps-kaarst.de", "include_subdomains": true, "mode": "force-https" },
+ { "name": "grenadiere-kaarst.de", "include_subdomains": true, "mode": "force-https" },
+ { "name": "grenadierkorps-kaarst.de", "include_subdomains": true, "mode": "force-https" },
+ { "name": "grenadierkorps.de", "include_subdomains": true, "mode": "force-https" },
+ { "name": "grothoff.org", "include_subdomains": true, "mode": "force-https" },
+ { "name": "guides-peche64.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "gustaff.de", "include_subdomains": true, "mode": "force-https" },
+ { "name": "gymnaserenens.ch", "include_subdomains": true, "mode": "force-https" },
+ { "name": "gyre.ch", "include_subdomains": true, "mode": "force-https" },
+ { "name": "gyrenens.ch", "include_subdomains": true, "mode": "force-https" },
+ { "name": "haloobaloo.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "harald-pfeiffer.de", "include_subdomains": true, "mode": "force-https" },
+ { "name": "haven-staging.cloud", "include_subdomains": true, "mode": "force-https" },
+ { "name": "haven.cloud", "include_subdomains": true, "mode": "force-https" },
+ { "name": "hcoe.fi", "include_subdomains": true, "mode": "force-https" },
+ { "name": "helenelefauconnier.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "helpekwendenihospital.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "hendric.us", "include_subdomains": true, "mode": "force-https" },
+ { "name": "hgfa.fi", "include_subdomains": true, "mode": "force-https" },
+ { "name": "hhgdo.de", "include_subdomains": true, "mode": "force-https" },
+ { "name": "hhidr.org", "include_subdomains": true, "mode": "force-https" },
+ { "name": "hialatv.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "hidedd.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "highlatitudestravel.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "hill.selfip.net", "include_subdomains": true, "mode": "force-https" },
+ { "name": "hippo.ge", "include_subdomains": true, "mode": "force-https" },
+ { "name": "hlacosedora.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "hoast.xyz", "include_subdomains": true, "mode": "force-https" },
+ { "name": "hoflerlawfirm.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "holistichealer.in", "include_subdomains": true, "mode": "force-https" },
+ { "name": "hollandguns.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "homeownersassociationmanagementla.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "hong.io", "include_subdomains": true, "mode": "force-https" },
+ { "name": "hontoir.eu", "include_subdomains": true, "mode": "force-https" },
+ { "name": "hoopertechnicalsolutions.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "houtinee.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "howmanymilesfrom.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "hqwebhosting.tk", "include_subdomains": true, "mode": "force-https" },
+ { "name": "htlball.at", "include_subdomains": true, "mode": "force-https" },
+ { "name": "hua-in.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "humanesources.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "huzurmetal.net", "include_subdomains": true, "mode": "force-https" },
+ { "name": "hybridiyhdistys.fi", "include_subdomains": true, "mode": "force-https" },
+ { "name": "hybridklubben.fi", "include_subdomains": true, "mode": "force-https" },
+ { "name": "ibrainmedicine.org", "include_subdomains": true, "mode": "force-https" },
+ { "name": "icmhd.ch", "include_subdomains": true, "mode": "force-https" },
+ { "name": "idatha.de", "include_subdomains": true, "mode": "force-https" },
+ { "name": "ifort.fr", "include_subdomains": true, "mode": "force-https" },
+ { "name": "ima-tourcoing.fr", "include_subdomains": true, "mode": "force-https" },
+ { "name": "imgul.net", "include_subdomains": true, "mode": "force-https" },
+ { "name": "immo-passion.net", "include_subdomains": true, "mode": "force-https" },
+ { "name": "independencerecovery.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "inexlog.fr", "include_subdomains": true, "mode": "force-https" },
+ { "name": "ingo-schlueter.de", "include_subdomains": true, "mode": "force-https" },
+ { "name": "ingoschlueter.de", "include_subdomains": true, "mode": "force-https" },
+ { "name": "inter-corporate.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "intraobes.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "ioslo.net", "include_subdomains": true, "mode": "force-https" },
+ { "name": "ip3office.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "iplantom.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "ipo-times.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "islandpumpandtank.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "ispringcloud.ru", "include_subdomains": true, "mode": "force-https" },
+ { "name": "ittop-gabon.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "ivanpolchenko.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "izumi.tv", "include_subdomains": true, "mode": "force-https" },
+ { "name": "jakewalker.xyz", "include_subdomains": true, "mode": "force-https" },
+ { "name": "james-parker.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "janada.cz", "include_subdomains": true, "mode": "force-https" },
+ { "name": "jeremy-chen.org", "include_subdomains": true, "mode": "force-https" },
+ { "name": "jevisite.ca", "include_subdomains": true, "mode": "force-https" },
+ { "name": "jinmaguoji.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "jm22.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "joespaintingpgh.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "jokerice.co.uk", "include_subdomains": true, "mode": "force-https" },
+ { "name": "jons.org", "include_subdomains": true, "mode": "force-https" },
+ { "name": "ju1ro.de", "include_subdomains": true, "mode": "force-https" },
+ { "name": "juandesouza.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "jurassicgolf.nl", "include_subdomains": true, "mode": "force-https" },
+ { "name": "juristeo.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "jvanerp.nl", "include_subdomains": true, "mode": "force-https" },
+ { "name": "jxir.de", "include_subdomains": true, "mode": "force-https" },
+ { "name": "kainetsoft.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "kangzaber.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "kanis.ag", "include_subdomains": true, "mode": "force-https" },
+ { "name": "katyusha.net", "include_subdomains": true, "mode": "force-https" },
+ { "name": "kdbx.online", "include_subdomains": true, "mode": "force-https" },
+ { "name": "kinetiq.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "kitegarage.eu", "include_subdomains": true, "mode": "force-https" },
+ { "name": "kiteschoolschellinkhout.nl", "include_subdomains": true, "mode": "force-https" },
+ { "name": "kiteschoolwijkaanzee.nl", "include_subdomains": true, "mode": "force-https" },
+ { "name": "kj1391.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "kj1396.net", "include_subdomains": true, "mode": "force-https" },
+ { "name": "kj1397.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "klustermedia.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "kneblinghausen.de", "include_subdomains": true, "mode": "force-https" },
+ { "name": "knightsweep.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "koddsson.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "komintek.ru", "include_subdomains": true, "mode": "force-https" },
+ { "name": "kotori.love", "include_subdomains": true, "mode": "force-https" },
+ { "name": "kplnet.net", "include_subdomains": true, "mode": "force-https" },
+ { "name": "kram.nz", "include_subdomains": true, "mode": "force-https" },
+ { "name": "krumberconsulting.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "kwedo.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "kxah35.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "kylerwood.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "l7world.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "la-maison.eu", "include_subdomains": true, "mode": "force-https" },
+ { "name": "lars.cloud", "include_subdomains": true, "mode": "force-https" },
+ { "name": "larsbauer.xyz", "include_subdomains": true, "mode": "force-https" },
+ { "name": "laurenlobue.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "leevealdc.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "lernplattform-akademie.de", "include_subdomains": true, "mode": "force-https" },
+ { "name": "lhconsult.tk", "include_subdomains": true, "mode": "force-https" },
+ { "name": "liautard.fr", "include_subdomains": true, "mode": "force-https" },
+ { "name": "limodo-shop.de", "include_subdomains": true, "mode": "force-https" },
+ { "name": "listen.dk", "include_subdomains": true, "mode": "force-https" },
+ { "name": "livekortti.fi", "include_subdomains": true, "mode": "force-https" },
+ { "name": "llslb.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "lockr.io", "include_subdomains": true, "mode": "force-https" },
+ { "name": "logiciel-entreprise-seurann.fr", "include_subdomains": true, "mode": "force-https" },
+ { "name": "love4taylor.me", "include_subdomains": true, "mode": "force-https" },
+ { "name": "lovemysafetynet.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "lsys.ac", "include_subdomains": true, "mode": "force-https" },
+ { "name": "luftreiniger.biz", "include_subdomains": true, "mode": "force-https" },
+ { "name": "lukasschauer.de", "include_subdomains": true, "mode": "force-https" },
+ { "name": "lunight.ml", "include_subdomains": true, "mode": "force-https" },
+ { "name": "macustar.eu", "include_subdomains": true, "mode": "force-https" },
+ { "name": "madeinchezmoi.net", "include_subdomains": true, "mode": "force-https" },
+ { "name": "madesurveying.co.uk", "include_subdomains": true, "mode": "force-https" },
+ { "name": "magnoliastrong.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "makemejob.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "marti201.ga", "include_subdomains": true, "mode": "force-https" },
+ { "name": "marykatrinaphotography.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "matomeathena.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "matthewtester.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "maxhorvath.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "mayoristassexshop.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "mazda-thermote.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "mcuexchange.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "meincoach.at", "include_subdomains": true, "mode": "force-https" },
+ { "name": "melonstudios.net", "include_subdomains": true, "mode": "force-https" },
+ { "name": "meruri.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "miaoubox.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "miboulot.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "mikevesch.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "minimaltimer.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "mir.pe", "include_subdomains": true, "mode": "force-https" },
+ { "name": "mklpedia.de", "include_subdomains": true, "mode": "force-https" },
+ { "name": "mokeedev.review", "include_subdomains": true, "mode": "force-https" },
+ { "name": "molti.hu", "include_subdomains": true, "mode": "force-https" },
+ { "name": "montas.io", "include_subdomains": true, "mode": "force-https" },
+ { "name": "morepay.cn", "include_subdomains": true, "mode": "force-https" },
+ { "name": "mosaic-design.ru", "include_subdomains": true, "mode": "force-https" },
+ { "name": "moube.fr", "include_subdomains": true, "mode": "force-https" },
+ { "name": "mrpropop.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "mubiflex.nl", "include_subdomains": true, "mode": "force-https" },
+ { "name": "multimail.work", "include_subdomains": true, "mode": "force-https" },
+ { "name": "multivpn.com.de", "include_subdomains": true, "mode": "force-https" },
+ { "name": "my-contract.ch", "include_subdomains": true, "mode": "force-https" },
+ { "name": "my-contract.info", "include_subdomains": true, "mode": "force-https" },
+ { "name": "my-contract.net", "include_subdomains": true, "mode": "force-https" },
+ { "name": "my-host.ovh", "include_subdomains": true, "mode": "force-https" },
+ { "name": "mybb.de", "include_subdomains": true, "mode": "force-https" },
+ { "name": "myday.eu.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "myhair.asia", "include_subdomains": true, "mode": "force-https" },
+ { "name": "myspa.asia", "include_subdomains": true, "mode": "force-https" },
+ { "name": "nataldigital.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "nathumarket.com.br", "include_subdomains": true, "mode": "force-https" },
+ { "name": "natives-team.ch", "include_subdomains": true, "mode": "force-https" },
+ { "name": "nawroth.info", "include_subdomains": true, "mode": "force-https" },
+ { "name": "neavision.de", "include_subdomains": true, "mode": "force-https" },
+ { "name": "nerot.eu", "include_subdomains": true, "mode": "force-https" },
+ { "name": "neuch.info", "include_subdomains": true, "mode": "force-https" },
+ { "name": "nezrouge-est-vaudois.ch", "include_subdomains": true, "mode": "force-https" },
+ { "name": "ngiemboon.net", "include_subdomains": true, "mode": "force-https" },
+ { "name": "nico.st", "include_subdomains": true, "mode": "force-https" },
+ { "name": "niess.space", "include_subdomains": true, "mode": "force-https" },
+ { "name": "nightbutterflies.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "nijikata.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "nikz.in", "include_subdomains": true, "mode": "force-https" },
+ { "name": "nkautoservice.nl", "include_subdomains": true, "mode": "force-https" },
+ { "name": "nosyu.pe.kr", "include_subdomains": true, "mode": "force-https" },
+ { "name": "nova-wd.org.uk", "include_subdomains": true, "mode": "force-https" },
+ { "name": "noyocenter.org", "include_subdomains": true, "mode": "force-https" },
+ { "name": "nrev.ch", "include_subdomains": true, "mode": "force-https" },
+ { "name": "nuamooreaindonesia.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "oakington.info", "include_subdomains": true, "mode": "force-https" },
+ { "name": "obamalibrary.gov", "include_subdomains": true, "mode": "force-https" },
+ { "name": "obrienlab.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "oc-sa.ch", "include_subdomains": true, "mode": "force-https" },
+ { "name": "octohedralpvp.tk", "include_subdomains": true, "mode": "force-https" },
+ { "name": "officium.tech", "include_subdomains": true, "mode": "force-https" },
+ { "name": "ogis.gov", "include_subdomains": true, "mode": "force-https" },
+ { "name": "ohchouette.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "ohd.dk", "include_subdomains": true, "mode": "force-https" },
+ { "name": "okanaganrailtrail.ca", "include_subdomains": true, "mode": "force-https" },
+ { "name": "olmsted.io", "include_subdomains": true, "mode": "force-https" },
+ { "name": "onebigcow.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "onix.eu.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "onlineweblearning.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "open-source.gr", "include_subdomains": true, "mode": "force-https" },
+ { "name": "opencluster.at", "include_subdomains": true, "mode": "force-https" },
+ { "name": "openwifi.gr", "include_subdomains": true, "mode": "force-https" },
+ { "name": "originalniknihy.cz", "include_subdomains": true, "mode": "force-https" },
+ { "name": "owngeek.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "padzilla.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "pagedesignhub.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "pagedesignpro.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "pagedesignshop.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "paichai.space", "include_subdomains": true, "mode": "force-https" },
+ { "name": "passionatehorsemanship.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "pastorsuico.com.br", "include_subdomains": true, "mode": "force-https" },
+ { "name": "paul-bronski.de", "include_subdomains": true, "mode": "force-https" },
+ { "name": "pawsomebox.co.uk", "include_subdomains": true, "mode": "force-https" },
+ { "name": "payssaintgilles.fr", "include_subdomains": true, "mode": "force-https" },
+ { "name": "pcipac.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "penticton.photography", "include_subdomains": true, "mode": "force-https" },
+ { "name": "peoplelikemeapp.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "performaride.com.au", "include_subdomains": true, "mode": "force-https" },
+ { "name": "periodismoactual.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "persjrp.ca", "include_subdomains": true, "mode": "force-https" },
+ { "name": "petwall.info", "include_subdomains": true, "mode": "force-https" },
+ { "name": "pgcpbc.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "philippbirkholz.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "pingworks.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "pingworks.de", "include_subdomains": true, "mode": "force-https" },
+ { "name": "pingworks.eu", "include_subdomains": true, "mode": "force-https" },
+ { "name": "pingworks.net", "include_subdomains": true, "mode": "force-https" },
+ { "name": "pixelurbia.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "pizzacook.ch", "include_subdomains": true, "mode": "force-https" },
+ { "name": "pizzeria-mehrhoog.de", "include_subdomains": true, "mode": "force-https" },
+ { "name": "planbox.info", "include_subdomains": true, "mode": "force-https" },
+ { "name": "plitu.de", "include_subdomains": true, "mode": "force-https" },
+ { "name": "pluggedhead.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "pomocniczy.eu.org", "include_subdomains": true, "mode": "force-https" },
+ { "name": "popi.se", "include_subdomains": true, "mode": "force-https" },
+ { "name": "posoiu.net", "include_subdomains": true, "mode": "force-https" },
+ { "name": "postpot.co.kr", "include_subdomains": true, "mode": "force-https" },
+ { "name": "prescriptionrex.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "primordialsnooze.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "principalstest.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "probiv.cc", "include_subdomains": true, "mode": "force-https" },
+ { "name": "prof.ch", "include_subdomains": true, "mode": "force-https" },
+ { "name": "projectx.top", "include_subdomains": true, "mode": "force-https" },
+ { "name": "projest.ch", "include_subdomains": true, "mode": "force-https" },
+ { "name": "promolover.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "proplan.co.il", "include_subdomains": true, "mode": "force-https" },
+ { "name": "provence-appartements.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "pscleaningsolutions.co.uk", "include_subdomains": true, "mode": "force-https" },
+ { "name": "purrfect-box.co.uk", "include_subdomains": true, "mode": "force-https" },
+ { "name": "pwi.agency", "include_subdomains": true, "mode": "force-https" },
+ { "name": "qhse-professionals.nl", "include_subdomains": true, "mode": "force-https" },
+ { "name": "qualite-ecole-et-formation.ch", "include_subdomains": true, "mode": "force-https" },
+ { "name": "quality-life.gr", "include_subdomains": true, "mode": "force-https" },
+ { "name": "quanterra.ch", "include_subdomains": true, "mode": "force-https" },
+ { "name": "quantor.dk", "include_subdomains": true, "mode": "force-https" },
+ { "name": "r-ay.cn", "include_subdomains": true, "mode": "force-https" },
+ { "name": "ragnaroktop.com.br", "include_subdomains": true, "mode": "force-https" },
+ { "name": "ram.nl", "include_subdomains": true, "mode": "force-https" },
+ { "name": "rambii.de", "include_subdomains": true, "mode": "force-https" },
+ { "name": "random-samplings.org", "include_subdomains": true, "mode": "force-https" },
+ { "name": "randombit.eu", "include_subdomains": true, "mode": "force-https" },
+ { "name": "recantoshop.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "recantoshop.com.br", "include_subdomains": true, "mode": "force-https" },
+ { "name": "redair.es", "include_subdomains": true, "mode": "force-https" },
+ { "name": "renascentia.asia", "include_subdomains": true, "mode": "force-https" },
+ { "name": "renaultclubticino.ch", "include_subdomains": true, "mode": "force-https" },
+ { "name": "report-incident.de", "include_subdomains": true, "mode": "force-https" },
+ { "name": "republic.gr", "include_subdomains": true, "mode": "force-https" },
+ { "name": "restoruns.xyz", "include_subdomains": true, "mode": "force-https" },
+ { "name": "rivercruiseadvisor.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "robinflikkema.nl", "include_subdomains": true, "mode": "force-https" },
+ { "name": "roeldevries.me", "include_subdomains": true, "mode": "force-https" },
+ { "name": "rootsbar.fr", "include_subdomains": true, "mode": "force-https" },
+ { "name": "rosesciences.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "roussos.cc", "include_subdomains": true, "mode": "force-https" },
+ { "name": "rove3d.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "rtc.fun", "include_subdomains": true, "mode": "force-https" },
+ { "name": "ruby-auf-schienen.de", "include_subdomains": true, "mode": "force-https" },
+ { "name": "ruigomes.me", "include_subdomains": true, "mode": "force-https" },
+ { "name": "ruitershoponline.nl", "include_subdomains": true, "mode": "force-https" },
+ { "name": "rulutv.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "ryssland.guide", "include_subdomains": true, "mode": "force-https" },
+ { "name": "s0923.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "sabatek.pl", "include_subdomains": true, "mode": "force-https" },
+ { "name": "saco-ceso.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "sallysubs.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "sandburner.net", "include_subdomains": true, "mode": "force-https" },
+ { "name": "santmark.eu", "include_subdomains": true, "mode": "force-https" },
+ { "name": "saxojoe.de", "include_subdomains": true, "mode": "force-https" },
+ { "name": "sb-tuning.ru", "include_subdomains": true, "mode": "force-https" },
+ { "name": "scriptum.gr", "include_subdomains": true, "mode": "force-https" },
+ { "name": "scswam.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "seatshare.co.uk", "include_subdomains": true, "mode": "force-https" },
+ { "name": "secutrans.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "seraph.tokyo", "include_subdomains": true, "mode": "force-https" },
+ { "name": "serrano-chris.ch", "include_subdomains": true, "mode": "force-https" },
+ { "name": "serw.org", "include_subdomains": true, "mode": "force-https" },
+ { "name": "setuid0.kr", "include_subdomains": true, "mode": "force-https" },
+ { "name": "severine-trousselard.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "sevinci.ch", "include_subdomains": true, "mode": "force-https" },
+ { "name": "sexshopsgay.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "sgthotshot.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "sheepfriends.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "shipinsight.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "shoprsc.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "shrinidhiclinic.in", "include_subdomains": true, "mode": "force-https" },
+ { "name": "silashes.ru", "include_subdomains": true, "mode": "force-https" },
+ { "name": "silentmode.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "simmis.fr", "include_subdomains": true, "mode": "force-https" },
+ { "name": "simon-mueller.de", "include_subdomains": true, "mode": "force-https" },
+ { "name": "simpbx.net", "include_subdomains": true, "mode": "force-https" },
+ { "name": "sinkip.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "sinomod.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "sistimiki-anaparastasi.gr", "include_subdomains": true, "mode": "force-https" },
+ { "name": "skol.bzh", "include_subdomains": true, "mode": "force-https" },
+ { "name": "smartlogreturns.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "smartlogstock.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "smartlogtower.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "sneakypaw.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "snelbv.nl", "include_subdomains": true, "mode": "force-https" },
+ { "name": "ss.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "stage4.ch", "include_subdomains": true, "mode": "force-https" },
+ { "name": "starlim.org", "include_subdomains": true, "mode": "force-https" },
+ { "name": "static-assets.io", "include_subdomains": true, "mode": "force-https" },
+ { "name": "stefan-schlueter.de", "include_subdomains": true, "mode": "force-https" },
+ { "name": "steyaert.be", "include_subdomains": true, "mode": "force-https" },
+ { "name": "stikkie.me", "include_subdomains": true, "mode": "force-https" },
+ { "name": "stl.news", "include_subdomains": true, "mode": "force-https" },
+ { "name": "stomadental.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "store-host.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "stoxford.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "stream-ing.xyz", "include_subdomains": true, "mode": "force-https" },
+ { "name": "stumeta.de", "include_subdomains": true, "mode": "force-https" },
+ { "name": "stumeta2018.de", "include_subdomains": true, "mode": "force-https" },
+ { "name": "stylett.ru", "include_subdomains": true, "mode": "force-https" },
+ { "name": "sunlandsg.vn", "include_subdomains": true, "mode": "force-https" },
+ { "name": "supertasker.org", "include_subdomains": true, "mode": "force-https" },
+ { "name": "surdam.casa", "include_subdomains": true, "mode": "force-https" },
+ { "name": "survivalistplanet.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "swilly.org", "include_subdomains": true, "mode": "force-https" },
+ { "name": "swvaux.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "sy24.ru", "include_subdomains": true, "mode": "force-https" },
+ { "name": "systea.fr", "include_subdomains": true, "mode": "force-https" },
+ { "name": "systea.net", "include_subdomains": true, "mode": "force-https" },
+ { "name": "tab.watch", "include_subdomains": true, "mode": "force-https" },
+ { "name": "taggedpdf.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "taim.io", "include_subdomains": true, "mode": "force-https" },
+ { "name": "tardybaker.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "tavsys.net", "include_subdomains": true, "mode": "force-https" },
+ { "name": "taxi-24std.de", "include_subdomains": true, "mode": "force-https" },
+ { "name": "tech-value.eu", "include_subdomains": true, "mode": "force-https" },
+ { "name": "techarea.fr", "include_subdomains": true, "mode": "force-https" },
+ { "name": "technicabv.nl", "include_subdomains": true, "mode": "force-https" },
+ { "name": "teskalabs.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "teva-li.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "tfx.com.br", "include_subdomains": true, "mode": "force-https" },
+ { "name": "tfx.pt", "include_subdomains": true, "mode": "force-https" },
+ { "name": "tfxstartup.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "tfxstartup.com.br", "include_subdomains": true, "mode": "force-https" },
+ { "name": "tgmkanis.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "thebasebk.org", "include_subdomains": true, "mode": "force-https" },
+ { "name": "thegym.org", "include_subdomains": true, "mode": "force-https" },
+ { "name": "thehivedesign.org", "include_subdomains": true, "mode": "force-https" },
+ { "name": "thepaulagcompany.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "thepromisemusic.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "therise.ca", "include_subdomains": true, "mode": "force-https" },
+ { "name": "thesharedbrain.ch", "include_subdomains": true, "mode": "force-https" },
+ { "name": "thesharedbrain.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "thesteins.org", "include_subdomains": true, "mode": "force-https" },
+ { "name": "thestrategyagency.com.au", "include_subdomains": true, "mode": "force-https" },
+ { "name": "thewebflash.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "thiepcuoidep.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "thijsslop.nl", "include_subdomains": true, "mode": "force-https" },
+ { "name": "thomas-fahle.de", "include_subdomains": true, "mode": "force-https" },
+ { "name": "tibipg.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "ticketslover.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "tiendafetichista.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "timesavingplugins.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "timesavingplugins.net", "include_subdomains": true, "mode": "force-https" },
+ { "name": "tivido.nl", "include_subdomains": true, "mode": "force-https" },
+ { "name": "torbe.es", "include_subdomains": true, "mode": "force-https" },
+ { "name": "trackersimulator.org", "include_subdomains": true, "mode": "force-https" },
+ { "name": "traditional-knowledge.tk", "include_subdomains": true, "mode": "force-https" },
+ { "name": "trainline.cz", "include_subdomains": true, "mode": "force-https" },
+ { "name": "trazosdearte.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "treeremovaljohannesburg.co.za", "include_subdomains": true, "mode": "force-https" },
+ { "name": "trixati.org.ua", "include_subdomains": true, "mode": "force-https" },
+ { "name": "trollingeffects.org", "include_subdomains": true, "mode": "force-https" },
+ { "name": "tschuermans.be", "include_subdomains": true, "mode": "force-https" },
+ { "name": "turismo.cl", "include_subdomains": true, "mode": "force-https" },
+ { "name": "type1joe.net", "include_subdomains": true, "mode": "force-https" },
+ { "name": "type1joe.org", "include_subdomains": true, "mode": "force-https" },
+ { "name": "typeonejoe.net", "include_subdomains": true, "mode": "force-https" },
+ { "name": "typeonejoe.org", "include_subdomains": true, "mode": "force-https" },
+ { "name": "umkmjogja.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "uni2share.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "uniteasia.org", "include_subdomains": true, "mode": "force-https" },
+ { "name": "upgamerengine.net", "include_subdomains": true, "mode": "force-https" },
+ { "name": "upsiteseo.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "urbanguerillas.de", "include_subdomains": true, "mode": "force-https" },
+ { "name": "vagrantcloud.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "vannaos.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "vannaos.net", "include_subdomains": true, "mode": "force-https" },
+ { "name": "vanvoro.us", "include_subdomains": true, "mode": "force-https" },
+ { "name": "variablyconstant.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "varimedoma.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "vbcdn.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "verbierfestival.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "vidiproject.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "vierdaagsehotel.nl", "include_subdomains": true, "mode": "force-https" },
+ { "name": "viltsu.net", "include_subdomains": true, "mode": "force-https" },
+ { "name": "vinticom.ch", "include_subdomains": true, "mode": "force-https" },
+ { "name": "virtusaero.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "visual-cockpit.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "vivirenelmundo.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "voltimax.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "voxfilmeonline.net", "include_subdomains": true, "mode": "force-https" },
+ { "name": "wahidhasan.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "waka88.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "wandercue.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "warschild.org", "include_subdomains": true, "mode": "force-https" },
+ { "name": "washingtonregisteredagent.io", "include_subdomains": true, "mode": "force-https" },
+ { "name": "watchfreeonline.co.uk", "include_subdomains": true, "mode": "force-https" },
+ { "name": "wbci.us", "include_subdomains": true, "mode": "force-https" },
+ { "name": "wbx.support", "include_subdomains": true, "mode": "force-https" },
+ { "name": "webneuch.ch", "include_subdomains": true, "mode": "force-https" },
+ { "name": "webneuch.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "webneuch.eu", "include_subdomains": true, "mode": "force-https" },
+ { "name": "webneuch.fr", "include_subdomains": true, "mode": "force-https" },
+ { "name": "webneuch.info", "include_subdomains": true, "mode": "force-https" },
+ { "name": "webneuch.swiss", "include_subdomains": true, "mode": "force-https" },
+ { "name": "weyland-yutani.org", "include_subdomains": true, "mode": "force-https" },
+ { "name": "widegab.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "wintermeyer-consulting.de", "include_subdomains": true, "mode": "force-https" },
+ { "name": "wintermeyer.de", "include_subdomains": true, "mode": "force-https" },
+ { "name": "wordpresspro.cl", "include_subdomains": true, "mode": "force-https" },
+ { "name": "workcloud.jp", "include_subdomains": true, "mode": "force-https" },
+ { "name": "wrenwrites.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "wrksheet.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "xboxonex.shop", "include_subdomains": true, "mode": "force-https" },
+ { "name": "xega.org", "include_subdomains": true, "mode": "force-https" },
+ { "name": "xn--8dry00a7se89ay98epsgxxq.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "xn--f9jh4f4b4993b66s.tokyo", "include_subdomains": true, "mode": "force-https" },
+ { "name": "xn--p8jskj.jp", "include_subdomains": true, "mode": "force-https" },
+ { "name": "y3451.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "ytreza.fr", "include_subdomains": true, "mode": "force-https" },
+ { "name": "zadarkside.ro", "include_subdomains": true, "mode": "force-https" },
+ { "name": "zero-sum.xyz", "include_subdomains": true, "mode": "force-https" },
+ { "name": "zhiku8.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "ziemlich-zackig.de", "include_subdomains": true, "mode": "force-https" },
+ { "name": "ziemlichzackig.de", "include_subdomains": true, "mode": "force-https" },
+ { "name": "zokster.net", "include_subdomains": true, "mode": "force-https" },
+ { "name": "zouk.info", "include_subdomains": true, "mode": "force-https" },
+ { "name": "zuan-in.net", "include_subdomains": true, "mode": "force-https" },
+ { "name": "zug.fr", "include_subdomains": true, "mode": "force-https" },
+ { "name": "zurgl.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "zypr.pw", "include_subdomains": true, "mode": "force-https" },
+ { "name": "zyzardx.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "0wx.cat", "include_subdomains": true, "mode": "force-https" },
+ { "name": "0wx.es", "include_subdomains": true, "mode": "force-https" },
+ { "name": "0wx.eu", "include_subdomains": true, "mode": "force-https" },
+ { "name": "0wx.org", "include_subdomains": true, "mode": "force-https" },
+ { "name": "1511774230.rsc.cdn77.org", "include_subdomains": true, "mode": "force-https" },
+ { "name": "300mbmovie24.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "330.net", "include_subdomains": true, "mode": "force-https" },
+ { "name": "518maicai.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "88laohu.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "899699.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "98laba.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "98laba.net", "include_subdomains": true, "mode": "force-https" },
+ { "name": "abvlbasketviganello.ch", "include_subdomains": true, "mode": "force-https" },
+ { "name": "academie-de-police.ch", "include_subdomains": true, "mode": "force-https" },
+ { "name": "allesisonline.nl", "include_subdomains": true, "mode": "force-https" },
+ { "name": "alphabetsigns.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "andrewdaws.io", "include_subdomains": true, "mode": "force-https" },
+ { "name": "angelic47.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "annrusnak.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "anstaskforce.gov", "include_subdomains": true, "mode": "force-https" },
+ { "name": "baconate.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "badpackets.net", "include_subdomains": true, "mode": "force-https" },
+ { "name": "bageluncle.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "baglu.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "brucemobile.de", "include_subdomains": true, "mode": "force-https" },
+ { "name": "bulletbabu.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "c-aeroconsult.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "calypsogames.net", "include_subdomains": true, "mode": "force-https" },
+ { "name": "capital-match.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "centennialradon.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "complexsystems.fail", "include_subdomains": true, "mode": "force-https" },
+ { "name": "cranforddental.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "crea.bg", "include_subdomains": true, "mode": "force-https" },
+ { "name": "cusfit.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "cyberlightapp.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "dado.fr", "include_subdomains": true, "mode": "force-https" },
+ { "name": "dado.me", "include_subdomains": true, "mode": "force-https" },
+ { "name": "dado.virtual.museum", "include_subdomains": true, "mode": "force-https" },
+ { "name": "danielschreurs.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "deflect.ca", "include_subdomains": true, "mode": "force-https" },
+ { "name": "dezshop24.de", "include_subdomains": true, "mode": "force-https" },
+ { "name": "dijks.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "disavow.tools", "include_subdomains": true, "mode": "force-https" },
+ { "name": "discreet-condooms.nl", "include_subdomains": true, "mode": "force-https" },
+ { "name": "dlde.ru", "include_subdomains": true, "mode": "force-https" },
+ { "name": "dosyauzantisi.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "downtownvernon.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "doyouedc.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "drchristinehatfield.ca", "include_subdomains": true, "mode": "force-https" },
+ { "name": "durexwinkel.nl", "include_subdomains": true, "mode": "force-https" },
+ { "name": "dwscdv3.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "eagleindustriesltd.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "edtech-hub.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "elementarywave.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "elwave.org", "include_subdomains": true, "mode": "force-https" },
+ { "name": "emeraldcoastrideshare.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "emmanuelle-et-julien.ch", "include_subdomains": true, "mode": "force-https" },
+ { "name": "englishlol.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "esolcourses.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "f1fever.co.uk", "include_subdomains": true, "mode": "force-https" },
+ { "name": "f1fever.net", "include_subdomains": true, "mode": "force-https" },
+ { "name": "f5w.de", "include_subdomains": true, "mode": "force-https" },
+ { "name": "fauvettes.be", "include_subdomains": true, "mode": "force-https" },
+ { "name": "ffkoenigsberg.de", "include_subdomains": true, "mode": "force-https" },
+ { "name": "firma-cerny.cz", "include_subdomains": true, "mode": "force-https" },
+ { "name": "floriantanner.ch", "include_subdomains": true, "mode": "force-https" },
+ { "name": "flue-ducting.co.uk", "include_subdomains": true, "mode": "force-https" },
+ { "name": "getrambling.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "goldcoasthypnotherapyhypnosis.com.au", "include_subdomains": true, "mode": "force-https" },
+ { "name": "hairtonic-lab.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "hearingshofar.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "highlevelwoodlands.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "hips.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "huangzenghao.cn", "include_subdomains": true, "mode": "force-https" },
+ { "name": "huangzenghao.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "hulldevs.net", "include_subdomains": true, "mode": "force-https" },
+ { "name": "hydrasolutions.de", "include_subdomains": true, "mode": "force-https" },
+ { "name": "hypotheekbond.nl", "include_subdomains": true, "mode": "force-https" },
+ { "name": "hzh.pub", "include_subdomains": true, "mode": "force-https" },
+ { "name": "iemb.tk", "include_subdomains": true, "mode": "force-https" },
+ { "name": "iideaz.org", "include_subdomains": true, "mode": "force-https" },
+ { "name": "investingdiary.cn", "include_subdomains": true, "mode": "force-https" },
+ { "name": "ipop.gr", "include_subdomains": true, "mode": "force-https" },
+ { "name": "isamiok.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "ivxv.ee", "include_subdomains": true, "mode": "force-https" },
+ { "name": "jayna.design", "include_subdomains": true, "mode": "force-https" },
+ { "name": "jm06.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "joeldrapper.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "jorisdalderup.nl", "include_subdomains": true, "mode": "force-https" },
+ { "name": "kancolle.me", "include_subdomains": true, "mode": "force-https" },
+ { "name": "kauplusprofesional.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "krsn.de", "include_subdomains": true, "mode": "force-https" },
+ { "name": "kuzbass-pwl.ru", "include_subdomains": true, "mode": "force-https" },
+ { "name": "landflair-magazin.de", "include_subdomains": true, "mode": "force-https" },
+ { "name": "lavitrine-une-collection.be", "include_subdomains": true, "mode": "force-https" },
+ { "name": "logostock.jp", "include_subdomains": true, "mode": "force-https" },
+ { "name": "luav.org", "include_subdomains": true, "mode": "force-https" },
+ { "name": "ma-eir.nl", "include_subdomains": true, "mode": "force-https" },
+ { "name": "mail4geek.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "malte-kiefer.de", "include_subdomains": true, "mode": "force-https" },
+ { "name": "maslife365.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "masterhelenaroma.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "matchboxdesigngroup.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "maynardnetworks.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "mongla168.net", "include_subdomains": true, "mode": "force-https" },
+ { "name": "mongla88.net", "include_subdomains": true, "mode": "force-https" },
+ { "name": "mylene-chandelier.me", "include_subdomains": true, "mode": "force-https" },
+ { "name": "mysize-condooms.nl", "include_subdomains": true, "mode": "force-https" },
+ { "name": "nabaleka.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "naturalspacesdomes.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "newbietech.cn", "include_subdomains": true, "mode": "force-https" },
+ { "name": "nextrobotics.de", "include_subdomains": true, "mode": "force-https" },
+ { "name": "novelabs.eu", "include_subdomains": true, "mode": "force-https" },
+ { "name": "o-sp.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "oliverspringer.eu", "include_subdomains": true, "mode": "force-https" },
+ { "name": "onelawsuit.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "papatest24.de", "include_subdomains": true, "mode": "force-https" },
+ { "name": "pathwaystoresilience.org", "include_subdomains": true, "mode": "force-https" },
+ { "name": "pik.bzh", "include_subdomains": true, "mode": "force-https" },
+ { "name": "politeiaudesa.org", "include_subdomains": true, "mode": "force-https" },
+ { "name": "press-presse.ca", "include_subdomains": true, "mode": "force-https" },
+ { "name": "psw-consulting.de", "include_subdomains": true, "mode": "force-https" },
+ { "name": "quizionic.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "rclsm.net", "include_subdomains": true, "mode": "force-https" },
+ { "name": "resoundpro.ca", "include_subdomains": true, "mode": "force-https" },
+ { "name": "risiinfo.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "royalcitytaxi.ca", "include_subdomains": true, "mode": "force-https" },
+ { "name": "royalcitytaxi.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "sahb.dk", "include_subdomains": true, "mode": "force-https" },
+ { "name": "samaritainsmeyrin.ch", "include_subdomains": true, "mode": "force-https" },
+ { "name": "sat7a-riyadh.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "sbanken.no", "include_subdomains": true, "mode": "force-https" },
+ { "name": "schlueter-software.de", "include_subdomains": true, "mode": "force-https" },
+ { "name": "searchbrothers.dk", "include_subdomains": true, "mode": "force-https" },
+ { "name": "searchbrothers.es", "include_subdomains": true, "mode": "force-https" },
+ { "name": "seo-lagniappe.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "seproco.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "shushu.media", "include_subdomains": true, "mode": "force-https" },
+ { "name": "spacehighway.ms", "include_subdomains": true, "mode": "force-https" },
+ { "name": "spiritualregression.com.au", "include_subdomains": true, "mode": "force-https" },
+ { "name": "squidparty.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "suelyonjones.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "telos-analytics.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "test.de", "include_subdomains": true, "mode": "force-https" },
+ { "name": "the-body-shop.hu", "include_subdomains": true, "mode": "force-https" },
+ { "name": "thesecondsposts.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "thestoryshack.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "timco.cloud", "include_subdomains": true, "mode": "force-https" },
+ { "name": "tsurezurematome.ga", "include_subdomains": true, "mode": "force-https" },
+ { "name": "type1joe.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "upgamerengine.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "vernonfilmsociety.bc.ca", "include_subdomains": true, "mode": "force-https" },
+ { "name": "vernonfishandgame.ca", "include_subdomains": true, "mode": "force-https" },
+ { "name": "vers.one", "include_subdomains": true, "mode": "force-https" },
+ { "name": "victoriaville.ca", "include_subdomains": true, "mode": "force-https" },
+ { "name": "vivremoinscher.fr", "include_subdomains": true, "mode": "force-https" },
+ { "name": "wadvisor.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "wai-in.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "web.bzh", "include_subdomains": true, "mode": "force-https" },
+ { "name": "webslake.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "whatarepatentsfor.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "yoxall.me.uk", "include_subdomains": true, "mode": "force-https" },
+ { "name": "yuna.love", "include_subdomains": true, "mode": "force-https" },
+ { "name": "zamocosmeticos.com.br", "include_subdomains": true, "mode": "force-https" },
+ { "name": "zoomek.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "06se.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "1000serien.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "11thstreetcoffee.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "123pay.ir", "include_subdomains": true, "mode": "force-https" },
+ { "name": "1590284872.rsc.cdn77.org", "include_subdomains": true, "mode": "force-https" },
+ { "name": "173vpns.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "1888zr.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "1gsoft.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "1wl.uk", "include_subdomains": true, "mode": "force-https" },
+ { "name": "2bitout.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "3dm.audio", "include_subdomains": true, "mode": "force-https" },
+ { "name": "3logic.ru", "include_subdomains": true, "mode": "force-https" },
+ { "name": "3mbo.de", "include_subdomains": true, "mode": "force-https" },
+ { "name": "3plusdesign.gr", "include_subdomains": true, "mode": "force-https" },
+ { "name": "440hz-radio.de", "include_subdomains": true, "mode": "force-https" },
+ { "name": "4share.tv", "include_subdomains": true, "mode": "force-https" },
+ { "name": "68277.me", "include_subdomains": true, "mode": "force-https" },
+ { "name": "69butterfly.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "7links.com.br", "include_subdomains": true, "mode": "force-https" },
+ { "name": "8ballbombom.uk", "include_subdomains": true, "mode": "force-https" },
+ { "name": "a1scuba.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "a1scubastore.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "abaapplianceservice.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "abcdentalcare.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "abeilles-idapi.fr", "include_subdomains": true, "mode": "force-https" },
+ { "name": "academy4.net", "include_subdomains": true, "mode": "force-https" },
+ { "name": "achtzehnterachter.de", "include_subdomains": true, "mode": "force-https" },
+ { "name": "actionlabs.net", "include_subdomains": true, "mode": "force-https" },
+ { "name": "activeclearweb.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "adamh.us", "include_subdomains": true, "mode": "force-https" },
+ { "name": "adeline.mobi", "include_subdomains": true, "mode": "force-https" },
+ { "name": "adesa-asesoria.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "adhigamindia.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "adm-sarov.ru", "include_subdomains": true, "mode": "force-https" },
+ { "name": "admin-serv.net", "include_subdomains": true, "mode": "force-https" },
+ { "name": "adriancitu.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "adriancostin.ro", "include_subdomains": true, "mode": "force-https" },
+ { "name": "adult.properties", "include_subdomains": true, "mode": "force-https" },
+ { "name": "advancedprotectionkey.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "advancedprotectionsecuritykey.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "adws.io", "include_subdomains": true, "mode": "force-https" },
+ { "name": "aehe.us", "include_subdomains": true, "mode": "force-https" },
+ { "name": "affily.io", "include_subdomains": true, "mode": "force-https" },
+ { "name": "afterhate.fr", "include_subdomains": true, "mode": "force-https" },
+ { "name": "agent-grow.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "agglo-sion.ch", "include_subdomains": true, "mode": "force-https" },
+ { "name": "agiairini.cz", "include_subdomains": true, "mode": "force-https" },
+ { "name": "agouraelectrical.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "agourahillselectrical.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "ahfazahmed.net", "include_subdomains": true, "mode": "force-https" },
+ { "name": "ahughes03.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "aijsk.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "air-craftglass.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "airductclean.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "airtimefranchise.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "ais.fashion", "include_subdomains": true, "mode": "force-https" },
+ { "name": "ajibot.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "alaboard.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "alchimic.ch", "include_subdomains": true, "mode": "force-https" },
+ { "name": "alexeykopytko.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "alexmol.tk", "include_subdomains": true, "mode": "force-https" },
+ { "name": "algoentremanos.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "alien.bz", "include_subdomains": true, "mode": "force-https" },
+ { "name": "all-markup-news.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "allegro-inc.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "allproptonline.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "allstarautokiaparts.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "allurescarves.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "almaatlantica.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "alpengreis.ch", "include_subdomains": true, "mode": "force-https" },
+ { "name": "alpertron.com.ar", "include_subdomains": true, "mode": "force-https" },
+ { "name": "alphera.nl", "include_subdomains": true, "mode": "force-https" },
+ { "name": "alternativebit.fr", "include_subdomains": true, "mode": "force-https" },
+ { "name": "alvcs.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "amorgos-aegialis.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "andrewdaws.co", "include_subdomains": true, "mode": "force-https" },
+ { "name": "andrewdaws.info", "include_subdomains": true, "mode": "force-https" },
+ { "name": "andrewdaws.me", "include_subdomains": true, "mode": "force-https" },
+ { "name": "andrewrdaws.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "andrewryno.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "andro2id.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "angel-body.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "anime1.pw", "include_subdomains": true, "mode": "force-https" },
+ { "name": "annettewindlin.ch", "include_subdomains": true, "mode": "force-https" },
+ { "name": "anoxinon.de", "include_subdomains": true, "mode": "force-https" },
+ { "name": "anthedesign.fr", "include_subdomains": true, "mode": "force-https" },
+ { "name": "antoinebetas.be", "include_subdomains": true, "mode": "force-https" },
+ { "name": "aomberg.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "appt.ch", "include_subdomains": true, "mode": "force-https" },
+ { "name": "aprefix.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "araxis.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "area3.org", "include_subdomains": true, "mode": "force-https" },
+ { "name": "arethsu.se", "include_subdomains": true, "mode": "force-https" },
+ { "name": "arganaderm.ch", "include_subdomains": true, "mode": "force-https" },
+ { "name": "ariba.info", "include_subdomains": true, "mode": "force-https" },
+ { "name": "arizonaautomobileclub.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "arjanvaartjes.net", "include_subdomains": true, "mode": "force-https" },
+ { "name": "arjunasdaughter.pub", "include_subdomains": true, "mode": "force-https" },
+ { "name": "armeni-jewellery.gr", "include_subdomains": true, "mode": "force-https" },
+ { "name": "arnoudraeven.nl", "include_subdomains": true, "mode": "force-https" },
+ { "name": "arnoudvandalen.nl", "include_subdomains": true, "mode": "force-https" },
+ { "name": "aseith.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "ashmportfolio.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "asianshops.net", "include_subdomains": true, "mode": "force-https" },
+ { "name": "asoul.tw", "include_subdomains": true, "mode": "force-https" },
+ { "name": "assempsaibiza.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "astarmathsandphysics.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "astenotarili.online", "include_subdomains": true, "mode": "force-https" },
+ { "name": "astrosnail.pt.eu.org", "include_subdomains": true, "mode": "force-https" },
+ { "name": "astutr.co", "include_subdomains": true, "mode": "force-https" },
+ { "name": "asustreiber.de", "include_subdomains": true, "mode": "force-https" },
+ { "name": "atmocdn.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "aubergegilly.ch", "include_subdomains": true, "mode": "force-https" },
+ { "name": "augrandinquisiteur.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "auroraassociationofrealtors.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "auslandsjahr-usa.de", "include_subdomains": true, "mode": "force-https" },
+ { "name": "austincardiac.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "austinheap.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "auszeit-lanzarote.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "authland.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "autoinsurancehavasu.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "automatic.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "auvious.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "ava-software.at", "include_subdomains": true, "mode": "force-https" },
+ { "name": "aventurische-allianz.de", "include_subdomains": true, "mode": "force-https" },
+ { "name": "awomaninherprime.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "axelteichmann.net", "include_subdomains": true, "mode": "force-https" },
+ { "name": "axxial.tk", "include_subdomains": true, "mode": "force-https" },
+ { "name": "az-vinyl-boden.de", "include_subdomains": true, "mode": "force-https" },
+ { "name": "b-entropy.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "b72.net", "include_subdomains": true, "mode": "force-https" },
+ { "name": "backschues.de", "include_subdomains": true, "mode": "force-https" },
+ { "name": "bairdzhang.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "balihai.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "ballroom.info", "include_subdomains": true, "mode": "force-https" },
+ { "name": "bankfreeoffers.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "banksaround.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "barbarafeldman.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "baris-sagdic.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "bariskaragoz.nl", "include_subdomains": true, "mode": "force-https" },
+ { "name": "barrera.io", "include_subdomains": true, "mode": "force-https" },
+ { "name": "barriofut.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "bartzutow.xyz", "include_subdomains": true, "mode": "force-https" },
+ { "name": "basedonline.nl", "include_subdomains": true, "mode": "force-https" },
+ { "name": "basketball-brannenburg.de", "include_subdomains": true, "mode": "force-https" },
+ { "name": "bastolino.de", "include_subdomains": true, "mode": "force-https" },
+ { "name": "batiburrillo.net", "include_subdomains": true, "mode": "force-https" },
+ { "name": "batteryservice.ru", "include_subdomains": true, "mode": "force-https" },
+ { "name": "baychimo.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "bayinstruments.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "bazaarcompass.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "bb37roma.it", "include_subdomains": true, "mode": "force-https" },
+ { "name": "bblsa.ch", "include_subdomains": true, "mode": "force-https" },
+ { "name": "bclogandtimberbuilders.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "beatrizaebischer.ch", "include_subdomains": true, "mode": "force-https" },
+ { "name": "bebes.uno", "include_subdomains": true, "mode": "force-https" },
+ { "name": "bedfordnissanparts.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "beermedlar.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "behamzdarma.cz", "include_subdomains": true, "mode": "force-https" },
+ { "name": "bentley.blog", "include_subdomains": true, "mode": "force-https" },
+ { "name": "berdaguermontes.eu", "include_subdomains": true, "mode": "force-https" },
+ { "name": "berrus.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "berrypay.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "bertsmithvwparts.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "besb66.club", "include_subdomains": true, "mode": "force-https" },
+ { "name": "besb66.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "besb66.me", "include_subdomains": true, "mode": "force-https" },
+ { "name": "besb66.ninja", "include_subdomains": true, "mode": "force-https" },
+ { "name": "besb66.rocks", "include_subdomains": true, "mode": "force-https" },
+ { "name": "besb66.us", "include_subdomains": true, "mode": "force-https" },
+ { "name": "beserberg.tk", "include_subdomains": true, "mode": "force-https" },
+ { "name": "beslider.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "bestbonuses.co.uk", "include_subdomains": true, "mode": "force-https" },
+ { "name": "betecnet.de", "include_subdomains": true, "mode": "force-https" },
+ { "name": "bewerbungsfoto-deinfoto.ch", "include_subdomains": true, "mode": "force-https" },
+ { "name": "bewertet.de", "include_subdomains": true, "mode": "force-https" },
+ { "name": "bezemkast.nl", "include_subdomains": true, "mode": "force-https" },
+ { "name": "bft-media.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "bhost.net", "include_subdomains": true, "mode": "force-https" },
+ { "name": "biaoqingfuhao.net", "include_subdomains": true, "mode": "force-https" },
+ { "name": "biaoqingfuhao.org", "include_subdomains": true, "mode": "force-https" },
+ { "name": "bidorbuy.co.ke", "include_subdomains": true, "mode": "force-https" },
+ { "name": "billyoh.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "bin95.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "binhex.net", "include_subdomains": true, "mode": "force-https" },
+ { "name": "birthmatters.us", "include_subdomains": true, "mode": "force-https" },
+ { "name": "bismarck-tb.de", "include_subdomains": true, "mode": "force-https" },
+ { "name": "bitenose.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "bjarnerest.de", "include_subdomains": true, "mode": "force-https" },
+ { "name": "blackandpony.de", "include_subdomains": true, "mode": "force-https" },
+ { "name": "blackevent.be", "include_subdomains": true, "mode": "force-https" },
+ { "name": "blacklightparty.be", "include_subdomains": true, "mode": "force-https" },
+ { "name": "blindaryproduction.tk", "include_subdomains": true, "mode": "force-https" },
+ { "name": "blizhost.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "blkbx.eu", "include_subdomains": true, "mode": "force-https" },
+ { "name": "blogging-life.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "blogom.at", "include_subdomains": true, "mode": "force-https" },
+ { "name": "bloom-avenue.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "blumen-binder.ch", "include_subdomains": true, "mode": "force-https" },
+ { "name": "bmw-motorradclub-seefeld.de", "include_subdomains": true, "mode": "force-https" },
+ { "name": "bnstree.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "booter.es", "include_subdomains": true, "mode": "force-https" },
+ { "name": "borisavstankovic.rs", "include_subdomains": true, "mode": "force-https" },
+ { "name": "borrelpartybus.nl", "include_subdomains": true, "mode": "force-https" },
+ { "name": "bosabosa.org", "include_subdomains": true, "mode": "force-https" },
+ { "name": "bounceapp.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "bozemancarpetcleaningservices.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "braunwarth.info", "include_subdomains": true, "mode": "force-https" },
+ { "name": "brck.nl", "include_subdomains": true, "mode": "force-https" },
+ { "name": "brecknell.biz", "include_subdomains": true, "mode": "force-https" },
+ { "name": "brecknell.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "brecknell.info", "include_subdomains": true, "mode": "force-https" },
+ { "name": "brecknell.name", "include_subdomains": true, "mode": "force-https" },
+ { "name": "brecknell.net", "include_subdomains": true, "mode": "force-https" },
+ { "name": "brecknell.org", "include_subdomains": true, "mode": "force-https" },
+ { "name": "briangarcia.ga", "include_subdomains": true, "mode": "force-https" },
+ { "name": "brianwesaala.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "bridgingdirectory.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "brilliantproductions.co.nz", "include_subdomains": true, "mode": "force-https" },
+ { "name": "brinkmann.one", "include_subdomains": true, "mode": "force-https" },
+ { "name": "brio-ukraine.store", "include_subdomains": true, "mode": "force-https" },
+ { "name": "brunner.ninja", "include_subdomains": true, "mode": "force-https" },
+ { "name": "bs-security.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "bs12v.ru", "include_subdomains": true, "mode": "force-https" },
+ { "name": "bsohoekvanholland.nl", "include_subdomains": true, "mode": "force-https" },
+ { "name": "btcgo.nl", "include_subdomains": true, "mode": "force-https" },
+ { "name": "btcycle.org", "include_subdomains": true, "mode": "force-https" },
+ { "name": "btth.pl", "include_subdomains": true, "mode": "force-https" },
+ { "name": "buddie5.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "budeanu.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "budgetenergievriendenvoordeel.nl", "include_subdomains": true, "mode": "force-https" },
+ { "name": "builtvisible.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "burghardt.pl", "include_subdomains": true, "mode": "force-https" },
+ { "name": "burningbird.net", "include_subdomains": true, "mode": "force-https" },
+ { "name": "bushcraftfriends.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "bustadice.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "buydesired.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "buyharpoon.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "c2design.it", "include_subdomains": true, "mode": "force-https" },
+ { "name": "c2lab.net", "include_subdomains": true, "mode": "force-https" },
+ { "name": "cabotfinancial.co.uk", "include_subdomains": true, "mode": "force-https" },
+ { "name": "calabasaselectrical.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "calotte-academy.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "camaras.uno", "include_subdomains": true, "mode": "force-https" },
+ { "name": "camarilloelectrical.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "camilomodzz.net", "include_subdomains": true, "mode": "force-https" },
+ { "name": "caoyu.info", "include_subdomains": true, "mode": "force-https" },
+ { "name": "capuchinox.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "carlili.fr", "include_subdomains": true, "mode": "force-https" },
+ { "name": "carol-lambert.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "carrando.de", "include_subdomains": true, "mode": "force-https" },
+ { "name": "carrierplatform.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "carthedral.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "casamariposaspi.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "cashlogic.ch", "include_subdomains": true, "mode": "force-https" },
+ { "name": "caspicards.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "catbull.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "catdecor.ru", "include_subdomains": true, "mode": "force-https" },
+ { "name": "catgirl.me", "include_subdomains": true, "mode": "force-https" },
+ { "name": "cavevinsdefrance.fr", "include_subdomains": true, "mode": "force-https" },
+ { "name": "ccgx.de", "include_subdomains": true, "mode": "force-https" },
+ { "name": "centralcountiesservices.org", "include_subdomains": true, "mode": "force-https" },
+ { "name": "centredaccueil.fr", "include_subdomains": true, "mode": "force-https" },
+ { "name": "certmonitor.net", "include_subdomains": true, "mode": "force-https" },
+ { "name": "cfno.org", "include_subdomains": true, "mode": "force-https" },
+ { "name": "cgsmart.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "chambion.ch", "include_subdomains": true, "mode": "force-https" },
+ { "name": "charakato.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "charlimarie.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "chatsworthelectrical.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "chaverde.org", "include_subdomains": true, "mode": "force-https" },
+ { "name": "cheapestgamecards.co.uk", "include_subdomains": true, "mode": "force-https" },
+ { "name": "cheapiesystems.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "cheesefusion.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "chellame.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "chellame.fr", "include_subdomains": true, "mode": "force-https" },
+ { "name": "chessreporter.nl", "include_subdomains": true, "mode": "force-https" },
+ { "name": "childrenandmedia.org.au", "include_subdomains": true, "mode": "force-https" },
+ { "name": "chinatrademarkoffice.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "chocolatier-tristan.ch", "include_subdomains": true, "mode": "force-https" },
+ { "name": "chowii.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "christian-liebel.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "christiancleva.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "christianfaq.org", "include_subdomains": true, "mode": "force-https" },
+ { "name": "christopher-simon.de", "include_subdomains": true, "mode": "force-https" },
+ { "name": "chupadelfrasco.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "cine.to", "include_subdomains": true, "mode": "force-https" },
+ { "name": "cinteo.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "cinto.cc", "include_subdomains": true, "mode": "force-https" },
+ { "name": "cipher.land", "include_subdomains": true, "mode": "force-https" },
+ { "name": "circlebox.rocks", "include_subdomains": true, "mode": "force-https" },
+ { "name": "cirugiasplasticas.com.mx", "include_subdomains": true, "mode": "force-https" },
+ { "name": "cisoaid.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "citton.com.br", "include_subdomains": true, "mode": "force-https" },
+ { "name": "cjessett.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "cjr.host", "include_subdomains": true, "mode": "force-https" },
+ { "name": "claretandbanter.uk", "include_subdomains": true, "mode": "force-https" },
+ { "name": "clarity-c2ced.appspot.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "cleancode.club", "include_subdomains": true, "mode": "force-https" },
+ { "name": "clinia.ca", "include_subdomains": true, "mode": "force-https" },
+ { "name": "clnnet.ch", "include_subdomains": true, "mode": "force-https" },
+ { "name": "cloudbreaker.de", "include_subdomains": true, "mode": "force-https" },
+ { "name": "cloudimproved.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "cloudimprovedtest.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "club-adulti.ro", "include_subdomains": true, "mode": "force-https" },
+ { "name": "cluj.apartments", "include_subdomains": true, "mode": "force-https" },
+ { "name": "cnrd.me", "include_subdomains": true, "mode": "force-https" },
+ { "name": "codeventure.de", "include_subdomains": true, "mode": "force-https" },
+ { "name": "coingate.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "colorblindprogramming.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "colorectalcompounding.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "comicrelief.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "comicwiki.dk", "include_subdomains": true, "mode": "force-https" },
+ { "name": "commechezvous.ch", "include_subdomains": true, "mode": "force-https" },
+ { "name": "community-cupboard.org", "include_subdomains": true, "mode": "force-https" },
+ { "name": "comopuededejardefumar.net", "include_subdomains": true, "mode": "force-https" },
+ { "name": "compostatebien.com.ar", "include_subdomains": true, "mode": "force-https" },
+ { "name": "concertengine.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "conciliumnotaire.ca", "include_subdomains": true, "mode": "force-https" },
+ { "name": "concursopublico.com.br", "include_subdomains": true, "mode": "force-https" },
+ { "name": "concursosabertos.com.br", "include_subdomains": true, "mode": "force-https" },
+ { "name": "conniesacademy.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "controle.net", "include_subdomains": true, "mode": "force-https" },
+ { "name": "contxt-agentur.de", "include_subdomains": true, "mode": "force-https" },
+ { "name": "cool110.xyz", "include_subdomains": true, "mode": "force-https" },
+ { "name": "coptkm.cz", "include_subdomains": true, "mode": "force-https" },
+ { "name": "coresos.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "corlitocaffe.de", "include_subdomains": true, "mode": "force-https" },
+ { "name": "corpulant.coffee", "include_subdomains": true, "mode": "force-https" },
+ { "name": "corpulantcoffee.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "corpulent.coffee", "include_subdomains": true, "mode": "force-https" },
+ { "name": "corpulentcoffee.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "crackcat.de", "include_subdomains": true, "mode": "force-https" },
+ { "name": "crawfordcountytcc.org", "include_subdomains": true, "mode": "force-https" },
+ { "name": "creepypastas.net", "include_subdomains": true, "mode": "force-https" },
+ { "name": "crewplanner.eu", "include_subdomains": true, "mode": "force-https" },
+ { "name": "criena.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "crisisactual.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "cross-link.ch", "include_subdomains": true, "mode": "force-https" },
+ { "name": "crypalert.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "csilies.de", "include_subdomains": true, "mode": "force-https" },
+ { "name": "cstb.ch", "include_subdomains": true, "mode": "force-https" },
+ { "name": "cuanhua3s.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "cuentasmutualamr.org.ar", "include_subdomains": true, "mode": "force-https" },
+ { "name": "customgear.com.au", "include_subdomains": true, "mode": "force-https" },
+ { "name": "cuxpool.club", "include_subdomains": true, "mode": "force-https" },
+ { "name": "cvjd.me", "include_subdomains": true, "mode": "force-https" },
+ { "name": "cyber-perikarp.eu", "include_subdomains": true, "mode": "force-https" },
+ { "name": "cyclop-editorial.fr", "include_subdomains": true, "mode": "force-https" },
+ { "name": "cypresslegacy.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "daciamodellen.nl", "include_subdomains": true, "mode": "force-https" },
+ { "name": "daevel.fr", "include_subdomains": true, "mode": "force-https" },
+ { "name": "dakotasilencer.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "danielas.boutique", "include_subdomains": true, "mode": "force-https" },
+ { "name": "darc-mak.de", "include_subdomains": true, "mode": "force-https" },
+ { "name": "dark-infection.de", "include_subdomains": true, "mode": "force-https" },
+ { "name": "darkx.me", "include_subdomains": true, "mode": "force-https" },
+ { "name": "data-detox.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "data-detox.de", "include_subdomains": true, "mode": "force-https" },
+ { "name": "data.govt.nz", "include_subdomains": true, "mode": "force-https" },
+ { "name": "davesinclair.com.au", "include_subdomains": true, "mode": "force-https" },
+ { "name": "day.vip", "include_subdomains": true, "mode": "force-https" },
+ { "name": "dbtsai.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "dealbanana.ch", "include_subdomains": true, "mode": "force-https" },
+ { "name": "deanbank.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "debrusoft.ch", "include_subdomains": true, "mode": "force-https" },
+ { "name": "debuis.nl", "include_subdomains": true, "mode": "force-https" },
+ { "name": "dechat.nl", "include_subdomains": true, "mode": "force-https" },
+ { "name": "deconsolutions.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "decorland.com.ua", "include_subdomains": true, "mode": "force-https" },
+ { "name": "deephill.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "defman.me", "include_subdomains": true, "mode": "force-https" },
+ { "name": "defont.nl", "include_subdomains": true, "mode": "force-https" },
+ { "name": "deinfoto.ch", "include_subdomains": true, "mode": "force-https" },
+ { "name": "delicioustable.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "delogo.nl", "include_subdomains": true, "mode": "force-https" },
+ { "name": "delta.ru", "include_subdomains": true, "mode": "force-https" },
+ { "name": "demijn.nl", "include_subdomains": true, "mode": "force-https" },
+ { "name": "democraticdifference.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "dennisang.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "denous.nl", "include_subdomains": true, "mode": "force-https" },
+ { "name": "dermacarecomplex.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "dersix.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "detechnologiecooperatie.nl", "include_subdomains": true, "mode": "force-https" },
+ { "name": "dethikiemtra.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "detype.nl", "include_subdomains": true, "mode": "force-https" },
+ { "name": "devcast.io", "include_subdomains": true, "mode": "force-https" },
+ { "name": "dezet-ev.de", "include_subdomains": true, "mode": "force-https" },
+ { "name": "dfixit.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "dgportals.co.uk", "include_subdomains": true, "mode": "force-https" },
+ { "name": "diagnocentro.cl", "include_subdomains": true, "mode": "force-https" },
+ { "name": "diario-egipto.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "diejanssens.net", "include_subdomains": true, "mode": "force-https" },
+ { "name": "dietagespresse.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "diggable.co", "include_subdomains": true, "mode": "force-https" },
+ { "name": "digicert.nl", "include_subdomains": true, "mode": "force-https" },
+ { "name": "digital-compounds.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "dimitrisotiropoulosbooks.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "directtwosolutions.org", "include_subdomains": true, "mode": "force-https" },
+ { "name": "direwolfsoftware.ca", "include_subdomains": true, "mode": "force-https" },
+ { "name": "dirk-scheele.de", "include_subdomains": true, "mode": "force-https" },
+ { "name": "discount24.de", "include_subdomains": true, "mode": "force-https" },
+ { "name": "discountmania.eu", "include_subdomains": true, "mode": "force-https" },
+ { "name": "discountplush.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "ditisabc.nl", "include_subdomains": true, "mode": "force-https" },
+ { "name": "divedowntown.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "djipanov.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "dnfc.rocks", "include_subdomains": true, "mode": "force-https" },
+ { "name": "dockerm.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "documaniatv.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "doesnotscale.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "domengrad.ru", "include_subdomains": true, "mode": "force-https" },
+ { "name": "domian.cz", "include_subdomains": true, "mode": "force-https" },
+ { "name": "dominik-schlueter.de", "include_subdomains": true, "mode": "force-https" },
+ { "name": "donnoval.ru", "include_subdomains": true, "mode": "force-https" },
+ { "name": "donpaginasweb.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "donzool.es", "include_subdomains": true, "mode": "force-https" },
+ { "name": "doopdidoop.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "dora.moe", "include_subdomains": true, "mode": "force-https" },
+ { "name": "dotbrick.co.th", "include_subdomains": true, "mode": "force-https" },
+ { "name": "dowc.org", "include_subdomains": true, "mode": "force-https" },
+ { "name": "dpwsweeps.co.uk", "include_subdomains": true, "mode": "force-https" },
+ { "name": "dr-schuessler.de", "include_subdomains": true, "mode": "force-https" },
+ { "name": "dragoncave.me", "include_subdomains": true, "mode": "force-https" },
+ { "name": "dragonheartsrpg.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "drchristophepanthier.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "dreamonkey.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "driver61.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "driverscollection.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "drixn.cn", "include_subdomains": true, "mode": "force-https" },
+ { "name": "drixn.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "drixn.info", "include_subdomains": true, "mode": "force-https" },
+ { "name": "drixn.net", "include_subdomains": true, "mode": "force-https" },
+ { "name": "droithxn.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "droso.dk", "include_subdomains": true, "mode": "force-https" },
+ { "name": "drubn.de", "include_subdomains": true, "mode": "force-https" },
+ { "name": "dtg-fonds.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "dtg-fonds.de", "include_subdomains": true, "mode": "force-https" },
+ { "name": "dtg-fonds.net", "include_subdomains": true, "mode": "force-https" },
+ { "name": "dtnx.net", "include_subdomains": true, "mode": "force-https" },
+ { "name": "dublin-traceroute.net", "include_subdomains": true, "mode": "force-https" },
+ { "name": "dufrei.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "dutch.desi", "include_subdomains": true, "mode": "force-https" },
+ { "name": "dvdland.com.au", "include_subdomains": true, "mode": "force-https" },
+ { "name": "dyktig.no", "include_subdomains": true, "mode": "force-https" },
+ { "name": "dzet.de", "include_subdomains": true, "mode": "force-https" },
+ { "name": "e2feed.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "e64.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "easycoding.org", "include_subdomains": true, "mode": "force-https" },
+ { "name": "eauxdespleiades.ch", "include_subdomains": true, "mode": "force-https" },
+ { "name": "ecolemathurincordier.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "edenvalerubbleremovals.co.za", "include_subdomains": true, "mode": "force-https" },
+ { "name": "edhesive.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "edstep.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "eggert.org", "include_subdomains": true, "mode": "force-https" },
+ { "name": "ejusu.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "ekobudisantoso.net", "include_subdomains": true, "mode": "force-https" },
+ { "name": "eldrid.ge", "include_subdomains": true, "mode": "force-https" },
+ { "name": "elexprimidor.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "elijahgrey.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "eliyah.co.il", "include_subdomains": true, "mode": "force-https" },
+ { "name": "elosuite.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "elsensohn.ch", "include_subdomains": true, "mode": "force-https" },
+ { "name": "elyasweb.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "emailtools.io", "include_subdomains": true, "mode": "force-https" },
+ { "name": "emma-o.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "emojiengine.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "emolafarm.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "emoticonesjaponeses.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "empireauto-2000.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "employer.guru", "include_subdomains": true, "mode": "force-https" },
+ { "name": "emresaglam.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "emultiagent.pl", "include_subdomains": true, "mode": "force-https" },
+ { "name": "endangeredwatch.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "energisammenslutningen.dk", "include_subdomains": true, "mode": "force-https" },
+ { "name": "enflow.nl", "include_subdomains": true, "mode": "force-https" },
+ { "name": "englishdirectory.de", "include_subdomains": true, "mode": "force-https" },
+ { "name": "enotecastore.it", "include_subdomains": true, "mode": "force-https" },
+ { "name": "enrollapp.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "enterprivacy.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "epave.paris", "include_subdomains": true, "mode": "force-https" },
+ { "name": "epi.one", "include_subdomains": true, "mode": "force-https" },
+ { "name": "epilis.gr", "include_subdomains": true, "mode": "force-https" },
+ { "name": "eposkent.co.uk", "include_subdomains": true, "mode": "force-https" },
+ { "name": "eposleeds.co.uk", "include_subdomains": true, "mode": "force-https" },
+ { "name": "eposwales.co.uk", "include_subdomains": true, "mode": "force-https" },
+ { "name": "epulsar.ru", "include_subdomains": true, "mode": "force-https" },
+ { "name": "ereader.uno", "include_subdomains": true, "mode": "force-https" },
+ { "name": "ericorporation.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "ers35.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "erspro.net", "include_subdomains": true, "mode": "force-https" },
+ { "name": "esball.tv", "include_subdomains": true, "mode": "force-https" },
+ { "name": "eshepperd.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "esp.community", "include_subdomains": true, "mode": "force-https" },
+ { "name": "espace-caen.fr", "include_subdomains": true, "mode": "force-https" },
+ { "name": "esslm.sk", "include_subdomains": true, "mode": "force-https" },
+ { "name": "estcequejailaflemme.fr", "include_subdomains": true, "mode": "force-https" },
+ { "name": "estespr.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "etccooperative.org", "include_subdomains": true, "mode": "force-https" },
+ { "name": "etincelle.ml", "include_subdomains": true, "mode": "force-https" },
+ { "name": "etre-vivant.fr", "include_subdomains": true, "mode": "force-https" },
+ { "name": "evailoil.ee", "include_subdomains": true, "mode": "force-https" },
+ { "name": "everydaywot.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "everytruckjob.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "excentos.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "exdamo.de", "include_subdomains": true, "mode": "force-https" },
+ { "name": "expatmortgage.uk", "include_subdomains": true, "mode": "force-https" },
+ { "name": "expatriate.pl", "include_subdomains": true, "mode": "force-https" },
+ { "name": "expo-america.ru", "include_subdomains": true, "mode": "force-https" },
+ { "name": "eyps.net", "include_subdomains": true, "mode": "force-https" },
+ { "name": "eznfe.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "facebooktsukaikata.net", "include_subdomains": true, "mode": "force-https" },
+ { "name": "facepunch.org", "include_subdomains": true, "mode": "force-https" },
+ { "name": "fahmed.de", "include_subdomains": true, "mode": "force-https" },
+ { "name": "failover.de", "include_subdomains": true, "mode": "force-https" },
+ { "name": "failover.eu", "include_subdomains": true, "mode": "force-https" },
+ { "name": "fakerli.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "fakti.bg", "include_subdomains": true, "mode": "force-https" },
+ { "name": "familie-leu.ch", "include_subdomains": true, "mode": "force-https" },
+ { "name": "familletouret.fr", "include_subdomains": true, "mode": "force-https" },
+ { "name": "fantasyescortsbirmingham.co.uk", "include_subdomains": true, "mode": "force-https" },
+ { "name": "farcecrew.de", "include_subdomains": true, "mode": "force-https" },
+ { "name": "farid.is", "include_subdomains": true, "mode": "force-https" },
+ { "name": "fastcommerce.org", "include_subdomains": true, "mode": "force-https" },
+ { "name": "fastonline.ro", "include_subdomains": true, "mode": "force-https" },
+ { "name": "fatidique.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "fc.media", "include_subdomains": true, "mode": "force-https" },
+ { "name": "fcitasc.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "feastr-dev.de", "include_subdomains": true, "mode": "force-https" },
+ { "name": "featuredmen.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "fedux.com.ar", "include_subdomains": true, "mode": "force-https" },
+ { "name": "feedough.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "feeltennis.net", "include_subdomains": true, "mode": "force-https" },
+ { "name": "felgitscher.xyz", "include_subdomains": true, "mode": "force-https" },
+ { "name": "femanca.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "fensterbau-mutscheller.de", "include_subdomains": true, "mode": "force-https" },
+ { "name": "fernandob.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "fernandobarillas.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "festaprylar.se", "include_subdomains": true, "mode": "force-https" },
+ { "name": "festival-tipps.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "ff-bg.xyz", "include_subdomains": true, "mode": "force-https" },
+ { "name": "ffl123.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "fiftynorth.eu", "include_subdomains": true, "mode": "force-https" },
+ { "name": "filecopa.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "filterflasche-kaufen.de", "include_subdomains": true, "mode": "force-https" },
+ { "name": "find-job-in.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "finer04.pw", "include_subdomains": true, "mode": "force-https" },
+ { "name": "firstchoicepool.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "firstq.xyz", "include_subdomains": true, "mode": "force-https" },
+ { "name": "fiuxy.bz", "include_subdomains": true, "mode": "force-https" },
+ { "name": "fl0222.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "flehm.de", "include_subdomains": true, "mode": "force-https" },
+ { "name": "flets-ms.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "fliacuello.com.ar", "include_subdomains": true, "mode": "force-https" },
+ { "name": "flightzero.cf", "include_subdomains": true, "mode": "force-https" },
+ { "name": "flirtfaces.de", "include_subdomains": true, "mode": "force-https" },
+ { "name": "flucky.xyz", "include_subdomains": true, "mode": "force-https" },
+ { "name": "flugplatz-edvc.de", "include_subdomains": true, "mode": "force-https" },
+ { "name": "flygpost.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "fondy.ru", "include_subdomains": true, "mode": "force-https" },
+ { "name": "fondy.ua", "include_subdomains": true, "mode": "force-https" },
+ { "name": "fonte-trading.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "foodserve.in", "include_subdomains": true, "mode": "force-https" },
+ { "name": "foot.fr", "include_subdomains": true, "mode": "force-https" },
+ { "name": "forbusiness.ca", "include_subdomains": true, "mode": "force-https" },
+ { "name": "forman.store", "include_subdomains": true, "mode": "force-https" },
+ { "name": "formkiq.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "forourselves.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "fortran.io", "include_subdomains": true, "mode": "force-https" },
+ { "name": "foxphotography.ch", "include_subdomains": true, "mode": "force-https" },
+ { "name": "frantorregrosa.me", "include_subdomains": true, "mode": "force-https" },
+ { "name": "frauenarzt-zinke.de", "include_subdomains": true, "mode": "force-https" },
+ { "name": "fredliang.cn", "include_subdomains": true, "mode": "force-https" },
+ { "name": "free8.xyz", "include_subdomains": true, "mode": "force-https" },
+ { "name": "freecam2cam.site", "include_subdomains": true, "mode": "force-https" },
+ { "name": "freedomkiaparts.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "freeexampapers.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "freelandinnovation.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "fridayfoucoud.ma", "include_subdomains": true, "mode": "force-https" },
+ { "name": "froh.co.jp", "include_subdomains": true, "mode": "force-https" },
+ { "name": "frozen-geek.net", "include_subdomains": true, "mode": "force-https" },
+ { "name": "fs-maistadt.de", "include_subdomains": true, "mode": "force-https" },
+ { "name": "fscott.de", "include_subdomains": true, "mode": "force-https" },
+ { "name": "fsky.info", "include_subdomains": true, "mode": "force-https" },
+ { "name": "fsps.ch", "include_subdomains": true, "mode": "force-https" },
+ { "name": "fuckcie.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "fujianshipbuilding.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "fulgenzis.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "functional.cc", "include_subdomains": true, "mode": "force-https" },
+ { "name": "fundacionfranciscofiasco.org", "include_subdomains": true, "mode": "force-https" },
+ { "name": "futurefire.de", "include_subdomains": true, "mode": "force-https" },
+ { "name": "g-rom.net", "include_subdomains": true, "mode": "force-https" },
+ { "name": "gabethebabetv.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "galerieautodirect.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "gallerify.eu", "include_subdomains": true, "mode": "force-https" },
+ { "name": "galpaoap.com.br", "include_subdomains": true, "mode": "force-https" },
+ { "name": "gamekeepers.cz", "include_subdomains": true, "mode": "force-https" },
+ { "name": "gamerpoets.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "games4theworld.org", "include_subdomains": true, "mode": "force-https" },
+ { "name": "gamesplanet.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "gameswitchers.uk", "include_subdomains": true, "mode": "force-https" },
+ { "name": "garage-door.pro", "include_subdomains": true, "mode": "force-https" },
+ { "name": "garage-leone.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "gautham.pro", "include_subdomains": true, "mode": "force-https" },
+ { "name": "gauthier.dk", "include_subdomains": true, "mode": "force-https" },
+ { "name": "gazette.govt.nz", "include_subdomains": true, "mode": "force-https" },
+ { "name": "gbit.xyz", "include_subdomains": true, "mode": "force-https" },
+ { "name": "gboys.net", "include_subdomains": true, "mode": "force-https" },
+ { "name": "gdhzcgs.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "geekbaba.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "gehrke.in", "include_subdomains": true, "mode": "force-https" },
+ { "name": "genemesservwparts.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "genesistrading.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "genevoise-entretien.ch", "include_subdomains": true, "mode": "force-https" },
+ { "name": "geniusteacher.in", "include_subdomains": true, "mode": "force-https" },
+ { "name": "geraldsonrealty.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "germanssky.de", "include_subdomains": true, "mode": "force-https" },
+ { "name": "getgeek.ee", "include_subdomains": true, "mode": "force-https" },
+ { "name": "getgeek.es", "include_subdomains": true, "mode": "force-https" },
+ { "name": "getgeek.fr", "include_subdomains": true, "mode": "force-https" },
+ { "name": "getgeek.pl", "include_subdomains": true, "mode": "force-https" },
+ { "name": "getpost.online", "include_subdomains": true, "mode": "force-https" },
+ { "name": "getwisdom.io", "include_subdomains": true, "mode": "force-https" },
+ { "name": "getyourlifestraight.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "ggrks-asano.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "ggs-marschallstrasse.de", "include_subdomains": true, "mode": "force-https" },
+ { "name": "ghi.gov", "include_subdomains": true, "mode": "force-https" },
+ { "name": "giftedconsortium.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "gilangcp.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "giochistem.it", "include_subdomains": true, "mode": "force-https" },
+ { "name": "gitla.in", "include_subdomains": true, "mode": "force-https" },
+ { "name": "globalresistancecorporation.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "glofox.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "gluecksgriff-taschen.de", "include_subdomains": true, "mode": "force-https" },
+ { "name": "goldenplate.com.sg", "include_subdomains": true, "mode": "force-https" },
+ { "name": "gonx.dk", "include_subdomains": true, "mode": "force-https" },
+ { "name": "gouforit.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "grantcooper.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "grayscale.co", "include_subdomains": true, "mode": "force-https" },
+ { "name": "green-light.cf", "include_subdomains": true, "mode": "force-https" },
+ { "name": "green-light.co.nz", "include_subdomains": true, "mode": "force-https" },
+ { "name": "green-light.ga", "include_subdomains": true, "mode": "force-https" },
+ { "name": "green-light.gq", "include_subdomains": true, "mode": "force-https" },
+ { "name": "green-light.ml", "include_subdomains": true, "mode": "force-https" },
+ { "name": "greenwithdecor.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "gs93.de", "include_subdomains": true, "mode": "force-https" },
+ { "name": "gtravers-basketmaker.co.uk", "include_subdomains": true, "mode": "force-https" },
+ { "name": "gtts.space", "include_subdomains": true, "mode": "force-https" },
+ { "name": "guarajubaimoveis.com.br", "include_subdomains": true, "mode": "force-https" },
+ { "name": "guardianproject.info", "include_subdomains": true, "mode": "force-https" },
+ { "name": "guelphhydropool.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "guid2steamid.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "guidedselling.net", "include_subdomains": true, "mode": "force-https" },
+ { "name": "gulfstream.ru", "include_subdomains": true, "mode": "force-https" },
+ { "name": "gviedu.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "gxgx.org", "include_subdomains": true, "mode": "force-https" },
+ { "name": "h-suppo.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "h2cdn.cloud", "include_subdomains": true, "mode": "force-https" },
+ { "name": "haarlemsesaxofoonschool.nl", "include_subdomains": true, "mode": "force-https" },
+ { "name": "hackbeil.name", "include_subdomains": true, "mode": "force-https" },
+ { "name": "hackingsafe.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "haha-raku.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "half-logic.eu.org", "include_subdomains": true, "mode": "force-https" },
+ { "name": "hansolrella.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "harald-d.dyndns.org", "include_subdomains": true, "mode": "force-https" },
+ { "name": "haritsa.co.id", "include_subdomains": true, "mode": "force-https" },
+ { "name": "haroldsharpe.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "harryharrison.co", "include_subdomains": true, "mode": "force-https" },
+ { "name": "harrypottereditor.net", "include_subdomains": true, "mode": "force-https" },
+ { "name": "havasuhomepage.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "havasuinsurance.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "haze-productions.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "haze.network", "include_subdomains": true, "mode": "force-https" },
+ { "name": "haze.productions", "include_subdomains": true, "mode": "force-https" },
+ { "name": "head.ru", "include_subdomains": true, "mode": "force-https" },
+ { "name": "health-plan-news.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "healtheals.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "heap.zone", "include_subdomains": true, "mode": "force-https" },
+ { "name": "hearmeraw.uk", "include_subdomains": true, "mode": "force-https" },
+ { "name": "heartwoodart.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "hearty.tech", "include_subdomains": true, "mode": "force-https" },
+ { "name": "heilpraxis-bgl.de", "include_subdomains": true, "mode": "force-https" },
+ { "name": "hell.sh", "include_subdomains": true, "mode": "force-https" },
+ { "name": "hemnet.se", "include_subdomains": true, "mode": "force-https" },
+ { "name": "hendersonrealestatepros.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "henkbrink.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "herndl.org", "include_subdomains": true, "mode": "force-https" },
+ { "name": "hertz.bj", "include_subdomains": true, "mode": "force-https" },
+ { "name": "hetene.nl", "include_subdomains": true, "mode": "force-https" },
+ { "name": "hiddenprocess.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "hideouswebsite.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "hirezzportal.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "hivatalinfo.hu", "include_subdomains": true, "mode": "force-https" },
+ { "name": "hochzeitsfotograf-deinfoto.ch", "include_subdomains": true, "mode": "force-https" },
+ { "name": "holad.de", "include_subdomains": true, "mode": "force-https" },
+ { "name": "holidaysportugal.eu", "include_subdomains": true, "mode": "force-https" },
+ { "name": "homatism.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "homeodynamics.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "homeownersinsurancenevada.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "homeownersinsurancenv.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "hoplongtech.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "horrendous-servers.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "horror-forum.de", "include_subdomains": true, "mode": "force-https" },
+ { "name": "hostme.co.il", "include_subdomains": true, "mode": "force-https" },
+ { "name": "hotplate.co.nz", "include_subdomains": true, "mode": "force-https" },
+ { "name": "hottestwebcamgirls.org", "include_subdomains": true, "mode": "force-https" },
+ { "name": "hpeditor.tk", "include_subdomains": true, "mode": "force-https" },
+ { "name": "hserver.top", "include_subdomains": true, "mode": "force-https" },
+ { "name": "htmlvalidator.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "hubok.net", "include_subdomains": true, "mode": "force-https" },
+ { "name": "hudrydum.cz", "include_subdomains": true, "mode": "force-https" },
+ { "name": "hukutuu.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "hulet.tech", "include_subdomains": true, "mode": "force-https" },
+ { "name": "humanexperiments.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "hyckenberg.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "i-proswiss.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "iacono.com.br", "include_subdomains": true, "mode": "force-https" },
+ { "name": "iberiaversicherungen.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "ibiz.mk", "include_subdomains": true, "mode": "force-https" },
+ { "name": "icondoom.nl", "include_subdomains": true, "mode": "force-https" },
+ { "name": "ideashop.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "idsoccer.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "ieeesb.nl", "include_subdomains": true, "mode": "force-https" },
+ { "name": "ieeesbe.nl", "include_subdomains": true, "mode": "force-https" },
+ { "name": "iewar.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "ifelse.io", "include_subdomains": true, "mode": "force-https" },
+ { "name": "igorw.org", "include_subdomains": true, "mode": "force-https" },
+ { "name": "ihacklabs.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "ihatethissh.it", "include_subdomains": true, "mode": "force-https" },
+ { "name": "ihc.im", "include_subdomains": true, "mode": "force-https" },
+ { "name": "ijn-dd.nl", "include_subdomains": true, "mode": "force-https" },
+ { "name": "ikenmeyer.eu", "include_subdomains": true, "mode": "force-https" },
+ { "name": "ilhan.name", "include_subdomains": true, "mode": "force-https" },
+ { "name": "iligang.cn", "include_subdomains": true, "mode": "force-https" },
+ { "name": "imlinan.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "impactpub.ch", "include_subdomains": true, "mode": "force-https" },
+ { "name": "inchcape-fleet-autobid.co.uk", "include_subdomains": true, "mode": "force-https" },
+ { "name": "indianaantlersupply.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "indieethos.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "indogerman.de", "include_subdomains": true, "mode": "force-https" },
+ { "name": "infinitiofmarinparts.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "info-d-74.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "infopulsa.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "inforisposte.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "infoworm.org", "include_subdomains": true, "mode": "force-https" },
+ { "name": "inge-r.nl", "include_subdomains": true, "mode": "force-https" },
+ { "name": "innerform.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "innovation-workshop.ro", "include_subdomains": true, "mode": "force-https" },
+ { "name": "instawi.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "instelikes.com.br", "include_subdomains": true, "mode": "force-https" },
+ { "name": "insult.es", "include_subdomains": true, "mode": "force-https" },
+ { "name": "integratedmedicalonline.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "intellinetixvibration.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "internetmarkets.net", "include_subdomains": true, "mode": "force-https" },
+ { "name": "intraxia.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "introvertedtravel.space", "include_subdomains": true, "mode": "force-https" },
+ { "name": "inventix.nl", "include_subdomains": true, "mode": "force-https" },
+ { "name": "investnext.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "investorloanshub.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "invisible-college.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "iphonote.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "ipnetworking.net", "include_subdomains": true, "mode": "force-https" },
+ { "name": "is-sw.net", "include_subdomains": true, "mode": "force-https" },
+ { "name": "it-world.eu", "include_subdomains": true, "mode": "force-https" },
+ { "name": "itds-consulting.eu", "include_subdomains": true, "mode": "force-https" },
+ { "name": "iterader.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "itsasaja.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "itsevident.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "itzap.com.au", "include_subdomains": true, "mode": "force-https" },
+ { "name": "ivanbenito.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "iwell.de", "include_subdomains": true, "mode": "force-https" },
+ { "name": "j-elliott.co.uk", "include_subdomains": true, "mode": "force-https" },
+ { "name": "janssen.fm", "include_subdomains": true, "mode": "force-https" },
+ { "name": "japaneseemoticons.org", "include_subdomains": true, "mode": "force-https" },
+ { "name": "japanesenames.biz", "include_subdomains": true, "mode": "force-https" },
+ { "name": "japanwatches.xyz", "include_subdomains": true, "mode": "force-https" },
+ { "name": "jaroku.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "jasmijnwagenaar.nl", "include_subdomains": true, "mode": "force-https" },
+ { "name": "jdc.io", "include_subdomains": true, "mode": "force-https" },
+ { "name": "jeec.ist", "include_subdomains": true, "mode": "force-https" },
+ { "name": "jemoticons.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "jens-prangenberg.de", "include_subdomains": true, "mode": "force-https" },
+ { "name": "jesuslucas.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "jetsetboyz.net", "include_subdomains": true, "mode": "force-https" },
+ { "name": "jimbutlerkiaparts.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "jimslop.nl", "include_subdomains": true, "mode": "force-https" },
+ { "name": "jlponsetto.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "jmoreau.ddns.net", "include_subdomains": true, "mode": "force-https" },
+ { "name": "jmsolodesigns.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "jmssg.jp", "include_subdomains": true, "mode": "force-https" },
+ { "name": "jobs-in-tech.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "jobtestprep.fr", "include_subdomains": true, "mode": "force-https" },
+ { "name": "jobtestprep.it", "include_subdomains": true, "mode": "force-https" },
+ { "name": "jobzninja.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "joe262.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "joearodriguez.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "joedoyle.us", "include_subdomains": true, "mode": "force-https" },
+ { "name": "joetyson.io", "include_subdomains": true, "mode": "force-https" },
+ { "name": "joetyson.me", "include_subdomains": true, "mode": "force-https" },
+ { "name": "johand.io", "include_subdomains": true, "mode": "force-https" },
+ { "name": "johanli.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "johannespichler.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "johnbeil.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "johngaltgroup.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "jokedalderup.nl", "include_subdomains": true, "mode": "force-https" },
+ { "name": "joker.menu", "include_subdomains": true, "mode": "force-https" },
+ { "name": "jooksuratas.ee", "include_subdomains": true, "mode": "force-https" },
+ { "name": "jpod.cc", "include_subdomains": true, "mode": "force-https" },
+ { "name": "jpslconsulting.ca", "include_subdomains": true, "mode": "force-https" },
+ { "name": "juergenspecht.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "juergenspecht.de", "include_subdomains": true, "mode": "force-https" },
+ { "name": "juliaoantiguidades.com.br", "include_subdomains": true, "mode": "force-https" },
+ { "name": "juniperroots.ca", "include_subdomains": true, "mode": "force-https" },
+ { "name": "jurke.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "justbelieverecovery.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "justzz.xyz", "include_subdomains": true, "mode": "force-https" },
+ { "name": "juventusmania1897.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "k8r.eu", "include_subdomains": true, "mode": "force-https" },
+ { "name": "kaatha-kamrater.se", "include_subdomains": true, "mode": "force-https" },
+ { "name": "kabeltv.co.nz", "include_subdomains": true, "mode": "force-https" },
+ { "name": "kantorkita.net", "include_subdomains": true, "mode": "force-https" },
+ { "name": "kanzshop.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "kaomojis.net", "include_subdomains": true, "mode": "force-https" },
+ { "name": "kara-fabian.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "karina.gd", "include_subdomains": true, "mode": "force-https" },
+ { "name": "kathegiraldo.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "katzspeech.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "kazu.click", "include_subdomains": true, "mode": "force-https" },
+ { "name": "kdw.cloud", "include_subdomains": true, "mode": "force-https" },
+ { "name": "keshausconsulting.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "kevinfoley.cc", "include_subdomains": true, "mode": "force-https" },
+ { "name": "kevinfoley.org", "include_subdomains": true, "mode": "force-https" },
+ { "name": "kidswallstickers.com.au", "include_subdomains": true, "mode": "force-https" },
+ { "name": "kievradio.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "kimisia.net", "include_subdomains": true, "mode": "force-https" },
+ { "name": "kinow.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "kirchen-im-web.de", "include_subdomains": true, "mode": "force-https" },
+ { "name": "kirill.ws", "include_subdomains": true, "mode": "force-https" },
+ { "name": "kiteschoolkatwijk.nl", "include_subdomains": true, "mode": "force-https" },
+ { "name": "kiteschoolnoordwijk.nl", "include_subdomains": true, "mode": "force-https" },
+ { "name": "kj-prince.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "kjellner.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "kks-karlstadt.de", "include_subdomains": true, "mode": "force-https" },
+ { "name": "knnet.ch", "include_subdomains": true, "mode": "force-https" },
+ { "name": "knownsec.cf", "include_subdomains": true, "mode": "force-https" },
+ { "name": "knurps.de", "include_subdomains": true, "mode": "force-https" },
+ { "name": "koenen-bau.de", "include_subdomains": true, "mode": "force-https" },
+ { "name": "koetjesenkanker.nl", "include_subdomains": true, "mode": "force-https" },
+ { "name": "komok.co.uk", "include_subdomains": true, "mode": "force-https" },
+ { "name": "kondi.net", "include_subdomains": true, "mode": "force-https" },
+ { "name": "konzertheld.de", "include_subdomains": true, "mode": "force-https" },
+ { "name": "koolikatsed.ee", "include_subdomains": true, "mode": "force-https" },
+ { "name": "kopteva.ru", "include_subdomains": true, "mode": "force-https" },
+ { "name": "koumuwin.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "kpfanworld.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "krasavchik.by", "include_subdomains": true, "mode": "force-https" },
+ { "name": "krokodent.de", "include_subdomains": true, "mode": "force-https" },
+ { "name": "krugoval.hr", "include_subdomains": true, "mode": "force-https" },
+ { "name": "kudo.co.id", "include_subdomains": true, "mode": "force-https" },
+ { "name": "kuechenprofi-group.de", "include_subdomains": true, "mode": "force-https" },
+ { "name": "kuehnel-online.eu", "include_subdomains": true, "mode": "force-https" },
+ { "name": "kupid.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "kusochi.eu", "include_subdomains": true, "mode": "force-https" },
+ { "name": "kutus.ee", "include_subdomains": true, "mode": "force-https" },
+ { "name": "kwcolville.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "kwyxz.org", "include_subdomains": true, "mode": "force-https" },
+ { "name": "kyberna.xyz", "include_subdomains": true, "mode": "force-https" },
+ { "name": "kyle.place", "include_subdomains": true, "mode": "force-https" },
+ { "name": "la-tourmaline.ch", "include_subdomains": true, "mode": "force-https" },
+ { "name": "laatikko.io", "include_subdomains": true, "mode": "force-https" },
+ { "name": "labiblioafronebrulepas.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "labobooks.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "ladybugjam.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "ladylikeit.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "lafema.de", "include_subdomains": true, "mode": "force-https" },
+ { "name": "lagazzettadigitale.it", "include_subdomains": true, "mode": "force-https" },
+ { "name": "lakarwebb.se", "include_subdomains": true, "mode": "force-https" },
+ { "name": "lakehavasucityhomebuyerscredit.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "lakehavasuhomebuyercredit.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "lakehavasuhouserentals.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "lakehavasuhouses.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "lakehavasuwebsites.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "lalyre-corcelles.ch", "include_subdomains": true, "mode": "force-https" },
+ { "name": "lanetix.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "lanseyujie.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "lanturtle.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "larraz.es", "include_subdomains": true, "mode": "force-https" },
+ { "name": "lasepiataca.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "latabledemontebello.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "laufcampus.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "lavamob.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "lavapot.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "le130rb.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "learnplayground.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "ledzom.ru", "include_subdomains": true, "mode": "force-https" },
+ { "name": "leideninternationalreview.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "leinfelder.in", "include_subdomains": true, "mode": "force-https" },
+ { "name": "lennyfaces.net", "include_subdomains": true, "mode": "force-https" },
+ { "name": "leon.net", "include_subdomains": true, "mode": "force-https" },
+ { "name": "leretour.ch", "include_subdomains": true, "mode": "force-https" },
+ { "name": "lesplatanes.ch", "include_subdomains": true, "mode": "force-https" },
+ { "name": "lesterrassesdusoleil.ch", "include_subdomains": true, "mode": "force-https" },
+ { "name": "lexpartsofac.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "lianwen.kim", "include_subdomains": true, "mode": "force-https" },
+ { "name": "libmpq.org", "include_subdomains": true, "mode": "force-https" },
+ { "name": "lidl-menubox.ch", "include_subdomains": true, "mode": "force-https" },
+ { "name": "lifeinhex.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "lifematenutrition.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "likc.me", "include_subdomains": true, "mode": "force-https" },
+ { "name": "likenewhearing.com.au", "include_subdomains": true, "mode": "force-https" },
+ { "name": "limunana.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "lindsayanderson.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "linernotekids.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "lingting.vip", "include_subdomains": true, "mode": "force-https" },
+ { "name": "linksextremist.at", "include_subdomains": true, "mode": "force-https" },
+ { "name": "lipo.lol", "include_subdomains": true, "mode": "force-https" },
+ { "name": "living24.de", "include_subdomains": true, "mode": "force-https" },
+ { "name": "localhorst.xyz", "include_subdomains": true, "mode": "force-https" },
+ { "name": "locksmithrandburg24-7.co.za", "include_subdomains": true, "mode": "force-https" },
+ { "name": "logement.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "lolcow.farm", "include_subdomains": true, "mode": "force-https" },
+ { "name": "lolhax.org", "include_subdomains": true, "mode": "force-https" },
+ { "name": "longhorn-imports.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "lottospielen24.org", "include_subdomains": true, "mode": "force-https" },
+ { "name": "love4taylor.eu.org", "include_subdomains": true, "mode": "force-https" },
+ { "name": "lstma.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "lubar.me", "include_subdomains": true, "mode": "force-https" },
+ { "name": "luganskservers.net", "include_subdomains": true, "mode": "force-https" },
+ { "name": "lunidea.ch", "include_subdomains": true, "mode": "force-https" },
+ { "name": "lunidea.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "luso-livros.net", "include_subdomains": true, "mode": "force-https" },
+ { "name": "luvare.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "luxcraft.eng.br", "include_subdomains": true, "mode": "force-https" },
+ { "name": "luxonetwork.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "lycly.top", "include_subdomains": true, "mode": "force-https" },
+ { "name": "lynnmosher.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "m4g.ru", "include_subdomains": true, "mode": "force-https" },
+ { "name": "mabankonline.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "macaw.nl", "include_subdomains": true, "mode": "force-https" },
+ { "name": "mach1club.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "magasindejouets.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "magentapinkinteriors.co.uk", "include_subdomains": true, "mode": "force-https" },
+ { "name": "mahansexcavating.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "maik-mahlow.de", "include_subdomains": true, "mode": "force-https" },
+ { "name": "mailjet.tech", "include_subdomains": true, "mode": "force-https" },
+ { "name": "mailto.space", "include_subdomains": true, "mode": "force-https" },
+ { "name": "majkyto.cz", "include_subdomains": true, "mode": "force-https" },
+ { "name": "maku.edu.tr", "include_subdomains": true, "mode": "force-https" },
+ { "name": "maldives.cx", "include_subdomains": true, "mode": "force-https" },
+ { "name": "malibuelectrical.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "malvy.kiev.ua", "include_subdomains": true, "mode": "force-https" },
+ { "name": "mamanecesitaungintonic.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "mamospienas.lt", "include_subdomains": true, "mode": "force-https" },
+ { "name": "mandm.servebeer.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "manfredgruber.net", "include_subdomains": true, "mode": "force-https" },
+ { "name": "mankans.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "manneguiden.no", "include_subdomains": true, "mode": "force-https" },
+ { "name": "manualscollection.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "manuel-schefczyk.de", "include_subdomains": true, "mode": "force-https" },
+ { "name": "maosi.xin", "include_subdomains": true, "mode": "force-https" },
+ { "name": "marciaimportados.com.br", "include_subdomains": true, "mode": "force-https" },
+ { "name": "marco-kretz.de", "include_subdomains": true, "mode": "force-https" },
+ { "name": "markridgwell.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "markridgwellcom.appspot.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "markup-ua.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "markusgran.de", "include_subdomains": true, "mode": "force-https" },
+ { "name": "marocemploi.co", "include_subdomains": true, "mode": "force-https" },
+ { "name": "marxist.party", "include_subdomains": true, "mode": "force-https" },
+ { "name": "maryeclark.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "massage4u.net", "include_subdomains": true, "mode": "force-https" },
+ { "name": "mat99.dk", "include_subdomains": true, "mode": "force-https" },
+ { "name": "matheo-schefczyk.de", "include_subdomains": true, "mode": "force-https" },
+ { "name": "matriterie-sdv.ro", "include_subdomains": true, "mode": "force-https" },
+ { "name": "matrixreq.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "maxisito.it", "include_subdomains": true, "mode": "force-https" },
+ { "name": "maxrandolph.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "maydex.info", "include_subdomains": true, "mode": "force-https" },
+ { "name": "mazyun.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "mazzotta.me", "include_subdomains": true, "mode": "force-https" },
+ { "name": "mbits.solutions", "include_subdomains": true, "mode": "force-https" },
+ { "name": "media-pi.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "mediadandy.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "mediagenic.ch", "include_subdomains": true, "mode": "force-https" },
+ { "name": "mediationculturelleclp.ch", "include_subdomains": true, "mode": "force-https" },
+ { "name": "medstreaming.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "medtankers.management", "include_subdomains": true, "mode": "force-https" },
+ { "name": "meetingfriends.ch", "include_subdomains": true, "mode": "force-https" },
+ { "name": "meeusen-usedcars.be", "include_subdomains": true, "mode": "force-https" },
+ { "name": "mehmetakif.edu.tr", "include_subdomains": true, "mode": "force-https" },
+ { "name": "mehr-schulferien.de", "include_subdomains": true, "mode": "force-https" },
+ { "name": "meierhofer.net", "include_subdomains": true, "mode": "force-https" },
+ { "name": "melakaltenegger.at", "include_subdomains": true, "mode": "force-https" },
+ { "name": "melaniebernhardt.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "melbourneapartments.website", "include_subdomains": true, "mode": "force-https" },
+ { "name": "melikoff.es", "include_subdomains": true, "mode": "force-https" },
+ { "name": "melina-schefczyk.de", "include_subdomains": true, "mode": "force-https" },
+ { "name": "memetrash.co.uk", "include_subdomains": true, "mode": "force-https" },
+ { "name": "memorygame.io", "include_subdomains": true, "mode": "force-https" },
+ { "name": "menole.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "menole.de", "include_subdomains": true, "mode": "force-https" },
+ { "name": "menole.net", "include_subdomains": true, "mode": "force-https" },
+ { "name": "mercadopago.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "merimatka.fi", "include_subdomains": true, "mode": "force-https" },
+ { "name": "merlet.eu", "include_subdomains": true, "mode": "force-https" },
+ { "name": "messagescelestes.ca", "include_subdomains": true, "mode": "force-https" },
+ { "name": "metalu.ch", "include_subdomains": true, "mode": "force-https" },
+ { "name": "meteo-parc.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "metrix.design", "include_subdomains": true, "mode": "force-https" },
+ { "name": "meupedido.online", "include_subdomains": true, "mode": "force-https" },
+ { "name": "mfgod.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "mhi.web.id", "include_subdomains": true, "mode": "force-https" },
+ { "name": "micaiahparker.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "micalodeal.ch", "include_subdomains": true, "mode": "force-https" },
+ { "name": "michael-schefczyk.de", "include_subdomains": true, "mode": "force-https" },
+ { "name": "michael-schilling.de", "include_subdomains": true, "mode": "force-https" },
+ { "name": "michaelasawyer.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "michaelpfrommer.pub", "include_subdomains": true, "mode": "force-https" },
+ { "name": "michaeltaboada.me", "include_subdomains": true, "mode": "force-https" },
+ { "name": "microdesic.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "midriversmotorsllc.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "milionshop.sk", "include_subdomains": true, "mode": "force-https" },
+ { "name": "minigames.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "minimaliston.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "minschuns.ch", "include_subdomains": true, "mode": "force-https" },
+ { "name": "minto.cc", "include_subdomains": true, "mode": "force-https" },
+ { "name": "mitrostudios.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "miukimodafeminina.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "miyugirls.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "mkset.ru", "include_subdomains": true, "mode": "force-https" },
+ { "name": "mneeb.de", "include_subdomains": true, "mode": "force-https" },
+ { "name": "mnitro.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "mode-hautnah.de", "include_subdomains": true, "mode": "force-https" },
+ { "name": "mohio.co.nz", "include_subdomains": true, "mode": "force-https" },
+ { "name": "mojavenissanofbarstowparts.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "molecularbiosystems.org", "include_subdomains": true, "mode": "force-https" },
+ { "name": "mon-trafic.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "monpetitforfait.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "monpetitmobile.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "montopolis.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "moorparkelectrical.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "mortgagecalculator.biz", "include_subdomains": true, "mode": "force-https" },
+ { "name": "mostlyoverhead.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "motomorgen.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "motoroilinfo.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "motorpointarenacardiff.co.uk", "include_subdomains": true, "mode": "force-https" },
+ { "name": "motorring.ru", "include_subdomains": true, "mode": "force-https" },
+ { "name": "moveltix.net", "include_subdomains": true, "mode": "force-https" },
+ { "name": "movil.uno", "include_subdomains": true, "mode": "force-https" },
+ { "name": "moy.cat", "include_subdomains": true, "mode": "force-https" },
+ { "name": "mrleonardo.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "ms-host.fr", "include_subdomains": true, "mode": "force-https" },
+ { "name": "msch.pw", "include_subdomains": true, "mode": "force-https" },
+ { "name": "mszavodumiru.cz", "include_subdomains": true, "mode": "force-https" },
+ { "name": "mullen.net.au", "include_subdomains": true, "mode": "force-https" },
+ { "name": "multi-vpn.biz", "include_subdomains": true, "mode": "force-https" },
+ { "name": "multirep.ch", "include_subdomains": true, "mode": "force-https" },
+ { "name": "multivpn.cn.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "multivpn.com.ua", "include_subdomains": true, "mode": "force-https" },
+ { "name": "multivpn.fr", "include_subdomains": true, "mode": "force-https" },
+ { "name": "munecoscabezones.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "murraycolin.org", "include_subdomains": true, "mode": "force-https" },
+ { "name": "musclecarresearch.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "musearchengine.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "musicall.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "musicalschwarzenburg.ch", "include_subdomains": true, "mode": "force-https" },
+ { "name": "mustasj.no", "include_subdomains": true, "mode": "force-https" },
+ { "name": "myaggic.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "mybloggedlife.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "myclinicalstudybuddy.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "mydmdi.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "myforfaitmobile.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "mygaysitges.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "mygoldennetwork.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "mymp3singer.co", "include_subdomains": true, "mode": "force-https" },
+ { "name": "myndcommunication.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "mynewselfbariatrics.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "mynn.io", "include_subdomains": true, "mode": "force-https" },
+ { "name": "mypress.mx", "include_subdomains": true, "mode": "force-https" },
+ { "name": "mypup.nl", "include_subdomains": true, "mode": "force-https" },
+ { "name": "myrandomtips.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "myrotvorets.center", "include_subdomains": true, "mode": "force-https" },
+ { "name": "mz-mz.net", "include_subdomains": true, "mode": "force-https" },
+ { "name": "n-m.lu", "include_subdomains": true, "mode": "force-https" },
+ { "name": "nadaquenosepas.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "naiaspa.fr", "include_subdomains": true, "mode": "force-https" },
+ { "name": "natureflo.net", "include_subdomains": true, "mode": "force-https" },
+ { "name": "natusvita.com.br", "include_subdomains": true, "mode": "force-https" },
+ { "name": "nbrii.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "ncea.net.au", "include_subdomains": true, "mode": "force-https" },
+ { "name": "nclvle.co.uk", "include_subdomains": true, "mode": "force-https" },
+ { "name": "negraelinda.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "neko-nyan-nuko.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "nekoku.io", "include_subdomains": true, "mode": "force-https" },
+ { "name": "nesantuoka.lt", "include_subdomains": true, "mode": "force-https" },
+ { "name": "newmovements.net", "include_subdomains": true, "mode": "force-https" },
+ { "name": "nexxus-sistemas.net.br", "include_subdomains": true, "mode": "force-https" },
+ { "name": "nfluence.org", "include_subdomains": true, "mode": "force-https" },
+ { "name": "niadd.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "nickguyver.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "nickmorri.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "niclasreich.de", "include_subdomains": true, "mode": "force-https" },
+ { "name": "nien.gq", "include_subdomains": true, "mode": "force-https" },
+ { "name": "nienkeslop.nl", "include_subdomains": true, "mode": "force-https" },
+ { "name": "nintendoforum.no", "include_subdomains": true, "mode": "force-https" },
+ { "name": "nixonlibrary.gov", "include_subdomains": true, "mode": "force-https" },
+ { "name": "nlbewustgezond.nl", "include_subdomains": true, "mode": "force-https" },
+ { "name": "nlfant.eu", "include_subdomains": true, "mode": "force-https" },
+ { "name": "nodefiles.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "noglobalwarrants.org", "include_subdomains": true, "mode": "force-https" },
+ { "name": "nordmoregatebilklubb.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "northcountykiaparts.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "northridgeelectrical.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "notdienstreform-nordrhein.de", "include_subdomains": true, "mode": "force-https" },
+ { "name": "nouma.fr", "include_subdomains": true, "mode": "force-https" },
+ { "name": "nowremindme.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "nutonic-sports.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "nvq.nl", "include_subdomains": true, "mode": "force-https" },
+ { "name": "nydnxs.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "oben.pl", "include_subdomains": true, "mode": "force-https" },
+ { "name": "oberam.de", "include_subdomains": true, "mode": "force-https" },
+ { "name": "octal.es", "include_subdomains": true, "mode": "force-https" },
+ { "name": "odoo.co.th", "include_subdomains": true, "mode": "force-https" },
+ { "name": "oestepaulista.net", "include_subdomains": true, "mode": "force-https" },
+ { "name": "offersgame.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "officeprint.co.th", "include_subdomains": true, "mode": "force-https" },
+ { "name": "oganime.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "ohadsoft.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "ojomovies.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "okakuro.org", "include_subdomains": true, "mode": "force-https" },
+ { "name": "okin-jp.net", "include_subdomains": true, "mode": "force-https" },
+ { "name": "oldking.net", "include_subdomains": true, "mode": "force-https" },
+ { "name": "oliveoiltimes.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "omnisiens.se", "include_subdomains": true, "mode": "force-https" },
+ { "name": "on-te.ch", "include_subdomains": true, "mode": "force-https" },
+ { "name": "on-tech.co.uk", "include_subdomains": true, "mode": "force-https" },
+ { "name": "onestepfootcare.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "oniria.ch", "include_subdomains": true, "mode": "force-https" },
+ { "name": "onlinebillingform.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "onlinecasino.vlaanderen", "include_subdomains": true, "mode": "force-https" },
+ { "name": "onlinerollout.de", "include_subdomains": true, "mode": "force-https" },
+ { "name": "onlineth.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "onsite4u.de", "include_subdomains": true, "mode": "force-https" },
+ { "name": "ontdekhetzelf.nu", "include_subdomains": true, "mode": "force-https" },
+ { "name": "ooharttemplates.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "openfitapi-falke.azurewebsites.net", "include_subdomains": true, "mode": "force-https" },
+ { "name": "openresty.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "openspa.webhop.info", "include_subdomains": true, "mode": "force-https" },
+ { "name": "openwaveguide.de", "include_subdomains": true, "mode": "force-https" },
+ { "name": "opinion8td.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "opinionicentrifuga.it", "include_subdomains": true, "mode": "force-https" },
+ { "name": "opinionipannolini.it", "include_subdomains": true, "mode": "force-https" },
+ { "name": "opryshok.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "orcsnet.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "oribia.net", "include_subdomains": true, "mode": "force-https" },
+ { "name": "orthodontiste-geneve-docteur-rioux.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "orui.com.br", "include_subdomains": true, "mode": "force-https" },
+ { "name": "oskrba.net", "include_subdomains": true, "mode": "force-https" },
+ { "name": "otakurumi.de", "include_subdomains": true, "mode": "force-https" },
+ { "name": "outdoorimagingportal.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "overdrive-usedcars.be", "include_subdomains": true, "mode": "force-https" },
+ { "name": "owl-stat.ch", "include_subdomains": true, "mode": "force-https" },
+ { "name": "owlishmedia.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "paazmaya.fi", "include_subdomains": true, "mode": "force-https" },
+ { "name": "pagalworld.la", "include_subdomains": true, "mode": "force-https" },
+ { "name": "painlessproperty.co.uk", "include_subdomains": true, "mode": "force-https" },
+ { "name": "paktolos.net", "include_subdomains": true, "mode": "force-https" },
+ { "name": "pantallasled.com.mx", "include_subdomains": true, "mode": "force-https" },
+ { "name": "pantographe.info", "include_subdomains": true, "mode": "force-https" },
+ { "name": "parisescortgirls.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "parleamonluc.fr", "include_subdomains": true, "mode": "force-https" },
+ { "name": "partycentrumdebinnenhof.nl", "include_subdomains": true, "mode": "force-https" },
+ { "name": "pascal-kannchen.de", "include_subdomains": true, "mode": "force-https" },
+ { "name": "passfoto-deinfoto.ch", "include_subdomains": true, "mode": "force-https" },
+ { "name": "passionpictures.eu", "include_subdomains": true, "mode": "force-https" },
+ { "name": "passports.govt.nz", "include_subdomains": true, "mode": "force-https" },
+ { "name": "passwordkeeperbooks.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "pasztor.at", "include_subdomains": true, "mode": "force-https" },
+ { "name": "patrick-robrecht.de", "include_subdomains": true, "mode": "force-https" },
+ { "name": "patrickbusch.net", "include_subdomains": true, "mode": "force-https" },
+ { "name": "patrickneuro.de", "include_subdomains": true, "mode": "force-https" },
+ { "name": "paulshir.is", "include_subdomains": true, "mode": "force-https" },
+ { "name": "pcvirusclear.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "perfectbalance.tech", "include_subdomains": true, "mode": "force-https" },
+ { "name": "peuterspeelzaalhoekvanholland.nl", "include_subdomains": true, "mode": "force-https" },
+ { "name": "pg-forum.de", "include_subdomains": true, "mode": "force-https" },
+ { "name": "phdhub.it", "include_subdomains": true, "mode": "force-https" },
+ { "name": "photodeal.fr", "include_subdomains": true, "mode": "force-https" },
+ { "name": "piedfeed.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "piercing-store.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "pilani.ch", "include_subdomains": true, "mode": "force-https" },
+ { "name": "piratepay.io", "include_subdomains": true, "mode": "force-https" },
+ { "name": "piratepay.ir", "include_subdomains": true, "mode": "force-https" },
+ { "name": "pitot-rs.org", "include_subdomains": true, "mode": "force-https" },
+ { "name": "pixlfox.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "pizzagigant.hu", "include_subdomains": true, "mode": "force-https" },
+ { "name": "pko.ch", "include_subdomains": true, "mode": "force-https" },
+ { "name": "plakbak.nl", "include_subdomains": true, "mode": "force-https" },
+ { "name": "planetau2.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "planete-secu.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "planitz.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "planitz.net", "include_subdomains": true, "mode": "force-https" },
+ { "name": "plant-gift.jp", "include_subdomains": true, "mode": "force-https" },
+ { "name": "planteforum.no", "include_subdomains": true, "mode": "force-https" },
+ { "name": "plextv.de", "include_subdomains": true, "mode": "force-https" },
+ { "name": "plumber-in-sandton.co.za", "include_subdomains": true, "mode": "force-https" },
+ { "name": "plussizereviews.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "pmessage.ch", "include_subdomains": true, "mode": "force-https" },
+ { "name": "pnimmobilier.ch", "include_subdomains": true, "mode": "force-https" },
+ { "name": "pocketfruity.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "pogoswine.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "pointhost.de", "include_subdomains": true, "mode": "force-https" },
+ { "name": "pokomichi.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "polandb2b.directory", "include_subdomains": true, "mode": "force-https" },
+ { "name": "polish.directory", "include_subdomains": true, "mode": "force-https" },
+ { "name": "poly-fast.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "ponga.se", "include_subdomains": true, "mode": "force-https" },
+ { "name": "ponteus.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "pop-corn.ro", "include_subdomains": true, "mode": "force-https" },
+ { "name": "popoway.cloud", "include_subdomains": true, "mode": "force-https" },
+ { "name": "popoway.me", "include_subdomains": true, "mode": "force-https" },
+ { "name": "portsdebalears.gob.es", "include_subdomains": true, "mode": "force-https" },
+ { "name": "postfalls-naturopathic.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "potworowski.de", "include_subdomains": true, "mode": "force-https" },
+ { "name": "pourout.org", "include_subdomains": true, "mode": "force-https" },
+ { "name": "powersergthisisthewebsitefuckyouscott.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "pptavmdata.org", "include_subdomains": true, "mode": "force-https" },
+ { "name": "praerien-racing.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "praxis-dingeldey.de", "include_subdomains": true, "mode": "force-https" },
+ { "name": "precode.eu", "include_subdomains": true, "mode": "force-https" },
+ { "name": "preis-alarm.info", "include_subdomains": true, "mode": "force-https" },
+ { "name": "preis-alarm.org", "include_subdomains": true, "mode": "force-https" },
+ { "name": "prelved.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "prelved.es", "include_subdomains": true, "mode": "force-https" },
+ { "name": "prelved.fi", "include_subdomains": true, "mode": "force-https" },
+ { "name": "prelved.fr", "include_subdomains": true, "mode": "force-https" },
+ { "name": "prelved.it", "include_subdomains": true, "mode": "force-https" },
+ { "name": "prelved.nl", "include_subdomains": true, "mode": "force-https" },
+ { "name": "prelved.pl", "include_subdomains": true, "mode": "force-https" },
+ { "name": "prelved.se", "include_subdomains": true, "mode": "force-https" },
+ { "name": "pretwolk.nl", "include_subdomains": true, "mode": "force-https" },
+ { "name": "priorityelectric.net", "include_subdomains": true, "mode": "force-https" },
+ { "name": "privacymanatee.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "privatepropertymallorca.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "privatewolke.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "privcloud.org", "include_subdomains": true, "mode": "force-https" },
+ { "name": "privu.me", "include_subdomains": true, "mode": "force-https" },
+ { "name": "prlved.co.uk", "include_subdomains": true, "mode": "force-https" },
+ { "name": "pro-ing.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "probely.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "processesinmotion.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "proft.eu", "include_subdomains": true, "mode": "force-https" },
+ { "name": "progiscad.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "project-splash.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "project-stats.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "projectherogames.xyz", "include_subdomains": true, "mode": "force-https" },
+ { "name": "promoterms.com.au", "include_subdomains": true, "mode": "force-https" },
+ { "name": "provectus.de", "include_subdomains": true, "mode": "force-https" },
+ { "name": "provitacare.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "proximityradio.fr", "include_subdomains": true, "mode": "force-https" },
+ { "name": "prpsss.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "psb4ukr.org", "include_subdomains": true, "mode": "force-https" },
+ { "name": "psu.je", "include_subdomains": true, "mode": "force-https" },
+ { "name": "ptal.eu", "include_subdomains": true, "mode": "force-https" },
+ { "name": "purplebooth.co.uk", "include_subdomains": true, "mode": "force-https" },
+ { "name": "pv-paderborn-now.de", "include_subdomains": true, "mode": "force-https" },
+ { "name": "q8mp3.me", "include_subdomains": true, "mode": "force-https" },
+ { "name": "qq-navi.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "quareal.ru", "include_subdomains": true, "mode": "force-https" },
+ { "name": "quasseldroid.info", "include_subdomains": true, "mode": "force-https" },
+ { "name": "question.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "qwertee.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "radio-utopie.de", "include_subdomains": true, "mode": "force-https" },
+ { "name": "raeven.nl", "include_subdomains": true, "mode": "force-https" },
+ { "name": "rainbowstore.com.ua", "include_subdomains": true, "mode": "force-https" },
+ { "name": "rainpaper.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "randy.su", "include_subdomains": true, "mode": "force-https" },
+ { "name": "rb-china.net", "include_subdomains": true, "mode": "force-https" },
+ { "name": "reaiaer.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "realestateradioshow.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "realhost.name", "include_subdomains": true, "mode": "force-https" },
+ { "name": "realum.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "realum.de", "include_subdomains": true, "mode": "force-https" },
+ { "name": "realum.eu", "include_subdomains": true, "mode": "force-https" },
+ { "name": "realum.net", "include_subdomains": true, "mode": "force-https" },
+ { "name": "reaven.nl", "include_subdomains": true, "mode": "force-https" },
+ { "name": "rebelessex.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "reboxonline.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "recetasdecocinaideal.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "redshoeswalking.net", "include_subdomains": true, "mode": "force-https" },
+ { "name": "ref1oct.nl", "include_subdomains": true, "mode": "force-https" },
+ { "name": "refficience.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "refreshliving.us", "include_subdomains": true, "mode": "force-https" },
+ { "name": "reimu.ink", "include_subdomains": true, "mode": "force-https" },
+ { "name": "reismil.ch", "include_subdomains": true, "mode": "force-https" },
+ { "name": "reneleu.ch", "include_subdomains": true, "mode": "force-https" },
+ { "name": "replicaswiss.nl", "include_subdomains": true, "mode": "force-https" },
+ { "name": "requestr.co.uk", "include_subdomains": true, "mode": "force-https" },
+ { "name": "resolvefa.co.uk", "include_subdomains": true, "mode": "force-https" },
+ { "name": "resolvefa.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "resourceconnect.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "restauranttester.at", "include_subdomains": true, "mode": "force-https" },
+ { "name": "reversecanada.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "reverseloansolutions.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "reversesouthafrica.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "review.jp", "include_subdomains": true, "mode": "force-https" },
+ { "name": "rhese.net", "include_subdomains": true, "mode": "force-https" },
+ { "name": "rhiskiapril.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "rhnet.at", "include_subdomains": true, "mode": "force-https" },
+ { "name": "richardcrosby.co.uk", "include_subdomains": true, "mode": "force-https" },
+ { "name": "ricknox.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "rienasemettre.fr", "include_subdomains": true, "mode": "force-https" },
+ { "name": "risada.nl", "include_subdomains": true, "mode": "force-https" },
+ { "name": "rivierasaints.ch", "include_subdomains": true, "mode": "force-https" },
+ { "name": "rmcbs.de", "include_subdomains": true, "mode": "force-https" },
+ { "name": "robinvdmarkt.nl", "include_subdomains": true, "mode": "force-https" },
+ { "name": "robpol86.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "rockymountainspice.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "roemhild.de", "include_subdomains": true, "mode": "force-https" },
+ { "name": "rofl.com.ua", "include_subdomains": true, "mode": "force-https" },
+ { "name": "romande-entretien.ch", "include_subdomains": true, "mode": "force-https" },
+ { "name": "romantelychko.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "ronanrbr.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "roninf.ch", "include_subdomains": true, "mode": "force-https" },
+ { "name": "roolevoi.ru", "include_subdomains": true, "mode": "force-https" },
+ { "name": "rossiworld.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "rrwolfe.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "rskuipers.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "rsldb.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "rsm-intern.de", "include_subdomains": true, "mode": "force-https" },
+ { "name": "rtenews.eu", "include_subdomains": true, "mode": "force-https" },
+ { "name": "rtesport.eu", "include_subdomains": true, "mode": "force-https" },
+ { "name": "rubbleremovalsbenoni.co.za", "include_subdomains": true, "mode": "force-https" },
+ { "name": "rushiiworks.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "ruskod.net", "include_subdomains": true, "mode": "force-https" },
+ { "name": "rwky.net", "include_subdomains": true, "mode": "force-https" },
+ { "name": "ryzhov.me", "include_subdomains": true, "mode": "force-https" },
+ { "name": "sabine-forschbach.de", "include_subdomains": true, "mode": "force-https" },
+ { "name": "sabineforschbach.de", "include_subdomains": true, "mode": "force-https" },
+ { "name": "saclier.at", "include_subdomains": true, "mode": "force-https" },
+ { "name": "sacred-knights.net", "include_subdomains": true, "mode": "force-https" },
+ { "name": "saint-astier-triathlon.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "samanthahumphreysstudio.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "samanthasgeckos.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "sameworks.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "samsonova.de", "include_subdomains": true, "mode": "force-https" },
+ { "name": "samsungphonegenerator.xyz", "include_subdomains": true, "mode": "force-https" },
+ { "name": "samyerkes.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "santmark.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "saoneth.pl", "include_subdomains": true, "mode": "force-https" },
+ { "name": "sarariman.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "saronno5stelle.it", "include_subdomains": true, "mode": "force-https" },
+ { "name": "sarpsb.org", "include_subdomains": true, "mode": "force-https" },
+ { "name": "saterdalen.net", "include_subdomains": true, "mode": "force-https" },
+ { "name": "savinggoliath.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "scangeo.net", "include_subdomains": true, "mode": "force-https" },
+ { "name": "sceptique.eu", "include_subdomains": true, "mode": "force-https" },
+ { "name": "schefczyk.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "schefczyk.de", "include_subdomains": true, "mode": "force-https" },
+ { "name": "schefczyk.eu", "include_subdomains": true, "mode": "force-https" },
+ { "name": "schefczyk.net", "include_subdomains": true, "mode": "force-https" },
+ { "name": "scheuchenstuel.at", "include_subdomains": true, "mode": "force-https" },
+ { "name": "schlafguru.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "schmetterlingsapp.at", "include_subdomains": true, "mode": "force-https" },
+ { "name": "schroepfi.de", "include_subdomains": true, "mode": "force-https" },
+ { "name": "schulfotograf-deinfoto.ch", "include_subdomains": true, "mode": "force-https" },
+ { "name": "schwanke.in", "include_subdomains": true, "mode": "force-https" },
+ { "name": "schwarzes-muenchen.de", "include_subdomains": true, "mode": "force-https" },
+ { "name": "schwinnbike.ru", "include_subdomains": true, "mode": "force-https" },
+ { "name": "science-network.ch", "include_subdomains": true, "mode": "force-https" },
+ { "name": "scis.com.ua", "include_subdomains": true, "mode": "force-https" },
+ { "name": "scorp13.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "scripo-bay.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "scuolaguidalame.ch", "include_subdomains": true, "mode": "force-https" },
+ { "name": "scw.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "se7ensins.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "search-job-in.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "sebascelis.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "sebastiaperis.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "seceye.cn", "include_subdomains": true, "mode": "force-https" },
+ { "name": "secure-gw.de", "include_subdomains": true, "mode": "force-https" },
+ { "name": "secureindia.co", "include_subdomains": true, "mode": "force-https" },
+ { "name": "securiscan.io", "include_subdomains": true, "mode": "force-https" },
+ { "name": "seikatu-navi.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "seitai-taiyou.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "selectcertifiedautos.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "selkiemckatrick.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "sellguard.pl", "include_subdomains": true, "mode": "force-https" },
+ { "name": "sentinel.gov", "include_subdomains": true, "mode": "force-https" },
+ { "name": "septfinance.ch", "include_subdomains": true, "mode": "force-https" },
+ { "name": "sergos.de", "include_subdomains": true, "mode": "force-https" },
+ { "name": "serve-a.com.au", "include_subdomains": true, "mode": "force-https" },
+ { "name": "servea.com.au", "include_subdomains": true, "mode": "force-https" },
+ { "name": "serveatechnologies.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "servfefe.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "setkit.net", "include_subdomains": true, "mode": "force-https" },
+ { "name": "setyoursite.nl", "include_subdomains": true, "mode": "force-https" },
+ { "name": "sewafineseam.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "sewoo.co.uk", "include_subdomains": true, "mode": "force-https" },
+ { "name": "sexservice.io", "include_subdomains": true, "mode": "force-https" },
+ { "name": "sfaturiit.ro", "include_subdomains": true, "mode": "force-https" },
+ { "name": "shariahlawcenter.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "shariahlawcenter.org", "include_subdomains": true, "mode": "force-https" },
+ { "name": "sharialawcenter.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "sharialawcenter.org", "include_subdomains": true, "mode": "force-https" },
+ { "name": "sharingcode.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "shaunharker.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "shelleystoybox.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "shopods.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "showroom.de", "include_subdomains": true, "mode": "force-https" },
+ { "name": "sicilianbalm.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "sieulog.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "significados.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "siikarantacamping.fi", "include_subdomains": true, "mode": "force-https" },
+ { "name": "silviamacallister.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "simpleinout.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "simplewire.de", "include_subdomains": true, "mode": "force-https" },
+ { "name": "simplylovejesus.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "sin.swiss", "include_subdomains": true, "mode": "force-https" },
+ { "name": "singerwang.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "sistel.es", "include_subdomains": true, "mode": "force-https" },
+ { "name": "skei.org", "include_subdomains": true, "mode": "force-https" },
+ { "name": "skynethk.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "slowsociety.org", "include_subdomains": true, "mode": "force-https" },
+ { "name": "smarthinking.nl", "include_subdomains": true, "mode": "force-https" },
+ { "name": "smartmomsmartideas.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "smeso.it", "include_subdomains": true, "mode": "force-https" },
+ { "name": "smimea.info", "include_subdomains": true, "mode": "force-https" },
+ { "name": "smuncensored.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "snaptools.io", "include_subdomains": true, "mode": "force-https" },
+ { "name": "sncdn.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "sneaker.date", "include_subdomains": true, "mode": "force-https" },
+ { "name": "sniderman.pro", "include_subdomains": true, "mode": "force-https" },
+ { "name": "sniderman.us", "include_subdomains": true, "mode": "force-https" },
+ { "name": "sniderman.xyz", "include_subdomains": true, "mode": "force-https" },
+ { "name": "socialdj.de", "include_subdomains": true, "mode": "force-https" },
+ { "name": "soldbygold.net", "include_subdomains": true, "mode": "force-https" },
+ { "name": "sonyforum.no", "include_subdomains": true, "mode": "force-https" },
+ { "name": "soomee.be", "include_subdomains": true, "mode": "force-https" },
+ { "name": "soomee1.be", "include_subdomains": true, "mode": "force-https" },
+ { "name": "sozai-good.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "sparta-solutions.de", "include_subdomains": true, "mode": "force-https" },
+ { "name": "speechmate.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "speerpunt.info", "include_subdomains": true, "mode": "force-https" },
+ { "name": "spiellawine.de", "include_subdomains": true, "mode": "force-https" },
+ { "name": "spiralschneiderkaufen.de", "include_subdomains": true, "mode": "force-https" },
+ { "name": "splendidspoon.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "spookquest.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "spreadthenews.eu", "include_subdomains": true, "mode": "force-https" },
+ { "name": "squirex2.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "srvc.io", "include_subdomains": true, "mode": "force-https" },
+ { "name": "st-steuern.de", "include_subdomains": true, "mode": "force-https" },
+ { "name": "stadterneuerung-hwb.de", "include_subdomains": true, "mode": "force-https" },
+ { "name": "startuplevel.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "stb-schefczyk.de", "include_subdomains": true, "mode": "force-https" },
+ { "name": "steamerrors.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "steckel.cc", "include_subdomains": true, "mode": "force-https" },
+ { "name": "steffi-in-australien.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "stellarvale.net", "include_subdomains": true, "mode": "force-https" },
+ { "name": "stembureauledenindenhaag.nl", "include_subdomains": true, "mode": "force-https" },
+ { "name": "stevenkwan.me", "include_subdomains": true, "mode": "force-https" },
+ { "name": "stevesdrivingschooltyneside.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "stickmanventures.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "stlu.de", "include_subdomains": true, "mode": "force-https" },
+ { "name": "stodieck.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "stonehammerhead.org", "include_subdomains": true, "mode": "force-https" },
+ { "name": "strm.hu", "include_subdomains": true, "mode": "force-https" },
+ { "name": "studienservice.de", "include_subdomains": true, "mode": "force-https" },
+ { "name": "studio-fotografico.ru", "include_subdomains": true, "mode": "force-https" },
+ { "name": "studying-neet.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "stupidstatetricks.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "stuudium.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "styloeart.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "subastasdecarros.net", "include_subdomains": true, "mode": "force-https" },
+ { "name": "suchprogrammer.net", "include_subdomains": true, "mode": "force-https" },
+ { "name": "summitmasters.net", "include_subdomains": true, "mode": "force-https" },
+ { "name": "superbowlkneel.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "supercinebattle.fr", "include_subdomains": true, "mode": "force-https" },
+ { "name": "supportdesk.nu", "include_subdomains": true, "mode": "force-https" },
+ { "name": "suuria.de", "include_subdomains": true, "mode": "force-https" },
+ { "name": "suvidhaapay.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "sw33tp34.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "sweepay.ch", "include_subdomains": true, "mode": "force-https" },
+ { "name": "swiftconf.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "switch.moe", "include_subdomains": true, "mode": "force-https" },
+ { "name": "switzerland-family-office.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "syajvo.if.ua", "include_subdomains": true, "mode": "force-https" },
+ { "name": "synecek11.cz", "include_subdomains": true, "mode": "force-https" },
+ { "name": "synthetik.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "tacotown.tk", "include_subdomains": true, "mode": "force-https" },
+ { "name": "takuyaphotos.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "talenthero.io", "include_subdomains": true, "mode": "force-https" },
+ { "name": "tanz.info", "include_subdomains": true, "mode": "force-https" },
+ { "name": "tb-itf.de", "include_subdomains": true, "mode": "force-https" },
+ { "name": "tbs-certificates.co.uk", "include_subdomains": true, "mode": "force-https" },
+ { "name": "tc.nz", "include_subdomains": true, "mode": "force-https" },
+ { "name": "tcb-a.org", "include_subdomains": true, "mode": "force-https" },
+ { "name": "tcb-b.org", "include_subdomains": true, "mode": "force-https" },
+ { "name": "tdchrom.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "teatrarium.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "techask.it", "include_subdomains": true, "mode": "force-https" },
+ { "name": "technoinfogroup.it", "include_subdomains": true, "mode": "force-https" },
+ { "name": "techpit.us", "include_subdomains": true, "mode": "force-https" },
+ { "name": "telecomwestland.nl", "include_subdomains": true, "mode": "force-https" },
+ { "name": "telefoncek.si", "include_subdomains": true, "mode": "force-https" },
+ { "name": "templateinvaders.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "tennismindgame.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "terrainator.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "text-shirt.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "the-finance-blog.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "theboxofcarlos.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "thecrew-exchange.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "thecuriouscat.net", "include_subdomains": true, "mode": "force-https" },
+ { "name": "thedrunkencabbage.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "theeducationchannel.info", "include_subdomains": true, "mode": "force-https" },
+ { "name": "theevergreen.me", "include_subdomains": true, "mode": "force-https" },
+ { "name": "theferrarista.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "thefrk.pw", "include_subdomains": true, "mode": "force-https" },
+ { "name": "thehookup.be", "include_subdomains": true, "mode": "force-https" },
+ { "name": "thestoritplace.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "theswissbay.ch", "include_subdomains": true, "mode": "force-https" },
+ { "name": "thirdworld.moe", "include_subdomains": true, "mode": "force-https" },
+ { "name": "thomasmcfly.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "thomassen.sh", "include_subdomains": true, "mode": "force-https" },
+ { "name": "thriftdiving.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "ticketluck.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "ticketsmate.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "tickit.ca", "include_subdomains": true, "mode": "force-https" },
+ { "name": "tiffanytravels.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "tijo.ch", "include_subdomains": true, "mode": "force-https" },
+ { "name": "tik.edu.ee", "include_subdomains": true, "mode": "force-https" },
+ { "name": "tik.help", "include_subdomains": true, "mode": "force-https" },
+ { "name": "timeatlas.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "timer.fit", "include_subdomains": true, "mode": "force-https" },
+ { "name": "tkn.me", "include_subdomains": true, "mode": "force-https" },
+ { "name": "tkw01536.de", "include_subdomains": true, "mode": "force-https" },
+ { "name": "tlca.org", "include_subdomains": true, "mode": "force-https" },
+ { "name": "tlcnet.info", "include_subdomains": true, "mode": "force-https" },
+ { "name": "tntmobi.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "tobaccore.eu", "include_subdomains": true, "mode": "force-https" },
+ { "name": "tobaccore.sk", "include_subdomains": true, "mode": "force-https" },
+ { "name": "tobias-bauer.de", "include_subdomains": true, "mode": "force-https" },
+ { "name": "tobias-kluge.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "tobis-rundfluege.de", "include_subdomains": true, "mode": "force-https" },
+ { "name": "tobis-webservice.de", "include_subdomains": true, "mode": "force-https" },
+ { "name": "tollfreeproxy.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "toom.io", "include_subdomains": true, "mode": "force-https" },
+ { "name": "topshelfcommercial.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "torchantifa.org", "include_subdomains": true, "mode": "force-https" },
+ { "name": "totallynotaserver.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "tounyou-raku.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "toushi-exe.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "trackrecordpro.co.uk", "include_subdomains": true, "mode": "force-https" },
+ { "name": "tradingbhavishya.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "traditionsvivantesenimages.ch", "include_subdomains": true, "mode": "force-https" },
+ { "name": "trainline.io", "include_subdomains": true, "mode": "force-https" },
+ { "name": "travelmyth.ie", "include_subdomains": true, "mode": "force-https" },
+ { "name": "tremlor.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "trhastane.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "tridimage.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "trymegadrol.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "tsuki.moe", "include_subdomains": true, "mode": "force-https" },
+ { "name": "ttbonline.gov", "include_subdomains": true, "mode": "force-https" },
+ { "name": "ttdsevaonline.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "turigum.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "tutanota.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "twittelzie.nl", "include_subdomains": true, "mode": "force-https" },
+ { "name": "tylerharcourt.ca", "include_subdomains": true, "mode": "force-https" },
+ { "name": "tylerharcourt.net", "include_subdomains": true, "mode": "force-https" },
+ { "name": "typist.tech", "include_subdomains": true, "mode": "force-https" },
+ { "name": "tyreis.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "u1100.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "u1144.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "u2fanlife.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "ucppe.org", "include_subdomains": true, "mode": "force-https" },
+ { "name": "ueni.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "uhuru-market.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "ullah.se", "include_subdomains": true, "mode": "force-https" },
+ { "name": "ultimatemafia.net", "include_subdomains": true, "mode": "force-https" },
+ { "name": "unicorn.li", "include_subdomains": true, "mode": "force-https" },
+ { "name": "unieducar.org.br", "include_subdomains": true, "mode": "force-https" },
+ { "name": "unikoingold.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "unknownbreakup.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "upgamerengine.com.br", "include_subdomains": true, "mode": "force-https" },
+ { "name": "uploadbro.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "ursae.co", "include_subdomains": true, "mode": "force-https" },
+ { "name": "urukproject.org", "include_subdomains": true, "mode": "force-https" },
+ { "name": "ussuka.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "ut-addicted.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "uuit.nl", "include_subdomains": true, "mode": "force-https" },
+ { "name": "uzaymedya.com.tr", "include_subdomains": true, "mode": "force-https" },
+ { "name": "v-d-p.net", "include_subdomains": true, "mode": "force-https" },
+ { "name": "v2bv.net", "include_subdomains": true, "mode": "force-https" },
+ { "name": "vacationfund.co", "include_subdomains": true, "mode": "force-https" },
+ { "name": "valentinera.in", "include_subdomains": true, "mode": "force-https" },
+ { "name": "valesdev.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "valika.ee", "include_subdomains": true, "mode": "force-https" },
+ { "name": "valkor.pro", "include_subdomains": true, "mode": "force-https" },
+ { "name": "vanderkroon.nl", "include_subdomains": true, "mode": "force-https" },
+ { "name": "vareillefoundation.fr", "include_subdomains": true, "mode": "force-https" },
+ { "name": "vareillefoundation.org", "include_subdomains": true, "mode": "force-https" },
+ { "name": "variable.agency", "include_subdomains": true, "mode": "force-https" },
+ { "name": "vcdn.xyz", "include_subdomains": true, "mode": "force-https" },
+ { "name": "vcsjones.codes", "include_subdomains": true, "mode": "force-https" },
+ { "name": "vectorwish.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "veke.fi", "include_subdomains": true, "mode": "force-https" },
+ { "name": "vekenz.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "venturavwparts.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "venturum.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "venturum.de", "include_subdomains": true, "mode": "force-https" },
+ { "name": "venturum.eu", "include_subdomains": true, "mode": "force-https" },
+ { "name": "venturum.net", "include_subdomains": true, "mode": "force-https" },
+ { "name": "vernaeve-usedcars.be", "include_subdomains": true, "mode": "force-https" },
+ { "name": "vernonhouseofhope.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "vernonsecureselfstorage.ca", "include_subdomains": true, "mode": "force-https" },
+ { "name": "verteilergetriebe.info", "include_subdomains": true, "mode": "force-https" },
+ { "name": "vetforum.co", "include_subdomains": true, "mode": "force-https" },
+ { "name": "vgolos.zt.ua", "include_subdomains": true, "mode": "force-https" },
+ { "name": "vichiya.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "victorgbustamante.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "victoriaartist.ru", "include_subdomains": true, "mode": "force-https" },
+ { "name": "victoriastudio.ru", "include_subdomains": true, "mode": "force-https" },
+ { "name": "videov.tk", "include_subdomains": true, "mode": "force-https" },
+ { "name": "vikodek.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "viralboombox.xyz", "include_subdomains": true, "mode": "force-https" },
+ { "name": "vitahook.pw", "include_subdomains": true, "mode": "force-https" },
+ { "name": "vizards.cc", "include_subdomains": true, "mode": "force-https" },
+ { "name": "vkennke.org", "include_subdomains": true, "mode": "force-https" },
+ { "name": "voids.org", "include_subdomains": true, "mode": "force-https" },
+ { "name": "voipkb.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "volkerwesselstransfer.nl", "include_subdomains": true, "mode": "force-https" },
+ { "name": "volkerwesselswave.nl", "include_subdomains": true, "mode": "force-https" },
+ { "name": "vongerlach.at", "include_subdomains": true, "mode": "force-https" },
+ { "name": "vonski.pl", "include_subdomains": true, "mode": "force-https" },
+ { "name": "votercircle.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "voyagesdetective.fr", "include_subdomains": true, "mode": "force-https" },
+ { "name": "vozami.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "vpls.co.th", "include_subdomains": true, "mode": "force-https" },
+ { "name": "vpls.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "vpls.net", "include_subdomains": true, "mode": "force-https" },
+ { "name": "vplssolutions.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "vranjske.co.rs", "include_subdomains": true, "mode": "force-https" },
+ { "name": "vsamsonov.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "vuzi.fr", "include_subdomains": true, "mode": "force-https" },
+ { "name": "warenits.at", "include_subdomains": true, "mode": "force-https" },
+ { "name": "watchtv-online.pw", "include_subdomains": true, "mode": "force-https" },
+ { "name": "wbit.co.il", "include_subdomains": true, "mode": "force-https" },
+ { "name": "webaeon.org", "include_subdomains": true, "mode": "force-https" },
+ { "name": "webapky.cz", "include_subdomains": true, "mode": "force-https" },
+ { "name": "webappky.cz", "include_subdomains": true, "mode": "force-https" },
+ { "name": "webclimbers.ch", "include_subdomains": true, "mode": "force-https" },
+ { "name": "webkeks.org", "include_subdomains": true, "mode": "force-https" },
+ { "name": "webnoob.net", "include_subdomains": true, "mode": "force-https" },
+ { "name": "websites4business.ca", "include_subdomains": true, "mode": "force-https" },
+ { "name": "webspire.tech", "include_subdomains": true, "mode": "force-https" },
+ { "name": "webtar.info", "include_subdomains": true, "mode": "force-https" },
+ { "name": "webwinkelwestland.nl", "include_subdomains": true, "mode": "force-https" },
+ { "name": "wecanvisit.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "wecobble.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "week.report", "include_subdomains": true, "mode": "force-https" },
+ { "name": "weerda.fr", "include_subdomains": true, "mode": "force-https" },
+ { "name": "weigelia.nl", "include_subdomains": true, "mode": "force-https" },
+ { "name": "weimz.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "weinbergerlawgroup.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "wellcom.co.il", "include_subdomains": true, "mode": "force-https" },
+ { "name": "wellnesscheck.net", "include_subdomains": true, "mode": "force-https" },
+ { "name": "welzijnkoggenland.nl", "include_subdomains": true, "mode": "force-https" },
+ { "name": "werk-34.de", "include_subdomains": true, "mode": "force-https" },
+ { "name": "werkemotion.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "wesreportportal.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "weyland.tech", "include_subdomains": true, "mode": "force-https" },
+ { "name": "whereismyorigin.cf", "include_subdomains": true, "mode": "force-https" },
+ { "name": "who-calledme.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "whoisthenightking.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "wien52.at", "include_subdomains": true, "mode": "force-https" },
+ { "name": "wifi-names.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "wiiforum.no", "include_subdomains": true, "mode": "force-https" },
+ { "name": "wiki-play.ru", "include_subdomains": true, "mode": "force-https" },
+ { "name": "wild-turtles.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "wili.li", "include_subdomains": true, "mode": "force-https" },
+ { "name": "willekeinden.nl", "include_subdomains": true, "mode": "force-https" },
+ { "name": "willowdalechurch.ca", "include_subdomains": true, "mode": "force-https" },
+ { "name": "winfieldchen.me", "include_subdomains": true, "mode": "force-https" },
+ { "name": "wisdomize.me", "include_subdomains": true, "mode": "force-https" },
+ { "name": "wishesbee.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "wittepapaver.nl", "include_subdomains": true, "mode": "force-https" },
+ { "name": "witting.co", "include_subdomains": true, "mode": "force-https" },
+ { "name": "wjg.ca", "include_subdomains": true, "mode": "force-https" },
+ { "name": "wjg.dk", "include_subdomains": true, "mode": "force-https" },
+ { "name": "wollongongbaptist.hopto.org", "include_subdomains": true, "mode": "force-https" },
+ { "name": "workcelerator.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "worldpeacetechnology.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "wpdesigner.ir", "include_subdomains": true, "mode": "force-https" },
+ { "name": "wpenhance.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "wroffle.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "wumbo.cf", "include_subdomains": true, "mode": "force-https" },
+ { "name": "wumbo.ga", "include_subdomains": true, "mode": "force-https" },
+ { "name": "wumbo.gq", "include_subdomains": true, "mode": "force-https" },
+ { "name": "wumbo.kiwi", "include_subdomains": true, "mode": "force-https" },
+ { "name": "wumbo.ml", "include_subdomains": true, "mode": "force-https" },
+ { "name": "wumbo.tk", "include_subdomains": true, "mode": "force-https" },
+ { "name": "www-49889.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "www-68277.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "www68277.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "x2c0.net", "include_subdomains": true, "mode": "force-https" },
+ { "name": "x7plus.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "xanderweaver.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "xblau.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "xiamenshipbuilding.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "xn--grnderlehrstuhl-0vb.de", "include_subdomains": true, "mode": "force-https" },
+ { "name": "xn--hllrigl-90a.at", "include_subdomains": true, "mode": "force-https" },
+ { "name": "xn--ktha-kamrater-pfba.se", "include_subdomains": true, "mode": "force-https" },
+ { "name": "xn--ykrp42k.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "xn--zettlmeil-n1a.de", "include_subdomains": true, "mode": "force-https" },
+ { "name": "xoda.pw", "include_subdomains": true, "mode": "force-https" },
+ { "name": "xonn.de", "include_subdomains": true, "mode": "force-https" },
+ { "name": "xpwn.cz", "include_subdomains": true, "mode": "force-https" },
+ { "name": "yaru.one", "include_subdomains": true, "mode": "force-https" },
+ { "name": "yephy.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "yibaoweilong.top", "include_subdomains": true, "mode": "force-https" },
+ { "name": "yinga.ga", "include_subdomains": true, "mode": "force-https" },
+ { "name": "yorcool.nl", "include_subdomains": true, "mode": "force-https" },
+ { "name": "youcanfuckoff.xyz", "include_subdomains": true, "mode": "force-https" },
+ { "name": "youhua.ru", "include_subdomains": true, "mode": "force-https" },
+ { "name": "youth2009.org", "include_subdomains": true, "mode": "force-https" },
+ { "name": "youtsuu-raku.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "yqjf68.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "ytbmp3.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "ytbmp4.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "yum0.cn", "include_subdomains": true, "mode": "force-https" },
+ { "name": "yutuo.net", "include_subdomains": true, "mode": "force-https" },
+ { "name": "yuxuan.org", "include_subdomains": true, "mode": "force-https" },
+ { "name": "ywyz.tech", "include_subdomains": true, "mode": "force-https" },
+ { "name": "zach.codes", "include_subdomains": true, "mode": "force-https" },
+ { "name": "zaoext.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "zarpo.com.br", "include_subdomains": true, "mode": "force-https" },
+ { "name": "zavec.com.ec", "include_subdomains": true, "mode": "force-https" },
+ { "name": "zebbra.ro", "include_subdomains": true, "mode": "force-https" },
+ { "name": "zeguigui.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "zestylemon.co.uk", "include_subdomains": true, "mode": "force-https" },
+ { "name": "zetrov.pl", "include_subdomains": true, "mode": "force-https" },
+ { "name": "zettlmeissl.de", "include_subdomains": true, "mode": "force-https" },
+ { "name": "zhang.nz", "include_subdomains": true, "mode": "force-https" },
+ { "name": "zhitanska.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "ziondrive.com.br", "include_subdomains": true, "mode": "force-https" },
+ { "name": "zivver.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "zodiacohouses.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "zoo.city", "include_subdomains": true, "mode": "force-https" },
+ { "name": "zug.io", "include_subdomains": true, "mode": "force-https" },
+ { "name": "zuiacg.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "zuppy.pm", "include_subdomains": true, "mode": "force-https" },
+ { "name": "zuralski.net", "include_subdomains": true, "mode": "force-https" },
+ { "name": "zutsu-raku.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "zwy.ch", "include_subdomains": true, "mode": "force-https" },
+ { "name": "zyciedlazwierzat.pl", "include_subdomains": true, "mode": "force-https" },
+ { "name": "188522.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "arai21.net", "include_subdomains": true, "mode": "force-https" },
+ { "name": "arto.bg", "include_subdomains": true, "mode": "force-https" },
+ { "name": "arvutiladu.ee", "include_subdomains": true, "mode": "force-https" },
+ { "name": "awf0.xyz", "include_subdomains": true, "mode": "force-https" },
+ { "name": "axel-fischer.science", "include_subdomains": true, "mode": "force-https" },
+ { "name": "byiu.info", "include_subdomains": true, "mode": "force-https" },
+ { "name": "cal.goip.de", "include_subdomains": true, "mode": "force-https" },
+ { "name": "clintonplasticsurgery.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "cloudberlin.goip.de", "include_subdomains": true, "mode": "force-https" },
+ { "name": "comw.cc", "include_subdomains": true, "mode": "force-https" },
+ { "name": "dantransports.fr", "include_subdomains": true, "mode": "force-https" },
+ { "name": "extreme-players.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "fejes.house", "include_subdomains": true, "mode": "force-https" },
+ { "name": "freifunk-burgaltendorf.de", "include_subdomains": true, "mode": "force-https" },
+ { "name": "fukushimacoffee.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "fysesbjerg.dk", "include_subdomains": true, "mode": "force-https" },
+ { "name": "hcstr.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "huislaw.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "imcsx.co", "include_subdomains": true, "mode": "force-https" },
+ { "name": "juchheim-methode.de", "include_subdomains": true, "mode": "force-https" },
+ { "name": "junqueiropolis.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "kalender.goip.de", "include_subdomains": true, "mode": "force-https" },
+ { "name": "kinepolis-studio.be", "include_subdomains": true, "mode": "force-https" },
+ { "name": "kry.no", "include_subdomains": true, "mode": "force-https" },
+ { "name": "kry.se", "include_subdomains": true, "mode": "force-https" },
+ { "name": "linan.blog", "include_subdomains": true, "mode": "force-https" },
+ { "name": "maeplasticsurgery.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "moonchart.co.uk", "include_subdomains": true, "mode": "force-https" },
+ { "name": "nautiljon.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "openmirrors.cf", "include_subdomains": true, "mode": "force-https" },
+ { "name": "plexhome13.ddns.net", "include_subdomains": true, "mode": "force-https" },
+ { "name": "pro-netz.de", "include_subdomains": true, "mode": "force-https" },
+ { "name": "schmidtplasticsurgery.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "ssnet.vip", "include_subdomains": true, "mode": "force-https" },
+ { "name": "tetsai.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "thederminstitute.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "twinkieman.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "twisted-brains.org", "include_subdomains": true, "mode": "force-https" },
+ { "name": "unblocked.pro", "include_subdomains": true, "mode": "force-https" },
+ { "name": "upd.jp", "include_subdomains": true, "mode": "force-https" },
+ { "name": "uscp8.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "vida.es", "include_subdomains": true, "mode": "force-https" },
+ { "name": "viepixel.at", "include_subdomains": true, "mode": "force-https" },
+ { "name": "wochennummern.de", "include_subdomains": true, "mode": "force-https" },
+ { "name": "wplatin.com", "include_subdomains": true, "mode": "force-https" },
// END OF BULK ENTRIES
// Manual additions and changes in Chrome 51 or later that do not belong in a
@@ -35025,7 +37989,6 @@
{ "name": "wordpress.com", "include_subdomains": false, "mode": "force-https" },
{ "name": "www.wordpress.com", "include_subdomains": false, "mode": "force-https" },
{ "name": "rugk.dedyn.io", "include_subdomains": true, "mode": "force-https" },
- { "name": "login.gov", "include_subdomains": true, "mode": "force-https" },
{ "name": "bicycle-events.com", "include_subdomains": true, "mode": "force-https" },
{ "name": "aramado.com", "include_subdomains": true, "mode": "force-https" },
{ "name": "bebefofuxo.com.br", "include_subdomains": true, "mode": "force-https" },
@@ -35070,9 +38033,23 @@
{ "name": "patrick.dark.name", "include_subdomains": true, "mode": "force-https" },
{ "name": "techmasters.andover.edu", "include_subdomains": true, "mode": "force-https" },
{ "name": "simpletax.ca", "include_subdomains": true, "mode": "force-https" },
- { "name": "scotthelme.co.uk", "include_subdomains": true, "mode": "force-https", "expect_staple": true, "expect_staple_report_uri": "https://scotthelme.report-uri.io/r/default/staple/reportOnly", "include_subdomains_for_expect_staple": true },
+ {
+ "name": "scotthelme.co.uk",
+ "mode": "force-https", "include_subdomains": true,
+ "expect_staple": true, "include_subdomains_for_expect_staple": true,
+ "expect_staple_report_uri": "https://scotthelme.report-uri.io/r/default/staple/reportOnly",
+ "expect_ct": true,
+ "expect_ct_report_uri": "https://scotthelme.report-uri.io/r/default/ct/reportOnly"
+ },
{ "name": "hstspreload.appspot.com", "include_subdomains": true, "mode": "force-https" },
- { "name": "matteomarescotti.it", "include_subdomains": true, "mode": "force-https", "expect_staple": true, "expect_staple_report_uri": "https://matteomarescotti.report-uri.io/r/default/staple/reportOnly", "include_subdomains_for_expect_staple": true },
+ {
+ "name": "matteomarescotti.it",
+ "mode": "force-https", "include_subdomains": true,
+ "expect_staple": true, "include_subdomains_for_expect_staple": true,
+ "expect_staple_report_uri": "https://matteomarescotti.report-uri.io/r/default/staple/reportOnly",
+ "expect_ct": true,
+ "expect_ct_report_uri": "https://matteomarescotti.report-uri.io/r/default/ct/reportOnly"
+ },
{ "name": "www.cnet.com", "include_subdomains": true, "mode": "force-https" },
{
"name": "alessandroz.pro",
@@ -35149,6 +38126,14 @@
"expect_staple_report_uri": "https://photistic.report-uri.io/r/default/staple/reportOnly"
},
{ "name": "ccu.plus", "include_subdomains": true, "mode": "force-https" },
+ { "name": "mitm-software.badssl.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "hyatt.com", "mode": "force-https" },
+ { "name": "www.hyatt.com", "include_subdomains": true, "mode": "force-https" },
+ {
+ "name": "www.tumblr.com",
+ "mode": "force-https", "include_subdomains": false,
+ "include_subdomains_for_pinning": true, "pins": "tumblr"
+ },
// END OF MANUAL ENTRIES
// TODO(lgarron): hstspreload.org can't scan IPv6-only sites due to Google
@@ -35161,6 +38146,7 @@
// eTLD owners who are working towards wide HSTS adoption can request to
// preload entries at registration time.
// START OF ETLD-OWNER REQUESTED ENTRIES
+ { "name": "login.gov", "include_subdomains": true, "mode": "force-https" },
{ "name": "digital.gov", "include_subdomains": true, "mode": "force-https" },
{ "name": "cdcpartners.gov", "include_subdomains": true, "mode": "force-https" },
{ "name": "smarterskies.gov", "include_subdomains": true, "mode": "force-https" },
@@ -35173,6 +38159,12 @@
{ "name": "earthsystemprediction.gov", "include_subdomains": true, "mode": "force-https" },
{ "name": "militaryconsumer.gov", "include_subdomains": true, "mode": "force-https" },
{ "name": "osdls.gov", "include_subdomains": true, "mode": "force-https" },
+ { "name": "identitysandbox.gov", "include_subdomains": true, "mode": "force-https" },
+ { "name": "employer.gov", "include_subdomains": true, "mode": "force-https" },
+ { "name": "digitaldashboard.gov", "include_subdomains": true, "mode": "force-https" },
+ { "name": "reporting.gov", "include_subdomains": true, "mode": "force-https" },
+ { "name": "hirevets.gov", "include_subdomains": true, "mode": "force-https" },
+ { "name": "search.gov", "include_subdomains": true, "mode": "force-https" },
// END OF ETLD-OWNER REQUESTED ENTRIES
// To avoid trailing comma changes from showing up in diffs, we place a
diff --git a/chromium/net/http/transport_security_state_static.pins b/chromium/net/http/transport_security_state_static.pins
index 2ea4f0b84bd..1972b8c2863 100644
--- a/chromium/net/http/transport_security_state_static.pins
+++ b/chromium/net/http/transport_security_state_static.pins
@@ -253,6 +253,37 @@ YSEY1QSteDwsOoBrp+uvFRTp2InBuThs4pFsiv9kuXclVzDAGySj4dzp30d8tbQk
CAUw7C29C79Fv1C5qfPrmAESrciIxpg0X40KPMbp1ZWVbd4=
-----END CERTIFICATE-----
+# https://www.digicert.com/digicert-root-certificates.htm
+DigiCertSHA2HighAssuranceServerCA
+-----BEGIN CERTIFICATE-----
+MIIEsTCCA5mgAwIBAgIQBOHnpNxc8vNtwCtCuF0VnzANBgkqhkiG9w0BAQsFADBs
+MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3
+d3cuZGlnaWNlcnQuY29tMSswKQYDVQQDEyJEaWdpQ2VydCBIaWdoIEFzc3VyYW5j
+ZSBFViBSb290IENBMB4XDTEzMTAyMjEyMDAwMFoXDTI4MTAyMjEyMDAwMFowcDEL
+MAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZMBcGA1UECxMQd3d3
+LmRpZ2ljZXJ0LmNvbTEvMC0GA1UEAxMmRGlnaUNlcnQgU0hBMiBIaWdoIEFzc3Vy
+YW5jZSBTZXJ2ZXIgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC2
+4C/CJAbIbQRf1+8KZAayfSImZRauQkCbztyfn3YHPsMwVYcZuU+UDlqUH1VWtMIC
+Kq/QmO4LQNfE0DtyyBSe75CxEamu0si4QzrZCwvV1ZX1QK/IHe1NnF9Xt4ZQaJn1
+itrSxwUfqJfJ3KSxgoQtxq2lnMcZgqaFD15EWCo3j/018QsIJzJa9buLnqS9UdAn
+4t07QjOjBSjEuyjMmqwrIw14xnvmXnG3Sj4I+4G3FhahnSMSTeXXkgisdaScus0X
+sh5ENWV/UyU50RwKmmMbGZJ0aAo3wsJSSMs5WqK24V3B3aAguCGikyZvFEohQcft
+bZvySC/zA/WiaJJTL17jAgMBAAGjggFJMIIBRTASBgNVHRMBAf8ECDAGAQH/AgEA
+MA4GA1UdDwEB/wQEAwIBhjAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIw
+NAYIKwYBBQUHAQEEKDAmMCQGCCsGAQUFBzABhhhodHRwOi8vb2NzcC5kaWdpY2Vy
+dC5jb20wSwYDVR0fBEQwQjBAoD6gPIY6aHR0cDovL2NybDQuZGlnaWNlcnQuY29t
+L0RpZ2lDZXJ0SGlnaEFzc3VyYW5jZUVWUm9vdENBLmNybDA9BgNVHSAENjA0MDIG
+BFUdIAAwKjAoBggrBgEFBQcCARYcaHR0cHM6Ly93d3cuZGlnaWNlcnQuY29tL0NQ
+UzAdBgNVHQ4EFgQUUWj/kK8CB3U8zNllZGKiErhZcjswHwYDVR0jBBgwFoAUsT7D
+aQP4v0cB1JgmGggC72NkK8MwDQYJKoZIhvcNAQELBQADggEBABiKlYkD5m3fXPwd
+aOpKj4PWUS+Na0QWnqxj9dJubISZi6qBcYRb7TROsLd5kinMLYBq8I4g4Xmk/gNH
+E+r1hspZcX30BJZr01lYPf7TMSVcGDiEo+afgv2MW5gxTs14nhr9hctJqvIni5ly
+/D6q1UEL2tU2ob8cbkdJf17ZSHwD2f2LSaCYJkJA69aSEaRkCldUxPUd1gJea6zu
+xICaEnL6VpPX/78whQYwvwt/Tv9XBZ0k7YXDK/umdaisLRbvfXknsuvCnQsH6qqF
+0wGjIChBWUMo0oHjqvbsezt3tkBigAVBRQHvFwY+3sAzm2fTYS5yh+Rp/BIAV0Ae
+cPUeybQ=
+-----END CERTIFICATE-----
+
Tor1
-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAlOpp8zfF+jEbI6R7nxnm
@@ -1607,3 +1638,15 @@ BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjEA7wNbeqy3eApyt4jf/7VGFAkK+qDm
fQjGGoe9GKhzvSbKYAydzpmfz1wPMOG+FDHqAjAU9JM8SaczepBGR7NjfRObTrdv
GDeAU/7dIOA1mjbRxwG55tzd8/8dLDoWV9mSOdY=
-----END CERTIFICATE-----
+
+# From https://crbug.com/745781#c7
+TumblrBackup
+-----BEGIN PUBLIC KEY-----
+MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvRHwz8nF03wWD2yzXa9t
+zxuxs0ITJIPofPKNshVgIKg7HIMgZ/i7e5Gr6pfoC/majqbcxPFd/AaGcQLjTxv0
+hnDPOnIicG2NpofNDE8n1cmZ0TM3fNp73E+Rp9Fb0p2uLglLBN4SaXRDNXCGGZBI
+uGs1xJmIDdgaYCKMCekvD2xwvpXKO9kcSrA7gvCFFP1hKBI6DAL1CNTBCiRKcm/S
+GWJTdi+BsmLN41ctt9HKOJ4/J/yrsl8Fbnatt55dEByJDJnwGvgCvkgYbM+pgc1H
+3zdFfyi/c3LKxf6ZkKYRNCSCL3UXZcLZZhHBwwC9kMMJQohmxwkV7t2imWWbtnTX
+jQIDAQAB
+-----END PUBLIC KEY-----
diff --git a/chromium/net/http/transport_security_state_static_unittest0.json b/chromium/net/http/transport_security_state_static_unittest0.json
deleted file mode 100644
index 8c89c38a5bb..00000000000
--- a/chromium/net/http/transport_security_state_static_unittest0.json
+++ /dev/null
@@ -1,175 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// This is a HSTS preloaded list used by the unittests to supply a custom
-// preload list when the default one isn't available. For more information on
-// the content and format see the comments in
-// transport_security_state_static.json.
-
-{
- "pinsets": [
- {
- "name": "test",
- "static_spki_hashes": [
- "TestSPKI1"
- ]
- },
- {
- "name": "google",
- "static_spki_hashes": [
- "TestSPKI1"
- ],
- "report_uri": "http://clients3.google.com/cert_upload_json"
- },
- {
- "name": "tor",
- "static_spki_hashes": [
- "TestSPKI1"
- ]
- },
- {
- "name": "twitterCom",
- "static_spki_hashes": [
- "TestSPKI1"
- ],
- "report_uri": "http://l.twimg.com/i/hpkp_report"
- },
- {
- "name": "twitterCDN",
- "static_spki_hashes": [
- "TestSPKI1"
- ],
- "report_uri": "http://l.twimg.com/i/hpkp_report"
- },
- {
- "name": "facebook",
- "static_spki_hashes": [
- "TestSPKI2"
- ]
- }
- ],
-
- "entries": [
- { "name": "pinningtest.appspot.com", "include_subdomains": true, "pins": "test" },
- { "name": "pinning-test.badssl.com", "include_subdomains": true, "pins": "test" },
- { "name": "preloaded-expect-ct.badssl.com", "expect_ct": true, "expect_ct_report_uri": "https://clients3.google.com/ct_upload" },
- { "name": "preloaded-expect-staple.badssl.com", "expect_staple": true, "expect_staple_report_uri": "https://report.badssl.com/expect-staple" },
- { "name": "preloaded-expect-staple-include-subdomains.badssl.com", "expect_staple": true, "expect_staple_report_uri": "https://report.badssl.com/expect-staple", "include_subdomains_for_expect_staple": true },
- { "name": "google", "include_subdomains": true, "mode": "force-https", "pins": "google" },
- { "name": "mail.google.com", "include_subdomains": true, "mode": "force-https", "pins": "google", "expect_ct": true, "expect_ct_report_uri": "https://clients3.google.com/ct_upload" },
- { "name": "accounts.google.com", "include_subdomains": true, "mode": "force-https", "pins": "google" },
- { "name": "appengine.google.com", "include_subdomains": true, "mode": "force-https", "pins": "google" },
- { "name": "checkout.google.com", "include_subdomains": true, "mode": "force-https", "pins": "google" },
- { "name": "chrome.google.com", "include_subdomains": true, "mode": "force-https", "pins": "google" },
- { "name": "docs.google.com", "include_subdomains": true, "mode": "force-https", "pins": "google" },
- { "name": "encrypted.google.com", "include_subdomains": true, "mode": "force-https", "pins": "google" },
- { "name": "hostedtalkgadget.google.com", "include_subdomains": true, "mode": "force-https", "pins": "google" },
- { "name": "play.google.com", "include_subdomains": true, "mode": "force-https", "pins": "google" },
- { "name": "plus.google.com", "include_subdomains": true, "mode": "force-https", "pins": "google" },
- { "name": "profiles.google.com", "include_subdomains": true, "mode": "force-https", "pins": "google" },
- { "name": "sites.google.com", "include_subdomains": true, "mode": "force-https", "pins": "google" },
- { "name": "spreadsheets.google.com", "include_subdomains": true, "mode": "force-https", "pins": "google" },
- { "name": "talkgadget.google.com", "include_subdomains": true, "mode": "force-https", "pins": "google" },
- { "name": "talk.google.com", "include_subdomains": true, "mode": "force-https", "pins": "google" },
- { "name": "wallet.google.com", "include_subdomains": true, "mode": "force-https", "pins": "google" },
- { "name": "apis.google.com", "include_subdomains": true, "mode": "force-https", "pins": "google" },
- { "name": "drive.google.com", "include_subdomains": true, "mode": "force-https", "pins": "google" },
- { "name": "gmail.com", "mode": "force-https", "pins": "google" },
- { "name": "googlecode.com", "include_subdomains": true, "pins": "google" },
- { "name": "googlemail.com", "mode": "force-https", "pins": "google" },
- { "name": "googleplex.com", "include_subdomains": true, "mode": "force-https", "pins": "google" },
- { "name": "groups.google.com", "include_subdomains": true, "mode": "force-https", "pins": "google" },
- { "name": "market.android.com", "include_subdomains": true, "mode": "force-https", "pins": "google" },
- { "name": "www.gmail.com", "mode": "force-https", "pins": "google" },
- { "name": "www.googlemail.com", "mode": "force-https", "pins": "google" },
- { "name": "google-analytics.com", "include_subdomains": true, "mode": "force-https", "pins": "google" },
- { "name": "chart.apis.google.com", "include_subdomains": true, "pins": "google" },
- { "name": "appspot.com", "include_subdomains": true, "pins": "google" },
- { "name": "doubleclick.net", "include_subdomains": true, "pins": "google" },
- { "name": "googleadservices.com", "include_subdomains": true, "pins": "google" },
- { "name": "googleapis.com", "include_subdomains": true, "pins": "google" },
- { "name": "google.com", "include_subdomains": true, "pins": "google" },
- { "name": "googlegroups.com", "include_subdomains": true, "pins": "google", "expect_ct": true, "expect_ct_report_uri": "https://clients3.google.com/ct_upload" },
- { "name": "googlesyndication.com", "include_subdomains": true, "pins": "google" },
- { "name": "googleusercontent.com", "include_subdomains": true, "pins": "google" },
- { "name": "gstatic.com", "include_subdomains": true, "pins": "google" },
- { "name": "youtube.com", "include_subdomains": true, "pins": "google" },
- { "name": "ytimg.com", "include_subdomains": true, "pins": "google" },
- { "name": "learn.doubleclick.net", "include_subdomains": true },
- { "name": "www.paypal.com", "mode": "force-https" },
- { "name": "paypal.com", "mode": "force-https" },
- { "name": "www.elanex.biz", "mode": "force-https" },
- { "name": "sunshinepress.org", "include_subdomains": true, "mode": "force-https" },
- { "name": "www.noisebridge.net", "mode": "force-https" },
- { "name": "neg9.org", "mode": "force-https" },
- { "name": "riseup.net", "include_subdomains": true, "mode": "force-https" },
- { "name": "factor.cc", "mode": "force-https" },
- { "name": "members.mayfirst.org", "include_subdomains": true, "mode": "force-https" },
- { "name": "support.mayfirst.org", "include_subdomains": true, "mode": "force-https" },
- { "name": "id.mayfirst.org", "include_subdomains": true, "mode": "force-https" },
- { "name": "lists.mayfirst.org", "include_subdomains": true, "mode": "force-https" },
- { "name": "aladdinschools.appspot.com", "mode": "force-https" },
- { "name": "ottospora.nl", "include_subdomains": true, "mode": "force-https" },
- { "name": "www.paycheckrecords.com", "mode": "force-https" },
- { "name": "lastpass.com", "mode": "force-https" },
- { "name": "www.lastpass.com", "mode": "force-https" },
- { "name": "keyerror.com", "include_subdomains": true, "mode": "force-https" },
- { "name": "entropia.de", "mode": "force-https" },
- { "name": "www.entropia.de", "mode": "force-https" },
- { "name": "romab.com", "include_subdomains": true, "mode": "force-https" },
- { "name": "logentries.com", "mode": "force-https" },
- { "name": "www.logentries.com", "mode": "force-https" },
- { "name": "stripe.com", "include_subdomains": true, "mode": "force-https" },
- { "name": "cloudsecurityalliance.org", "include_subdomains": true, "mode": "force-https" },
- { "name": "login.sapo.pt", "include_subdomains": true, "mode": "force-https" },
- { "name": "mattmccutchen.net", "include_subdomains": true, "mode": "force-https" },
- { "name": "betnet.fr", "include_subdomains": true, "mode": "force-https" },
- { "name": "uprotect.it", "include_subdomains": true, "mode": "force-https" },
- { "name": "squareup.com", "mode": "force-https" },
- { "name": "cert.se", "include_subdomains": true, "mode": "force-https" },
- { "name": "simon.butcher.name", "include_subdomains": true, "mode": "force-https" },
- { "name": "linx.net", "include_subdomains": true, "mode": "force-https" },
- { "name": "dropcam.com", "mode": "force-https" },
- { "name": "www.dropcam.com", "mode": "force-https" },
- { "name": "ebanking.indovinabank.com.vn", "include_subdomains": true, "mode": "force-https" },
- { "name": "epoxate.com", "mode": "force-https" },
- { "name": "torproject.org", "mode": "force-https", "pins": "tor" },
- { "name": "blog.torproject.org", "include_subdomains": true, "mode": "force-https", "pins": "tor" },
- { "name": "check.torproject.org", "include_subdomains": true, "mode": "force-https", "pins": "tor" },
- { "name": "www.torproject.org", "include_subdomains": true, "mode": "force-https", "pins": "tor" },
- { "name": "www.moneybookers.com", "include_subdomains": true, "mode": "force-https" },
- { "name": "ledgerscope.net", "mode": "force-https" },
- { "name": "www.ledgerscope.net", "mode": "force-https" },
- { "name": "app.recurly.com", "include_subdomains": true, "mode": "force-https" },
- { "name": "api.recurly.com", "include_subdomains": true, "mode": "force-https" },
- { "name": "greplin.com", "mode": "force-https" },
- { "name": "www.greplin.com", "mode": "force-https" },
- { "name": "luneta.nearbuysystems.com", "include_subdomains": true, "mode": "force-https" },
- { "name": "ubertt.org", "include_subdomains": true, "mode": "force-https" },
- { "name": "pixi.me", "include_subdomains": true, "mode": "force-https" },
- { "name": "grepular.com", "include_subdomains": true, "mode": "force-https" },
- { "name": "mydigipass.com", "mode": "force-https" },
- { "name": "www.mydigipass.com", "mode": "force-https" },
- { "name": "developer.mydigipass.com", "mode": "force-https" },
- { "name": "www.developer.mydigipass.com", "mode": "force-https" },
- { "name": "sandbox.mydigipass.com", "mode": "force-https" },
- { "name": "www.sandbox.mydigipass.com", "mode": "force-https" },
- { "name": "bigshinylock.minazo.net", "include_subdomains": true, "mode": "force-https" },
- { "name": "crate.io", "include_subdomains": true, "mode": "force-https" },
- { "name": "twitter.com", "mode": "force-https", "pins": "twitterCom" },
- { "name": "www.twitter.com", "include_subdomains": true, "mode": "force-https", "pins": "twitterCom" },
- { "name": "api.twitter.com", "include_subdomains": true, "pins": "twitterCDN" },
- { "name": "oauth.twitter.com", "include_subdomains": true, "pins": "twitterCom" },
- { "name": "mobile.twitter.com", "include_subdomains": true, "pins": "twitterCom" },
- { "name": "dev.twitter.com", "include_subdomains": true, "pins": "twitterCom" },
- { "name": "business.twitter.com", "include_subdomains": true, "pins": "twitterCom" },
- { "name": "platform.twitter.com", "include_subdomains": true, "pins": "twitterCDN" },
- { "name": "twimg.com", "include_subdomains": true, "pins": "twitterCDN" },
- { "name": "facebook.com", "mode": "force-https", "include_subdomains_for_pinning": true, "pins": "facebook" },
- { "name": "www.facebook.com", "include_subdomains": true, "mode": "force-https", "pins": "facebook" },
- { "name": "recurly.com", "include_subdomains": true, "mode": "force-https" },
- { "name": "crypto.is", "include_subdomains": true, "mode": "force-https", "expect_ct": true, "expect_ct_report_uri": "https://clients3.google.com/ct_upload" }
- ]
-}
-
diff --git a/chromium/net/http/transport_security_state_static_unittest3.json b/chromium/net/http/transport_security_state_static_unittest3.json
index b1a1a69bd89..1c740e1998e 100644
--- a/chromium/net/http/transport_security_state_static_unittest3.json
+++ b/chromium/net/http/transport_security_state_static_unittest3.json
@@ -58,6 +58,11 @@
"expect_staple": true,
"include_subdomains_for_expect_staple": true,
"expect_staple_report_uri": "https://report.badssl.com/staple-upload"
+ }, {
+ // Keep this a simple entry in the context of TrieWriter::IsSimpleEntry().
+ "name": "simple-entry.example.com",
+ "mode": "force-https",
+ "include_subdomains": true
}
]
}
diff --git a/chromium/net/http/transport_security_state_static_unittest_default.json b/chromium/net/http/transport_security_state_static_unittest_default.json
new file mode 100644
index 00000000000..e8a50ce7a2b
--- /dev/null
+++ b/chromium/net/http/transport_security_state_static_unittest_default.json
@@ -0,0 +1,51 @@
+// Copyright 2017 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// This is a HSTS preload list for net_unittests. Use or add entries in this
+// file when you need to write a test that has expectations that depend on
+// static transport security state. Tests should never depend on the real
+// preload list. The format of this file is identical to
+// transport_security_state_static.json.
+
+{
+ "pinsets": [
+ {
+ "name": "withoutRejectedPins",
+ "static_spki_hashes": [
+ "TestSPKI1",
+ "GoodPin1"
+ ]
+ }, {
+ "name": "withRejectedPins",
+ "static_spki_hashes": [
+ "GoodPin1"
+ ],
+ "bad_static_spki_hashes": [
+ "TestSPKI1"
+ ]
+ }, {
+ "name": "withReportUri",
+ "static_spki_hashes": [
+ "GoodPin1"
+ ],
+ "report_uri": "http://report-uri.preloaded.test/pkp"
+ }
+ ],
+
+ "entries": [
+ { "name": "hsts-preloaded.test", "mode": "force-https" },
+ { "name": "include-subdomains-hsts-preloaded.test", "mode": "force-https", "include_subdomains": true },
+
+ { "name": "no-rejected-pins-pkp.preloaded.test", "pins": "withoutRejectedPins" },
+ { "name": "with-report-uri-pkp.preloaded.test", "pins": "withReportUri" },
+
+ { "name": "hsts-hpkp-preloaded.test", "mode": "force-https", "pins": "withoutRejectedPins" },
+
+ { "name": "expect-ct.preloaded.test", "expect_ct": true, "expect_ct_report_uri": "http://report-uri.preloaded.test/expect-ct" },
+
+ { "name": "expect-staple.preloaded.test", "expect_staple": true, "expect_staple_report_uri": "http://report-uri.preloaded.test/expect-staple" },
+ { "name": "include-subdomains-expect-staple.preloaded.test", "expect_staple": true, "include_subdomains_for_expect_staple": true, "expect_staple_report_uri": "http://report-uri.preloaded.test/expect-staple" }
+ ]
+}
+
diff --git a/chromium/net/http/transport_security_state_static_unittest_default.pins b/chromium/net/http/transport_security_state_static_unittest_default.pins
new file mode 100644
index 00000000000..900b7fd7333
--- /dev/null
+++ b/chromium/net/http/transport_security_state_static_unittest_default.pins
@@ -0,0 +1,12 @@
+# Copyright 2017 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+#
+# For use with transport_security_state_static_unittest_default.json.
+# The format of this file is identical to transport_security_state_static.pins.
+
+TestSPKI1
+sha256/w3y7Yg3RzkAyhCeBoLHm71YRnuuUW87AAR/DVpLMTw4=
+
+GoodPin1
+sha256/Nn8jk5By4Vkq6BeOVZ7R7AC6XUUBZsWmUbJR1f1Y5FY=
diff --git a/chromium/net/http/transport_security_state_unittest.cc b/chromium/net/http/transport_security_state_unittest.cc
index fc4e5d4b0a9..689cfeb079d 100644
--- a/chromium/net/http/transport_security_state_unittest.cc
+++ b/chromium/net/http/transport_security_state_unittest.cc
@@ -5,13 +5,13 @@
#include "net/http/transport_security_state.h"
#include <algorithm>
+#include <memory>
#include <string>
#include <vector>
#include "base/base64.h"
#include "base/files/file_path.h"
#include "base/json/json_reader.h"
-#include "base/memory/ptr_util.h"
#include "base/metrics/field_trial.h"
#include "base/rand_util.h"
#include "base/strings/string_piece.h"
@@ -19,6 +19,7 @@
#include "base/test/mock_entropy_provider.h"
#include "base/test/scoped_feature_list.h"
#include "base/values.h"
+#include "build/build_config.h"
#include "crypto/openssl_util.h"
#include "crypto/sha2.h"
#include "net/base/host_port_pair.h"
@@ -44,10 +45,9 @@ namespace net {
namespace {
-namespace test0 {
-#include "net/http/transport_security_state_static_unittest0.h"
+namespace test_default {
+#include "net/http/transport_security_state_static_unittest_default.h"
}
-
namespace test1 {
#include "net/http/transport_security_state_static_unittest1.h"
}
@@ -62,28 +62,25 @@ const char kHost[] = "example.test";
const char kSubdomain[] = "foo.example.test";
const uint16_t kPort = 443;
const char kReportUri[] = "http://report-example.test/test";
-const char kExpectCTStaticHostname[] = "preloaded-expect-ct.badssl.com";
-const char kExpectCTStaticReportURI[] = "https://clients3.google.com/ct_upload";
-const char kExpectStapleStaticHostname[] = "preloaded-expect-staple.badssl.com";
+const char kExpectCTStaticHostname[] = "expect-ct.preloaded.test";
+const char kExpectCTStaticReportURI[] =
+ "http://report-uri.preloaded.test/expect-ct";
+const char kExpectStapleStaticHostname[] = "expect-staple.preloaded.test";
const char kExpectStapleStaticReportURI[] =
- "https://report.badssl.com/expect-staple";
+ "http://report-uri.preloaded.test/expect-staple";
const char kExpectStapleStaticIncludeSubdomainsHostname[] =
- "preloaded-expect-staple-include-subdomains.badssl.com";
+ "include-subdomains-expect-staple.preloaded.test";
+
+const char kGoodPin1[] = "fzP+pVAbH0hRoUphJKenIP8+2tD/d2QH9J+kQNieM6Q=";
+const char kGoodPin2[] = "9vRUVdjloCa4wXUKfDWotV5eUXYD7vu0v0z9SRzQdzg=";
+const char kGoodPin3[] = "Nn8jk5By4Vkq6BeOVZ7R7AC6XUUBZsWmUbJR1f1Y5FY=";
-// kGoodPath is blog.torproject.org.
const char* const kGoodPath[] = {
- "sha256/4osU79hfY3P2+WJGlT2mxmSL+5FIwLEVxTQcavyBNgQ=",
- "sha256/k2v657xBsOVe1PQRwOsHsw3bsGT2VzIqz5K+59sNQws=",
- "sha256/WoiWRyIOVNa9ihaBciRSC7XHjliYS9VwUGOIud4PB18=",
- nullptr,
+ "sha256/fzP+pVAbH0hRoUphJKenIP8+2tD/d2QH9J+kQNieM6Q=",
+ "sha256/9vRUVdjloCa4wXUKfDWotV5eUXYD7vu0v0z9SRzQdzg=",
+ "sha256/Nn8jk5By4Vkq6BeOVZ7R7AC6XUUBZsWmUbJR1f1Y5FY=", nullptr,
};
-const char kGoodPin1[] = "4osU79hfY3P2+WJGlT2mxmSL+5FIwLEVxTQcavyBNgQ=";
-const char kGoodPin2[] = "k2v657xBsOVe1PQRwOsHsw3bsGT2VzIqz5K+59sNQws=";
-const char kGoodPin3[] = "WoiWRyIOVNa9ihaBciRSC7XHjliYS9VwUGOIud4PB18=";
-
-// kBadPath is plus.google.com via Trustcenter, which is utterly wrong for
-// torproject.org.
const char* const kBadPath[] = {
"sha256/1111111111111111111111111111111111111111111=",
"sha256/2222222222222222222222222222222222222222222=",
@@ -404,9 +401,7 @@ void CheckExpectStapleReport(TransportSecurityState* state,
class TransportSecurityStateTest : public testing::Test {
public:
TransportSecurityStateTest() {
-#if !BUILDFLAG(INCLUDE_TRANSPORT_SECURITY_STATE_PRELOAD_LIST)
- SetTransportSecurityStateSourceForTesting(&test0::kHSTSSource);
-#endif
+ SetTransportSecurityStateSourceForTesting(&test_default::kHSTSSource);
}
~TransportSecurityStateTest() override {
@@ -521,10 +516,10 @@ TEST_F(TransportSecurityStateTest, DomainNameOddities) {
// Now do the same for preloaded entries
TransportSecurityState state5;
- EXPECT_TRUE(state5.ShouldUpgradeToSSL("accounts.google.com"));
- EXPECT_TRUE(state5.ShouldUpgradeToSSL("accounts.google.com."));
- EXPECT_FALSE(state5.ShouldUpgradeToSSL("accounts..google.com"));
- EXPECT_FALSE(state5.ShouldUpgradeToSSL("accounts..google.com."));
+ EXPECT_TRUE(state5.ShouldUpgradeToSSL("hsts-preloaded.test"));
+ EXPECT_TRUE(state5.ShouldUpgradeToSSL("hsts-preloaded.test."));
+ EXPECT_FALSE(state5.ShouldUpgradeToSSL("hsts-preloaded..test"));
+ EXPECT_FALSE(state5.ShouldUpgradeToSSL("hsts-preloaded..test."));
}
TEST_F(TransportSecurityStateTest, SimpleMatches) {
@@ -564,8 +559,9 @@ TEST_F(TransportSecurityStateTest, MatchesCase2) {
EXPECT_TRUE(state.ShouldUpgradeToSSL("EXample.coM"));
// Check static entries
- EXPECT_TRUE(state.ShouldUpgradeToSSL("AccounTs.GooGle.com"));
- EXPECT_TRUE(state.ShouldUpgradeToSSL("mail.google.COM"));
+ EXPECT_TRUE(state.ShouldUpgradeToSSL("hStS-prelOAded.tEsT"));
+ EXPECT_TRUE(
+ state.ShouldUpgradeToSSL("inClude-subDOmaIns-hsts-prEloaDed.TesT"));
}
TEST_F(TransportSecurityStateTest, SubdomainMatches) {
@@ -884,398 +880,6 @@ TEST_F(TransportSecurityStateTest, DeleteDynamicDataForHost) {
state.GetDynamicExpectCTState("example1.test", &expect_ct_state));
}
-TEST_F(TransportSecurityStateTest, EnableStaticPins) {
- TransportSecurityState state;
- TransportSecurityState::STSState sts_state;
- TransportSecurityState::PKPState pkp_state;
-
- EnableStaticPins(&state);
-
- EXPECT_TRUE(
- state.GetStaticDomainState("chrome.google.com", &sts_state, &pkp_state));
- EXPECT_FALSE(pkp_state.spki_hashes.empty());
-}
-
-TEST_F(TransportSecurityStateTest, DisableStaticPins) {
- TransportSecurityState state;
- TransportSecurityState::STSState sts_state;
- TransportSecurityState::PKPState pkp_state;
-
- DisableStaticPins(&state);
- EXPECT_TRUE(
- state.GetStaticDomainState("chrome.google.com", &sts_state, &pkp_state));
- EXPECT_TRUE(pkp_state.spki_hashes.empty());
-}
-
-TEST_F(TransportSecurityStateTest, IsPreloaded) {
- const std::string paypal = "paypal.com";
- const std::string www_paypal = "www.paypal.com";
- const std::string foo_paypal = "foo.paypal.com";
- const std::string a_www_paypal = "a.www.paypal.com";
- const std::string abc_paypal = "a.b.c.paypal.com";
- const std::string example = "example.com";
- const std::string aypal = "aypal.com";
- const std::string google = "google";
- const std::string www_google = "www.google";
-
- TransportSecurityState state;
- TransportSecurityState::STSState sts_state;
- TransportSecurityState::PKPState pkp_state;
-
- EXPECT_TRUE(GetStaticDomainState(&state, paypal, &sts_state, &pkp_state));
- EXPECT_TRUE(GetStaticDomainState(&state, www_paypal, &sts_state, &pkp_state));
- EXPECT_FALSE(sts_state.include_subdomains);
- EXPECT_TRUE(GetStaticDomainState(&state, google, &sts_state, &pkp_state));
- EXPECT_TRUE(GetStaticDomainState(&state, www_google, &sts_state, &pkp_state));
- EXPECT_FALSE(
- GetStaticDomainState(&state, a_www_paypal, &sts_state, &pkp_state));
- EXPECT_FALSE(
- GetStaticDomainState(&state, abc_paypal, &sts_state, &pkp_state));
- EXPECT_FALSE(GetStaticDomainState(&state, example, &sts_state, &pkp_state));
- EXPECT_FALSE(GetStaticDomainState(&state, aypal, &sts_state, &pkp_state));
-}
-
-TEST_F(TransportSecurityStateTest, PreloadedDomainSet) {
- TransportSecurityState state;
- TransportSecurityState::STSState sts_state;
- TransportSecurityState::PKPState pkp_state;
-
- // The domain wasn't being set, leading to a blank string in the
- // chrome://net-internals/#hsts UI. So test that.
- EXPECT_TRUE(
- state.GetStaticDomainState("market.android.com", &sts_state, &pkp_state));
- EXPECT_EQ(sts_state.domain, "market.android.com");
- EXPECT_EQ(pkp_state.domain, "market.android.com");
- EXPECT_TRUE(state.GetStaticDomainState("sub.market.android.com", &sts_state,
- &pkp_state));
- EXPECT_EQ(sts_state.domain, "market.android.com");
- EXPECT_EQ(pkp_state.domain, "market.android.com");
-}
-
-static bool StaticShouldRedirect(const char* hostname) {
- TransportSecurityState state;
- TransportSecurityState::STSState sts_state;
- TransportSecurityState::PKPState pkp_state;
- return state.GetStaticDomainState(hostname, &sts_state, &pkp_state) &&
- sts_state.ShouldUpgradeToSSL();
-}
-
-static bool HasStaticState(const char* hostname) {
- TransportSecurityState state;
- TransportSecurityState::STSState sts_state;
- TransportSecurityState::PKPState pkp_state;
- return state.GetStaticDomainState(hostname, &sts_state, &pkp_state);
-}
-
-static bool HasStaticPublicKeyPins(const char* hostname) {
- TransportSecurityState state;
- TransportSecurityStateTest::EnableStaticPins(&state);
- TransportSecurityState::STSState sts_state;
- TransportSecurityState::PKPState pkp_state;
- if (!state.GetStaticDomainState(hostname, &sts_state, &pkp_state))
- return false;
-
- return pkp_state.HasPublicKeyPins();
-}
-
-static bool OnlyPinningInStaticState(const char* hostname) {
- TransportSecurityState state;
- TransportSecurityStateTest::EnableStaticPins(&state);
- TransportSecurityState::STSState sts_state;
- TransportSecurityState::PKPState pkp_state;
- if (!state.GetStaticDomainState(hostname, &sts_state, &pkp_state))
- return false;
-
- return (pkp_state.spki_hashes.size() > 0 ||
- pkp_state.bad_spki_hashes.size() > 0) &&
- !sts_state.ShouldUpgradeToSSL();
-}
-
-TEST_F(TransportSecurityStateTest, Preloaded) {
- TransportSecurityState state;
- TransportSecurityState::STSState sts_state;
- TransportSecurityState::PKPState pkp_state;
-
- // We do more extensive checks for the first domain.
- EXPECT_TRUE(
- state.GetStaticDomainState("www.paypal.com", &sts_state, &pkp_state));
- EXPECT_EQ(sts_state.upgrade_mode,
- TransportSecurityState::STSState::MODE_FORCE_HTTPS);
- EXPECT_FALSE(sts_state.include_subdomains);
- EXPECT_FALSE(pkp_state.include_subdomains);
-
- EXPECT_TRUE(HasStaticState("paypal.com"));
- EXPECT_FALSE(HasStaticState("www2.paypal.com"));
-
- // Google hosts:
-
- EXPECT_TRUE(StaticShouldRedirect("chrome.google.com"));
- EXPECT_TRUE(StaticShouldRedirect("checkout.google.com"));
- EXPECT_TRUE(StaticShouldRedirect("wallet.google.com"));
- EXPECT_TRUE(StaticShouldRedirect("docs.google.com"));
- EXPECT_TRUE(StaticShouldRedirect("sites.google.com"));
- EXPECT_TRUE(StaticShouldRedirect("drive.google.com"));
- EXPECT_TRUE(StaticShouldRedirect("spreadsheets.google.com"));
- EXPECT_TRUE(StaticShouldRedirect("appengine.google.com"));
- EXPECT_TRUE(StaticShouldRedirect("market.android.com"));
- EXPECT_TRUE(StaticShouldRedirect("encrypted.google.com"));
- EXPECT_TRUE(StaticShouldRedirect("accounts.google.com"));
- EXPECT_TRUE(StaticShouldRedirect("profiles.google.com"));
- EXPECT_TRUE(StaticShouldRedirect("mail.google.com"));
- EXPECT_TRUE(StaticShouldRedirect("chatenabled.mail.google.com"));
- EXPECT_TRUE(StaticShouldRedirect("talkgadget.google.com"));
- EXPECT_TRUE(StaticShouldRedirect("hostedtalkgadget.google.com"));
- EXPECT_TRUE(StaticShouldRedirect("talk.google.com"));
- EXPECT_TRUE(StaticShouldRedirect("plus.google.com"));
- EXPECT_TRUE(StaticShouldRedirect("groups.google.com"));
- EXPECT_TRUE(StaticShouldRedirect("apis.google.com"));
- EXPECT_FALSE(StaticShouldRedirect("chart.apis.google.com"));
- EXPECT_TRUE(StaticShouldRedirect("ssl.google-analytics.com"));
- EXPECT_TRUE(StaticShouldRedirect("google"));
- EXPECT_TRUE(StaticShouldRedirect("foo.google"));
- EXPECT_TRUE(StaticShouldRedirect("gmail.com"));
- EXPECT_TRUE(StaticShouldRedirect("www.gmail.com"));
- EXPECT_TRUE(StaticShouldRedirect("googlemail.com"));
- EXPECT_TRUE(StaticShouldRedirect("www.googlemail.com"));
- EXPECT_TRUE(StaticShouldRedirect("googleplex.com"));
- EXPECT_TRUE(StaticShouldRedirect("www.googleplex.com"));
- EXPECT_TRUE(StaticShouldRedirect("www.google-analytics.com"));
-
- // These domains used to be only HSTS when SNI was available.
- EXPECT_TRUE(state.GetStaticDomainState("gmail.com", &sts_state, &pkp_state));
- EXPECT_TRUE(
- state.GetStaticDomainState("www.gmail.com", &sts_state, &pkp_state));
- EXPECT_TRUE(
- state.GetStaticDomainState("googlemail.com", &sts_state, &pkp_state));
- EXPECT_TRUE(
- state.GetStaticDomainState("www.googlemail.com", &sts_state, &pkp_state));
-
- // Other hosts:
-
- EXPECT_TRUE(StaticShouldRedirect("aladdinschools.appspot.com"));
-
- EXPECT_TRUE(StaticShouldRedirect("ottospora.nl"));
- EXPECT_TRUE(StaticShouldRedirect("www.ottospora.nl"));
-
- EXPECT_TRUE(StaticShouldRedirect("www.paycheckrecords.com"));
-
- EXPECT_TRUE(StaticShouldRedirect("lastpass.com"));
- EXPECT_TRUE(StaticShouldRedirect("www.lastpass.com"));
- EXPECT_FALSE(HasStaticState("blog.lastpass.com"));
-
- EXPECT_TRUE(StaticShouldRedirect("keyerror.com"));
- EXPECT_TRUE(StaticShouldRedirect("www.keyerror.com"));
-
- EXPECT_TRUE(StaticShouldRedirect("entropia.de"));
- EXPECT_TRUE(StaticShouldRedirect("www.entropia.de"));
- EXPECT_FALSE(HasStaticState("foo.entropia.de"));
-
- EXPECT_TRUE(StaticShouldRedirect("www.elanex.biz"));
- EXPECT_FALSE(HasStaticState("elanex.biz"));
- EXPECT_FALSE(HasStaticState("foo.elanex.biz"));
-
- EXPECT_TRUE(StaticShouldRedirect("sunshinepress.org"));
- EXPECT_TRUE(StaticShouldRedirect("www.sunshinepress.org"));
- EXPECT_TRUE(StaticShouldRedirect("a.b.sunshinepress.org"));
-
- EXPECT_TRUE(StaticShouldRedirect("www.noisebridge.net"));
- EXPECT_FALSE(HasStaticState("noisebridge.net"));
- EXPECT_FALSE(HasStaticState("foo.noisebridge.net"));
-
- EXPECT_TRUE(StaticShouldRedirect("neg9.org"));
- EXPECT_FALSE(HasStaticState("www.neg9.org"));
-
- EXPECT_TRUE(StaticShouldRedirect("riseup.net"));
- EXPECT_TRUE(StaticShouldRedirect("foo.riseup.net"));
-
- EXPECT_TRUE(StaticShouldRedirect("factor.cc"));
- EXPECT_FALSE(HasStaticState("www.factor.cc"));
-
- EXPECT_TRUE(StaticShouldRedirect("members.mayfirst.org"));
- EXPECT_TRUE(StaticShouldRedirect("support.mayfirst.org"));
- EXPECT_TRUE(StaticShouldRedirect("id.mayfirst.org"));
- EXPECT_TRUE(StaticShouldRedirect("lists.mayfirst.org"));
- EXPECT_FALSE(HasStaticState("www.mayfirst.org"));
-
- EXPECT_TRUE(StaticShouldRedirect("romab.com"));
- EXPECT_TRUE(StaticShouldRedirect("www.romab.com"));
- EXPECT_TRUE(StaticShouldRedirect("foo.romab.com"));
-
- EXPECT_TRUE(StaticShouldRedirect("logentries.com"));
- EXPECT_TRUE(StaticShouldRedirect("www.logentries.com"));
- EXPECT_FALSE(HasStaticState("foo.logentries.com"));
-
- EXPECT_TRUE(StaticShouldRedirect("stripe.com"));
- EXPECT_TRUE(StaticShouldRedirect("foo.stripe.com"));
-
- EXPECT_TRUE(StaticShouldRedirect("cloudsecurityalliance.org"));
- EXPECT_TRUE(StaticShouldRedirect("foo.cloudsecurityalliance.org"));
-
- EXPECT_TRUE(StaticShouldRedirect("login.sapo.pt"));
- EXPECT_TRUE(StaticShouldRedirect("foo.login.sapo.pt"));
-
- EXPECT_TRUE(StaticShouldRedirect("mattmccutchen.net"));
- EXPECT_TRUE(StaticShouldRedirect("foo.mattmccutchen.net"));
-
- EXPECT_TRUE(StaticShouldRedirect("betnet.fr"));
- EXPECT_TRUE(StaticShouldRedirect("foo.betnet.fr"));
-
- EXPECT_TRUE(StaticShouldRedirect("uprotect.it"));
- EXPECT_TRUE(StaticShouldRedirect("foo.uprotect.it"));
-
- EXPECT_TRUE(StaticShouldRedirect("squareup.com"));
- EXPECT_FALSE(HasStaticState("foo.squareup.com"));
-
- EXPECT_TRUE(StaticShouldRedirect("cert.se"));
- EXPECT_TRUE(StaticShouldRedirect("foo.cert.se"));
-
- EXPECT_TRUE(StaticShouldRedirect("crypto.is"));
- EXPECT_TRUE(StaticShouldRedirect("foo.crypto.is"));
-
- EXPECT_TRUE(StaticShouldRedirect("simon.butcher.name"));
- EXPECT_TRUE(StaticShouldRedirect("foo.simon.butcher.name"));
-
- EXPECT_TRUE(StaticShouldRedirect("linx.net"));
- EXPECT_TRUE(StaticShouldRedirect("foo.linx.net"));
-
- EXPECT_TRUE(StaticShouldRedirect("dropcam.com"));
- EXPECT_TRUE(StaticShouldRedirect("www.dropcam.com"));
- EXPECT_FALSE(HasStaticState("foo.dropcam.com"));
-
- EXPECT_TRUE(StaticShouldRedirect("ebanking.indovinabank.com.vn"));
- EXPECT_TRUE(StaticShouldRedirect("foo.ebanking.indovinabank.com.vn"));
-
- EXPECT_TRUE(StaticShouldRedirect("epoxate.com"));
- EXPECT_FALSE(HasStaticState("foo.epoxate.com"));
-
- EXPECT_FALSE(HasStaticState("foo.torproject.org"));
-
- EXPECT_TRUE(StaticShouldRedirect("www.moneybookers.com"));
- EXPECT_FALSE(HasStaticState("moneybookers.com"));
-
- EXPECT_TRUE(StaticShouldRedirect("ledgerscope.net"));
- EXPECT_TRUE(StaticShouldRedirect("www.ledgerscope.net"));
- EXPECT_FALSE(HasStaticState("status.ledgerscope.net"));
-
- EXPECT_TRUE(StaticShouldRedirect("foo.app.recurly.com"));
- EXPECT_TRUE(StaticShouldRedirect("foo.api.recurly.com"));
-
- EXPECT_TRUE(StaticShouldRedirect("greplin.com"));
- EXPECT_TRUE(StaticShouldRedirect("www.greplin.com"));
- EXPECT_FALSE(HasStaticState("foo.greplin.com"));
-
- EXPECT_TRUE(StaticShouldRedirect("luneta.nearbuysystems.com"));
- EXPECT_TRUE(StaticShouldRedirect("foo.luneta.nearbuysystems.com"));
-
- EXPECT_TRUE(StaticShouldRedirect("ubertt.org"));
- EXPECT_TRUE(StaticShouldRedirect("foo.ubertt.org"));
-
- EXPECT_TRUE(StaticShouldRedirect("pixi.me"));
- EXPECT_TRUE(StaticShouldRedirect("www.pixi.me"));
-
- EXPECT_TRUE(StaticShouldRedirect("grepular.com"));
- EXPECT_TRUE(StaticShouldRedirect("www.grepular.com"));
-
- EXPECT_TRUE(StaticShouldRedirect("mydigipass.com"));
- EXPECT_FALSE(StaticShouldRedirect("foo.mydigipass.com"));
- EXPECT_TRUE(StaticShouldRedirect("www.mydigipass.com"));
- EXPECT_FALSE(StaticShouldRedirect("foo.www.mydigipass.com"));
- EXPECT_TRUE(StaticShouldRedirect("developer.mydigipass.com"));
- EXPECT_FALSE(StaticShouldRedirect("foo.developer.mydigipass.com"));
- EXPECT_TRUE(StaticShouldRedirect("www.developer.mydigipass.com"));
- EXPECT_FALSE(StaticShouldRedirect("foo.www.developer.mydigipass.com"));
- EXPECT_TRUE(StaticShouldRedirect("sandbox.mydigipass.com"));
- EXPECT_FALSE(StaticShouldRedirect("foo.sandbox.mydigipass.com"));
- EXPECT_TRUE(StaticShouldRedirect("www.sandbox.mydigipass.com"));
- EXPECT_FALSE(StaticShouldRedirect("foo.www.sandbox.mydigipass.com"));
-
- EXPECT_TRUE(StaticShouldRedirect("bigshinylock.minazo.net"));
- EXPECT_TRUE(StaticShouldRedirect("foo.bigshinylock.minazo.net"));
-
- EXPECT_TRUE(StaticShouldRedirect("crate.io"));
- EXPECT_TRUE(StaticShouldRedirect("foo.crate.io"));
-}
-
-// http://crbug.com/624946
-#if defined(OS_IOS)
-#define MAYBE_PreloadedPins DISABLED_PreloadedPins
-#else
-#define MAYBE_PreloadedPins PreloadedPins
-#endif
-TEST_F(TransportSecurityStateTest, MAYBE_PreloadedPins) {
- TransportSecurityState state;
- EnableStaticPins(&state);
- TransportSecurityState::STSState sts_state;
- TransportSecurityState::PKPState pkp_state;
-
- // We do more extensive checks for the first domain.
- EXPECT_TRUE(
- state.GetStaticDomainState("www.paypal.com", &sts_state, &pkp_state));
- EXPECT_EQ(sts_state.upgrade_mode,
- TransportSecurityState::STSState::MODE_FORCE_HTTPS);
- EXPECT_FALSE(sts_state.include_subdomains);
- EXPECT_FALSE(pkp_state.include_subdomains);
-
- EXPECT_TRUE(OnlyPinningInStaticState("www.google.com"));
- EXPECT_TRUE(OnlyPinningInStaticState("foo.google.com"));
- EXPECT_TRUE(OnlyPinningInStaticState("google.com"));
- EXPECT_TRUE(OnlyPinningInStaticState("www.youtube.com"));
- EXPECT_TRUE(OnlyPinningInStaticState("youtube.com"));
- EXPECT_TRUE(OnlyPinningInStaticState("i.ytimg.com"));
- EXPECT_TRUE(OnlyPinningInStaticState("ytimg.com"));
- EXPECT_TRUE(OnlyPinningInStaticState("googleusercontent.com"));
- EXPECT_TRUE(OnlyPinningInStaticState("www.googleusercontent.com"));
- EXPECT_TRUE(OnlyPinningInStaticState("googleapis.com"));
- EXPECT_TRUE(OnlyPinningInStaticState("googleadservices.com"));
- EXPECT_TRUE(OnlyPinningInStaticState("googlecode.com"));
- EXPECT_TRUE(OnlyPinningInStaticState("appspot.com"));
- EXPECT_TRUE(OnlyPinningInStaticState("googlesyndication.com"));
- EXPECT_TRUE(OnlyPinningInStaticState("doubleclick.net"));
- EXPECT_TRUE(OnlyPinningInStaticState("googlegroups.com"));
-
- EXPECT_TRUE(HasStaticPublicKeyPins("torproject.org"));
- EXPECT_TRUE(HasStaticPublicKeyPins("www.torproject.org"));
- EXPECT_TRUE(HasStaticPublicKeyPins("check.torproject.org"));
- EXPECT_TRUE(HasStaticPublicKeyPins("blog.torproject.org"));
- EXPECT_FALSE(HasStaticState("foo.torproject.org"));
-
- EXPECT_TRUE(
- state.GetStaticDomainState("torproject.org", &sts_state, &pkp_state));
- EXPECT_FALSE(pkp_state.spki_hashes.empty());
- EXPECT_TRUE(
- state.GetStaticDomainState("www.torproject.org", &sts_state, &pkp_state));
- EXPECT_FALSE(pkp_state.spki_hashes.empty());
- EXPECT_TRUE(state.GetStaticDomainState("check.torproject.org", &sts_state,
- &pkp_state));
- EXPECT_FALSE(pkp_state.spki_hashes.empty());
- EXPECT_TRUE(state.GetStaticDomainState("blog.torproject.org", &sts_state,
- &pkp_state));
- EXPECT_FALSE(pkp_state.spki_hashes.empty());
-
- EXPECT_TRUE(HasStaticPublicKeyPins("www.twitter.com"));
-
- // Check that Facebook subdomains have pinning but not HSTS.
- EXPECT_TRUE(
- state.GetStaticDomainState("facebook.com", &sts_state, &pkp_state));
- EXPECT_FALSE(pkp_state.spki_hashes.empty());
- EXPECT_TRUE(StaticShouldRedirect("facebook.com"));
-
- EXPECT_TRUE(
- state.GetStaticDomainState("foo.facebook.com", &sts_state, &pkp_state));
- EXPECT_FALSE(pkp_state.spki_hashes.empty());
- EXPECT_FALSE(StaticShouldRedirect("foo.facebook.com"));
-
- EXPECT_TRUE(
- state.GetStaticDomainState("www.facebook.com", &sts_state, &pkp_state));
- EXPECT_FALSE(pkp_state.spki_hashes.empty());
- EXPECT_TRUE(StaticShouldRedirect("www.facebook.com"));
-
- EXPECT_TRUE(state.GetStaticDomainState("foo.www.facebook.com", &sts_state,
- &pkp_state));
- EXPECT_FALSE(pkp_state.spki_hashes.empty());
- EXPECT_TRUE(StaticShouldRedirect("foo.www.facebook.com"));
-}
-
TEST_F(TransportSecurityStateTest, LongNames) {
TransportSecurityState state;
const char kLongName[] =
@@ -1289,64 +893,7 @@ TEST_F(TransportSecurityStateTest, LongNames) {
EXPECT_FALSE(state.GetDynamicPKPState(kLongName, &pkp_state));
}
-TEST_F(TransportSecurityStateTest, BuiltinCertPins) {
- TransportSecurityState state;
- EnableStaticPins(&state);
- TransportSecurityState::STSState sts_state;
- TransportSecurityState::PKPState pkp_state;
-
- EXPECT_TRUE(
- state.GetStaticDomainState("chrome.google.com", &sts_state, &pkp_state));
- EXPECT_TRUE(HasStaticPublicKeyPins("chrome.google.com"));
-
- HashValueVector hashes;
- std::string failure_log;
- // Checks that a built-in list does exist.
- EXPECT_FALSE(pkp_state.CheckPublicKeyPins(hashes, &failure_log));
- EXPECT_FALSE(HasStaticPublicKeyPins("www.paypal.com"));
-
- EXPECT_TRUE(HasStaticPublicKeyPins("docs.google.com"));
- EXPECT_TRUE(HasStaticPublicKeyPins("1.docs.google.com"));
- EXPECT_TRUE(HasStaticPublicKeyPins("sites.google.com"));
- EXPECT_TRUE(HasStaticPublicKeyPins("drive.google.com"));
- EXPECT_TRUE(HasStaticPublicKeyPins("spreadsheets.google.com"));
- EXPECT_TRUE(HasStaticPublicKeyPins("wallet.google.com"));
- EXPECT_TRUE(HasStaticPublicKeyPins("checkout.google.com"));
- EXPECT_TRUE(HasStaticPublicKeyPins("appengine.google.com"));
- EXPECT_TRUE(HasStaticPublicKeyPins("market.android.com"));
- EXPECT_TRUE(HasStaticPublicKeyPins("encrypted.google.com"));
- EXPECT_TRUE(HasStaticPublicKeyPins("accounts.google.com"));
- EXPECT_TRUE(HasStaticPublicKeyPins("profiles.google.com"));
- EXPECT_TRUE(HasStaticPublicKeyPins("mail.google.com"));
- EXPECT_TRUE(HasStaticPublicKeyPins("chatenabled.mail.google.com"));
- EXPECT_TRUE(HasStaticPublicKeyPins("talkgadget.google.com"));
- EXPECT_TRUE(HasStaticPublicKeyPins("hostedtalkgadget.google.com"));
- EXPECT_TRUE(HasStaticPublicKeyPins("talk.google.com"));
- EXPECT_TRUE(HasStaticPublicKeyPins("plus.google.com"));
- EXPECT_TRUE(HasStaticPublicKeyPins("groups.google.com"));
- EXPECT_TRUE(HasStaticPublicKeyPins("apis.google.com"));
- EXPECT_TRUE(HasStaticPublicKeyPins("www.google-analytics.com"));
-
- EXPECT_TRUE(HasStaticPublicKeyPins("ssl.gstatic.com"));
- EXPECT_TRUE(HasStaticPublicKeyPins("gstatic.com"));
- EXPECT_TRUE(HasStaticPublicKeyPins("www.gstatic.com"));
- EXPECT_TRUE(HasStaticPublicKeyPins("ssl.google-analytics.com"));
- EXPECT_TRUE(HasStaticPublicKeyPins("www.googleplex.com"));
-
- EXPECT_TRUE(HasStaticPublicKeyPins("twitter.com"));
- EXPECT_FALSE(HasStaticPublicKeyPins("foo.twitter.com"));
- EXPECT_TRUE(HasStaticPublicKeyPins("www.twitter.com"));
- EXPECT_TRUE(HasStaticPublicKeyPins("api.twitter.com"));
- EXPECT_TRUE(HasStaticPublicKeyPins("oauth.twitter.com"));
- EXPECT_TRUE(HasStaticPublicKeyPins("mobile.twitter.com"));
- EXPECT_TRUE(HasStaticPublicKeyPins("dev.twitter.com"));
- EXPECT_TRUE(HasStaticPublicKeyPins("business.twitter.com"));
- EXPECT_TRUE(HasStaticPublicKeyPins("platform.twitter.com"));
- EXPECT_TRUE(HasStaticPublicKeyPins("si0.twimg.com"));
-}
-
-static bool AddHash(const std::string& type_and_base64,
- HashValueVector* out) {
+static bool AddHash(const std::string& type_and_base64, HashValueVector* out) {
HashValue hash;
if (!hash.FromString(type_and_base64))
return false;
@@ -1355,15 +902,7 @@ static bool AddHash(const std::string& type_and_base64,
return true;
}
-// This test depends on the pinset of tor.
-#if !BUILDFLAG(INCLUDE_TRANSPORT_SECURITY_STATE_PRELOAD_LIST)
-#define MAYBE_PinValidationWithoutRejectedCerts \
- DISABLED_PinValidationWithoutRejectedCerts
-#else
-#define MAYBE_PinValidationWithoutRejectedCerts \
- PinValidationWithoutRejectedCerts
-#endif
-TEST_F(TransportSecurityStateTest, MAYBE_PinValidationWithoutRejectedCerts) {
+TEST_F(TransportSecurityStateTest, PinValidationWithoutRejectedCerts) {
HashValueVector good_hashes, bad_hashes;
for (size_t i = 0; kGoodPath[i]; i++) {
@@ -1378,8 +917,8 @@ TEST_F(TransportSecurityStateTest, MAYBE_PinValidationWithoutRejectedCerts) {
TransportSecurityState::STSState sts_state;
TransportSecurityState::PKPState pkp_state;
- EXPECT_TRUE(state.GetStaticDomainState("blog.torproject.org", &sts_state,
- &pkp_state));
+ EXPECT_TRUE(state.GetStaticDomainState("no-rejected-pins-pkp.preloaded.test",
+ &sts_state, &pkp_state));
EXPECT_TRUE(pkp_state.HasPublicKeyPins());
std::string failure_log;
@@ -1387,48 +926,6 @@ TEST_F(TransportSecurityStateTest, MAYBE_PinValidationWithoutRejectedCerts) {
EXPECT_FALSE(pkp_state.CheckPublicKeyPins(bad_hashes, &failure_log));
}
-// http://crbug.com/624946
-#if defined(OS_IOS)
-#define MAYBE_OptionalHSTSCertPins DISABLED_OptionalHSTSCertPins
-#else
-#define MAYBE_OptionalHSTSCertPins OptionalHSTSCertPins
-#endif
-TEST_F(TransportSecurityStateTest, MAYBE_OptionalHSTSCertPins) {
- TransportSecurityState state;
- EnableStaticPins(&state);
-
- EXPECT_TRUE(HasStaticPublicKeyPins("google.com"));
- EXPECT_TRUE(HasStaticPublicKeyPins("www.google.com"));
- EXPECT_TRUE(HasStaticPublicKeyPins("mail-attachment.googleusercontent.com"));
- EXPECT_TRUE(HasStaticPublicKeyPins("www.youtube.com"));
- EXPECT_TRUE(HasStaticPublicKeyPins("i.ytimg.com"));
- EXPECT_TRUE(HasStaticPublicKeyPins("googleapis.com"));
- EXPECT_TRUE(HasStaticPublicKeyPins("ajax.googleapis.com"));
- EXPECT_TRUE(HasStaticPublicKeyPins("googleadservices.com"));
- EXPECT_TRUE(HasStaticPublicKeyPins("pagead2.googleadservices.com"));
- EXPECT_TRUE(HasStaticPublicKeyPins("googlecode.com"));
- EXPECT_TRUE(HasStaticPublicKeyPins("kibbles.googlecode.com"));
- EXPECT_TRUE(HasStaticPublicKeyPins("appspot.com"));
- EXPECT_TRUE(HasStaticPublicKeyPins("googlesyndication.com"));
- EXPECT_TRUE(HasStaticPublicKeyPins("doubleclick.net"));
- EXPECT_TRUE(HasStaticPublicKeyPins("ad.doubleclick.net"));
- EXPECT_FALSE(HasStaticPublicKeyPins("learn.doubleclick.net"));
- EXPECT_TRUE(HasStaticPublicKeyPins("a.googlegroups.com"));
-}
-
-TEST_F(TransportSecurityStateTest, OverrideBuiltins) {
- EXPECT_TRUE(HasStaticPublicKeyPins("google.com"));
- EXPECT_FALSE(StaticShouldRedirect("google.com"));
- EXPECT_FALSE(StaticShouldRedirect("www.google.com"));
-
- TransportSecurityState state;
- const base::Time current_time(base::Time::Now());
- const base::Time expiry = current_time + base::TimeDelta::FromSeconds(1000);
- state.AddHSTS("www.google.com", expiry, true);
-
- EXPECT_TRUE(state.ShouldUpgradeToSSL("www.google.com"));
-}
-
TEST_F(TransportSecurityStateTest, HPKPReporting) {
HostPortPair host_port_pair(kHost, kPort);
HostPortPair subdomain_host_port_pair(kSubdomain, kPort);
@@ -1722,7 +1219,7 @@ TEST_F(TransportSecurityStateTest, HPKPReportOnlyParseErrors) {
// Tests that pinning violations on preloaded pins trigger reports when
// the preloaded pin contains a report URI.
TEST_F(TransportSecurityStateTest, PreloadedPKPReportUri) {
- const char kPreloadedPinDomain[] = "www.google.com";
+ const char kPreloadedPinDomain[] = "with-report-uri-pkp.preloaded.test";
const uint16_t kPort = 443;
HostPortPair host_port_pair(kPreloadedPinDomain, kPort);
@@ -1791,8 +1288,7 @@ TEST_F(TransportSecurityStateTest, HPKPReportUriToSameHost) {
EXPECT_TRUE(AddHash(kGoodPath[i], &good_hashes));
// Two dummy certs to use as the server-sent and validated chains. The
- // contents don't matter, as long as they are not the real google.com
- // certs in the pins.
+ // contents don't matter, as long as they don't match the certs in the pins.
scoped_refptr<X509Certificate> cert1 =
ImportCertFromFile(GetTestCertsDirectory(), "ok_cert.pem");
ASSERT_TRUE(cert1);
@@ -1910,7 +1406,7 @@ TEST_F(TransportSecurityStateTest, PreloadedExpectCT) {
EXPECT_EQ(kExpectCTStaticHostname, expect_ct_state.domain);
EXPECT_EQ(GURL(kExpectCTStaticReportURI), expect_ct_state.report_uri);
EXPECT_FALSE(
- GetExpectCTState(&state, "pinning-test.badssl.com", &expect_ct_state));
+ GetExpectCTState(&state, "hsts-preloaded.test", &expect_ct_state));
}
// Tests that static (preloaded) expect staple state is read correctly.
@@ -1926,7 +1422,7 @@ TEST_F(TransportSecurityStateTest, PreloadedExpectStaple) {
EXPECT_EQ(kExpectStapleStaticHostname, expect_staple_state.domain);
EXPECT_EQ(GURL(kExpectStapleStaticReportURI), expect_staple_state.report_uri);
EXPECT_FALSE(expect_staple_state.include_subdomains);
- EXPECT_FALSE(GetExpectStapleState(&state, "pinning-test.badssl.com",
+ EXPECT_FALSE(GetExpectStapleState(&state, "hsts-preloaded.test",
&expect_staple_state));
std::string subdomain = "subdomain.";
subdomain += kExpectStapleStaticHostname;
@@ -2438,6 +1934,23 @@ TEST_F(TransportSecurityStateTest, DecodePreloadedMultipleMix) {
EXPECT_TRUE(staple_state.include_subdomains);
EXPECT_EQ(GURL("https://report.badssl.com/staple-upload"),
staple_state.report_uri);
+
+ sts_state = TransportSecurityState::STSState();
+ pkp_state = TransportSecurityState::PKPState();
+ ct_state = TransportSecurityState::ExpectCTState();
+ staple_state = TransportSecurityState::ExpectStapleState();
+
+ // This should be a simple entry in the context of
+ // TrieWriter::IsSimpleEntry().
+ EXPECT_TRUE(GetStaticDomainState(&state, "simple-entry.example.com",
+ &sts_state, &pkp_state));
+ EXPECT_TRUE(sts_state.include_subdomains);
+ EXPECT_EQ(TransportSecurityState::STSState::MODE_FORCE_HTTPS,
+ sts_state.upgrade_mode);
+ EXPECT_FALSE(pkp_state.include_subdomains);
+ EXPECT_FALSE(GetExpectCTState(&state, "simple-entry.example.com", &ct_state));
+ EXPECT_FALSE(
+ GetExpectStapleState(&state, "simple-entry.example.com", &staple_state));
}
static const struct ExpectStapleErrorResponseData {
@@ -3378,4 +2891,551 @@ TEST_F(TransportSecurityStateTest, CheckCTRequirementsWithExpectCTAndDelegate) {
EXPECT_EQ(sct_list[0].sct, reporter.signed_certificate_timestamps()[0].sct);
}
-} // namespace net
+// Tests that the dynamic Expect-CT UMA histogram is recorded correctly.
+TEST_F(TransportSecurityStateTest, DynamicExpectCTUMA) {
+ const char kHistogramName[] = "Net.ExpectCTHeader.ParseSuccess";
+ SSLInfo ssl;
+ ssl.is_issued_by_known_root = true;
+ ssl.ct_compliance_details_available = true;
+ ssl.ct_cert_policy_compliance =
+ ct::CertPolicyCompliance::CERT_POLICY_COMPLIES_VIA_SCTS;
+
+ base::test::ScopedFeatureList feature_list;
+ feature_list.InitAndEnableFeature(
+ TransportSecurityState::kDynamicExpectCTFeature);
+
+ // Test that the histogram is recorded correctly when the header successfully
+ // parses.
+ {
+ const char kHeader[] = "max-age=123,enforce,report-uri=\"http://foo.test\"";
+ base::HistogramTester histograms;
+ TransportSecurityState state;
+ MockExpectCTReporter reporter;
+ state.SetExpectCTReporter(&reporter);
+ state.ProcessExpectCTHeader(kHeader, HostPortPair("example.test", 443),
+ ssl);
+ histograms.ExpectTotalCount(kHistogramName, 1);
+ histograms.ExpectBucketCount(kHistogramName, true, 1);
+ }
+
+ // Test that the histogram is recorded correctly when the header fails to
+ // parse (due to semi-colons instead of commas).
+ {
+ const char kHeader[] = "max-age=123;enforce;report-uri=\"http://foo.test\"";
+ base::HistogramTester histograms;
+ TransportSecurityState state;
+ MockExpectCTReporter reporter;
+ state.SetExpectCTReporter(&reporter);
+ state.ProcessExpectCTHeader(kHeader, HostPortPair("example.test", 443),
+ ssl);
+ histograms.ExpectTotalCount(kHistogramName, 1);
+ histograms.ExpectBucketCount(kHistogramName, false, 1);
+ }
+}
+
+#if BUILDFLAG(INCLUDE_TRANSPORT_SECURITY_STATE_PRELOAD_LIST)
+class TransportSecurityStateStaticTest : public TransportSecurityStateTest {
+ public:
+ TransportSecurityStateStaticTest() {
+ SetTransportSecurityStateSourceForTesting(nullptr);
+ }
+};
+
+static bool StaticShouldRedirect(const char* hostname) {
+ TransportSecurityState state;
+ TransportSecurityState::STSState sts_state;
+ TransportSecurityState::PKPState pkp_state;
+ return state.GetStaticDomainState(hostname, &sts_state, &pkp_state) &&
+ sts_state.ShouldUpgradeToSSL();
+}
+
+static bool HasStaticState(const char* hostname) {
+ TransportSecurityState state;
+ TransportSecurityState::STSState sts_state;
+ TransportSecurityState::PKPState pkp_state;
+ return state.GetStaticDomainState(hostname, &sts_state, &pkp_state);
+}
+
+static bool HasStaticPublicKeyPins(const char* hostname) {
+ TransportSecurityState state;
+ TransportSecurityStateTest::EnableStaticPins(&state);
+ TransportSecurityState::STSState sts_state;
+ TransportSecurityState::PKPState pkp_state;
+ if (!state.GetStaticDomainState(hostname, &sts_state, &pkp_state))
+ return false;
+
+ return pkp_state.HasPublicKeyPins();
+}
+
+static bool OnlyPinningInStaticState(const char* hostname) {
+ TransportSecurityState state;
+ TransportSecurityStateTest::EnableStaticPins(&state);
+ TransportSecurityState::STSState sts_state;
+ TransportSecurityState::PKPState pkp_state;
+ if (!state.GetStaticDomainState(hostname, &sts_state, &pkp_state))
+ return false;
+
+ return (pkp_state.spki_hashes.size() > 0 ||
+ pkp_state.bad_spki_hashes.size() > 0) &&
+ !sts_state.ShouldUpgradeToSSL();
+}
+
+TEST_F(TransportSecurityStateStaticTest, EnableStaticPins) {
+ TransportSecurityState state;
+ TransportSecurityState::STSState sts_state;
+ TransportSecurityState::PKPState pkp_state;
+
+ EnableStaticPins(&state);
+
+ EXPECT_TRUE(
+ state.GetStaticDomainState("chrome.google.com", &sts_state, &pkp_state));
+ EXPECT_FALSE(pkp_state.spki_hashes.empty());
+}
+
+TEST_F(TransportSecurityStateStaticTest, DisableStaticPins) {
+ TransportSecurityState state;
+ TransportSecurityState::STSState sts_state;
+ TransportSecurityState::PKPState pkp_state;
+
+ DisableStaticPins(&state);
+ EXPECT_TRUE(
+ state.GetStaticDomainState("chrome.google.com", &sts_state, &pkp_state));
+ EXPECT_TRUE(pkp_state.spki_hashes.empty());
+}
+
+TEST_F(TransportSecurityStateStaticTest, IsPreloaded) {
+ const std::string paypal = "paypal.com";
+ const std::string www_paypal = "www.paypal.com";
+ const std::string foo_paypal = "foo.paypal.com";
+ const std::string a_www_paypal = "a.www.paypal.com";
+ const std::string abc_paypal = "a.b.c.paypal.com";
+ const std::string example = "example.com";
+ const std::string aypal = "aypal.com";
+ const std::string google = "google";
+ const std::string www_google = "www.google";
+ const std::string foo = "foo";
+
+ TransportSecurityState state;
+ TransportSecurityState::STSState sts_state;
+ TransportSecurityState::PKPState pkp_state;
+
+ EXPECT_TRUE(GetStaticDomainState(&state, paypal, &sts_state, &pkp_state));
+ EXPECT_TRUE(GetStaticDomainState(&state, www_paypal, &sts_state, &pkp_state));
+ EXPECT_FALSE(sts_state.include_subdomains);
+ EXPECT_TRUE(GetStaticDomainState(&state, google, &sts_state, &pkp_state));
+ EXPECT_TRUE(GetStaticDomainState(&state, www_google, &sts_state, &pkp_state));
+ EXPECT_TRUE(GetStaticDomainState(&state, foo, &sts_state, &pkp_state));
+ EXPECT_FALSE(
+ GetStaticDomainState(&state, a_www_paypal, &sts_state, &pkp_state));
+ EXPECT_FALSE(
+ GetStaticDomainState(&state, abc_paypal, &sts_state, &pkp_state));
+ EXPECT_FALSE(GetStaticDomainState(&state, example, &sts_state, &pkp_state));
+ EXPECT_FALSE(GetStaticDomainState(&state, aypal, &sts_state, &pkp_state));
+}
+
+TEST_F(TransportSecurityStateStaticTest, PreloadedDomainSet) {
+ TransportSecurityState state;
+ TransportSecurityState::STSState sts_state;
+ TransportSecurityState::PKPState pkp_state;
+
+ // The domain wasn't being set, leading to a blank string in the
+ // chrome://net-internals/#hsts UI. So test that.
+ EXPECT_TRUE(
+ state.GetStaticDomainState("market.android.com", &sts_state, &pkp_state));
+ EXPECT_EQ(sts_state.domain, "market.android.com");
+ EXPECT_EQ(pkp_state.domain, "market.android.com");
+ EXPECT_TRUE(state.GetStaticDomainState("sub.market.android.com", &sts_state,
+ &pkp_state));
+ EXPECT_EQ(sts_state.domain, "market.android.com");
+ EXPECT_EQ(pkp_state.domain, "market.android.com");
+}
+
+TEST_F(TransportSecurityStateStaticTest, Preloaded) {
+ TransportSecurityState state;
+ TransportSecurityState::STSState sts_state;
+ TransportSecurityState::PKPState pkp_state;
+
+ // We do more extensive checks for the first domain.
+ EXPECT_TRUE(
+ state.GetStaticDomainState("www.paypal.com", &sts_state, &pkp_state));
+ EXPECT_EQ(sts_state.upgrade_mode,
+ TransportSecurityState::STSState::MODE_FORCE_HTTPS);
+ EXPECT_FALSE(sts_state.include_subdomains);
+ EXPECT_FALSE(pkp_state.include_subdomains);
+
+ EXPECT_TRUE(HasStaticState("paypal.com"));
+ EXPECT_FALSE(HasStaticState("www2.paypal.com"));
+
+ // Google hosts:
+
+ EXPECT_TRUE(StaticShouldRedirect("chrome.google.com"));
+ EXPECT_TRUE(StaticShouldRedirect("checkout.google.com"));
+ EXPECT_TRUE(StaticShouldRedirect("wallet.google.com"));
+ EXPECT_TRUE(StaticShouldRedirect("docs.google.com"));
+ EXPECT_TRUE(StaticShouldRedirect("sites.google.com"));
+ EXPECT_TRUE(StaticShouldRedirect("drive.google.com"));
+ EXPECT_TRUE(StaticShouldRedirect("spreadsheets.google.com"));
+ EXPECT_TRUE(StaticShouldRedirect("appengine.google.com"));
+ EXPECT_TRUE(StaticShouldRedirect("market.android.com"));
+ EXPECT_TRUE(StaticShouldRedirect("encrypted.google.com"));
+ EXPECT_TRUE(StaticShouldRedirect("accounts.google.com"));
+ EXPECT_TRUE(StaticShouldRedirect("profiles.google.com"));
+ EXPECT_TRUE(StaticShouldRedirect("mail.google.com"));
+ EXPECT_TRUE(StaticShouldRedirect("chatenabled.mail.google.com"));
+ EXPECT_TRUE(StaticShouldRedirect("talkgadget.google.com"));
+ EXPECT_TRUE(StaticShouldRedirect("hostedtalkgadget.google.com"));
+ EXPECT_TRUE(StaticShouldRedirect("talk.google.com"));
+ EXPECT_TRUE(StaticShouldRedirect("plus.google.com"));
+ EXPECT_TRUE(StaticShouldRedirect("groups.google.com"));
+ EXPECT_TRUE(StaticShouldRedirect("apis.google.com"));
+ EXPECT_FALSE(StaticShouldRedirect("chart.apis.google.com"));
+ EXPECT_TRUE(StaticShouldRedirect("ssl.google-analytics.com"));
+ EXPECT_TRUE(StaticShouldRedirect("google"));
+ EXPECT_TRUE(StaticShouldRedirect("foo.google"));
+ EXPECT_TRUE(StaticShouldRedirect("foo"));
+ EXPECT_TRUE(StaticShouldRedirect("domaintest.foo"));
+ EXPECT_TRUE(StaticShouldRedirect("gmail.com"));
+ EXPECT_TRUE(StaticShouldRedirect("www.gmail.com"));
+ EXPECT_TRUE(StaticShouldRedirect("googlemail.com"));
+ EXPECT_TRUE(StaticShouldRedirect("www.googlemail.com"));
+ EXPECT_TRUE(StaticShouldRedirect("googleplex.com"));
+ EXPECT_TRUE(StaticShouldRedirect("www.googleplex.com"));
+ EXPECT_TRUE(StaticShouldRedirect("www.google-analytics.com"));
+ EXPECT_TRUE(StaticShouldRedirect("www.youtube.com"));
+ EXPECT_TRUE(StaticShouldRedirect("youtube.com"));
+
+ // These domains used to be only HSTS when SNI was available.
+ EXPECT_TRUE(state.GetStaticDomainState("gmail.com", &sts_state, &pkp_state));
+ EXPECT_TRUE(
+ state.GetStaticDomainState("www.gmail.com", &sts_state, &pkp_state));
+ EXPECT_TRUE(
+ state.GetStaticDomainState("googlemail.com", &sts_state, &pkp_state));
+ EXPECT_TRUE(
+ state.GetStaticDomainState("www.googlemail.com", &sts_state, &pkp_state));
+
+ // Other hosts:
+
+ EXPECT_TRUE(StaticShouldRedirect("aladdinschools.appspot.com"));
+
+ EXPECT_TRUE(StaticShouldRedirect("ottospora.nl"));
+ EXPECT_TRUE(StaticShouldRedirect("www.ottospora.nl"));
+
+ EXPECT_TRUE(StaticShouldRedirect("www.paycheckrecords.com"));
+
+ EXPECT_TRUE(StaticShouldRedirect("lastpass.com"));
+ EXPECT_TRUE(StaticShouldRedirect("www.lastpass.com"));
+ EXPECT_FALSE(HasStaticState("blog.lastpass.com"));
+
+ EXPECT_TRUE(StaticShouldRedirect("keyerror.com"));
+ EXPECT_TRUE(StaticShouldRedirect("www.keyerror.com"));
+
+ EXPECT_TRUE(StaticShouldRedirect("entropia.de"));
+ EXPECT_TRUE(StaticShouldRedirect("www.entropia.de"));
+ EXPECT_FALSE(HasStaticState("foo.entropia.de"));
+
+ EXPECT_TRUE(StaticShouldRedirect("www.elanex.biz"));
+ EXPECT_FALSE(HasStaticState("elanex.biz"));
+ EXPECT_FALSE(HasStaticState("foo.elanex.biz"));
+
+ EXPECT_TRUE(StaticShouldRedirect("sunshinepress.org"));
+ EXPECT_TRUE(StaticShouldRedirect("www.sunshinepress.org"));
+ EXPECT_TRUE(StaticShouldRedirect("a.b.sunshinepress.org"));
+
+ EXPECT_TRUE(StaticShouldRedirect("www.noisebridge.net"));
+ EXPECT_FALSE(HasStaticState("noisebridge.net"));
+ EXPECT_FALSE(HasStaticState("foo.noisebridge.net"));
+
+ EXPECT_TRUE(StaticShouldRedirect("neg9.org"));
+ EXPECT_FALSE(HasStaticState("www.neg9.org"));
+
+ EXPECT_TRUE(StaticShouldRedirect("riseup.net"));
+ EXPECT_TRUE(StaticShouldRedirect("foo.riseup.net"));
+
+ EXPECT_TRUE(StaticShouldRedirect("factor.cc"));
+ EXPECT_FALSE(HasStaticState("www.factor.cc"));
+
+ EXPECT_TRUE(StaticShouldRedirect("members.mayfirst.org"));
+ EXPECT_TRUE(StaticShouldRedirect("support.mayfirst.org"));
+ EXPECT_TRUE(StaticShouldRedirect("id.mayfirst.org"));
+ EXPECT_TRUE(StaticShouldRedirect("lists.mayfirst.org"));
+ EXPECT_FALSE(HasStaticState("www.mayfirst.org"));
+
+ EXPECT_TRUE(StaticShouldRedirect("romab.com"));
+ EXPECT_TRUE(StaticShouldRedirect("www.romab.com"));
+ EXPECT_TRUE(StaticShouldRedirect("foo.romab.com"));
+
+ EXPECT_TRUE(StaticShouldRedirect("logentries.com"));
+ EXPECT_TRUE(StaticShouldRedirect("www.logentries.com"));
+ EXPECT_FALSE(HasStaticState("foo.logentries.com"));
+
+ EXPECT_TRUE(StaticShouldRedirect("stripe.com"));
+ EXPECT_TRUE(StaticShouldRedirect("foo.stripe.com"));
+
+ EXPECT_TRUE(StaticShouldRedirect("cloudsecurityalliance.org"));
+ EXPECT_TRUE(StaticShouldRedirect("foo.cloudsecurityalliance.org"));
+
+ EXPECT_TRUE(StaticShouldRedirect("login.sapo.pt"));
+ EXPECT_TRUE(StaticShouldRedirect("foo.login.sapo.pt"));
+
+ EXPECT_TRUE(StaticShouldRedirect("mattmccutchen.net"));
+ EXPECT_TRUE(StaticShouldRedirect("foo.mattmccutchen.net"));
+
+ EXPECT_TRUE(StaticShouldRedirect("betnet.fr"));
+ EXPECT_TRUE(StaticShouldRedirect("foo.betnet.fr"));
+
+ EXPECT_TRUE(StaticShouldRedirect("uprotect.it"));
+ EXPECT_TRUE(StaticShouldRedirect("foo.uprotect.it"));
+
+ EXPECT_TRUE(StaticShouldRedirect("squareup.com"));
+ EXPECT_FALSE(HasStaticState("foo.squareup.com"));
+
+ EXPECT_TRUE(StaticShouldRedirect("cert.se"));
+ EXPECT_TRUE(StaticShouldRedirect("foo.cert.se"));
+
+ EXPECT_TRUE(StaticShouldRedirect("crypto.is"));
+ EXPECT_TRUE(StaticShouldRedirect("foo.crypto.is"));
+
+ EXPECT_TRUE(StaticShouldRedirect("simon.butcher.name"));
+ EXPECT_TRUE(StaticShouldRedirect("foo.simon.butcher.name"));
+
+ EXPECT_TRUE(StaticShouldRedirect("linx.net"));
+ EXPECT_TRUE(StaticShouldRedirect("foo.linx.net"));
+
+ EXPECT_TRUE(StaticShouldRedirect("dropcam.com"));
+ EXPECT_TRUE(StaticShouldRedirect("www.dropcam.com"));
+ EXPECT_FALSE(HasStaticState("foo.dropcam.com"));
+
+ EXPECT_TRUE(StaticShouldRedirect("ebanking.indovinabank.com.vn"));
+ EXPECT_TRUE(StaticShouldRedirect("foo.ebanking.indovinabank.com.vn"));
+
+ EXPECT_TRUE(StaticShouldRedirect("epoxate.com"));
+ EXPECT_FALSE(HasStaticState("foo.epoxate.com"));
+
+ EXPECT_FALSE(HasStaticState("foo.torproject.org"));
+
+ EXPECT_TRUE(StaticShouldRedirect("www.moneybookers.com"));
+ EXPECT_FALSE(HasStaticState("moneybookers.com"));
+
+ EXPECT_TRUE(StaticShouldRedirect("ledgerscope.net"));
+ EXPECT_TRUE(StaticShouldRedirect("www.ledgerscope.net"));
+ EXPECT_FALSE(HasStaticState("status.ledgerscope.net"));
+
+ EXPECT_TRUE(StaticShouldRedirect("foo.app.recurly.com"));
+ EXPECT_TRUE(StaticShouldRedirect("foo.api.recurly.com"));
+
+ EXPECT_TRUE(StaticShouldRedirect("greplin.com"));
+ EXPECT_TRUE(StaticShouldRedirect("www.greplin.com"));
+ EXPECT_FALSE(HasStaticState("foo.greplin.com"));
+
+ EXPECT_TRUE(StaticShouldRedirect("luneta.nearbuysystems.com"));
+ EXPECT_TRUE(StaticShouldRedirect("foo.luneta.nearbuysystems.com"));
+
+ EXPECT_TRUE(StaticShouldRedirect("ubertt.org"));
+ EXPECT_TRUE(StaticShouldRedirect("foo.ubertt.org"));
+
+ EXPECT_TRUE(StaticShouldRedirect("pixi.me"));
+ EXPECT_TRUE(StaticShouldRedirect("www.pixi.me"));
+
+ EXPECT_TRUE(StaticShouldRedirect("grepular.com"));
+ EXPECT_TRUE(StaticShouldRedirect("www.grepular.com"));
+
+ EXPECT_TRUE(StaticShouldRedirect("mydigipass.com"));
+ EXPECT_FALSE(StaticShouldRedirect("foo.mydigipass.com"));
+ EXPECT_TRUE(StaticShouldRedirect("www.mydigipass.com"));
+ EXPECT_FALSE(StaticShouldRedirect("foo.www.mydigipass.com"));
+ EXPECT_TRUE(StaticShouldRedirect("developer.mydigipass.com"));
+ EXPECT_FALSE(StaticShouldRedirect("foo.developer.mydigipass.com"));
+ EXPECT_TRUE(StaticShouldRedirect("www.developer.mydigipass.com"));
+ EXPECT_FALSE(StaticShouldRedirect("foo.www.developer.mydigipass.com"));
+ EXPECT_TRUE(StaticShouldRedirect("sandbox.mydigipass.com"));
+ EXPECT_FALSE(StaticShouldRedirect("foo.sandbox.mydigipass.com"));
+ EXPECT_TRUE(StaticShouldRedirect("www.sandbox.mydigipass.com"));
+ EXPECT_FALSE(StaticShouldRedirect("foo.www.sandbox.mydigipass.com"));
+
+ EXPECT_TRUE(StaticShouldRedirect("bigshinylock.minazo.net"));
+ EXPECT_TRUE(StaticShouldRedirect("foo.bigshinylock.minazo.net"));
+
+ EXPECT_TRUE(StaticShouldRedirect("crate.io"));
+ EXPECT_TRUE(StaticShouldRedirect("foo.crate.io"));
+}
+
+// http://crbug.com/624946
+#if defined(OS_IOS)
+#define MAYBE_PreloadedPins DISABLED_PreloadedPins
+#else
+#define MAYBE_PreloadedPins PreloadedPins
+#endif
+TEST_F(TransportSecurityStateStaticTest, MAYBE_PreloadedPins) {
+ TransportSecurityState state;
+ EnableStaticPins(&state);
+ TransportSecurityState::STSState sts_state;
+ TransportSecurityState::PKPState pkp_state;
+
+ // We do more extensive checks for the first domain.
+ EXPECT_TRUE(
+ state.GetStaticDomainState("www.paypal.com", &sts_state, &pkp_state));
+ EXPECT_EQ(sts_state.upgrade_mode,
+ TransportSecurityState::STSState::MODE_FORCE_HTTPS);
+ EXPECT_FALSE(sts_state.include_subdomains);
+ EXPECT_FALSE(pkp_state.include_subdomains);
+
+ EXPECT_TRUE(OnlyPinningInStaticState("www.google.com"));
+ EXPECT_TRUE(OnlyPinningInStaticState("foo.google.com"));
+ EXPECT_TRUE(OnlyPinningInStaticState("google.com"));
+ EXPECT_TRUE(OnlyPinningInStaticState("i.ytimg.com"));
+ EXPECT_TRUE(OnlyPinningInStaticState("ytimg.com"));
+ EXPECT_TRUE(OnlyPinningInStaticState("googleusercontent.com"));
+ EXPECT_TRUE(OnlyPinningInStaticState("www.googleusercontent.com"));
+ EXPECT_TRUE(OnlyPinningInStaticState("googleapis.com"));
+ EXPECT_TRUE(OnlyPinningInStaticState("googleadservices.com"));
+ EXPECT_TRUE(OnlyPinningInStaticState("googlecode.com"));
+ EXPECT_TRUE(OnlyPinningInStaticState("appspot.com"));
+ EXPECT_TRUE(OnlyPinningInStaticState("googlesyndication.com"));
+ EXPECT_TRUE(OnlyPinningInStaticState("doubleclick.net"));
+ EXPECT_TRUE(OnlyPinningInStaticState("googlegroups.com"));
+
+ EXPECT_TRUE(HasStaticPublicKeyPins("torproject.org"));
+ EXPECT_TRUE(HasStaticPublicKeyPins("www.torproject.org"));
+ EXPECT_TRUE(HasStaticPublicKeyPins("check.torproject.org"));
+ EXPECT_TRUE(HasStaticPublicKeyPins("blog.torproject.org"));
+ EXPECT_FALSE(HasStaticState("foo.torproject.org"));
+
+ EXPECT_TRUE(
+ state.GetStaticDomainState("torproject.org", &sts_state, &pkp_state));
+ EXPECT_FALSE(pkp_state.spki_hashes.empty());
+ EXPECT_TRUE(
+ state.GetStaticDomainState("www.torproject.org", &sts_state, &pkp_state));
+ EXPECT_FALSE(pkp_state.spki_hashes.empty());
+ EXPECT_TRUE(state.GetStaticDomainState("check.torproject.org", &sts_state,
+ &pkp_state));
+ EXPECT_FALSE(pkp_state.spki_hashes.empty());
+ EXPECT_TRUE(state.GetStaticDomainState("blog.torproject.org", &sts_state,
+ &pkp_state));
+ EXPECT_FALSE(pkp_state.spki_hashes.empty());
+
+ EXPECT_TRUE(HasStaticPublicKeyPins("www.twitter.com"));
+
+ // Check that Facebook subdomains have pinning but not HSTS.
+ EXPECT_TRUE(
+ state.GetStaticDomainState("facebook.com", &sts_state, &pkp_state));
+ EXPECT_FALSE(pkp_state.spki_hashes.empty());
+ EXPECT_TRUE(StaticShouldRedirect("facebook.com"));
+
+ EXPECT_TRUE(
+ state.GetStaticDomainState("foo.facebook.com", &sts_state, &pkp_state));
+ EXPECT_FALSE(pkp_state.spki_hashes.empty());
+ EXPECT_FALSE(StaticShouldRedirect("foo.facebook.com"));
+
+ EXPECT_TRUE(
+ state.GetStaticDomainState("www.facebook.com", &sts_state, &pkp_state));
+ EXPECT_FALSE(pkp_state.spki_hashes.empty());
+ EXPECT_TRUE(StaticShouldRedirect("www.facebook.com"));
+
+ EXPECT_TRUE(state.GetStaticDomainState("foo.www.facebook.com", &sts_state,
+ &pkp_state));
+ EXPECT_FALSE(pkp_state.spki_hashes.empty());
+ EXPECT_TRUE(StaticShouldRedirect("foo.www.facebook.com"));
+}
+
+TEST_F(TransportSecurityStateStaticTest, BuiltinCertPins) {
+ TransportSecurityState state;
+ EnableStaticPins(&state);
+ TransportSecurityState::STSState sts_state;
+ TransportSecurityState::PKPState pkp_state;
+
+ EXPECT_TRUE(
+ state.GetStaticDomainState("chrome.google.com", &sts_state, &pkp_state));
+ EXPECT_TRUE(HasStaticPublicKeyPins("chrome.google.com"));
+
+ HashValueVector hashes;
+ std::string failure_log;
+ // Checks that a built-in list does exist.
+ EXPECT_FALSE(pkp_state.CheckPublicKeyPins(hashes, &failure_log));
+ EXPECT_FALSE(HasStaticPublicKeyPins("www.paypal.com"));
+
+ EXPECT_TRUE(HasStaticPublicKeyPins("docs.google.com"));
+ EXPECT_TRUE(HasStaticPublicKeyPins("1.docs.google.com"));
+ EXPECT_TRUE(HasStaticPublicKeyPins("sites.google.com"));
+ EXPECT_TRUE(HasStaticPublicKeyPins("drive.google.com"));
+ EXPECT_TRUE(HasStaticPublicKeyPins("spreadsheets.google.com"));
+ EXPECT_TRUE(HasStaticPublicKeyPins("wallet.google.com"));
+ EXPECT_TRUE(HasStaticPublicKeyPins("checkout.google.com"));
+ EXPECT_TRUE(HasStaticPublicKeyPins("appengine.google.com"));
+ EXPECT_TRUE(HasStaticPublicKeyPins("market.android.com"));
+ EXPECT_TRUE(HasStaticPublicKeyPins("encrypted.google.com"));
+ EXPECT_TRUE(HasStaticPublicKeyPins("accounts.google.com"));
+ EXPECT_TRUE(HasStaticPublicKeyPins("profiles.google.com"));
+ EXPECT_TRUE(HasStaticPublicKeyPins("mail.google.com"));
+ EXPECT_TRUE(HasStaticPublicKeyPins("chatenabled.mail.google.com"));
+ EXPECT_TRUE(HasStaticPublicKeyPins("talkgadget.google.com"));
+ EXPECT_TRUE(HasStaticPublicKeyPins("hostedtalkgadget.google.com"));
+ EXPECT_TRUE(HasStaticPublicKeyPins("talk.google.com"));
+ EXPECT_TRUE(HasStaticPublicKeyPins("plus.google.com"));
+ EXPECT_TRUE(HasStaticPublicKeyPins("groups.google.com"));
+ EXPECT_TRUE(HasStaticPublicKeyPins("apis.google.com"));
+ EXPECT_TRUE(HasStaticPublicKeyPins("www.google-analytics.com"));
+ EXPECT_TRUE(HasStaticPublicKeyPins("www.youtube.com"));
+ EXPECT_TRUE(HasStaticPublicKeyPins("youtube.com"));
+
+ EXPECT_TRUE(HasStaticPublicKeyPins("ssl.gstatic.com"));
+ EXPECT_TRUE(HasStaticPublicKeyPins("gstatic.com"));
+ EXPECT_TRUE(HasStaticPublicKeyPins("www.gstatic.com"));
+ EXPECT_TRUE(HasStaticPublicKeyPins("ssl.google-analytics.com"));
+ EXPECT_TRUE(HasStaticPublicKeyPins("www.googleplex.com"));
+
+ EXPECT_TRUE(HasStaticPublicKeyPins("twitter.com"));
+ EXPECT_FALSE(HasStaticPublicKeyPins("foo.twitter.com"));
+ EXPECT_TRUE(HasStaticPublicKeyPins("www.twitter.com"));
+ EXPECT_TRUE(HasStaticPublicKeyPins("api.twitter.com"));
+ EXPECT_TRUE(HasStaticPublicKeyPins("oauth.twitter.com"));
+ EXPECT_TRUE(HasStaticPublicKeyPins("mobile.twitter.com"));
+ EXPECT_TRUE(HasStaticPublicKeyPins("dev.twitter.com"));
+ EXPECT_TRUE(HasStaticPublicKeyPins("business.twitter.com"));
+ EXPECT_TRUE(HasStaticPublicKeyPins("platform.twitter.com"));
+ EXPECT_TRUE(HasStaticPublicKeyPins("si0.twimg.com"));
+}
+
+// http://crbug.com/624946
+#if defined(OS_IOS)
+#define MAYBE_OptionalHSTSCertPins DISABLED_OptionalHSTSCertPins
+#else
+#define MAYBE_OptionalHSTSCertPins OptionalHSTSCertPins
+#endif
+TEST_F(TransportSecurityStateStaticTest, MAYBE_OptionalHSTSCertPins) {
+ TransportSecurityState state;
+ EnableStaticPins(&state);
+
+ EXPECT_TRUE(HasStaticPublicKeyPins("google.com"));
+ EXPECT_TRUE(HasStaticPublicKeyPins("www.google.com"));
+ EXPECT_TRUE(HasStaticPublicKeyPins("mail-attachment.googleusercontent.com"));
+ EXPECT_TRUE(HasStaticPublicKeyPins("www.youtube.com"));
+ EXPECT_TRUE(HasStaticPublicKeyPins("i.ytimg.com"));
+ EXPECT_TRUE(HasStaticPublicKeyPins("googleapis.com"));
+ EXPECT_TRUE(HasStaticPublicKeyPins("ajax.googleapis.com"));
+ EXPECT_TRUE(HasStaticPublicKeyPins("googleadservices.com"));
+ EXPECT_TRUE(HasStaticPublicKeyPins("pagead2.googleadservices.com"));
+ EXPECT_TRUE(HasStaticPublicKeyPins("googlecode.com"));
+ EXPECT_TRUE(HasStaticPublicKeyPins("kibbles.googlecode.com"));
+ EXPECT_TRUE(HasStaticPublicKeyPins("appspot.com"));
+ EXPECT_TRUE(HasStaticPublicKeyPins("googlesyndication.com"));
+ EXPECT_TRUE(HasStaticPublicKeyPins("doubleclick.net"));
+ EXPECT_TRUE(HasStaticPublicKeyPins("ad.doubleclick.net"));
+ EXPECT_FALSE(HasStaticPublicKeyPins("learn.doubleclick.net"));
+ EXPECT_TRUE(HasStaticPublicKeyPins("a.googlegroups.com"));
+}
+
+TEST_F(TransportSecurityStateStaticTest, OverrideBuiltins) {
+ EXPECT_TRUE(HasStaticPublicKeyPins("google.com"));
+ EXPECT_FALSE(StaticShouldRedirect("google.com"));
+ EXPECT_FALSE(StaticShouldRedirect("www.google.com"));
+
+ TransportSecurityState state;
+ const base::Time current_time(base::Time::Now());
+ const base::Time expiry = current_time + base::TimeDelta::FromSeconds(1000);
+ state.AddHSTS("www.google.com", expiry, true);
+
+ EXPECT_TRUE(state.ShouldUpgradeToSSL("www.google.com"));
+}
+#endif // BUILDFLAG(INCLUDE_TRANSPORT_SECURITY_STATE_PRELOAD_LIST)
+
+} // namespace net \ No newline at end of file