summaryrefslogtreecommitdiff
path: root/chromium/net/http
diff options
context:
space:
mode:
authorAllan Sandfeld Jensen <allan.jensen@qt.io>2018-01-31 16:33:43 +0100
committerAllan Sandfeld Jensen <allan.jensen@qt.io>2018-02-06 16:33:22 +0000
commitda51f56cc21233c2d30f0fe0d171727c3102b2e0 (patch)
tree4e579ab70ce4b19bee7984237f3ce05a96d59d83 /chromium/net/http
parentc8c2d1901aec01e934adf561a9fdf0cc776cdef8 (diff)
downloadqtwebengine-chromium-da51f56cc21233c2d30f0fe0d171727c3102b2e0.tar.gz
BASELINE: Update Chromium to 65.0.3525.40
Also imports missing submodules Change-Id: I36901b7c6a325cda3d2c10cedb2186c25af3b79b Reviewed-by: Alexandru Croitor <alexandru.croitor@qt.io>
Diffstat (limited to 'chromium/net/http')
-rw-r--r--chromium/net/http/OWNERS3
-rw-r--r--chromium/net/http/http_basic_state.cc8
-rw-r--r--chromium/net/http/http_basic_state.h4
-rw-r--r--chromium/net/http/http_basic_state_unittest.cc8
-rw-r--r--chromium/net/http/http_basic_stream.cc8
-rw-r--r--chromium/net/http/http_basic_stream.h1
-rw-r--r--chromium/net/http/http_cache.cc78
-rw-r--r--chromium/net/http/http_cache.h51
-rw-r--r--chromium/net/http/http_cache_transaction.cc44
-rw-r--r--chromium/net/http/http_cache_transaction.h7
-rw-r--r--chromium/net/http/http_cache_unittest.cc181
-rw-r--r--chromium/net/http/http_cache_writers.cc30
-rw-r--r--chromium/net/http/http_cache_writers.h17
-rw-r--r--chromium/net/http/http_cache_writers_unittest.cc60
-rw-r--r--chromium/net/http/http_network_session.cc38
-rw-r--r--chromium/net/http/http_network_session.h17
-rw-r--r--chromium/net/http/http_network_session_peer.cc5
-rw-r--r--chromium/net/http/http_network_session_peer.h2
-rw-r--r--chromium/net/http/http_network_transaction.cc22
-rw-r--r--chromium/net/http/http_network_transaction.h3
-rw-r--r--chromium/net/http/http_network_transaction_unittest.cc356
-rw-r--r--chromium/net/http/http_proxy_client_socket.cc43
-rw-r--r--chromium/net/http/http_proxy_client_socket.h15
-rw-r--r--chromium/net/http/http_proxy_client_socket_fuzzer.cc7
-rw-r--r--chromium/net/http/http_proxy_client_socket_pool.cc55
-rw-r--r--chromium/net/http/http_proxy_client_socket_pool.h39
-rw-r--r--chromium/net/http/http_proxy_client_socket_pool_unittest.cc243
-rw-r--r--chromium/net/http/http_proxy_client_socket_unittest.cc44
-rw-r--r--chromium/net/http/http_proxy_client_socket_wrapper.cc52
-rw-r--r--chromium/net/http/http_proxy_client_socket_wrapper.h12
-rw-r--r--chromium/net/http/http_proxy_client_socket_wrapper_unittest.cc46
-rw-r--r--chromium/net/http/http_request_info.h4
-rw-r--r--chromium/net/http/http_response_body_drainer_unittest.cc1
-rw-r--r--chromium/net/http/http_security_headers_unittest.cc4
-rw-r--r--chromium/net/http/http_server_properties.h7
-rw-r--r--chromium/net/http/http_server_properties_impl.cc11
-rw-r--r--chromium/net/http/http_server_properties_impl.h5
-rw-r--r--chromium/net/http/http_server_properties_impl_unittest.cc24
-rw-r--r--chromium/net/http/http_server_properties_manager.cc43
-rw-r--r--chromium/net/http/http_server_properties_manager.h20
-rw-r--r--chromium/net/http/http_server_properties_manager_unittest.cc31
-rw-r--r--chromium/net/http/http_stream.h5
-rw-r--r--chromium/net/http/http_stream_factory_impl.cc78
-rw-r--r--chromium/net/http/http_stream_factory_impl.h16
-rw-r--r--chromium/net/http/http_stream_factory_impl_job.cc105
-rw-r--r--chromium/net/http/http_stream_factory_impl_job.h33
-rw-r--r--chromium/net/http/http_stream_factory_impl_job_controller.cc69
-rw-r--r--chromium/net/http/http_stream_factory_impl_job_controller.h12
-rw-r--r--chromium/net/http/http_stream_factory_impl_job_controller_unittest.cc383
-rw-r--r--chromium/net/http/http_stream_factory_impl_request_unittest.cc1
-rw-r--r--chromium/net/http/http_stream_factory_impl_unittest.cc91
-rw-r--r--chromium/net/http/http_stream_factory_test_util.cc14
-rw-r--r--chromium/net/http/http_stream_factory_test_util.h4
-rw-r--r--chromium/net/http/http_stream_parser.cc25
-rw-r--r--chromium/net/http/http_stream_parser.h4
-rw-r--r--chromium/net/http/http_stream_parser_fuzzer.cc7
-rw-r--r--chromium/net/http/http_stream_parser_unittest.cc52
-rw-r--r--chromium/net/http/proxy_connect_redirect_http_stream.cc1
-rw-r--r--chromium/net/http/proxy_connect_redirect_http_stream.h1
-rw-r--r--chromium/net/http/transport_security_persister_unittest.cc2
-rw-r--r--chromium/net/http/transport_security_state.cc34
-rw-r--r--chromium/net/http/transport_security_state_ct_policies.inc13
-rw-r--r--chromium/net/http/transport_security_state_static.json2736
-rw-r--r--chromium/net/http/transport_security_state_unittest.cc110
64 files changed, 4553 insertions, 892 deletions
diff --git a/chromium/net/http/OWNERS b/chromium/net/http/OWNERS
index b15901669dd..b33c90cb2d0 100644
--- a/chromium/net/http/OWNERS
+++ b/chromium/net/http/OWNERS
@@ -1,2 +1,3 @@
+per-file http_cache_*=shivanisha@chromium.org
per-file transport_security_state_static.*=elawrence@chromium.org
-per-file transport_security_state_static.*=palmer@chromium.org \ No newline at end of file
+per-file transport_security_state_static.*=palmer@chromium.org
diff --git a/chromium/net/http/http_basic_state.cc b/chromium/net/http/http_basic_state.cc
index 0690de6b52f..cee4a407afa 100644
--- a/chromium/net/http/http_basic_state.cc
+++ b/chromium/net/http/http_basic_state.cc
@@ -23,12 +23,17 @@ HttpBasicState::HttpBasicState(std::unique_ptr<ClientSocketHandle> connection,
: read_buf_(new GrowableIOBuffer()),
connection_(std::move(connection)),
using_proxy_(using_proxy),
+ can_send_early_(false),
http_09_on_non_default_ports_enabled_(
- http_09_on_non_default_ports_enabled) {}
+ http_09_on_non_default_ports_enabled) {
+ CHECK(connection_) << "ClientSocketHandle passed to HttpBasicState must "
+ "not be NULL. See crbug.com/790776";
+}
HttpBasicState::~HttpBasicState() = default;
int HttpBasicState::Initialize(const HttpRequestInfo* request_info,
+ bool can_send_early,
RequestPriority priority,
const NetLogWithSource& net_log,
const CompletionCallback& callback) {
@@ -39,6 +44,7 @@ int HttpBasicState::Initialize(const HttpRequestInfo* request_info,
connection_.get(), request_info, read_buf_.get(), net_log));
parser_->set_http_09_on_non_default_ports_enabled(
http_09_on_non_default_ports_enabled_);
+ can_send_early_ = can_send_early;
return OK;
}
diff --git a/chromium/net/http/http_basic_state.h b/chromium/net/http/http_basic_state.h
index c89beab1274..5ce7945e3fa 100644
--- a/chromium/net/http/http_basic_state.h
+++ b/chromium/net/http/http_basic_state.h
@@ -35,6 +35,7 @@ class NET_EXPORT_PRIVATE HttpBasicState {
// Initialize() must be called before using any of the other methods.
int Initialize(const HttpRequestInfo* request_info,
+ bool can_send_early,
RequestPriority priority,
const NetLogWithSource& net_log,
const CompletionCallback& callback);
@@ -43,6 +44,7 @@ class NET_EXPORT_PRIVATE HttpBasicState {
bool using_proxy() const { return using_proxy_; }
+ bool can_send_early() const { return can_send_early_; }
bool http_09_on_non_default_ports_enabled() const {
return http_09_on_non_default_ports_enabled_;
}
@@ -69,6 +71,8 @@ class NET_EXPORT_PRIVATE HttpBasicState {
const bool using_proxy_;
+ bool can_send_early_;
+
const bool http_09_on_non_default_ports_enabled_;
GURL url_;
diff --git a/chromium/net/http/http_basic_state_unittest.cc b/chromium/net/http/http_basic_state_unittest.cc
index c0d337ab3e1..0d6621cc41c 100644
--- a/chromium/net/http/http_basic_state_unittest.cc
+++ b/chromium/net/http/http_basic_state_unittest.cc
@@ -46,7 +46,7 @@ TEST(HttpBasicStateTest, ReleaseConnectionWorks) {
TEST(HttpBasicStateTest, InitializeWorks) {
HttpBasicState state(std::make_unique<ClientSocketHandle>(), false, false);
const HttpRequestInfo request_info;
- EXPECT_EQ(OK, state.Initialize(&request_info, LOW, NetLogWithSource(),
+ EXPECT_EQ(OK, state.Initialize(&request_info, false, LOW, NetLogWithSource(),
CompletionCallback()));
EXPECT_TRUE(state.parser());
}
@@ -54,7 +54,7 @@ TEST(HttpBasicStateTest, InitializeWorks) {
TEST(HttpBasicStateTest, DeleteParser) {
HttpBasicState state(std::make_unique<ClientSocketHandle>(), false, false);
const HttpRequestInfo request_info;
- state.Initialize(&request_info, LOW, NetLogWithSource(),
+ state.Initialize(&request_info, false, LOW, NetLogWithSource(),
CompletionCallback());
EXPECT_TRUE(state.parser());
state.DeleteParser();
@@ -68,7 +68,7 @@ TEST(HttpBasicStateTest, GenerateRequestLineNoProxy) {
HttpRequestInfo request_info;
request_info.url = GURL("http://www.example.com/path?foo=bar#hoge");
request_info.method = "PUT";
- state.Initialize(&request_info, LOW, NetLogWithSource(),
+ state.Initialize(&request_info, false, LOW, NetLogWithSource(),
CompletionCallback());
EXPECT_EQ("PUT /path?foo=bar HTTP/1.1\r\n", state.GenerateRequestLine());
}
@@ -80,7 +80,7 @@ TEST(HttpBasicStateTest, GenerateRequestLineWithProxy) {
HttpRequestInfo request_info;
request_info.url = GURL("http://www.example.com/path?foo=bar#hoge");
request_info.method = "PUT";
- state.Initialize(&request_info, LOW, NetLogWithSource(),
+ state.Initialize(&request_info, false, LOW, NetLogWithSource(),
CompletionCallback());
EXPECT_EQ("PUT http://www.example.com/path?foo=bar HTTP/1.1\r\n",
state.GenerateRequestLine());
diff --git a/chromium/net/http/http_basic_stream.cc b/chromium/net/http/http_basic_stream.cc
index 2fc6c4e500e..aada0abbb97 100644
--- a/chromium/net/http/http_basic_stream.cc
+++ b/chromium/net/http/http_basic_stream.cc
@@ -11,6 +11,7 @@
#include "net/http/http_response_body_drainer.h"
#include "net/http/http_stream_parser.h"
#include "net/socket/client_socket_handle.h"
+#include "net/traffic_annotation/network_traffic_annotation.h"
namespace net {
@@ -24,10 +25,11 @@ HttpBasicStream::HttpBasicStream(std::unique_ptr<ClientSocketHandle> connection,
HttpBasicStream::~HttpBasicStream() = default;
int HttpBasicStream::InitializeStream(const HttpRequestInfo* request_info,
+ bool can_send_early,
RequestPriority priority,
const NetLogWithSource& net_log,
const CompletionCallback& callback) {
- state_.Initialize(request_info, priority, net_log, callback);
+ state_.Initialize(request_info, can_send_early, priority, net_log, callback);
return OK;
}
@@ -42,7 +44,9 @@ int HttpBasicStream::SendRequest(const HttpRequestHeaders& headers,
raw_headers.Add(it.name(), it.value());
request_headers_callback_.Run(std::move(raw_headers));
}
- return parser()->SendRequest(state_.GenerateRequestLine(), headers, response,
+ // TODO(crbug.com/656607): Add propoer annotation.
+ return parser()->SendRequest(state_.GenerateRequestLine(), headers,
+ NO_TRAFFIC_ANNOTATION_BUG_656607, response,
callback);
}
diff --git a/chromium/net/http/http_basic_stream.h b/chromium/net/http/http_basic_stream.h
index d1f54930a3d..15b74c60235 100644
--- a/chromium/net/http/http_basic_stream.h
+++ b/chromium/net/http/http_basic_stream.h
@@ -40,6 +40,7 @@ class NET_EXPORT_PRIVATE HttpBasicStream : public HttpStream {
// HttpStream methods:
int InitializeStream(const HttpRequestInfo* request_info,
+ bool can_send_early,
RequestPriority priority,
const NetLogWithSource& net_log,
const CompletionCallback& callback) override;
diff --git a/chromium/net/http/http_cache.cc b/chromium/net/http/http_cache.cc
index 0653b25b36a..f731201556c 100644
--- a/chromium/net/http/http_cache.cc
+++ b/chromium/net/http/http_cache.cc
@@ -321,7 +321,7 @@ HttpCache::HttpCache(std::unique_ptr<HttpTransactionFactory> network_layer,
fail_conditionalization_for_test_(false),
mode_(NORMAL),
network_layer_(std::move(network_layer)),
- clock_(new base::DefaultClock()),
+ clock_(base::DefaultClock::GetInstance()),
weak_factory_(this) {
HttpNetworkSession* session = network_layer_->GetSession();
// Session may be NULL in unittests.
@@ -839,8 +839,10 @@ int HttpCache::DoneWithResponseHeaders(ActiveEntry* entry,
// through done_headers_queue for performance benefit. (Also, in case of
// writer transaction, the consumer sometimes depend on synchronous behaviour
// e.g. while computing raw headers size. (crbug.com/711766))
- if ((transaction->mode() & Transaction::WRITE) && !entry->writers) {
- AddTransactionToWriters(entry, transaction);
+ if ((transaction->mode() & Transaction::WRITE) && !entry->writers &&
+ entry->readers.empty()) {
+ AddTransactionToWriters(entry, transaction,
+ CanTransactionJoinExistingWriters(transaction));
ProcessQueuedTransactions(entry);
return OK;
}
@@ -1058,19 +1060,30 @@ void HttpCache::ProcessAddToEntryQueue(ActiveEntry* entry) {
transaction->io_callback().Run(OK);
}
-bool HttpCache::CanTransactionJoinExistingWriters(Transaction* transaction) {
- return (transaction->method() == "GET" && !transaction->partial());
+HttpCache::ParallelWritingPattern HttpCache::CanTransactionJoinExistingWriters(
+ Transaction* transaction) {
+ if (transaction->method() != "GET")
+ return PARALLEL_WRITING_NOT_JOIN_METHOD_NOT_GET;
+ if (transaction->partial())
+ return PARALLEL_WRITING_NOT_JOIN_RANGE;
+ if (transaction->mode() == Transaction::READ)
+ return PARALLEL_WRITING_NOT_JOIN_READ_ONLY;
+ return PARALLEL_WRITING_JOIN;
}
void HttpCache::ProcessDoneHeadersQueue(ActiveEntry* entry) {
- DCHECK(!entry->writers || entry->writers->CanAddWriters());
+ ParallelWritingPattern writers_pattern;
+ DCHECK(!entry->writers || entry->writers->CanAddWriters(&writers_pattern));
DCHECK(!entry->done_headers_queue.empty());
Transaction* transaction = entry->done_headers_queue.front();
+ ParallelWritingPattern parallel_writing_pattern =
+ CanTransactionJoinExistingWriters(transaction);
if (IsWritingInProgress(entry)) {
- if (!CanTransactionJoinExistingWriters(transaction) ||
- transaction->mode() == Transaction::READ) {
+ transaction->MaybeSetParallelWritingPatternForMetrics(
+ parallel_writing_pattern);
+ if (parallel_writing_pattern != PARALLEL_WRITING_JOIN) {
// TODO(shivanisha): Returning from here instead of checking the next
// transaction in the queue because the FIFO order is maintained
// throughout, until it becomes a reader or writer. May be at this point
@@ -1079,11 +1092,14 @@ void HttpCache::ProcessDoneHeadersQueue(ActiveEntry* entry) {
// transactions.
return;
}
- AddTransactionToWriters(entry, transaction);
+ AddTransactionToWriters(entry, transaction, parallel_writing_pattern);
} else { // no writing in progress
if (transaction->mode() & Transaction::WRITE) {
if (transaction->partial()) {
- AddTransactionToWriters(entry, transaction);
+ if (entry->readers.empty())
+ AddTransactionToWriters(entry, transaction, parallel_writing_pattern);
+ else
+ return;
} else {
// Add the transaction to readers since the response body should have
// already been written. (If it was the first writer about to start
@@ -1093,10 +1109,14 @@ void HttpCache::ProcessDoneHeadersQueue(ActiveEntry* entry) {
transaction->WriteModeTransactionAboutToBecomeReader();
auto return_val = entry->readers.insert(transaction);
DCHECK(return_val.second);
+ transaction->MaybeSetParallelWritingPatternForMetrics(
+ PARALLEL_WRITING_NONE_CACHE_READ);
}
} else { // mode READ
auto return_val = entry->readers.insert(transaction);
DCHECK(return_val.second);
+ transaction->MaybeSetParallelWritingPatternForMetrics(
+ PARALLEL_WRITING_NONE_CACHE_READ);
}
}
@@ -1108,21 +1128,26 @@ void HttpCache::ProcessDoneHeadersQueue(ActiveEntry* entry) {
transaction->io_callback().Run(OK);
}
-void HttpCache::AddTransactionToWriters(ActiveEntry* entry,
- Transaction* transaction) {
+void HttpCache::AddTransactionToWriters(
+ ActiveEntry* entry,
+ Transaction* transaction,
+ ParallelWritingPattern parallel_writing_pattern) {
if (!entry->writers) {
entry->writers = std::make_unique<Writers>(this, entry);
+ transaction->MaybeSetParallelWritingPatternForMetrics(
+ PARALLEL_WRITING_CREATE);
+ } else {
+ ParallelWritingPattern writers_pattern;
+ DCHECK(entry->writers->CanAddWriters(&writers_pattern));
+ DCHECK_EQ(PARALLEL_WRITING_JOIN, writers_pattern);
}
- DCHECK(entry->writers->CanAddWriters());
-
Writers::TransactionInfo info(transaction->partial(),
transaction->is_truncated(),
*(transaction->GetResponseInfo()));
- entry->writers->AddTransaction(
- transaction,
- !CanTransactionJoinExistingWriters(transaction) /* is_exclusive */,
- transaction->priority(), info);
+
+ entry->writers->AddTransaction(transaction, parallel_writing_pattern,
+ transaction->priority(), info);
}
bool HttpCache::CanTransactionWriteResponseHeaders(ActiveEntry* entry,
@@ -1255,10 +1280,19 @@ void HttpCache::OnProcessQueuedTransactions(ActiveEntry* entry) {
// If another transaction is writing the response, let validated transactions
// wait till the response is complete. If the response is not yet started, the
// done_headers_queue transaction should start writing it.
- if ((!entry->writers || entry->writers->CanAddWriters()) &&
- !entry->done_headers_queue.empty()) {
- ProcessDoneHeadersQueue(entry);
- return;
+ if (!entry->done_headers_queue.empty()) {
+ ParallelWritingPattern reason = PARALLEL_WRITING_NONE;
+ if (entry->writers && !entry->writers->CanAddWriters(&reason)) {
+ if (reason != PARALLEL_WRITING_NONE) {
+ for (auto* done_headers_transaction : entry->done_headers_queue) {
+ done_headers_transaction->MaybeSetParallelWritingPatternForMetrics(
+ reason);
+ }
+ }
+ } else {
+ ProcessDoneHeadersQueue(entry);
+ return;
+ }
}
if (!entry->add_to_entry_queue.empty())
diff --git a/chromium/net/http/http_cache.h b/chromium/net/http/http_cache.h
index 975812e6506..0dabe1b3c81 100644
--- a/chromium/net/http/http_cache.h
+++ b/chromium/net/http/http_cache.h
@@ -109,6 +109,36 @@ class NET_EXPORT HttpCache : public HttpTransactionFactory {
int max_bytes_;
};
+ // Whether a transaction can join parallel writing or not is a function of the
+ // transaction as well as the current writers (if present). This enum
+ // captures that decision as well as when a Writers object is first created.
+ // This is also used to log metrics so should be consistent with the values in
+ // enums.xml and should only be appended to.
+ enum ParallelWritingPattern {
+ // Used as the default value till the transaction is in initial headers
+ // phase.
+ PARALLEL_WRITING_NONE,
+ // The transaction creates a writers object. This is only logged for
+ // transactions that did not fail to join existing writers earlier.
+ PARALLEL_WRITING_CREATE,
+ // The transaction joins existing writers.
+ PARALLEL_WRITING_JOIN,
+ // The transaction cannot join existing writers since either itself or
+ // existing writers instance is serving a range request.
+ PARALLEL_WRITING_NOT_JOIN_RANGE,
+ // The transaction cannot join existing writers since either itself or
+ // existing writers instance is serving a non GET request.
+ PARALLEL_WRITING_NOT_JOIN_METHOD_NOT_GET,
+ // The transaction cannot join existing writers since it does not have cache
+ // write privileges.
+ PARALLEL_WRITING_NOT_JOIN_READ_ONLY,
+ // Writers does not exist and the transaction does not need to create one
+ // since it is going to read from the cache.
+ PARALLEL_WRITING_NONE_CACHE_READ,
+ // On adding a value here, make sure to add in enums.xml as well.
+ PARALLEL_WRITING_MAX
+ };
+
// The number of minutes after a resource is prefetched that it can be used
// again without validation.
static const int kPrefetchReuseMins = 5;
@@ -170,10 +200,8 @@ class NET_EXPORT HttpCache : public HttpTransactionFactory {
Mode mode() { return mode_; }
// Get/Set the cache's clock. These are public only for testing.
- void SetClockForTesting(std::unique_ptr<base::Clock> clock) {
- clock_ = std::move(clock);
- }
- base::Clock* clock() const { return clock_.get(); }
+ void SetClockForTesting(base::Clock* clock) { clock_ = clock; }
+ base::Clock* clock() const { return clock_; }
// Close currently active sockets so that fresh page loads will not use any
// recycled connections. For sockets currently in use, they may not close
@@ -477,10 +505,11 @@ class NET_EXPORT HttpCache : public HttpTransactionFactory {
// already.
void ProcessAddToEntryQueue(ActiveEntry* entry);
- // Returns true if the transaction can join other transactions for writing to
- // the cache simultaneously. It is only supported for GET requests and
- // non-range requests.
- bool CanTransactionJoinExistingWriters(Transaction* transaction);
+ // Returns if the transaction can join other transactions for writing to
+ // the cache simultaneously. It is only supported for non-Read only,
+ // GET requests which are not range requests.
+ ParallelWritingPattern CanTransactionJoinExistingWriters(
+ Transaction* transaction);
// Invoked when a transaction that has already completed the response headers
// phase can resume reading/writing the response body. It will invoke the IO
@@ -489,7 +518,9 @@ class NET_EXPORT HttpCache : public HttpTransactionFactory {
void ProcessDoneHeadersQueue(ActiveEntry* entry);
// Adds a transaction to writers.
- void AddTransactionToWriters(ActiveEntry* entry, Transaction* transaction);
+ void AddTransactionToWriters(ActiveEntry* entry,
+ Transaction* transaction,
+ ParallelWritingPattern parallel_writing_pattern);
// Returns true if this transaction can write headers to the entry.
bool CanTransactionWriteResponseHeaders(ActiveEntry* entry,
@@ -566,7 +597,7 @@ class NET_EXPORT HttpCache : public HttpTransactionFactory {
std::unique_ptr<PlaybackCacheMap> playback_cache_map_;
// A clock that can be swapped out for testing.
- std::unique_ptr<base::Clock> clock_;
+ base::Clock* clock_;
THREAD_CHECKER(thread_checker_);
diff --git a/chromium/net/http/http_cache_transaction.cc b/chromium/net/http/http_cache_transaction.cc
index 7b491f92496..0dbacd48f37 100644
--- a/chromium/net/http/http_cache_transaction.cc
+++ b/chromium/net/http/http_cache_transaction.cc
@@ -19,8 +19,8 @@
#include "base/compiler_specific.h"
#include "base/location.h"
#include "base/macros.h"
+#include "base/metrics/histogram_functions.h"
#include "base/metrics/histogram_macros.h"
-#include "base/metrics/sparse_histogram.h"
#include "base/single_thread_task_runner.h"
#include "base/strings/string_number_conversions.h" // For HexEncode.
#include "base/strings/string_util.h" // For LowerCaseEqualsASCII.
@@ -179,6 +179,7 @@ HttpCache::Transaction::Transaction(RequestPriority priority, HttpCache* cache)
validation_cause_(VALIDATION_CAUSE_UNDEFINED),
cant_conditionalize_zero_freshness_from_memhint_(false),
recorded_histograms_(false),
+ parallel_writing_pattern_(PARALLEL_WRITING_NONE),
moved_network_transaction_to_writers_(false),
websocket_handshake_stream_base_create_helper_(NULL),
in_do_loop_(false),
@@ -558,10 +559,12 @@ void HttpCache::Transaction::PopulateNetErrorDetails(
void HttpCache::Transaction::SetPriority(RequestPriority priority) {
priority_ = priority;
- if (network_trans_) {
- DCHECK(!InWriters());
+
+ if (network_trans_)
network_trans_->SetPriority(priority_);
- } else if (InWriters()) {
+
+ if (InWriters()) {
+ DCHECK(!network_trans_ || partial_);
entry_->writers->UpdatePriority();
}
}
@@ -662,6 +665,15 @@ void HttpCache::Transaction::WriteModeTransactionAboutToBecomeReader() {
}
}
+void HttpCache::Transaction::MaybeSetParallelWritingPatternForMetrics(
+ HttpCache::ParallelWritingPattern pattern) {
+ // It's possible a transaction could not join existing writers and then
+ // creates a new writers. In that case the original reason for not being able
+ // to join writers should be logged.
+ if (parallel_writing_pattern_ == PARALLEL_WRITING_NONE)
+ parallel_writing_pattern_ = pattern;
+}
+
//-----------------------------------------------------------------------------
// A few common patterns: (Foo* means Foo -> FooComplete)
@@ -2982,11 +2994,14 @@ int HttpCache::Transaction::WriteResponseInfoToEntry(bool truncated) {
io_buf_len_ = data->pickle()->size();
- // Summarize some info on cacheability in memory.
- cache_->GetCurrentBackend()->SetEntryInMemoryData(
- cache_key_, ComputeUnusablePerCachingHeaders()
- ? HINT_UNUSABLE_PER_CACHING_HEADERS
- : 0);
+ // Summarize some info on cacheability in memory. Don't do it if doomed
+ // since then |entry_| isn't definitive for |cache_key_|.
+ if (!entry_->doomed) {
+ cache_->GetCurrentBackend()->SetEntryInMemoryData(
+ cache_key_, ComputeUnusablePerCachingHeaders()
+ ? HINT_UNUSABLE_PER_CACHING_HEADERS
+ : 0);
+ }
return entry_->disk_entry->WriteData(kResponseInfoIndex, 0, data.get(),
io_buf_len_, io_callback_, true);
@@ -3039,11 +3054,11 @@ int HttpCache::Transaction::OnCacheReadError(int result, bool restart) {
DLOG(ERROR) << "ReadData failed: " << result;
const int result_for_histogram = std::max(0, -result);
if (restart) {
- UMA_HISTOGRAM_SPARSE_SLOWLY("HttpCache.ReadErrorRestartable",
- result_for_histogram);
+ base::UmaHistogramSparse("HttpCache.ReadErrorRestartable",
+ result_for_histogram);
} else {
- UMA_HISTOGRAM_SPARSE_SLOWLY("HttpCache.ReadErrorNonRestartable",
- result_for_histogram);
+ base::UmaHistogramSparse("HttpCache.ReadErrorNonRestartable",
+ result_for_histogram);
}
// Avoid using this entry in the future.
@@ -3236,6 +3251,9 @@ void HttpCache::Transaction::RecordHistograms() {
DCHECK(!recorded_histograms_);
recorded_histograms_ = true;
+ UMA_HISTOGRAM_ENUMERATION("HttpCache.ParallelWritingPattern",
+ parallel_writing_pattern_, PARALLEL_WRITING_MAX);
+
if (CacheEntryStatus::ENTRY_UNDEFINED == cache_entry_status_)
return;
diff --git a/chromium/net/http/http_cache_transaction.h b/chromium/net/http/http_cache_transaction.h
index 385ab2ae7e6..fe8ac18463f 100644
--- a/chromium/net/http/http_cache_transaction.h
+++ b/chromium/net/http/http_cache_transaction.h
@@ -190,6 +190,12 @@ class NET_EXPORT_PRIVATE HttpCache::Transaction : public HttpTransaction {
// entry has finished writing.
void WriteModeTransactionAboutToBecomeReader();
+ // Invoked when HttpCache decides whether this transaction should join
+ // parallel writing or create a new writers object. This is then used
+ // for logging metrics. Can be called repeatedly, but doesn't change once the
+ // value has been set to something other than PARALLEL_WRITING_NONE.
+ void MaybeSetParallelWritingPatternForMetrics(ParallelWritingPattern pattern);
+
private:
static const size_t kNumValidationHeaders = 2;
// Helper struct to pair a header name with its value, for
@@ -624,6 +630,7 @@ class NET_EXPORT_PRIVATE HttpCache::Transaction : public HttpTransaction {
base::TimeDelta stale_entry_age_;
bool cant_conditionalize_zero_freshness_from_memhint_;
bool recorded_histograms_;
+ ParallelWritingPattern parallel_writing_pattern_;
NetworkTransactionInfo network_transaction_info_;
diff --git a/chromium/net/http/http_cache_unittest.cc b/chromium/net/http/http_cache_unittest.cc
index 4a6fbe801a6..f834fa62a41 100644
--- a/chromium/net/http/http_cache_unittest.cc
+++ b/chromium/net/http/http_cache_unittest.cc
@@ -22,6 +22,7 @@
#include "base/strings/string_number_conversions.h"
#include "base/strings/string_util.h"
#include "base/strings/stringprintf.h"
+#include "base/test/histogram_tester.h"
#include "base/test/simple_test_clock.h"
#include "base/trace_event/memory_allocator_dump.h"
#include "base/trace_event/memory_dump_request_args.h"
@@ -796,6 +797,8 @@ TEST(HttpCache, ReleaseBuffer) {
TEST(HttpCache, SimpleGETWithDiskFailures) {
MockHttpCache cache;
+ base::HistogramTester histograms;
+ const std::string histogram_name = "HttpCache.ParallelWritingPattern";
cache.disk_cache()->set_soft_failures(true);
@@ -812,6 +815,11 @@ TEST(HttpCache, SimpleGETWithDiskFailures) {
EXPECT_EQ(2, cache.network_layer()->transaction_count());
EXPECT_EQ(0, cache.disk_cache()->open_count());
EXPECT_EQ(2, cache.disk_cache()->create_count());
+
+ // Since the transactions were in headers phase when failed,
+ // PARALLEL_WRITING_NONE should be logged.
+ histograms.ExpectBucketCount(
+ histogram_name, static_cast<int>(HttpCache::PARALLEL_WRITING_NONE), 2);
}
// Tests that disk failures after the transaction has started don't cause the
@@ -988,6 +996,8 @@ TEST(HttpCache, SimpleGET_LoadOnlyFromCache_Miss) {
TEST(HttpCache, SimpleGET_LoadPreferringCache_Hit) {
MockHttpCache cache;
+ base::HistogramTester histograms;
+ const std::string histogram_name = "HttpCache.ParallelWritingPattern";
// write to the cache
RunTransactionTest(cache.http_cache(), kSimpleGET_Transaction);
@@ -1001,6 +1011,12 @@ TEST(HttpCache, SimpleGET_LoadPreferringCache_Hit) {
EXPECT_EQ(1, cache.network_layer()->transaction_count());
EXPECT_EQ(1, cache.disk_cache()->open_count());
EXPECT_EQ(1, cache.disk_cache()->create_count());
+
+ histograms.ExpectBucketCount(
+ histogram_name, static_cast<int>(HttpCache::PARALLEL_WRITING_CREATE), 1);
+ histograms.ExpectBucketCount(
+ histogram_name,
+ static_cast<int>(HttpCache::PARALLEL_WRITING_NONE_CACHE_READ), 1);
}
TEST(HttpCache, SimpleGET_LoadPreferringCache_Miss) {
@@ -1721,6 +1737,8 @@ TEST(HttpCache, RangeGET_ParallelValidationNoMatchDoomEntry1) {
// Tests parallel validation on range requests with non-overlapping ranges.
TEST(HttpCache, RangeGET_ParallelValidationDifferentRanges) {
+ base::HistogramTester histograms;
+ const std::string histogram_name = "HttpCache.ParallelWritingPattern";
MockHttpCache cache;
ScopedMockTransaction transaction(kRangeGET_TransactionOK);
@@ -1815,6 +1833,56 @@ TEST(HttpCache, RangeGET_ParallelValidationDifferentRanges) {
EXPECT_EQ(2, cache.network_layer()->transaction_count());
EXPECT_EQ(1, cache.disk_cache()->open_count());
EXPECT_EQ(1, cache.disk_cache()->create_count());
+
+ histograms.ExpectBucketCount(
+ histogram_name,
+ static_cast<int>(HttpCache::PARALLEL_WRITING_NOT_JOIN_RANGE), 1);
+ histograms.ExpectBucketCount(
+ histogram_name, static_cast<int>(HttpCache::PARALLEL_WRITING_CREATE), 2);
+}
+
+// Tests that a request does not create Writers when readers is not empty.
+TEST(HttpCache, RangeGET_DoNotCreateWritersWhenReaderExists) {
+ MockHttpCache cache;
+
+ // Save a request in the cache so that the next request can become a
+ // reader.
+ MockTransaction transaction(kRangeGET_Transaction);
+ transaction.request_headers = EXTRA_HEADER;
+ AddMockTransaction(&transaction);
+ RunTransactionTest(cache.http_cache(), transaction);
+
+ // Let this request be a reader since it doesn't need validation as per its
+ // load flag.
+ transaction.load_flags |= LOAD_SKIP_CACHE_VALIDATION;
+ MockHttpRequest request(transaction);
+ Context context;
+ context.result = cache.CreateTransaction(&context.trans);
+ ASSERT_THAT(context.result, IsOk());
+ context.result = context.trans->Start(&request, context.callback.callback(),
+ NetLogWithSource());
+ base::RunLoop().RunUntilIdle();
+ EXPECT_EQ(1, cache.GetCountReaders(transaction.url));
+ RemoveMockTransaction(&transaction);
+
+ // A range request should now "not" create Writers while readers is still
+ // non-empty.
+ MockTransaction range_transaction(kRangeGET_Transaction);
+ range_transaction.request_headers = "Range: bytes = 0-9\r\n" EXTRA_HEADER;
+ AddMockTransaction(&range_transaction);
+ MockHttpRequest range_request(range_transaction);
+ Context range_context;
+ range_context.result = cache.CreateTransaction(&range_context.trans);
+ ASSERT_THAT(range_context.result, IsOk());
+ range_context.result = range_context.trans->Start(
+ &range_request, range_context.callback.callback(), NetLogWithSource());
+ base::RunLoop().RunUntilIdle();
+
+ EXPECT_EQ(1, cache.GetCountReaders(transaction.url));
+ EXPECT_FALSE(cache.IsWriterPresent(transaction.url));
+ EXPECT_EQ(1, cache.GetCountDoneHeadersQueue(transaction.url));
+
+ RemoveMockTransaction(&range_transaction);
}
// Tests parallel validation on range requests can be successfully restarted
@@ -2795,6 +2863,8 @@ TEST(HttpCache, SimpleGET_ParallelWritingCacheWriteFailed) {
// like the code should disallow two POSTs without LOAD_ONLY_FROM_CACHE with the
// same upload data identifier to map to the same entry.
TEST(HttpCache, SimplePOST_ParallelWritingDisallowed) {
+ base::HistogramTester histograms;
+ const std::string histogram_name = "HttpCache.ParallelWritingPattern";
MockHttpCache cache;
MockTransaction transaction(kSimplePOST_Transaction);
@@ -2851,11 +2921,19 @@ TEST(HttpCache, SimplePOST_ParallelWritingDisallowed) {
EXPECT_EQ(1, cache.network_layer()->transaction_count());
EXPECT_EQ(0, cache.disk_cache()->open_count());
EXPECT_EQ(1, cache.disk_cache()->create_count());
+
+ histograms.ExpectBucketCount(
+ histogram_name,
+ static_cast<int>(HttpCache::PARALLEL_WRITING_NOT_JOIN_METHOD_NOT_GET), 1);
+ histograms.ExpectBucketCount(
+ histogram_name, static_cast<int>(HttpCache::PARALLEL_WRITING_CREATE), 1);
}
// Tests the case when parallel writing succeeds. Tests both idle and waiting
// transactions.
TEST(HttpCache, SimpleGET_ParallelWritingSuccess) {
+ base::HistogramTester histograms;
+ const std::string histogram_name = "HttpCache.ParallelWritingPattern";
MockHttpCache cache;
MockHttpRequest request(kSimpleGET_Transaction);
@@ -2930,6 +3008,15 @@ TEST(HttpCache, SimpleGET_ParallelWritingSuccess) {
auto& c = context_list[i];
ReadAndVerifyTransaction(c->trans.get(), kSimpleGET_Transaction);
}
+
+ // Verify metrics.
+ histograms.ExpectBucketCount(
+ histogram_name, static_cast<int>(HttpCache::PARALLEL_WRITING_CREATE), 1);
+ histograms.ExpectBucketCount(
+ histogram_name, static_cast<int>(HttpCache::PARALLEL_WRITING_JOIN), 2);
+ histograms.ExpectBucketCount(
+ histogram_name,
+ static_cast<int>(HttpCache::PARALLEL_WRITING_NOT_JOIN_READ_ONLY), 1);
}
// Tests that network transaction's info is saved correctly when a writer
@@ -3428,6 +3515,77 @@ TEST(HttpCache, SimpleGET_DoomWithPending) {
}
}
+TEST(HttpCache, DoomDoesNotSetHints) {
+ // Test that a doomed writer doesn't set in-memory index hints.
+ MockHttpCache cache;
+ cache.disk_cache()->set_support_in_memory_entry_data(true);
+
+ // Request 1 is a normal one to a no-cache/no-etag resource, to potentially
+ // set a "this is unvalidatable" hint in the cache. We also need it to
+ // actually write out to the doomed entry after request 2 does its thing,
+ // so its transaction is paused.
+ MockTransaction no_cache_transaction(kSimpleGET_Transaction);
+ no_cache_transaction.response_headers = "Cache-Control: no-cache\n";
+ AddMockTransaction(&no_cache_transaction);
+ MockHttpRequest request1(no_cache_transaction);
+
+ Context c1;
+ c1.result = cache.CreateTransaction(&c1.trans);
+ ASSERT_THAT(c1.result, IsOk());
+ c1.trans->SetBeforeNetworkStartCallback(
+ base::Bind([](bool* defer) { *defer = true; }));
+ c1.result =
+ c1.trans->Start(&request1, c1.callback.callback(), NetLogWithSource());
+ ASSERT_THAT(c1.result, IsError(ERR_IO_PENDING));
+
+ // It starts, copies over headers info, but doesn't get to proceed.
+ base::RunLoop().RunUntilIdle();
+ RemoveMockTransaction(&no_cache_transaction);
+
+ // Request 2 sets LOAD_BYPASS_CACHE to force the first one to be doomed ---
+ // it'll want to be a writer.
+ MockHttpRequest request2(kSimpleGET_Transaction);
+ request2.load_flags = LOAD_BYPASS_CACHE;
+
+ Context c2;
+ c2.result = cache.CreateTransaction(&c2.trans);
+ ASSERT_THAT(c2.result, IsOk());
+ c2.result =
+ c2.trans->Start(&request2, c2.callback.callback(), NetLogWithSource());
+ ASSERT_THAT(c2.result, IsError(ERR_IO_PENDING));
+
+ // Run Request2, then let the first one wrap up.
+ base::RunLoop().RunUntilIdle();
+ c2.callback.WaitForResult();
+ ReadAndVerifyTransaction(c2.trans.get(), kSimpleGET_Transaction);
+
+ c1.trans->ResumeNetworkStart();
+ c1.callback.WaitForResult();
+ ReadAndVerifyTransaction(c1.trans.get(), no_cache_transaction);
+
+ EXPECT_EQ(2, cache.network_layer()->transaction_count());
+ EXPECT_EQ(0, cache.disk_cache()->open_count());
+ EXPECT_EQ(2, cache.disk_cache()->create_count());
+
+ // Request 3 tries to read from cache, and it should successfully do so. It's
+ // run after the previous two transactions finish so it doesn't try to
+ // cooperate with them, and is entirely driven by the state of the cache.
+ MockHttpRequest request3(kSimpleGET_Transaction);
+ Context context3;
+ context3.result = cache.CreateTransaction(&context3.trans);
+ ASSERT_THAT(context3.result, IsOk());
+ context3.result = context3.trans->Start(
+ &request3, context3.callback.callback(), NetLogWithSource());
+ base::RunLoop().RunUntilIdle();
+ ASSERT_THAT(context3.result, IsError(ERR_IO_PENDING));
+ context3.result = context3.callback.WaitForResult();
+ ReadAndVerifyTransaction(context3.trans.get(), kSimpleGET_Transaction);
+
+ EXPECT_EQ(2, cache.network_layer()->transaction_count());
+ EXPECT_EQ(1, cache.disk_cache()->open_count());
+ EXPECT_EQ(2, cache.disk_cache()->create_count());
+}
+
// This is a test for http://code.google.com/p/chromium/issues/detail?id=4731.
// We may attempt to delete an entry synchronously with the act of adding a new
// transaction to said entry.
@@ -4936,6 +5094,8 @@ TEST(HttpCache, SimplePOST_LoadOnlyFromCache_Miss) {
TEST(HttpCache, SimplePOST_LoadOnlyFromCache_Hit) {
MockHttpCache cache;
+ base::HistogramTester histograms;
+ const std::string histogram_name = "HttpCache.ParallelWritingPattern";
// Test that we hit the cache for POST requests.
@@ -4965,6 +5125,10 @@ TEST(HttpCache, SimplePOST_LoadOnlyFromCache_Hit) {
EXPECT_EQ(1, cache.network_layer()->transaction_count());
EXPECT_EQ(1, cache.disk_cache()->open_count());
EXPECT_EQ(1, cache.disk_cache()->create_count());
+
+ histograms.ExpectBucketCount(
+ histogram_name,
+ static_cast<int>(HttpCache::PARALLEL_WRITING_NONE_CACHE_READ), 1);
}
// Test that we don't hit the cache for POST requests if there is a byte range.
@@ -8957,9 +9121,9 @@ TEST(HttpCache, SkipVaryCheckStar) {
// transactions unless LOAD_SKIP_CACHE_VALIDATION is set.
TEST(HttpCache, ValidLoadOnlyFromCache) {
MockHttpCache cache;
- base::SimpleTestClock* clock = new base::SimpleTestClock();
- cache.http_cache()->SetClockForTesting(base::WrapUnique(clock));
- cache.network_layer()->SetClock(clock);
+ base::SimpleTestClock clock;
+ cache.http_cache()->SetClockForTesting(&clock);
+ cache.network_layer()->SetClock(&clock);
// Write a resource that will expire in 100 seconds.
ScopedMockTransaction transaction(kSimpleGET_Transaction);
@@ -8967,7 +9131,7 @@ TEST(HttpCache, ValidLoadOnlyFromCache) {
RunTransactionTest(cache.http_cache(), transaction);
// Move forward in time such that the cached response is no longer valid.
- clock->Advance(base::TimeDelta::FromSeconds(101));
+ clock.Advance(base::TimeDelta::FromSeconds(101));
// Skipping cache validation should still return a response.
transaction.load_flags = LOAD_ONLY_FROM_CACHE | LOAD_SKIP_CACHE_VALIDATION;
@@ -9844,9 +10008,8 @@ class HttpCachePrefetchValidationTest : public ::testing::Test {
HttpCachePrefetchValidationTest() : transaction_(kSimpleGET_Transaction) {
DCHECK_LT(kMaxAgeSecs, prefetch_reuse_mins() * kNumSecondsPerMinute);
- clock_ = new base::SimpleTestClock();
- cache_.http_cache()->SetClockForTesting(base::WrapUnique(clock_));
- cache_.network_layer()->SetClock(clock_);
+ cache_.http_cache()->SetClockForTesting(&clock_);
+ cache_.network_layer()->SetClock(&clock_);
transaction_.response_headers = "Cache-Control: max-age=100\n";
}
@@ -9859,7 +10022,7 @@ class HttpCachePrefetchValidationTest : public ::testing::Test {
}
void AdvanceTime(int seconds) {
- clock_->Advance(base::TimeDelta::FromSeconds(seconds));
+ clock_.Advance(base::TimeDelta::FromSeconds(seconds));
}
int prefetch_reuse_mins() { return HttpCache::kPrefetchReuseMins; }
@@ -9874,7 +10037,7 @@ class HttpCachePrefetchValidationTest : public ::testing::Test {
MockHttpCache cache_;
ScopedMockTransaction transaction_;
std::string response_headers_;
- base::SimpleTestClock* clock_;
+ base::SimpleTestClock clock_;
};
TEST_F(HttpCachePrefetchValidationTest, SkipValidationShortlyAfterPrefetch) {
diff --git a/chromium/net/http/http_cache_writers.cc b/chromium/net/http/http_cache_writers.cc
index 0fcf1c6af52..31b4f15b116 100644
--- a/chromium/net/http/http_cache_writers.cc
+++ b/chromium/net/http/http_cache_writers.cc
@@ -103,12 +103,14 @@ bool HttpCache::Writers::StopCaching(bool keep_entry) {
return true;
}
-void HttpCache::Writers::AddTransaction(Transaction* transaction,
- bool is_exclusive,
- RequestPriority priority,
- const TransactionInfo& info) {
+void HttpCache::Writers::AddTransaction(
+ Transaction* transaction,
+ ParallelWritingPattern initial_writing_pattern,
+ RequestPriority priority,
+ const TransactionInfo& info) {
DCHECK(transaction);
- DCHECK(CanAddWriters());
+ ParallelWritingPattern writers_pattern;
+ DCHECK(CanAddWriters(&writers_pattern));
DCHECK_EQ(0u, all_writers_.count(transaction));
@@ -117,6 +119,15 @@ void HttpCache::Writers::AddTransaction(Transaction* transaction,
should_keep_entry_ =
IsValidResponseForWriter(info.partial != nullptr, &(info.response_info));
+ if (all_writers_.empty()) {
+ DCHECK_EQ(PARALLEL_WRITING_NONE, parallel_writing_pattern_);
+ parallel_writing_pattern_ = initial_writing_pattern;
+ if (parallel_writing_pattern_ != PARALLEL_WRITING_JOIN)
+ is_exclusive_ = true;
+ } else {
+ DCHECK_EQ(PARALLEL_WRITING_JOIN, parallel_writing_pattern_);
+ }
+
if (info.partial && !info.truncated) {
DCHECK(!partial_do_not_truncate_);
partial_do_not_truncate_ = true;
@@ -125,11 +136,6 @@ void HttpCache::Writers::AddTransaction(Transaction* transaction,
std::pair<Transaction*, TransactionInfo> writer(transaction, info);
all_writers_.insert(writer);
- if (is_exclusive) {
- DCHECK_EQ(1u, all_writers_.size());
- is_exclusive_ = true;
- }
-
priority_ = std::max(priority, priority_);
if (network_transaction_) {
network_transaction_->SetPriority(priority_);
@@ -227,7 +233,8 @@ bool HttpCache::Writers::ContainsOnlyIdleWriters() const {
return waiting_for_read_.empty() && !active_transaction_;
}
-bool HttpCache::Writers::CanAddWriters() {
+bool HttpCache::Writers::CanAddWriters(ParallelWritingPattern* reason) {
+ *reason = PARALLEL_WRITING_NONE;
// While cleaning up writers (truncation) we should delay adding new writers.
// The caller can try again later.
if (next_state_ == State::ASYNC_OP_COMPLETE_PRE_TRUNCATE ||
@@ -236,6 +243,7 @@ bool HttpCache::Writers::CanAddWriters() {
return false;
}
+ *reason = parallel_writing_pattern_;
if (all_writers_.empty())
return true;
diff --git a/chromium/net/http/http_cache_writers.h b/chromium/net/http/http_cache_writers.h
index 9fbd265c193..2b45c1e0b85 100644
--- a/chromium/net/http/http_cache_writers.h
+++ b/chromium/net/http/http_cache_writers.h
@@ -78,15 +78,16 @@ class NET_EXPORT_PRIVATE HttpCache::Writers {
// Adds an HttpCache::Transaction to Writers.
// Should only be invoked if CanAddWriters() returns true.
- // If |is_exclusive| is true, it makes writing an exclusive operation
- // implying that Writers can contain at most one transaction till the
- // completion of the response body. It is illegal to invoke with is_exclusive
- // as true if there is already a transaction present.
+ // |parallel_writing_pattern| governs whether writing is an exclusive
+ // operation implying that Writers can contain at most one transaction till
+ // the completion of the response body. It is illegal to invoke with
+ // |parallel_writing_pattern| as PARALLEL_WRITING_NOT_JOIN* if there is
+ // already a transaction present.
// |transaction| can be destroyed at any point and it should invoke
// HttpCache::DoneWithEntry() during its destruction. This will also ensure
// any pointers in |info| are not accessed after the transaction is destroyed.
void AddTransaction(Transaction* transaction,
- bool is_exclusive,
+ ParallelWritingPattern initial_writing_pattern,
RequestPriority priority,
const TransactionInfo& info);
@@ -108,8 +109,9 @@ class NET_EXPORT_PRIVATE HttpCache::Writers {
return all_writers_.count(const_cast<Transaction*>(transaction)) > 0;
}
- // Returns true if more writers can be added for shared writing.
- bool CanAddWriters();
+ // Returns true if more writers can be added for shared writing. Also fills in
+ // the |reason| for why a transaction cannot be added.
+ bool CanAddWriters(ParallelWritingPattern* reason);
// Returns if only one transaction can be a member of writers.
bool IsExclusive() const { return is_exclusive_; }
@@ -274,6 +276,7 @@ class NET_EXPORT_PRIVATE HttpCache::Writers {
// True if multiple transactions are not allowed e.g. for partial requests.
bool is_exclusive_ = false;
+ ParallelWritingPattern parallel_writing_pattern_ = PARALLEL_WRITING_NONE;
// Current priority of the request. It is always the maximum of all the writer
// transactions.
diff --git a/chromium/net/http/http_cache_writers_unittest.cc b/chromium/net/http/http_cache_writers_unittest.cc
index cb05ec48c86..4d65c6294c9 100644
--- a/chromium/net/http/http_cache_writers_unittest.cc
+++ b/chromium/net/http/http_cache_writers_unittest.cc
@@ -90,7 +90,9 @@ class WritersTest : public testing::Test {
return transaction;
}
- void CreateWritersAddTransaction(bool is_exclusive = false) {
+ void CreateWritersAddTransaction(
+ HttpCache::ParallelWritingPattern parallel_writing_pattern_ =
+ HttpCache::PARALLEL_WRITING_JOIN) {
TestCompletionCallback callback;
// Create and Start a mock network transaction.
@@ -113,7 +115,7 @@ class WritersTest : public testing::Test {
*(transaction->GetResponseInfo()));
info.response_info = response_info_;
- writers_->AddTransaction(transaction.get(), is_exclusive,
+ writers_->AddTransaction(transaction.get(), parallel_writing_pattern_,
transaction->priority(), info);
writers_->SetNetworkTransaction(transaction.get(),
std::move(network_transaction));
@@ -121,9 +123,11 @@ class WritersTest : public testing::Test {
transactions_.push_back(std::move(transaction));
}
- void CreateWritersAddTransactionPriority(net::RequestPriority priority,
- bool is_exclusive = false) {
- CreateWritersAddTransaction(is_exclusive);
+ void CreateWritersAddTransactionPriority(
+ net::RequestPriority priority,
+ HttpCache::ParallelWritingPattern parallel_writing_pattern_ =
+ HttpCache::PARALLEL_WRITING_JOIN) {
+ CreateWritersAddTransaction(parallel_writing_pattern_);
TestHttpCacheTransaction* transaction = transactions_.begin()->get();
transaction->SetPriority(priority);
}
@@ -140,8 +144,9 @@ class WritersTest : public testing::Test {
transaction->is_truncated(),
*(transaction->GetResponseInfo()));
info.response_info = response_info_;
- writers_->AddTransaction(transaction.get(), false, transaction->priority(),
- info);
+ writers_->AddTransaction(transaction.get(),
+ HttpCache::PARALLEL_WRITING_JOIN,
+ transaction->priority(), info);
transactions_.push_back(std::move(transaction));
}
@@ -322,7 +327,7 @@ class WritersTest : public testing::Test {
EXPECT_TRUE(writers_->IsEmpty());
// Cannot add more writers while we are in truncation pending state.
- EXPECT_FALSE(writers_->CanAddWriters());
+ EXPECT_FALSE(CanAddWriters());
// Complete the Read and the entry should be truncated.
base::RunLoop().RunUntilIdle();
@@ -341,7 +346,7 @@ class WritersTest : public testing::Test {
writers_->StopCaching(false /* keep_entry */);
// Cannot add more writers while we are in network read only state.
- EXPECT_FALSE(writers_->CanAddWriters());
+ EXPECT_FALSE(CanAddWriters());
// Complete the Read and the entry should be truncated.
base::RunLoop().RunUntilIdle();
@@ -438,6 +443,11 @@ class WritersTest : public testing::Test {
EXPECT_FALSE(ShouldKeepEntry());
}
+ bool CanAddWriters() {
+ HttpCache::ParallelWritingPattern parallel_writing_pattern_;
+ return writers_->CanAddWriters(&parallel_writing_pattern_);
+ }
+
MockHttpCache cache_;
std::unique_ptr<HttpCache::Writers> writers_;
disk_cache::Entry* disk_entry_;
@@ -476,10 +486,10 @@ TEST_F(WritersTest, AddManyTransactions) {
// Tests that CanAddWriters should return false if it is writing exclusively.
TEST_F(WritersTest, AddTransactionsExclusive) {
- CreateWritersAddTransaction(true /* is_exclusive */);
+ CreateWritersAddTransaction(HttpCache::PARALLEL_WRITING_NOT_JOIN_RANGE);
EXPECT_FALSE(writers_->IsEmpty());
- EXPECT_FALSE(writers_->CanAddWriters());
+ EXPECT_FALSE(CanAddWriters());
}
// Tests StopCaching should not stop caching if there are multiple writers.
@@ -487,11 +497,11 @@ TEST_F(WritersTest, StopCachingMultipleWriters) {
CreateWritersAddTransaction();
EXPECT_FALSE(writers_->IsEmpty());
- EXPECT_TRUE(writers_->CanAddWriters());
+ EXPECT_TRUE(CanAddWriters());
AddTransactionToExistingWriters();
EXPECT_FALSE(StopCaching());
- EXPECT_TRUE(writers_->CanAddWriters());
+ EXPECT_TRUE(CanAddWriters());
}
// Tests StopCaching should stop caching if there is a single writer.
@@ -500,7 +510,7 @@ TEST_F(WritersTest, StopCaching) {
EXPECT_FALSE(writers_->IsEmpty());
EXPECT_TRUE(StopCaching());
- EXPECT_FALSE(writers_->CanAddWriters());
+ EXPECT_FALSE(CanAddWriters());
}
// Tests StopCaching should be successful when invoked mid-read.
@@ -545,7 +555,7 @@ TEST_F(WritersTest, ReadMultiple) {
CreateWritersAddTransaction();
EXPECT_FALSE(writers_->IsEmpty());
- EXPECT_TRUE(writers_->CanAddWriters());
+ EXPECT_TRUE(CanAddWriters());
AddTransactionToExistingWriters();
AddTransactionToExistingWriters();
@@ -557,7 +567,7 @@ TEST_F(WritersTest, ReadMultipleDifferentBufferSizes) {
CreateWritersAddTransaction();
EXPECT_FALSE(writers_->IsEmpty());
- EXPECT_TRUE(writers_->CanAddWriters());
+ EXPECT_TRUE(CanAddWriters());
AddTransactionToExistingWriters();
std::vector<int> buffer_lengths{20, 10};
@@ -570,7 +580,7 @@ TEST_F(WritersTest, ReadMultipleDifferentBufferSizes1) {
CreateWritersAddTransaction();
EXPECT_FALSE(writers_->IsEmpty());
- EXPECT_TRUE(writers_->CanAddWriters());
+ EXPECT_TRUE(CanAddWriters());
AddTransactionToExistingWriters();
std::vector<int> buffer_lengths{10, 20};
@@ -583,7 +593,7 @@ TEST_F(WritersTest, ReadMultipleDeleteActiveTransaction) {
CreateWritersAddTransaction();
EXPECT_FALSE(writers_->IsEmpty());
- EXPECT_TRUE(writers_->CanAddWriters());
+ EXPECT_TRUE(CanAddWriters());
AddTransactionToExistingWriters();
AddTransactionToExistingWriters();
@@ -596,7 +606,7 @@ TEST_F(WritersTest, ReadMultipleDeleteActiveTransaction) {
TEST_F(WritersTest, MidReadDeleteActiveTransaction) {
CreateWritersAddTransaction();
EXPECT_FALSE(writers_->IsEmpty());
- EXPECT_TRUE(writers_->CanAddWriters());
+ EXPECT_TRUE(CanAddWriters());
MidReadDeleteActiveTransaction();
}
@@ -606,7 +616,7 @@ TEST_F(WritersTest, ReadMultipleDeleteWaitingTransaction) {
CreateWritersAddTransaction();
EXPECT_FALSE(writers_->IsEmpty());
- EXPECT_TRUE(writers_->CanAddWriters());
+ EXPECT_TRUE(CanAddWriters());
AddTransactionToExistingWriters();
AddTransactionToExistingWriters();
AddTransactionToExistingWriters();
@@ -620,7 +630,7 @@ TEST_F(WritersTest, ReadMultipleDeleteIdleTransaction) {
CreateWritersAddTransaction();
EXPECT_FALSE(writers_->IsEmpty());
- EXPECT_TRUE(writers_->CanAddWriters());
+ EXPECT_TRUE(CanAddWriters());
AddTransactionToExistingWriters();
AddTransactionToExistingWriters();
@@ -633,7 +643,7 @@ TEST_F(WritersTest, ReadMultipleCacheWriteFailed) {
CreateWritersAddTransaction();
EXPECT_FALSE(writers_->IsEmpty());
- EXPECT_TRUE(writers_->CanAddWriters());
+ EXPECT_TRUE(CanAddWriters());
AddTransactionToExistingWriters();
AddTransactionToExistingWriters();
@@ -658,7 +668,7 @@ TEST_F(WritersTest, ReadMultipleNetworkReadFailed) {
CreateWritersAddTransaction();
EXPECT_FALSE(writers_->IsEmpty());
- EXPECT_TRUE(writers_->CanAddWriters());
+ EXPECT_TRUE(CanAddWriters());
AddTransactionToExistingWriters();
AddTransactionToExistingWriters();
@@ -691,7 +701,7 @@ TEST_F(WritersTest, TruncateEntryFail) {
// Set network read only.
TEST_F(WritersTest, StopCachingWithKeepEntry) {
- CreateWritersAddTransaction(true /* is exclusive */);
+ CreateWritersAddTransaction(HttpCache::PARALLEL_WRITING_NOT_JOIN_RANGE);
EXPECT_FALSE(writers_->network_read_only());
writers_->StopCaching(true /* keep_entry */);
@@ -700,7 +710,7 @@ TEST_F(WritersTest, StopCachingWithKeepEntry) {
}
TEST_F(WritersTest, StopCachingWithNotKeepEntry) {
- CreateWritersAddTransaction(true /* is exclusive */);
+ CreateWritersAddTransaction(HttpCache::PARALLEL_WRITING_NOT_JOIN_RANGE);
EXPECT_FALSE(writers_->network_read_only());
writers_->StopCaching(false /* keep_entry */);
diff --git a/chromium/net/http/http_network_session.cc b/chromium/net/http/http_network_session.cc
index bcced4e441f..4b1fe0d8ebe 100644
--- a/chromium/net/http/http_network_session.cc
+++ b/chromium/net/http/http_network_session.cc
@@ -5,7 +5,7 @@
#include "net/http/http_network_session.h"
#include <inttypes.h>
-#include <memory>
+
#include <utility>
#include "base/atomic_sequence_num.h"
@@ -125,14 +125,20 @@ HttpNetworkSession::Params::Params()
quic_migrate_sessions_early(false),
quic_migrate_sessions_on_network_change_v2(false),
quic_migrate_sessions_early_v2(false),
+ quic_max_time_on_non_default_network(
+ base::TimeDelta::FromSeconds(kMaxTimeOnNonDefaultNetworkSecs)),
+ quic_max_migrations_to_non_default_network_on_path_degrading(
+ kMaxMigrationsToNonDefaultNetworkOnPathDegrading),
quic_allow_server_migration(false),
quic_allow_remote_alt_svc(false),
quic_disable_bidirectional_streams(false),
quic_force_hol_blocking(false),
quic_race_cert_verification(false),
quic_estimate_initial_rtt(false),
+ quic_headers_include_h2_stream_dependency(false),
enable_token_binding(false),
- http_09_on_non_default_ports_enabled(false) {
+ http_09_on_non_default_ports_enabled(false),
+ disable_idle_sockets_close_on_memory_pressure(false) {
quic_supported_versions.push_back(QUIC_VERSION_39);
}
@@ -206,9 +212,12 @@ HttpNetworkSession::HttpNetworkSession(const Params& params,
params.quic_migrate_sessions_early,
params.quic_migrate_sessions_on_network_change_v2,
params.quic_migrate_sessions_early_v2,
+ params.quic_max_time_on_non_default_network,
+ params.quic_max_migrations_to_non_default_network_on_path_degrading,
params.quic_allow_server_migration,
params.quic_race_cert_verification,
params.quic_estimate_initial_rtt,
+ params.quic_headers_include_h2_stream_dependency,
params.quic_connection_options,
params.quic_client_connection_options,
params.enable_token_binding),
@@ -223,9 +232,8 @@ HttpNetworkSession::HttpNetworkSession(const Params& params,
AddDefaultHttp2Settings(params.http2_settings),
params.time_func,
context.proxy_delegate),
- http_stream_factory_(new HttpStreamFactoryImpl(this, false)),
- http_stream_factory_for_websocket_(new HttpStreamFactoryImpl(this, true)),
- network_stream_throttler_(new NetworkThrottleManagerImpl()),
+ http_stream_factory_(std::make_unique<HttpStreamFactoryImpl>(this)),
+ network_stream_throttler_(std::make_unique<NetworkThrottleManagerImpl>()),
params_(params),
context_(context) {
DCHECK(proxy_service_);
@@ -248,14 +256,20 @@ HttpNetworkSession::HttpNetworkSession(const Params& params,
http_server_properties_->SetMaxServerConfigsStoredInProperties(
params.quic_max_server_configs_stored_in_properties);
- memory_pressure_listener_.reset(new base::MemoryPressureListener(base::Bind(
- &HttpNetworkSession::OnMemoryPressure, base::Unretained(this))));
+ if (!params_.disable_idle_sockets_close_on_memory_pressure) {
+ memory_pressure_listener_.reset(
+ new base::MemoryPressureListener(base::BindRepeating(
+ &HttpNetworkSession::OnMemoryPressure, base::Unretained(this))));
+ }
+
base::MemoryCoordinatorClientRegistry::GetInstance()->Register(this);
}
HttpNetworkSession::~HttpNetworkSession() {
DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
response_drainers_.clear();
+ // TODO(bnc): CloseAllSessions() is also called in SpdySessionPool destructor,
+ // one of the two calls should be removed.
spdy_session_pool_.CloseAllSessions();
base::MemoryCoordinatorClientRegistry::GetInstance()->Unregister(this);
}
@@ -359,6 +373,11 @@ std::unique_ptr<base::Value> HttpNetworkSession::QuicInfoToValue() const {
params_.quic_migrate_sessions_on_network_change_v2);
dict->SetBoolean("migrate_sessions_early_v2",
params_.quic_migrate_sessions_early_v2);
+ dict->SetInteger("max_time_on_non_default_network_seconds",
+ params_.quic_max_time_on_non_default_network.InSeconds());
+ dict->SetInteger(
+ "max_num_migrations_to_non_default_network_on_path_degrading",
+ params_.quic_max_migrations_to_non_default_network_on_path_degrading);
dict->SetBoolean("allow_server_migration",
params_.quic_allow_server_migration);
dict->SetBoolean("estimate_initial_rtt", params_.quic_estimate_initial_rtt);
@@ -480,10 +499,13 @@ ClientSocketPoolManager* HttpNetworkSession::GetSocketPoolManager(
void HttpNetworkSession::OnMemoryPressure(
base::MemoryPressureListener::MemoryPressureLevel memory_pressure_level) {
+ DCHECK(!params_.disable_idle_sockets_close_on_memory_pressure);
+
switch (memory_pressure_level) {
case base::MemoryPressureListener::MEMORY_PRESSURE_LEVEL_NONE:
- case base::MemoryPressureListener::MEMORY_PRESSURE_LEVEL_MODERATE:
break;
+
+ case base::MemoryPressureListener::MEMORY_PRESSURE_LEVEL_MODERATE:
case base::MemoryPressureListener::MEMORY_PRESSURE_LEVEL_CRITICAL:
CloseIdleConnections();
break;
diff --git a/chromium/net/http/http_network_session.h b/chromium/net/http/http_network_session.h
index 59d19493752..2a20aad3a37 100644
--- a/chromium/net/http/http_network_session.h
+++ b/chromium/net/http/http_network_session.h
@@ -175,6 +175,13 @@ class NET_EXPORT HttpNetworkSession : public base::MemoryCoordinatorClient {
// If true, connection migration v2 may be used to migrate active QUIC
// sessions to alternative network if current network connectivity is poor.
bool quic_migrate_sessions_early_v2;
+ // Maximum time the session could be on the non-default network before
+ // migrates back to default network. Defaults to
+ // kMaxTimeOnNonDefaultNetwork.
+ base::TimeDelta quic_max_time_on_non_default_network;
+ // Maximum number of migrations to the non-default network on path
+ // degrading per network for each session.
+ int quic_max_migrations_to_non_default_network_on_path_degrading;
// If true, allows migration of QUIC connections to a server-specified
// alternate server address.
bool quic_allow_server_migration;
@@ -189,6 +196,9 @@ class NET_EXPORT HttpNetworkSession : public base::MemoryCoordinatorClient {
bool quic_race_cert_verification;
// If true, estimate the initial RTT for QUIC connections based on network.
bool quic_estimate_initial_rtt;
+ // If true, client headers will include HTTP/2 stream dependency info
+ // derived from the request priority.
+ bool quic_headers_include_h2_stream_dependency;
// If non-empty, QUIC will only be spoken to hosts in this list.
base::flat_set<std::string> quic_host_whitelist;
@@ -198,6 +208,9 @@ class NET_EXPORT HttpNetworkSession : public base::MemoryCoordinatorClient {
// Enable HTTP/0.9 for HTTP/HTTPS on ports other than the default one for
// each protocol.
bool http_09_on_non_default_ports_enabled;
+
+ // If true, idle sockets won't be closed when memory pressure happens.
+ bool disable_idle_sockets_close_on_memory_pressure;
};
// Structure with pointers to the dependencies of the HttpNetworkSession.
@@ -277,9 +290,6 @@ class NET_EXPORT HttpNetworkSession : public base::MemoryCoordinatorClient {
HttpStreamFactory* http_stream_factory() {
return http_stream_factory_.get();
}
- HttpStreamFactory* http_stream_factory_for_websocket() {
- return http_stream_factory_for_websocket_.get();
- }
NetworkThrottleManager* throttler() {
return network_stream_throttler_.get();
}
@@ -358,7 +368,6 @@ class NET_EXPORT HttpNetworkSession : public base::MemoryCoordinatorClient {
QuicStreamFactory quic_stream_factory_;
SpdySessionPool spdy_session_pool_;
std::unique_ptr<HttpStreamFactory> http_stream_factory_;
- std::unique_ptr<HttpStreamFactory> http_stream_factory_for_websocket_;
std::map<HttpResponseBodyDrainer*, std::unique_ptr<HttpResponseBodyDrainer>>
response_drainers_;
std::unique_ptr<NetworkThrottleManager> network_stream_throttler_;
diff --git a/chromium/net/http/http_network_session_peer.cc b/chromium/net/http/http_network_session_peer.cc
index 9b33d98bac0..e9c629e8a92 100644
--- a/chromium/net/http/http_network_session_peer.cc
+++ b/chromium/net/http/http_network_session_peer.cc
@@ -29,11 +29,6 @@ void HttpNetworkSessionPeer::SetHttpStreamFactory(
session_->http_stream_factory_.swap(http_stream_factory);
}
-void HttpNetworkSessionPeer::SetHttpStreamFactoryForWebSocket(
- std::unique_ptr<HttpStreamFactory> http_stream_factory) {
- session_->http_stream_factory_for_websocket_.swap(http_stream_factory);
-}
-
void HttpNetworkSessionPeer::SetNetworkStreamThrottler(
std::unique_ptr<NetworkThrottleManager> network_throttle_manager) {
session_->network_stream_throttler_.swap(network_throttle_manager);
diff --git a/chromium/net/http/http_network_session_peer.h b/chromium/net/http/http_network_session_peer.h
index dae4f916df6..bb0d0c7dce3 100644
--- a/chromium/net/http/http_network_session_peer.h
+++ b/chromium/net/http/http_network_session_peer.h
@@ -29,8 +29,6 @@ class NET_EXPORT_PRIVATE HttpNetworkSessionPeer {
void SetHttpStreamFactory(
std::unique_ptr<HttpStreamFactory> http_stream_factory);
- void SetHttpStreamFactoryForWebSocket(
- std::unique_ptr<HttpStreamFactory> http_stream_factory_for_websocket);
void SetNetworkStreamThrottler(
std::unique_ptr<NetworkThrottleManager> network_throttle_manager);
diff --git a/chromium/net/http/http_network_transaction.cc b/chromium/net/http/http_network_transaction.cc
index a810d203821..44e52f436d4 100644
--- a/chromium/net/http/http_network_transaction.cc
+++ b/chromium/net/http/http_network_transaction.cc
@@ -86,6 +86,7 @@ HttpNetworkTransaction::HttpNetworkTransaction(RequestPriority priority,
request_(NULL),
priority_(priority),
headers_valid_(false),
+ can_send_early_data_(false),
request_headers_(),
read_buf_len_(0),
total_received_bytes_(0),
@@ -133,6 +134,10 @@ int HttpNetworkTransaction::Start(const HttpRequestInfo* request_info,
proxy_ssl_config_.rev_checking_enabled = false;
}
+ if (request_info->method != "POST") {
+ can_send_early_data_ = true;
+ }
+
if (request_->load_flags & LOAD_PREFETCH)
response_.unused_since_prefetch = true;
@@ -858,12 +863,10 @@ int HttpNetworkTransaction::DoCreateStream() {
DCHECK(!enable_alternative_services_);
if (ForWebSocketHandshake()) {
stream_request_ =
- session_->http_stream_factory_for_websocket()
- ->RequestWebSocketHandshakeStream(
- *request_, priority_, server_ssl_config_, proxy_ssl_config_,
- this, websocket_handshake_stream_base_create_helper_,
- enable_ip_based_pooling_, enable_alternative_services_,
- net_log_);
+ session_->http_stream_factory()->RequestWebSocketHandshakeStream(
+ *request_, priority_, server_ssl_config_, proxy_ssl_config_, this,
+ websocket_handshake_stream_base_create_helper_,
+ enable_ip_based_pooling_, enable_alternative_services_, net_log_);
} else {
stream_request_ = session_->http_stream_factory()->RequestStream(
*request_, priority_, server_ssl_config_, proxy_ssl_config_, this,
@@ -910,7 +913,8 @@ int HttpNetworkTransaction::DoInitStream() {
stream_->GetRemoteEndpoint(&remote_endpoint_);
- return stream_->InitializeStream(request_, priority_, net_log_, io_callback_);
+ return stream_->InitializeStream(request_, can_send_early_data_, priority_,
+ net_log_, io_callback_);
}
int HttpNetworkTransaction::DoInitStreamComplete(int result) {
@@ -1048,7 +1052,7 @@ int HttpNetworkTransaction::BuildRequestHeaders(
} else {
request_headers_.SetHeader(
HttpRequestHeaders::kContentLength,
- base::Uint64ToString(request_->upload_data_stream->size()));
+ base::NumberToString(request_->upload_data_stream->size()));
}
} else if (request_->method == "POST" || request_->method == "PUT") {
// An empty POST/PUT request still needs a content length. As for HEAD,
@@ -1562,6 +1566,8 @@ int HttpNetworkTransaction::HandleIOError(int error) {
break;
case ERR_SPDY_PING_FAILED:
case ERR_SPDY_SERVER_REFUSED_STREAM:
+ case ERR_SPDY_PUSHED_STREAM_NOT_AVAILABLE:
+ case ERR_SPDY_CLAIMED_PUSHED_STREAM_RESET_BY_SERVER:
case ERR_QUIC_HANDSHAKE_FAILED:
if (HasExceededMaxRetries())
break;
diff --git a/chromium/net/http/http_network_transaction.h b/chromium/net/http/http_network_transaction.h
index 866b5a28170..554a7258043 100644
--- a/chromium/net/http/http_network_transaction.h
+++ b/chromium/net/http/http_network_transaction.h
@@ -339,6 +339,9 @@ class NET_EXPORT_PRIVATE HttpNetworkTransaction
// True if we've validated the headers that the stream parser has returned.
bool headers_valid_;
+ // True if we can send the request over early data.
+ bool can_send_early_data_;
+
SSLConfig server_ssl_config_;
SSLConfig proxy_ssl_config_;
diff --git a/chromium/net/http/http_network_transaction_unittest.cc b/chromium/net/http/http_network_transaction_unittest.cc
index 615019cca67..4f2f307f919 100644
--- a/chromium/net/http/http_network_transaction_unittest.cc
+++ b/chromium/net/http/http_network_transaction_unittest.cc
@@ -97,6 +97,7 @@
#include "net/test/gtest_util.h"
#include "net/test/net_test_suite.h"
#include "net/test/test_data_directory.h"
+#include "net/traffic_annotation/network_traffic_annotation_test_helper.h"
#include "net/websockets/websocket_handshake_stream_base.h"
#include "testing/gmock/include/gmock/gmock.h"
#include "testing/gtest/include/gtest/gtest.h"
@@ -677,14 +678,18 @@ class CaptureGroupNameSocketPool : public ParentPool {
return last_group_name_;
}
+ bool socket_requested() const { return socket_requested_; }
+
int RequestSocket(const std::string& group_name,
const void* socket_params,
RequestPriority priority,
+ const SocketTag& socket_tag,
ClientSocketPool::RespectLimits respect_limits,
ClientSocketHandle* handle,
const CompletionCallback& callback,
const NetLogWithSource& net_log) override {
last_group_name_ = group_name;
+ socket_requested_ = true;
return ERR_IO_PENDING;
}
void CancelRequest(const std::string& group_name,
@@ -708,6 +713,7 @@ class CaptureGroupNameSocketPool : public ParentPool {
private:
std::string last_group_name_;
+ bool socket_requested_ = false;
};
typedef CaptureGroupNameSocketPool<TransportClientSocketPool>
@@ -4484,6 +4490,225 @@ TEST_F(HttpNetworkTransactionTest, NonPermanentGenerateAuthTokenError) {
session->CloseAllConnections();
}
+// Proxy resolver that returns a proxy with the same host and port for different
+// schemes, based on the path of the URL being requests.
+class SameProxyWithDifferentSchemesProxyResolver : public ProxyResolver {
+ public:
+ SameProxyWithDifferentSchemesProxyResolver() {}
+ ~SameProxyWithDifferentSchemesProxyResolver() override {}
+
+ static std::string ProxyHostPortPairAsString() { return "proxy.test:10000"; }
+
+ static HostPortPair ProxyHostPortPair() {
+ return HostPortPair::FromString(ProxyHostPortPairAsString());
+ }
+
+ // ProxyResolver implementation.
+ int GetProxyForURL(const GURL& url,
+ ProxyInfo* results,
+ const CompletionCallback& callback,
+ std::unique_ptr<Request>* request,
+ const NetLogWithSource& /*net_log*/) override {
+ *results = ProxyInfo();
+ if (url.path() == "/socks4") {
+ results->UsePacString("SOCKS " + ProxyHostPortPairAsString());
+ return OK;
+ }
+ if (url.path() == "/socks5") {
+ results->UsePacString("SOCKS5 " + ProxyHostPortPairAsString());
+ return OK;
+ }
+ if (url.path() == "/http") {
+ results->UsePacString("PROXY " + ProxyHostPortPairAsString());
+ return OK;
+ }
+ if (url.path() == "/https") {
+ results->UsePacString("HTTPS " + ProxyHostPortPairAsString());
+ return OK;
+ }
+ NOTREACHED();
+ return ERR_NOT_IMPLEMENTED;
+ }
+
+ private:
+ DISALLOW_COPY_AND_ASSIGN(SameProxyWithDifferentSchemesProxyResolver);
+};
+
+class SameProxyWithDifferentSchemesProxyResolverFactory
+ : public ProxyResolverFactory {
+ public:
+ SameProxyWithDifferentSchemesProxyResolverFactory()
+ : ProxyResolverFactory(false) {}
+
+ int CreateProxyResolver(
+ const scoped_refptr<ProxyResolverScriptData>& pac_script,
+ std::unique_ptr<ProxyResolver>* resolver,
+ const CompletionCallback& callback,
+ std::unique_ptr<Request>* request) override {
+ *resolver = std::make_unique<SameProxyWithDifferentSchemesProxyResolver>();
+ return OK;
+ }
+
+ private:
+ DISALLOW_COPY_AND_ASSIGN(SameProxyWithDifferentSchemesProxyResolverFactory);
+};
+
+// Check that when different proxy schemes are all applied to a proxy at the
+// same address, the sonnections are not grouped together. i.e., a request to
+// foo.com using proxy.com as an HTTPS proxy won't use the same socket as a
+// request to foo.com using proxy.com as an HTTP proxy.
+TEST_F(HttpNetworkTransactionTest, SameDestinationForDifferentProxyTypes) {
+ session_deps_.proxy_service = std::make_unique<ProxyService>(
+ std::make_unique<ProxyConfigServiceFixed>(
+ ProxyConfig::CreateAutoDetect()),
+ std::make_unique<SameProxyWithDifferentSchemesProxyResolverFactory>(),
+ nullptr);
+
+ std::unique_ptr<HttpNetworkSession> session = CreateSession(&session_deps_);
+
+ MockWrite socks_writes[] = {
+ MockWrite(SYNCHRONOUS, kSOCKS4OkRequestLocalHostPort80,
+ kSOCKS4OkRequestLocalHostPort80Length),
+ MockWrite(SYNCHRONOUS,
+ "GET /socks4 HTTP/1.1\r\n"
+ "Host: test\r\n"
+ "Connection: keep-alive\r\n\r\n"),
+ };
+ MockRead socks_reads[] = {
+ MockRead(SYNCHRONOUS, kSOCKS4OkReply, kSOCKS4OkReplyLength),
+ MockRead("HTTP/1.0 200 OK\r\n"
+ "Connection: keep-alive\r\n"
+ "Content-Length: 15\r\n\r\n"
+ "SOCKS4 Response"),
+ };
+ StaticSocketDataProvider socks_data(socks_reads, arraysize(socks_reads),
+ socks_writes, arraysize(socks_writes));
+ session_deps_.socket_factory->AddSocketDataProvider(&socks_data);
+
+ const char kSOCKS5Request[] = {
+ 0x05, // Version
+ 0x01, // Command (CONNECT)
+ 0x00, // Reserved
+ 0x03, // Address type (DOMAINNAME)
+ 0x04, // Length of domain (4)
+ 't', 'e', 's', 't', // Domain string
+ 0x00, 0x50, // 16-bit port (80)
+ };
+ MockWrite socks5_writes[] = {
+ MockWrite(ASYNC, kSOCKS5GreetRequest, kSOCKS5GreetRequestLength),
+ MockWrite(ASYNC, kSOCKS5Request, arraysize(kSOCKS5Request)),
+ MockWrite(SYNCHRONOUS,
+ "GET /socks5 HTTP/1.1\r\n"
+ "Host: test\r\n"
+ "Connection: keep-alive\r\n\r\n"),
+ };
+ MockRead socks5_reads[] = {
+ MockRead(ASYNC, kSOCKS5GreetResponse, kSOCKS5GreetResponseLength),
+ MockRead(ASYNC, kSOCKS5OkResponse, kSOCKS5OkResponseLength),
+ MockRead("HTTP/1.0 200 OK\r\n"
+ "Connection: keep-alive\r\n"
+ "Content-Length: 15\r\n\r\n"
+ "SOCKS5 Response"),
+ };
+ StaticSocketDataProvider socks5_data(socks5_reads, arraysize(socks5_reads),
+ socks5_writes, arraysize(socks5_writes));
+ session_deps_.socket_factory->AddSocketDataProvider(&socks5_data);
+
+ MockWrite http_writes[] = {
+ MockWrite(SYNCHRONOUS,
+ "GET http://test/http HTTP/1.1\r\n"
+ "Host: test\r\n"
+ "Proxy-Connection: keep-alive\r\n\r\n"),
+ };
+ MockRead http_reads[] = {
+ MockRead("HTTP/1.1 200 OK\r\n"
+ "Proxy-Connection: keep-alive\r\n"
+ "Content-Length: 13\r\n\r\n"
+ "HTTP Response"),
+ };
+ StaticSocketDataProvider http_data(http_reads, arraysize(http_reads),
+ http_writes, arraysize(http_writes));
+ session_deps_.socket_factory->AddSocketDataProvider(&http_data);
+
+ MockWrite https_writes[] = {
+ MockWrite(SYNCHRONOUS,
+ "GET http://test/https HTTP/1.1\r\n"
+ "Host: test\r\n"
+ "Proxy-Connection: keep-alive\r\n\r\n"),
+ };
+ MockRead https_reads[] = {
+ MockRead("HTTP/1.1 200 OK\r\n"
+ "Proxy-Connection: keep-alive\r\n"
+ "Content-Length: 14\r\n\r\n"
+ "HTTPS Response"),
+ };
+ StaticSocketDataProvider https_data(https_reads, arraysize(https_reads),
+ https_writes, arraysize(https_writes));
+ session_deps_.socket_factory->AddSocketDataProvider(&https_data);
+ SSLSocketDataProvider ssl(SYNCHRONOUS, OK);
+ session_deps_.socket_factory->AddSSLSocketDataProvider(&ssl);
+
+ struct TestCase {
+ GURL url;
+ std::string expected_response;
+ // How many idle sockets there should be in the SOCKS proxy socket pool
+ // after the test.
+ int expected_idle_socks_sockets;
+ // How many idle sockets there should be in the HTTP proxy socket pool after
+ // the test.
+ int expected_idle_http_sockets;
+ } const kTestCases[] = {
+ {GURL("http://test/socks4"), "SOCKS4 Response", 1, 0},
+ {GURL("http://test/socks5"), "SOCKS5 Response", 2, 0},
+ {GURL("http://test/http"), "HTTP Response", 2, 1},
+ {GURL("http://test/https"), "HTTPS Response", 2, 2},
+ };
+
+ for (const auto& test_case : kTestCases) {
+ HttpRequestInfo request;
+ request.method = "GET";
+ request.url = test_case.url;
+ std::unique_ptr<HttpNetworkTransaction> trans =
+ std::make_unique<HttpNetworkTransaction>(DEFAULT_PRIORITY,
+ session.get());
+ TestCompletionCallback callback;
+ int rv = trans->Start(&request, callback.callback(), NetLogWithSource());
+ EXPECT_THAT(callback.GetResult(rv), IsOk());
+
+ const HttpResponseInfo* response = trans->GetResponseInfo();
+ ASSERT_TRUE(response);
+ ASSERT_TRUE(response->headers);
+ EXPECT_EQ(200, response->headers->response_code());
+ std::string response_data;
+ EXPECT_THAT(ReadTransaction(trans.get(), &response_data), IsOk());
+ EXPECT_EQ(test_case.expected_response, response_data);
+
+ // Return the socket to the socket pool, so can make sure it's not used for
+ // the next requests.
+ trans.reset();
+ base::RunLoop().RunUntilIdle();
+
+ // Check the number of idle sockets in the pool, to make sure that used
+ // sockets are indeed being returned to the socket pool. If each request
+ // doesn't return an idle socket to the pool, the test would incorrectly
+ // pass.
+ EXPECT_EQ(
+ test_case.expected_idle_socks_sockets,
+ session
+ ->GetSocketPoolForSOCKSProxy(
+ HttpNetworkSession::NORMAL_SOCKET_POOL,
+ SameProxyWithDifferentSchemesProxyResolver::ProxyHostPortPair())
+ ->IdleSocketCount());
+ EXPECT_EQ(
+ test_case.expected_idle_http_sockets,
+ session
+ ->GetSocketPoolForHTTPProxy(
+ HttpNetworkSession::NORMAL_SOCKET_POOL,
+ SameProxyWithDifferentSchemesProxyResolver::ProxyHostPortPair())
+ ->IdleSocketCount());
+ }
+}
+
// Test the load timing for HTTPS requests with an HTTP proxy.
TEST_F(HttpNetworkTransactionTest, HttpProxyLoadTimingNoPacTwoRequests) {
HttpRequestInfo request1;
@@ -6879,6 +7104,82 @@ TEST_F(HttpNetworkTransactionTest, FlushSocketPoolOnLowMemoryNotifications) {
EXPECT_EQ(0, GetIdleSocketCountInTransportSocketPool(session.get()));
}
+// Disable idle socket closing on memory pressure.
+// Grab a socket, use it, and put it back into the pool. Then, make
+// low memory notification and ensure the socket pool is NOT flushed.
+TEST_F(HttpNetworkTransactionTest, NoFlushSocketPoolOnLowMemoryNotifications) {
+ HttpRequestInfo request;
+ request.method = "GET";
+ request.url = GURL("http://www.example.org/");
+ request.load_flags = 0;
+
+ // Disable idle socket closing on memory pressure.
+ session_deps_.disable_idle_sockets_close_on_memory_pressure = true;
+ std::unique_ptr<HttpNetworkSession> session(CreateSession(&session_deps_));
+
+ HttpNetworkTransaction trans(DEFAULT_PRIORITY, session.get());
+
+ MockRead data_reads[] = {
+ // A part of the response body is received with the response headers.
+ MockRead("HTTP/1.1 200 OK\r\nContent-Length: 11\r\n\r\nhel"),
+ // The rest of the response body is received in two parts.
+ MockRead("lo"), MockRead(" world"),
+ MockRead("junk"), // Should not be read!!
+ MockRead(SYNCHRONOUS, OK),
+ };
+
+ StaticSocketDataProvider data(data_reads, arraysize(data_reads), NULL, 0);
+ session_deps_.socket_factory->AddSocketDataProvider(&data);
+
+ TestCompletionCallback callback;
+
+ int rv = trans.Start(&request, callback.callback(), NetLogWithSource());
+ EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
+
+ EXPECT_THAT(callback.GetResult(rv), IsOk());
+
+ const HttpResponseInfo* response = trans.GetResponseInfo();
+ ASSERT_TRUE(response);
+ EXPECT_TRUE(response->headers);
+ std::string status_line = response->headers->GetStatusLine();
+ EXPECT_EQ("HTTP/1.1 200 OK", status_line);
+
+ // Make memory critical notification and ensure the transaction still has been
+ // operating right.
+ base::MemoryPressureListener::NotifyMemoryPressure(
+ base::MemoryPressureListener::MEMORY_PRESSURE_LEVEL_CRITICAL);
+ base::RunLoop().RunUntilIdle();
+
+ // Socket should not be flushed as long as it is not idle.
+ EXPECT_EQ(0, GetIdleSocketCountInTransportSocketPool(session.get()));
+
+ std::string response_data;
+ rv = ReadTransaction(&trans, &response_data);
+ EXPECT_THAT(rv, IsOk());
+ EXPECT_EQ("hello world", response_data);
+
+ // Empty the current queue. This is necessary because idle sockets are
+ // added to the connection pool asynchronously with a PostTask.
+ base::RunLoop().RunUntilIdle();
+
+ // We now check to make sure the socket was added back to the pool.
+ EXPECT_EQ(1, GetIdleSocketCountInTransportSocketPool(session.get()));
+
+ // Idle sockets should NOT be flushed on moderate memory pressure.
+ base::MemoryPressureListener::NotifyMemoryPressure(
+ base::MemoryPressureListener::MEMORY_PRESSURE_LEVEL_MODERATE);
+ base::RunLoop().RunUntilIdle();
+
+ EXPECT_EQ(1, GetIdleSocketCountInTransportSocketPool(session.get()));
+
+ // Idle sockets should NOT be flushed on critical memory pressure.
+ base::MemoryPressureListener::NotifyMemoryPressure(
+ base::MemoryPressureListener::MEMORY_PRESSURE_LEVEL_CRITICAL);
+ base::RunLoop().RunUntilIdle();
+
+ EXPECT_EQ(1, GetIdleSocketCountInTransportSocketPool(session.get()));
+}
+
// Grab an SSL socket, use it, and put it back into the pool. Then, make
// low memory notification and ensure the socket pool is flushed.
TEST_F(HttpNetworkTransactionTest, FlushSSLSocketPoolOnLowMemoryNotifications) {
@@ -8512,20 +8813,21 @@ TEST_F(HttpNetworkTransactionTest, CrossOriginSPDYProxyPush) {
CreateMockWrite(stream2_priority, 3, ASYNC),
};
+ SpdySerializedFrame stream2_syn(spdy_util_.ConstructSpdyPush(
+ NULL, 0, 2, 1, "http://www.another-origin.com/foo.dat"));
+
SpdySerializedFrame stream1_reply(
spdy_util_.ConstructSpdyGetReply(NULL, 0, 1));
SpdySerializedFrame stream1_body(spdy_util_.ConstructSpdyDataFrame(1, true));
- SpdySerializedFrame stream2_syn(spdy_util_.ConstructSpdyPush(
- NULL, 0, 2, 1, "http://www.another-origin.com/foo.dat"));
const char kPushedData[] = "pushed";
SpdySerializedFrame stream2_body(spdy_util_.ConstructSpdyDataFrame(
2, kPushedData, strlen(kPushedData), true));
MockRead spdy_reads[] = {
- CreateMockRead(stream1_reply, 1, ASYNC),
- CreateMockRead(stream2_syn, 2, ASYNC),
+ CreateMockRead(stream2_syn, 1, ASYNC),
+ CreateMockRead(stream1_reply, 2, ASYNC),
CreateMockRead(stream1_body, 4, ASYNC),
CreateMockRead(stream2_body, 5, ASYNC),
MockRead(SYNCHRONOUS, ERR_IO_PENDING, 6), // Force a hang
@@ -9644,44 +9946,42 @@ TEST_F(HttpNetworkTransactionTest, GroupNameForDirectConnections) {
EXPECT_EQ(ERR_IO_PENDING,
GroupNameTransactionHelper(tests[i].url, session.get()));
- if (tests[i].ssl)
+ if (tests[i].ssl) {
EXPECT_EQ(tests[i].expected_group_name,
ssl_conn_pool->last_group_name_received());
- else
+ } else {
EXPECT_EQ(tests[i].expected_group_name,
transport_conn_pool->last_group_name_received());
+ }
+ // When SSL proxy is in use, socket must be requested from |ssl_conn_pool|.
+ EXPECT_EQ(tests[i].ssl, ssl_conn_pool->socket_requested());
+ // When SSL proxy is not in use, socket must be requested from
+ // |transport_conn_pool|.
+ EXPECT_EQ(!tests[i].ssl, transport_conn_pool->socket_requested());
}
}
TEST_F(HttpNetworkTransactionTest, GroupNameForHTTPProxyConnections) {
const GroupNameTest tests[] = {
{
- "http_proxy",
- "http://www.example.org/http_proxy_normal",
- "www.example.org:80",
- false,
+ "http_proxy", "http://www.example.org/http_proxy_normal",
+ "http_proxy/www.example.org:80", false,
},
// SSL Tests
{
- "http_proxy",
- "https://www.example.org/http_connect_ssl",
- "ssl/www.example.org:443",
- true,
+ "http_proxy", "https://www.example.org/http_connect_ssl",
+ "http_proxy/ssl/www.example.org:443", true,
},
{
- "http_proxy",
- "https://host.with.alternate/direct",
- "ssl/host.with.alternate:443",
- true,
+ "http_proxy", "https://host.with.alternate/direct",
+ "http_proxy/ssl/host.with.alternate:443", true,
},
{
- "http_proxy",
- "ftp://ftp.google.com/http_proxy_normal",
- "ftp/ftp.google.com:21",
- false,
+ "http_proxy", "ftp://ftp.google.com/http_proxy_normal",
+ "http_proxy/ftp/ftp.google.com:21", false,
},
};
@@ -13411,7 +13711,6 @@ TEST_F(HttpNetworkTransactionTest, ProxyTunnelGetHangup) {
};
MockRead data_reads1[] = {
- MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
MockRead("HTTP/1.1 200 Connection Established\r\n\r\n"),
MockRead(ASYNC, 0, 0), // EOF
};
@@ -15430,6 +15729,7 @@ class FakeStream : public HttpStream,
RequestPriority priority() const { return priority_; }
int InitializeStream(const HttpRequestInfo* request_info,
+ bool can_send_early,
RequestPriority priority,
const NetLogWithSource& net_log,
const CompletionCallback& callback) override {
@@ -15683,10 +15983,12 @@ class FakeWebSocketBasicHandshakeStream : public WebSocketHandshakeStreamBase {
// the fact that the WebSocket code is not compiled on iOS makes that
// difficult.
int InitializeStream(const HttpRequestInfo* request_info,
+ bool can_send_early,
RequestPriority priority,
const NetLogWithSource& net_log,
const CompletionCallback& callback) override {
- state_.Initialize(request_info, priority, net_log, callback);
+ state_.Initialize(request_info, can_send_early, priority, net_log,
+ callback);
return OK;
}
@@ -15694,7 +15996,8 @@ class FakeWebSocketBasicHandshakeStream : public WebSocketHandshakeStreamBase {
HttpResponseInfo* response,
const CompletionCallback& callback) override {
return parser()->SendRequest(state_.GenerateRequestLine(), request_headers,
- response, callback);
+ TRAFFIC_ANNOTATION_FOR_TESTS, response,
+ callback);
}
int ReadResponseHeaders(const CompletionCallback& callback) override {
@@ -15893,8 +16196,7 @@ TEST_F(HttpNetworkTransactionTest, CreateWebSocketHandshakeStream) {
HttpNetworkSessionPeer peer(session.get());
FakeStreamFactory* fake_factory = new FakeStreamFactory();
FakeWebSocketStreamCreateHelper websocket_stream_create_helper;
- peer.SetHttpStreamFactoryForWebSocket(
- std::unique_ptr<HttpStreamFactory>(fake_factory));
+ peer.SetHttpStreamFactory(std::unique_ptr<HttpStreamFactory>(fake_factory));
HttpRequestInfo request;
HttpNetworkTransaction trans(LOW, session.get());
diff --git a/chromium/net/http/http_proxy_client_socket.cc b/chromium/net/http/http_proxy_client_socket.cc
index 4be93e00bee..417a21b96cc 100644
--- a/chromium/net/http/http_proxy_client_socket.cc
+++ b/chromium/net/http/http_proxy_client_socket.cc
@@ -11,7 +11,6 @@
#include "net/base/auth.h"
#include "net/base/host_port_pair.h"
#include "net/base/io_buffer.h"
-#include "net/base/proxy_delegate.h"
#include "net/http/http_basic_stream.h"
#include "net/http/http_network_session.h"
#include "net/http/http_request_info.h"
@@ -21,25 +20,24 @@
#include "net/log/net_log.h"
#include "net/log/net_log_event_type.h"
#include "net/socket/client_socket_handle.h"
+#include "net/traffic_annotation/network_traffic_annotation.h"
#include "url/gurl.h"
namespace net {
HttpProxyClientSocket::HttpProxyClientSocket(
- ClientSocketHandle* transport_socket,
+ std::unique_ptr<ClientSocketHandle> transport_socket,
const std::string& user_agent,
const HostPortPair& endpoint,
- const HostPortPair& proxy_server,
HttpAuthController* http_auth_controller,
bool tunnel,
bool using_spdy,
NextProto negotiated_protocol,
- ProxyDelegate* proxy_delegate,
bool is_https_proxy)
: io_callback_(base::Bind(&HttpProxyClientSocket::OnIOComplete,
base::Unretained(this))),
next_state_(STATE_NONE),
- transport_(transport_socket),
+ transport_(std::move(transport_socket)),
endpoint_(endpoint),
auth_(http_auth_controller),
tunnel_(tunnel),
@@ -47,9 +45,7 @@ HttpProxyClientSocket::HttpProxyClientSocket(
negotiated_protocol_(negotiated_protocol),
is_https_proxy_(is_https_proxy),
redirect_has_load_timing_info_(false),
- proxy_server_(proxy_server),
- proxy_delegate_(proxy_delegate),
- net_log_(transport_socket->socket()->NetLog()) {
+ net_log_(transport_->socket()->NetLog()) {
// Synthesize the bits of a request that we actually use.
request_.url = GURL("https://" + endpoint.ToString());
request_.method = "CONNECT";
@@ -207,6 +203,10 @@ int64_t HttpProxyClientSocket::GetTotalReceivedBytes() const {
return transport_->socket()->GetTotalReceivedBytes();
}
+void HttpProxyClientSocket::ApplySocketTag(const SocketTag& tag) {
+ return transport_->socket()->ApplySocketTag(tag);
+}
+
int HttpProxyClientSocket::Read(IOBuffer* buf, int buf_len,
const CompletionCallback& callback) {
DCHECK(user_callback_.is_null());
@@ -227,12 +227,16 @@ int HttpProxyClientSocket::Read(IOBuffer* buf, int buf_len,
return transport_->socket()->Read(buf, buf_len, callback);
}
-int HttpProxyClientSocket::Write(IOBuffer* buf, int buf_len,
- const CompletionCallback& callback) {
+int HttpProxyClientSocket::Write(
+ IOBuffer* buf,
+ int buf_len,
+ const CompletionCallback& callback,
+ const NetworkTrafficAnnotationTag& traffic_annotation) {
DCHECK_EQ(STATE_DONE, next_state_);
DCHECK(user_callback_.is_null());
- return transport_->socket()->Write(buf, buf_len, callback);
+ return transport_->socket()->Write(buf, buf_len, callback,
+ traffic_annotation);
}
int HttpProxyClientSocket::SetReceiveBufferSize(int32_t size) {
@@ -396,10 +400,6 @@ int HttpProxyClientSocket::DoSendRequest() {
HttpRequestHeaders authorization_headers;
if (auth_->HaveAuth())
auth_->AddAuthorizationHeader(&authorization_headers);
- if (proxy_delegate_) {
- proxy_delegate_->OnBeforeTunnelRequest(proxy_server_,
- &authorization_headers);
- }
std::string user_agent;
if (!request_.extra_headers.GetHeader(HttpRequestHeaders::kUserAgent,
&user_agent)) {
@@ -417,8 +417,10 @@ int HttpProxyClientSocket::DoSendRequest() {
parser_buf_ = new GrowableIOBuffer();
http_stream_parser_.reset(new HttpStreamParser(
transport_.get(), &request_, parser_buf_.get(), net_log_));
- return http_stream_parser_->SendRequest(
- request_line_, request_headers_, &response_, io_callback_);
+ // TODO(crbug.com/656607): Add propoer annotation.
+ return http_stream_parser_->SendRequest(request_line_, request_headers_,
+ NO_TRAFFIC_ANNOTATION_BUG_656607,
+ &response_, io_callback_);
}
int HttpProxyClientSocket::DoSendRequestComplete(int result) {
@@ -446,13 +448,6 @@ int HttpProxyClientSocket::DoReadHeadersComplete(int result) {
NetLogEventType::HTTP_TRANSACTION_READ_TUNNEL_RESPONSE_HEADERS,
base::Bind(&HttpResponseHeaders::NetLogCallback, response_.headers));
- if (proxy_delegate_) {
- proxy_delegate_->OnTunnelHeadersReceived(
- HostPortPair::FromURL(request_.url),
- proxy_server_,
- *response_.headers);
- }
-
switch (response_.headers->response_code()) {
case 200: // OK
if (http_stream_parser_->IsMoreDataBuffered())
diff --git a/chromium/net/http/http_proxy_client_socket.h b/chromium/net/http/http_proxy_client_socket.h
index 7c05a29b6df..8444be2069f 100644
--- a/chromium/net/http/http_proxy_client_socket.h
+++ b/chromium/net/http/http_proxy_client_socket.h
@@ -23,6 +23,7 @@
#include "net/http/proxy_client_socket.h"
#include "net/log/net_log_with_source.h"
#include "net/socket/ssl_client_socket.h"
+#include "net/traffic_annotation/network_traffic_annotation.h"
namespace net {
@@ -31,22 +32,19 @@ class GrowableIOBuffer;
class HttpStream;
class HttpStreamParser;
class IOBuffer;
-class ProxyDelegate;
class NET_EXPORT_PRIVATE HttpProxyClientSocket : public ProxyClientSocket {
public:
// Takes ownership of |transport_socket|, which should already be connected
// by the time Connect() is called. If tunnel is true then on Connect()
// this socket will establish an Http tunnel.
- HttpProxyClientSocket(ClientSocketHandle* transport_socket,
+ HttpProxyClientSocket(std::unique_ptr<ClientSocketHandle> transport_socket,
const std::string& user_agent,
const HostPortPair& endpoint,
- const HostPortPair& proxy_server,
HttpAuthController* http_auth_controller,
bool tunnel,
bool using_spdy,
NextProto negotiated_protocol,
- ProxyDelegate* proxy_delegate,
bool is_https_proxy);
// On destruction Disconnect() is called.
@@ -76,6 +74,7 @@ class NET_EXPORT_PRIVATE HttpProxyClientSocket : public ProxyClientSocket {
void ClearConnectionAttempts() override {}
void AddConnectionAttempts(const ConnectionAttempts& attempts) override {}
int64_t GetTotalReceivedBytes() const override;
+ void ApplySocketTag(const SocketTag& tag) override;
// Socket implementation.
int Read(IOBuffer* buf,
@@ -83,7 +82,8 @@ class NET_EXPORT_PRIVATE HttpProxyClientSocket : public ProxyClientSocket {
const CompletionCallback& callback) override;
int Write(IOBuffer* buf,
int buf_len,
- const CompletionCallback& callback) override;
+ const CompletionCallback& callback,
+ const NetworkTrafficAnnotationTag& traffic_annotation) override;
int SetReceiveBufferSize(int32_t size) override;
int SetSendBufferSize(int32_t size) override;
int GetPeerAddress(IPEndPoint* address) const override;
@@ -161,11 +161,6 @@ class NET_EXPORT_PRIVATE HttpProxyClientSocket : public ProxyClientSocket {
bool redirect_has_load_timing_info_;
LoadTimingInfo redirect_load_timing_info_;
- const HostPortPair proxy_server_;
-
- // This delegate must outlive this proxy client socket.
- ProxyDelegate* proxy_delegate_;
-
const NetLogWithSource net_log_;
DISALLOW_COPY_AND_ASSIGN(HttpProxyClientSocket);
diff --git a/chromium/net/http/http_proxy_client_socket_fuzzer.cc b/chromium/net/http/http_proxy_client_socket_fuzzer.cc
index 33c076f7284..ac9702ab767 100644
--- a/chromium/net/http/http_proxy_client_socket_fuzzer.cc
+++ b/chromium/net/http/http_proxy_client_socket_fuzzer.cc
@@ -64,10 +64,9 @@ extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
// is HTTPS.
bool is_https_proxy = data_provider.ConsumeBool();
net::HttpProxyClientSocket socket(
- socket_handle.release(), "Bond/007", net::HostPortPair("foo", 80),
- net::HostPortPair("proxy", 42), auth_controller.get(), true /* tunnel */,
- false /* using_spdy */, net::kProtoUnknown, nullptr /* proxy_delegate */,
- is_https_proxy);
+ std::move(socket_handle), "Bond/007", net::HostPortPair("foo", 80),
+ auth_controller.get(), true /* tunnel */, false /* using_spdy */,
+ net::kProtoUnknown, is_https_proxy);
int result = socket.Connect(callback.callback());
result = callback.GetResult(result);
diff --git a/chromium/net/http/http_proxy_client_socket_pool.cc b/chromium/net/http/http_proxy_client_socket_pool.cc
index ab7bbb30b67..1e3ec469be1 100644
--- a/chromium/net/http/http_proxy_client_socket_pool.cc
+++ b/chromium/net/http/http_proxy_client_socket_pool.cc
@@ -18,7 +18,6 @@
#include "base/values.h"
#include "net/base/load_flags.h"
#include "net/base/net_errors.h"
-#include "net/base/proxy_delegate.h"
#include "net/http/http_network_session.h"
#include "net/http/http_proxy_client_socket_wrapper.h"
#include "net/log/net_log_source_type.h"
@@ -85,8 +84,7 @@ HttpProxySocketParams::HttpProxySocketParams(
HttpAuthHandlerFactory* http_auth_handler_factory,
SpdySessionPool* spdy_session_pool,
QuicStreamFactory* quic_stream_factory,
- bool tunnel,
- ProxyDelegate* proxy_delegate)
+ bool tunnel)
: transport_params_(transport_params),
ssl_params_(ssl_params),
quic_version_(quic_version),
@@ -96,8 +94,7 @@ HttpProxySocketParams::HttpProxySocketParams(
endpoint_(endpoint),
http_auth_cache_(tunnel ? http_auth_cache : NULL),
http_auth_handler_factory_(tunnel ? http_auth_handler_factory : NULL),
- tunnel_(tunnel),
- proxy_delegate_(proxy_delegate) {
+ tunnel_(tunnel) {
// If doing a QUIC proxy, |quic_version| must not be QUIC_VERSION_UNSUPPORTED,
// and |ssl_params| must be valid while |transport_params| is null.
// Otherwise, |quic_version| must be QUIC_VERSION_UNSUPPORTED, and exactly
@@ -105,6 +102,9 @@ HttpProxySocketParams::HttpProxySocketParams(
DCHECK(quic_version_ == QUIC_VERSION_UNSUPPORTED
? (bool)transport_params != (bool)ssl_params
: !transport_params && ssl_params);
+ // Exactly one of |transport_params_| and |ssl_params_| must be non-null.
+ DCHECK(transport_params_ || ssl_params_);
+ DCHECK(!transport_params_ || !ssl_params_);
}
const HostResolver::RequestInfo& HttpProxySocketParams::destination() const {
@@ -120,6 +120,7 @@ HttpProxySocketParams::~HttpProxySocketParams() = default;
HttpProxyConnectJob::HttpProxyConnectJob(
const std::string& group_name,
RequestPriority priority,
+ const SocketTag& socket_tag,
ClientSocketPool::RespectLimits respect_limits,
const scoped_refptr<HttpProxySocketParams>& params,
const base::TimeDelta& timeout_duration,
@@ -131,6 +132,7 @@ HttpProxyConnectJob::HttpProxyConnectJob(
group_name,
base::TimeDelta() /* The socket takes care of timeouts */,
priority,
+ socket_tag,
respect_limits,
delegate,
NetLogWithSource::Make(net_log,
@@ -138,6 +140,7 @@ HttpProxyConnectJob::HttpProxyConnectJob(
client_socket_(new HttpProxyClientSocketWrapper(
group_name,
priority,
+ socket_tag,
respect_limits,
timeout_duration,
base::TimeDelta::FromSeconds(kHttpProxyConnectJobTimeoutInSeconds),
@@ -153,7 +156,6 @@ HttpProxyConnectJob::HttpProxyConnectJob(
params->spdy_session_pool(),
params->quic_stream_factory(),
params->tunnel(),
- params->proxy_delegate(),
this->net_log())) {}
HttpProxyConnectJob::~HttpProxyConnectJob() = default;
@@ -201,13 +203,16 @@ HttpProxyClientSocketPool::HttpProxyConnectJobFactory::
: transport_pool_(transport_pool),
ssl_pool_(ssl_pool),
network_quality_provider_(network_quality_provider),
- transport_rtt_multiplier_(GetInt32Param("transport_rtt_multiplier", 5)),
+ ssl_http_rtt_multiplier_(GetInt32Param("ssl_http_rtt_multiplier", 5)),
+ non_ssl_http_rtt_multiplier_(
+ GetInt32Param("non_ssl_http_rtt_multiplier", 5)),
min_proxy_connection_timeout_(base::TimeDelta::FromSeconds(
GetInt32Param("min_proxy_connection_timeout_seconds", 8))),
max_proxy_connection_timeout_(base::TimeDelta::FromSeconds(
GetInt32Param("max_proxy_connection_timeout_seconds", 60))),
net_log_(net_log) {
- DCHECK_LT(0, transport_rtt_multiplier_);
+ DCHECK_LT(0, ssl_http_rtt_multiplier_);
+ DCHECK_LT(0, non_ssl_http_rtt_multiplier_);
DCHECK_LE(base::TimeDelta(), min_proxy_connection_timeout_);
DCHECK_LE(base::TimeDelta(), max_proxy_connection_timeout_);
DCHECK_LE(min_proxy_connection_timeout_, max_proxy_connection_timeout_);
@@ -218,23 +223,35 @@ HttpProxyClientSocketPool::HttpProxyConnectJobFactory::NewConnectJob(
const std::string& group_name,
const PoolBase::Request& request,
ConnectJob::Delegate* delegate) const {
+ bool is_secure_connection = (request.params()->ssl_params() != nullptr);
+
return std::unique_ptr<ConnectJob>(new HttpProxyConnectJob(
- group_name, request.priority(), request.respect_limits(),
- request.params(), ConnectionTimeout(), transport_pool_, ssl_pool_,
- delegate, net_log_));
+ group_name, request.priority(), request.socket_tag(),
+ request.respect_limits(), request.params(),
+ ConnectionTimeoutWithConnectionProperty(is_secure_connection),
+ transport_pool_, ssl_pool_, delegate, net_log_));
}
base::TimeDelta
HttpProxyClientSocketPool::HttpProxyConnectJobFactory::ConnectionTimeout()
const {
+ // Take a conservative approach: Return the timeout for the secure proxies
+ // which is higher than the connection timeout for the insecure proxies.
+ return ConnectionTimeoutWithConnectionProperty(
+ true /* is_secure_connection */);
+}
+
+base::TimeDelta HttpProxyClientSocketPool::HttpProxyConnectJobFactory::
+ ConnectionTimeoutWithConnectionProperty(bool is_secure_connection) const {
if (IsInNetAdaptiveProxyConnectionTimeoutFieldTrial() &&
network_quality_provider_) {
- base::Optional<base::TimeDelta> transport_rtt_estimate =
- network_quality_provider_->GetTransportRTT();
- if (transport_rtt_estimate) {
- base::TimeDelta timeout = base::TimeDelta::FromMilliseconds(
- transport_rtt_multiplier_ *
- transport_rtt_estimate.value().InMilliseconds());
+ base::Optional<base::TimeDelta> http_rtt_estimate =
+ network_quality_provider_->GetHttpRTT();
+ if (http_rtt_estimate) {
+ int32_t multiplier = is_secure_connection ? ssl_http_rtt_multiplier_
+ : non_ssl_http_rtt_multiplier_;
+ base::TimeDelta timeout = base::TimeDelta::FromMicroseconds(
+ multiplier * http_rtt_estimate.value().InMicroseconds());
// Ensure that connection timeout is between
// |min_proxy_connection_timeout_| and |max_proxy_connection_timeout_|.
if (timeout < min_proxy_connection_timeout_)
@@ -290,6 +307,7 @@ HttpProxyClientSocketPool::~HttpProxyClientSocketPool() = default;
int HttpProxyClientSocketPool::RequestSocket(const std::string& group_name,
const void* socket_params,
RequestPriority priority,
+ const SocketTag& socket_tag,
RespectLimits respect_limits,
ClientSocketHandle* handle,
const CompletionCallback& callback,
@@ -298,7 +316,8 @@ int HttpProxyClientSocketPool::RequestSocket(const std::string& group_name,
static_cast<const scoped_refptr<HttpProxySocketParams>*>(socket_params);
return base_.RequestSocket(group_name, *casted_socket_params, priority,
- respect_limits, handle, callback, net_log);
+ socket_tag, respect_limits, handle, callback,
+ net_log);
}
void HttpProxyClientSocketPool::RequestSockets(
diff --git a/chromium/net/http/http_proxy_client_socket_pool.h b/chromium/net/http/http_proxy_client_socket_pool.h
index 0df5e47f33e..09fa48d69c2 100644
--- a/chromium/net/http/http_proxy_client_socket_pool.h
+++ b/chromium/net/http/http_proxy_client_socket_pool.h
@@ -31,7 +31,6 @@ class HttpAuthHandlerFactory;
class HttpProxyClientSocketWrapper;
class NetLog;
class NetworkQualityProvider;
-class ProxyDelegate;
class QuicStreamFactory;
class SSLClientSocketPool;
class SSLSocketParams;
@@ -57,8 +56,7 @@ class NET_EXPORT_PRIVATE HttpProxySocketParams
HttpAuthHandlerFactory* http_auth_handler_factory,
SpdySessionPool* spdy_session_pool,
QuicStreamFactory* quic_stream_factory,
- bool tunnel,
- ProxyDelegate* proxy_delegate);
+ bool tunnel);
const scoped_refptr<TransportSocketParams>& transport_params() const {
return transport_params_;
@@ -82,10 +80,6 @@ class NET_EXPORT_PRIVATE HttpProxySocketParams
const HostResolver::RequestInfo& destination() const;
bool tunnel() const { return tunnel_; }
- ProxyDelegate* proxy_delegate() const {
- return proxy_delegate_;
- }
-
private:
friend class base::RefCounted<HttpProxySocketParams>;
~HttpProxySocketParams();
@@ -100,7 +94,6 @@ class NET_EXPORT_PRIVATE HttpProxySocketParams
HttpAuthCache* const http_auth_cache_;
HttpAuthHandlerFactory* const http_auth_handler_factory_;
const bool tunnel_;
- ProxyDelegate* proxy_delegate_;
DISALLOW_COPY_AND_ASSIGN(HttpProxySocketParams);
};
@@ -111,6 +104,7 @@ class HttpProxyConnectJob : public ConnectJob {
public:
HttpProxyConnectJob(const std::string& group_name,
RequestPriority priority,
+ const SocketTag& socket_tag,
ClientSocketPool::RespectLimits respect_limits,
const scoped_refptr<HttpProxySocketParams>& params,
const base::TimeDelta& timeout_duration,
@@ -165,6 +159,7 @@ class NET_EXPORT_PRIVATE HttpProxyClientSocketPool
int RequestSocket(const std::string& group_name,
const void* connect_params,
RequestPriority priority,
+ const SocketTag& socket_tag,
RespectLimits respect_limits,
ClientSocketHandle* handle,
const CompletionCallback& callback,
@@ -218,9 +213,13 @@ class NET_EXPORT_PRIVATE HttpProxyClientSocketPool
bool CloseOneIdleConnection() override;
private:
+ FRIEND_TEST_ALL_PREFIXES(HttpProxyClientSocketPoolTest,
+ ProxyPoolTimeoutWithConnectionProperty);
+
typedef ClientSocketPoolBase<HttpProxySocketParams> PoolBase;
- class HttpProxyConnectJobFactory : public PoolBase::ConnectJobFactory {
+ class NET_EXPORT_PRIVATE HttpProxyConnectJobFactory
+ : public PoolBase::ConnectJobFactory {
public:
HttpProxyConnectJobFactory(TransportClientSocketPool* transport_pool,
SSLClientSocketPool* ssl_pool,
@@ -236,12 +235,30 @@ class NET_EXPORT_PRIVATE HttpProxyClientSocketPool
base::TimeDelta ConnectionTimeout() const override;
private:
+ FRIEND_TEST_ALL_PREFIXES(HttpProxyClientSocketPoolTest,
+ ProxyPoolTimeoutWithConnectionProperty);
+
+ // Returns proxy connection timeout for secure proxies if
+ // |is_secure_connection| is true. Otherwise, returns timeout for insecure
+ // proxies.
+ base::TimeDelta ConnectionTimeoutWithConnectionProperty(
+ bool is_secure_connection) const;
+
TransportClientSocketPool* const transport_pool_;
SSLClientSocketPool* const ssl_pool_;
- NetworkQualityProvider* network_quality_provider_;
- const int32_t transport_rtt_multiplier_;
+ NetworkQualityProvider* const network_quality_provider_;
+
+ // For secure proxies, the connection timeout is set to
+ // |ssl_http_rtt_multiplier_| times the HTTP RTT estimate. For insecure
+ // proxies, the connection timeout is set to |non_ssl_http_rtt_multiplier_|
+ // times the HTTP RTT estimate. In either case, the connection timeout
+ // is clamped to be between |min_proxy_connection_timeout_| and
+ // |max_proxy_connection_timeout_|.
+ const int32_t ssl_http_rtt_multiplier_;
+ const int32_t non_ssl_http_rtt_multiplier_;
const base::TimeDelta min_proxy_connection_timeout_;
const base::TimeDelta max_proxy_connection_timeout_;
+
NetLog* net_log_;
DISALLOW_COPY_AND_ASSIGN(HttpProxyConnectJobFactory);
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 2cf01c156cd..c3c483693ab 100644
--- a/chromium/net/http/http_proxy_client_socket_pool_unittest.cc
+++ b/chromium/net/http/http_proxy_client_socket_pool_unittest.cc
@@ -17,10 +17,9 @@
#include "base/strings/string_util.h"
#include "base/strings/utf_string_conversions.h"
#include "base/test/histogram_tester.h"
+#include "build/build_config.h"
#include "net/base/net_errors.h"
-#include "net/base/proxy_delegate.h"
#include "net/base/test_completion_callback.h"
-#include "net/base/test_proxy_delegate.h"
#include "net/http/http_network_session.h"
#include "net/http/http_proxy_client_socket.h"
#include "net/http/http_response_headers.h"
@@ -28,6 +27,7 @@
#include "net/nqe/network_quality_estimator_test_util.h"
#include "net/socket/client_socket_handle.h"
#include "net/socket/next_proto.h"
+#include "net/socket/socket_tag.h"
#include "net/socket/socket_test_util.h"
#include "net/spdy/chromium/spdy_test_util_common.h"
#include "net/spdy/core/spdy_protocol.h"
@@ -66,7 +66,7 @@ class HttpProxyClientSocketPoolTest
HttpProxyClientSocketPoolTest()
: transport_socket_pool_(kMaxSockets,
kMaxSocketsPerGroup,
- session_deps_.socket_factory.get()),
+ &socket_factory_),
ssl_socket_pool_(kMaxSockets,
kMaxSocketsPerGroup,
session_deps_.cert_verifier.get(),
@@ -75,7 +75,7 @@ class HttpProxyClientSocketPoolTest
NULL /* cert_transparency_verifier */,
NULL /* ct_policy_enforcer */,
std::string() /* ssl_session_cache_shard */,
- session_deps_.socket_factory.get(),
+ &socket_factory_,
&transport_socket_pool_,
NULL,
NULL,
@@ -98,7 +98,8 @@ class HttpProxyClientSocketPoolTest
// connection timeout based on the network quality.
void InitAdaptiveTimeoutFieldTrialWithParams(
bool use_default_params,
- int transport_rtt_multiplier,
+ int ssl_http_rtt_multiplier,
+ int non_ssl_http_rtt_multiplier,
base::TimeDelta min_proxy_connection_timeout,
base::TimeDelta max_proxy_connection_timeout) {
std::string trial_name = "NetAdaptiveProxyConnectionTimeout";
@@ -106,8 +107,10 @@ class HttpProxyClientSocketPoolTest
std::map<std::string, std::string> params;
if (!use_default_params) {
- params["transport_rtt_multiplier"] =
- base::IntToString(transport_rtt_multiplier);
+ params["ssl_http_rtt_multiplier"] =
+ base::IntToString(ssl_http_rtt_multiplier);
+ params["non_ssl_http_rtt_multiplier"] =
+ base::IntToString(non_ssl_http_rtt_multiplier);
params["min_proxy_connection_timeout_seconds"] =
base::IntToString(min_proxy_connection_timeout.InSeconds());
params["max_proxy_connection_timeout_seconds"] =
@@ -169,31 +172,24 @@ class HttpProxyClientSocketPoolTest
// Returns the a correctly constructed HttpProxyParms
// for the HTTP or HTTPS proxy.
- scoped_refptr<HttpProxySocketParams> CreateParams(
- bool tunnel,
- ProxyDelegate* proxy_delegate) {
- return scoped_refptr<HttpProxySocketParams>(new HttpProxySocketParams(
+ scoped_refptr<HttpProxySocketParams> CreateParams(bool tunnel) {
+ return base::MakeRefCounted<HttpProxySocketParams>(
CreateHttpProxyParams(), CreateHttpsProxyParams(),
QUIC_VERSION_UNSUPPORTED, std::string(),
HostPortPair("www.google.com", tunnel ? 443 : 80),
session_->http_auth_cache(), session_->http_auth_handler_factory(),
- session_->spdy_session_pool(), session_->quic_stream_factory(), tunnel,
- proxy_delegate));
+ session_->spdy_session_pool(), session_->quic_stream_factory(), tunnel);
}
- scoped_refptr<HttpProxySocketParams> CreateTunnelParams(
- ProxyDelegate* proxy_delegate) {
- return CreateParams(true, proxy_delegate);
+ scoped_refptr<HttpProxySocketParams> CreateTunnelParams() {
+ return CreateParams(true);
}
- scoped_refptr<HttpProxySocketParams> CreateNoTunnelParams(
- ProxyDelegate* proxy_delegate) {
- return CreateParams(false, proxy_delegate);
+ scoped_refptr<HttpProxySocketParams> CreateNoTunnelParams() {
+ return CreateParams(false);
}
- MockClientSocketFactory* socket_factory() {
- return session_deps_.socket_factory.get();
- }
+ MockTaggingClientSocketFactory* socket_factory() { return &socket_factory_; }
void Initialize(MockRead* reads, size_t reads_count,
MockWrite* writes, size_t writes_count,
@@ -234,7 +230,13 @@ class HttpProxyClientSocketPoolTest
TestNetworkQualityEstimator* estimator() { return &estimator_; }
+ MockTransportClientSocketPool* transport_socket_pool() {
+ return &transport_socket_pool_;
+ }
+ SSLClientSocketPool* ssl_socket_pool() { return &ssl_socket_pool_; }
+
private:
+ MockTaggingClientSocketFactory socket_factory_;
SpdySessionDependencies session_deps_;
TestNetworkQualityEstimator estimator_;
@@ -268,17 +270,13 @@ INSTANTIATE_TEST_CASE_P(HttpProxyType,
TEST_P(HttpProxyClientSocketPoolTest, NoTunnel) {
Initialize(NULL, 0, NULL, 0, NULL, 0, NULL, 0);
- std::unique_ptr<TestProxyDelegate> proxy_delegate(new TestProxyDelegate());
- int rv = handle_.Init("a", CreateNoTunnelParams(proxy_delegate.get()), LOW,
+ int rv = handle_.Init("a", CreateNoTunnelParams(), LOW, SocketTag(),
ClientSocketPool::RespectLimits::ENABLED,
CompletionCallback(), pool_.get(), NetLogWithSource());
EXPECT_THAT(rv, IsOk());
EXPECT_TRUE(handle_.is_initialized());
ASSERT_TRUE(handle_.socket());
EXPECT_TRUE(handle_.socket()->IsConnected());
- EXPECT_FALSE(proxy_delegate->on_before_tunnel_request_called());
- EXPECT_FALSE(proxy_delegate->on_tunnel_headers_received_called());
- EXPECT_TRUE(proxy_delegate->on_tunnel_request_completed_called());
bool is_secure_proxy = GetParam() == HTTPS || GetParam() == SPDY;
histogram_tester().ExpectTotalCount(
@@ -292,7 +290,7 @@ TEST_P(HttpProxyClientSocketPoolTest, NoTunnel) {
TEST_P(HttpProxyClientSocketPoolTest, SetSocketRequestPriorityOnInit) {
Initialize(NULL, 0, NULL, 0, NULL, 0, NULL, 0);
EXPECT_EQ(
- OK, handle_.Init("a", CreateNoTunnelParams(NULL), HIGHEST,
+ OK, handle_.Init("a", CreateNoTunnelParams(), HIGHEST, SocketTag(),
ClientSocketPool::RespectLimits::ENABLED,
CompletionCallback(), pool_.get(), NetLogWithSource()));
EXPECT_EQ(HIGHEST, GetLastTransportRequestPriority());
@@ -332,7 +330,7 @@ TEST_P(HttpProxyClientSocketPoolTest, NeedAuth) {
spdy_reads, arraysize(spdy_reads), spdy_writes,
arraysize(spdy_writes));
- int rv = handle_.Init("a", CreateTunnelParams(NULL), LOW,
+ int rv = handle_.Init("a", CreateTunnelParams(), LOW, SocketTag(),
ClientSocketPool::RespectLimits::ENABLED,
callback_.callback(), pool_.get(), NetLogWithSource());
EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
@@ -366,9 +364,7 @@ TEST_P(HttpProxyClientSocketPoolTest, HaveAuth) {
"CONNECT www.google.com:443 HTTP/1.1\r\n"
"Host: www.google.com:443\r\n"
"Proxy-Connection: keep-alive\r\n"
- "Proxy-Authorization: Basic Zm9vOmJhcg==\r\n"
- "Foo: " +
- proxy_host_port + "\r\n\r\n";
+ "Proxy-Authorization: Basic Zm9vOmJhcg==\r\n\r\n";
MockWrite writes[] = {
MockWrite(SYNCHRONOUS, 0, request.c_str()),
};
@@ -380,21 +376,13 @@ TEST_P(HttpProxyClientSocketPoolTest, HaveAuth) {
NULL, 0);
AddAuthToCache();
- std::unique_ptr<TestProxyDelegate> proxy_delegate(new TestProxyDelegate());
- int rv = handle_.Init("a", CreateTunnelParams(proxy_delegate.get()), LOW,
+ int rv = handle_.Init("a", CreateTunnelParams(), LOW, SocketTag(),
ClientSocketPool::RespectLimits::ENABLED,
callback_.callback(), pool_.get(), NetLogWithSource());
EXPECT_THAT(rv, IsOk());
EXPECT_TRUE(handle_.is_initialized());
ASSERT_TRUE(handle_.socket());
EXPECT_TRUE(handle_.socket()->IsConnected());
- proxy_delegate->VerifyOnTunnelHeadersReceived(
- "www.google.com:443",
- proxy_host_port.c_str(),
- "HTTP/1.1 200 Connection Established");
- proxy_delegate->VerifyOnTunnelRequestCompleted(
- "www.google.com:443",
- proxy_host_port.c_str());
}
TEST_P(HttpProxyClientSocketPoolTest, AsyncHaveAuth) {
@@ -405,9 +393,7 @@ TEST_P(HttpProxyClientSocketPoolTest, AsyncHaveAuth) {
"CONNECT www.google.com:443 HTTP/1.1\r\n"
"Host: www.google.com:443\r\n"
"Proxy-Connection: keep-alive\r\n"
- "Proxy-Authorization: Basic Zm9vOmJhcg==\r\n"
- "Foo: " +
- proxy_host_port + "\r\n\r\n";
+ "Proxy-Authorization: Basic Zm9vOmJhcg==\r\n\r\n";
MockWrite writes[] = {
MockWrite(ASYNC, 0, request.c_str()),
};
@@ -431,8 +417,7 @@ TEST_P(HttpProxyClientSocketPoolTest, AsyncHaveAuth) {
arraysize(spdy_writes));
AddAuthToCache();
- std::unique_ptr<TestProxyDelegate> proxy_delegate(new TestProxyDelegate());
- int rv = handle_.Init("a", CreateTunnelParams(proxy_delegate.get()), LOW,
+ int rv = handle_.Init("a", CreateTunnelParams(), LOW, SocketTag(),
ClientSocketPool::RespectLimits::ENABLED,
callback_.callback(), pool_.get(), NetLogWithSource());
EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
@@ -443,9 +428,6 @@ TEST_P(HttpProxyClientSocketPoolTest, AsyncHaveAuth) {
EXPECT_TRUE(handle_.is_initialized());
ASSERT_TRUE(handle_.socket());
EXPECT_TRUE(handle_.socket()->IsConnected());
- proxy_delegate->VerifyOnTunnelRequestCompleted(
- "www.google.com:443",
- proxy_host_port.c_str());
}
// Make sure that HttpProxyConnectJob passes on its priority to its
@@ -470,7 +452,7 @@ TEST_P(HttpProxyClientSocketPoolTest,
EXPECT_EQ(
ERR_IO_PENDING,
- handle_.Init("a", CreateTunnelParams(NULL), MEDIUM,
+ handle_.Init("a", CreateTunnelParams(), MEDIUM, SocketTag(),
ClientSocketPool::RespectLimits::ENABLED,
callback_.callback(), pool_.get(), NetLogWithSource()));
EXPECT_EQ(MEDIUM, GetLastTransportRequestPriority());
@@ -486,7 +468,7 @@ TEST_P(HttpProxyClientSocketPoolTest, TCPError) {
socket_factory()->AddSocketDataProvider(data_.get());
- int rv = handle_.Init("a", CreateTunnelParams(NULL), LOW,
+ int rv = handle_.Init("a", CreateTunnelParams(), LOW, SocketTag(),
ClientSocketPool::RespectLimits::ENABLED,
callback_.callback(), pool_.get(), NetLogWithSource());
EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
@@ -519,7 +501,7 @@ TEST_P(HttpProxyClientSocketPoolTest, SSLError) {
}
socket_factory()->AddSSLSocketDataProvider(ssl_data_.get());
- int rv = handle_.Init("a", CreateTunnelParams(NULL), LOW,
+ int rv = handle_.Init("a", CreateTunnelParams(), LOW, SocketTag(),
ClientSocketPool::RespectLimits::ENABLED,
callback_.callback(), pool_.get(), NetLogWithSource());
EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
@@ -551,7 +533,7 @@ TEST_P(HttpProxyClientSocketPoolTest, SslClientAuth) {
}
socket_factory()->AddSSLSocketDataProvider(ssl_data_.get());
- int rv = handle_.Init("a", CreateTunnelParams(NULL), LOW,
+ int rv = handle_.Init("a", CreateTunnelParams(), LOW, SocketTag(),
ClientSocketPool::RespectLimits::ENABLED,
callback_.callback(), pool_.get(), NetLogWithSource());
EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
@@ -594,7 +576,7 @@ TEST_P(HttpProxyClientSocketPoolTest, TunnelUnexpectedClose) {
arraysize(spdy_writes));
AddAuthToCache();
- int rv = handle_.Init("a", CreateTunnelParams(NULL), LOW,
+ int rv = handle_.Init("a", CreateTunnelParams(), LOW, SocketTag(),
ClientSocketPool::RespectLimits::ENABLED,
callback_.callback(), pool_.get(), NetLogWithSource());
EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
@@ -634,7 +616,7 @@ TEST_P(HttpProxyClientSocketPoolTest, Tunnel1xxResponse) {
Initialize(reads, arraysize(reads), writes, arraysize(writes),
NULL, 0, NULL, 0);
- int rv = handle_.Init("a", CreateTunnelParams(NULL), LOW,
+ int rv = handle_.Init("a", CreateTunnelParams(), LOW, SocketTag(),
ClientSocketPool::RespectLimits::ENABLED,
callback_.callback(), pool_.get(), NetLogWithSource());
EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
@@ -673,7 +655,7 @@ TEST_P(HttpProxyClientSocketPoolTest, TunnelSetupError) {
arraysize(spdy_writes));
AddAuthToCache();
- int rv = handle_.Init("a", CreateTunnelParams(NULL), LOW,
+ int rv = handle_.Init("a", CreateTunnelParams(), LOW, SocketTag(),
ClientSocketPool::RespectLimits::ENABLED,
callback_.callback(), pool_.get(), NetLogWithSource());
EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
@@ -730,7 +712,7 @@ TEST_P(HttpProxyClientSocketPoolTest, TunnelSetupRedirect) {
arraysize(spdy_writes));
AddAuthToCache();
- int rv = handle_.Init("a", CreateTunnelParams(NULL), LOW,
+ int rv = handle_.Init("a", CreateTunnelParams(), LOW, SocketTag(),
ClientSocketPool::RespectLimits::ENABLED,
callback_.callback(), pool_.get(), NetLogWithSource());
EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
@@ -783,104 +765,155 @@ TEST_P(HttpProxyClientSocketPoolTest, ProxyPoolTimeout) {
// Tests the connection timeout values when the field trial parameters are
// specified.
TEST_P(HttpProxyClientSocketPoolTest, ProxyPoolTimeoutWithExperiment) {
- int transport_rtt_multiplier = 2;
- base::TimeDelta min_timeout = base::TimeDelta::FromSeconds(8);
- base::TimeDelta max_timeout = base::TimeDelta::FromSeconds(20);
+ // Timeout should be kMultiplier times the HTTP RTT estimate.
+ const int kMultiplier = 4;
+ const base::TimeDelta kMinTimeout = base::TimeDelta::FromSeconds(8);
+ const base::TimeDelta kMaxTimeout = base::TimeDelta::FromSeconds(20);
- InitAdaptiveTimeoutFieldTrialWithParams(false, transport_rtt_multiplier,
- min_timeout, max_timeout);
+ InitAdaptiveTimeoutFieldTrialWithParams(false, kMultiplier, kMultiplier,
+ kMinTimeout, kMaxTimeout);
EXPECT_LE(base::TimeDelta(), pool_->ConnectionTimeout());
- // Timeout should be |transport_rtt_multiplier| times the transport RTT
- // estimate.
- base::TimeDelta rtt_estimate = base::TimeDelta::FromSeconds(7);
- estimator()->set_start_time_null_transport_rtt(rtt_estimate);
- EXPECT_EQ(rtt_estimate + rtt_estimate, pool_->ConnectionTimeout());
-
- // A change in RTT estimate should also change the connection timeout.
- rtt_estimate = base::TimeDelta::FromSeconds(8);
- estimator()->set_start_time_null_transport_rtt(rtt_estimate);
- EXPECT_EQ(rtt_estimate + rtt_estimate, pool_->ConnectionTimeout());
+ base::TimeDelta rtt_estimate = base::TimeDelta::FromSeconds(4);
+ estimator()->SetStartTimeNullHttpRtt(rtt_estimate);
+ base::TimeDelta expected_connection_timeout = kMultiplier * rtt_estimate;
+ EXPECT_EQ(expected_connection_timeout, pool_->ConnectionTimeout());
- // Connection timeout should not exceed |max_timeout|.
+ // Connection timeout should not exceed kMaxTimeout.
rtt_estimate = base::TimeDelta::FromSeconds(25);
- estimator()->set_start_time_null_transport_rtt(rtt_estimate);
- EXPECT_EQ(max_timeout, pool_->ConnectionTimeout());
+ estimator()->SetStartTimeNullHttpRtt(rtt_estimate);
+ EXPECT_EQ(kMaxTimeout, pool_->ConnectionTimeout());
- // Connection timeout should not be less than |min_timeout|.
+ // Connection timeout should not be less than kMinTimeout.
rtt_estimate = base::TimeDelta::FromSeconds(0);
- estimator()->set_start_time_null_transport_rtt(rtt_estimate);
- EXPECT_EQ(min_timeout, pool_->ConnectionTimeout());
+ estimator()->SetStartTimeNullHttpRtt(rtt_estimate);
+ EXPECT_EQ(kMinTimeout, pool_->ConnectionTimeout());
}
// Tests the connection timeout values when the field trial parameters are
// specified.
TEST_P(HttpProxyClientSocketPoolTest,
ProxyPoolTimeoutWithExperimentDifferentParams) {
- int transport_rtt_multiplier = 3;
- base::TimeDelta min_timeout = base::TimeDelta::FromSeconds(2);
- base::TimeDelta max_timeout = base::TimeDelta::FromSeconds(30);
+ // Timeout should be kMultiplier times the HTTP RTT estimate.
+ const int kMultiplier = 3;
+ const base::TimeDelta kMinTimeout = base::TimeDelta::FromSeconds(2);
+ const base::TimeDelta kMaxTimeout = base::TimeDelta::FromSeconds(30);
- InitAdaptiveTimeoutFieldTrialWithParams(false, transport_rtt_multiplier,
- min_timeout, max_timeout);
+ InitAdaptiveTimeoutFieldTrialWithParams(false, kMultiplier, kMultiplier,
+ kMinTimeout, kMaxTimeout);
EXPECT_LE(base::TimeDelta(), pool_->ConnectionTimeout());
- // Timeout should be |transport_rtt_multiplier| times the transport RTT
- // estimate.
base::TimeDelta rtt_estimate = base::TimeDelta::FromSeconds(2);
- estimator()->set_start_time_null_transport_rtt(rtt_estimate);
- EXPECT_EQ(rtt_estimate + rtt_estimate + rtt_estimate,
- pool_->ConnectionTimeout());
+ estimator()->SetStartTimeNullHttpRtt(rtt_estimate);
+ EXPECT_EQ(kMultiplier * rtt_estimate, pool_->ConnectionTimeout());
// A change in RTT estimate should also change the connection timeout.
rtt_estimate = base::TimeDelta::FromSeconds(7);
- estimator()->set_start_time_null_transport_rtt(rtt_estimate);
- EXPECT_EQ(rtt_estimate + rtt_estimate + rtt_estimate,
- pool_->ConnectionTimeout());
+ estimator()->SetStartTimeNullHttpRtt(rtt_estimate);
+ EXPECT_EQ(kMultiplier * rtt_estimate, pool_->ConnectionTimeout());
- // Connection timeout should not exceed |max_timeout|.
+ // Connection timeout should not exceed kMaxTimeout.
rtt_estimate = base::TimeDelta::FromSeconds(35);
- estimator()->set_start_time_null_transport_rtt(rtt_estimate);
- EXPECT_EQ(max_timeout, pool_->ConnectionTimeout());
+ estimator()->SetStartTimeNullHttpRtt(rtt_estimate);
+ EXPECT_EQ(kMaxTimeout, pool_->ConnectionTimeout());
- // Connection timeout should not be less than |min_timeout|.
+ // Connection timeout should not be less than kMinTimeout.
rtt_estimate = base::TimeDelta::FromSeconds(0);
- estimator()->set_start_time_null_transport_rtt(rtt_estimate);
- EXPECT_EQ(min_timeout, pool_->ConnectionTimeout());
+ estimator()->SetStartTimeNullHttpRtt(rtt_estimate);
+ EXPECT_EQ(kMinTimeout, pool_->ConnectionTimeout());
+}
+
+TEST_P(HttpProxyClientSocketPoolTest, ProxyPoolTimeoutWithConnectionProperty) {
+ const int kSecureMultiplier = 3;
+ const int kNonSecureMultiplier = 5;
+ const base::TimeDelta kMinTimeout = base::TimeDelta::FromSeconds(2);
+ const base::TimeDelta kMaxTimeout = base::TimeDelta::FromSeconds(30);
+
+ InitAdaptiveTimeoutFieldTrialWithParams(
+ false, kSecureMultiplier, kNonSecureMultiplier, kMinTimeout, kMaxTimeout);
+
+ HttpProxyClientSocketPool::HttpProxyConnectJobFactory job_factory(
+ transport_socket_pool(), ssl_socket_pool(), estimator(), nullptr);
+
+ const base::TimeDelta kRttEstimate = base::TimeDelta::FromSeconds(2);
+ estimator()->SetStartTimeNullHttpRtt(kRttEstimate);
+ // By default, connection timeout should return the timeout for secure
+ // proxies.
+ EXPECT_EQ(kSecureMultiplier * kRttEstimate, job_factory.ConnectionTimeout());
+ EXPECT_EQ(kSecureMultiplier * kRttEstimate,
+ job_factory.ConnectionTimeoutWithConnectionProperty(true));
+ EXPECT_EQ(kNonSecureMultiplier * kRttEstimate,
+ job_factory.ConnectionTimeoutWithConnectionProperty(false));
}
// Tests the connection timeout values when the field trial parameters are not
// specified.
TEST_P(HttpProxyClientSocketPoolTest,
ProxyPoolTimeoutWithExperimentDefaultParams) {
- InitAdaptiveTimeoutFieldTrialWithParams(true, 0, base::TimeDelta(),
+ InitAdaptiveTimeoutFieldTrialWithParams(true, 0, 0, base::TimeDelta(),
base::TimeDelta());
EXPECT_LE(base::TimeDelta(), pool_->ConnectionTimeout());
- // Timeout should be |transport_rtt_multiplier| times the transport RTT
+ // Timeout should be |http_rtt_multiplier| times the HTTP RTT
// estimate.
base::TimeDelta rtt_estimate = base::TimeDelta::FromMilliseconds(10);
- estimator()->set_start_time_null_transport_rtt(rtt_estimate);
- // Connection timeout should not be less than the transport RTT estimate.
+ estimator()->SetStartTimeNullHttpRtt(rtt_estimate);
+ // Connection timeout should not be less than the HTTP RTT estimate.
EXPECT_LE(rtt_estimate, pool_->ConnectionTimeout());
// A change in RTT estimate should also change the connection timeout.
rtt_estimate = base::TimeDelta::FromSeconds(10);
- estimator()->set_start_time_null_transport_rtt(rtt_estimate);
- // Connection timeout should not be less than the transport RTT estimate.
+ estimator()->SetStartTimeNullHttpRtt(rtt_estimate);
+ // Connection timeout should not be less than the HTTP RTT estimate.
EXPECT_LE(rtt_estimate, pool_->ConnectionTimeout());
// Set RTT to a very large value.
rtt_estimate = base::TimeDelta::FromMinutes(60);
- estimator()->set_start_time_null_transport_rtt(rtt_estimate);
+ estimator()->SetStartTimeNullHttpRtt(rtt_estimate);
EXPECT_GT(rtt_estimate, pool_->ConnectionTimeout());
// Set RTT to a very small value.
rtt_estimate = base::TimeDelta::FromSeconds(0);
- estimator()->set_start_time_null_transport_rtt(rtt_estimate);
+ estimator()->SetStartTimeNullHttpRtt(rtt_estimate);
EXPECT_LT(rtt_estimate, pool_->ConnectionTimeout());
}
// It would be nice to also test the timeouts in HttpProxyClientSocketPool.
+// Test that SocketTag passed into HttpProxyClientSocketPool is applied to
+// returned underlying TCP sockets.
+#if defined(OS_ANDROID)
+TEST_P(HttpProxyClientSocketPoolTest, Tag) {
+ Initialize(NULL, 0, NULL, 0, NULL, 0, NULL, 0);
+ SocketTag tag1(SocketTag::UNSET_UID, 0x12345678);
+ SocketTag tag2(getuid(), 0x87654321);
+
+ // Verify requested socket is tagged properly.
+ int rv = handle_.Init("a", CreateNoTunnelParams(), LOW, tag1,
+ ClientSocketPool::RespectLimits::ENABLED,
+ CompletionCallback(), pool_.get(), NetLogWithSource());
+ EXPECT_THAT(rv, IsOk());
+ EXPECT_TRUE(handle_.is_initialized());
+ ASSERT_TRUE(handle_.socket());
+ EXPECT_TRUE(handle_.socket()->IsConnected());
+ EXPECT_EQ(socket_factory()->GetLastProducedSocket()->tag(), tag1);
+ EXPECT_TRUE(
+ socket_factory()->GetLastProducedSocket()->tagged_before_connected());
+
+ // Verify reused socket is retagged properly.
+ StreamSocket* socket = handle_.socket();
+ handle_.Reset();
+ rv = handle_.Init("a", CreateNoTunnelParams(), LOW, tag2,
+ ClientSocketPool::RespectLimits::ENABLED,
+ CompletionCallback(), pool_.get(), NetLogWithSource());
+ EXPECT_THAT(rv, IsOk());
+ EXPECT_TRUE(handle_.socket());
+ EXPECT_TRUE(handle_.socket()->IsConnected());
+ EXPECT_EQ(handle_.socket(), socket);
+ EXPECT_EQ(socket_factory()->GetLastProducedSocket()->tag(), tag2);
+ handle_.socket()->Disconnect();
+ handle_.Reset();
+}
+#endif
+
} // namespace net
diff --git a/chromium/net/http/http_proxy_client_socket_unittest.cc b/chromium/net/http/http_proxy_client_socket_unittest.cc
new file mode 100644
index 00000000000..dd35006cebe
--- /dev/null
+++ b/chromium/net/http/http_proxy_client_socket_unittest.cc
@@ -0,0 +1,44 @@
+// 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.
+
+#include "net/http/http_proxy_client_socket.h"
+
+#include "build/build_config.h"
+#include "net/base/address_list.h"
+#include "net/base/host_port_pair.h"
+#include "net/log/test_net_log.h"
+#include "net/socket/next_proto.h"
+#include "net/socket/socket_tag.h"
+#include "net/socket/socket_test_util.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+namespace net {
+
+namespace {
+
+TEST(HttpProxyClientSocketTest, Tag) {
+ StaticSocketDataProvider data;
+ TestNetLog log;
+ MockTaggingStreamSocket* tagging_sock =
+ new MockTaggingStreamSocket(std::unique_ptr<StreamSocket>(
+ new MockTCPClientSocket(AddressList(), &log, &data)));
+
+ std::unique_ptr<ClientSocketHandle> connection(new ClientSocketHandle);
+ // |connection| takes ownership of |tagging_sock|, but keep a
+ // non-owning pointer to it.
+ connection->SetSocket(std::unique_ptr<StreamSocket>(tagging_sock));
+ HttpProxyClientSocket socket(std::move(connection), "", HostPortPair(),
+ nullptr, false, false, NextProto(), false);
+
+ EXPECT_EQ(tagging_sock->tag(), SocketTag());
+#if defined(OS_ANDROID)
+ SocketTag tag(0x12345678, 0x87654321);
+ socket.ApplySocketTag(tag);
+ EXPECT_EQ(tagging_sock->tag(), tag);
+#endif // OS_ANDROID
+}
+
+} // namespace
+
+} // namespace net
diff --git a/chromium/net/http/http_proxy_client_socket_wrapper.cc b/chromium/net/http/http_proxy_client_socket_wrapper.cc
index cd7a4d3db1f..4d769956cfa 100644
--- a/chromium/net/http/http_proxy_client_socket_wrapper.cc
+++ b/chromium/net/http/http_proxy_client_socket_wrapper.cc
@@ -12,7 +12,6 @@
#include "base/memory/weak_ptr.h"
#include "base/metrics/histogram_macros.h"
#include "base/values.h"
-#include "net/base/proxy_delegate.h"
#include "net/http/http_proxy_client_socket.h"
#include "net/http/http_response_info.h"
#include "net/log/net_log_event_type.h"
@@ -20,11 +19,13 @@
#include "net/log/net_log_source_type.h"
#include "net/quic/chromium/quic_proxy_client_socket.h"
#include "net/socket/client_socket_handle.h"
+#include "net/socket/socket_tag.h"
#include "net/spdy/chromium/spdy_proxy_client_socket.h"
#include "net/spdy/chromium/spdy_session.h"
#include "net/spdy/chromium/spdy_session_pool.h"
#include "net/spdy/chromium/spdy_stream.h"
#include "net/ssl/ssl_cert_request_info.h"
+#include "net/traffic_annotation/network_traffic_annotation.h"
#include "url/gurl.h"
namespace net {
@@ -32,6 +33,7 @@ namespace net {
HttpProxyClientSocketWrapper::HttpProxyClientSocketWrapper(
const std::string& group_name,
RequestPriority priority,
+ const SocketTag& socket_tag,
ClientSocketPool::RespectLimits respect_limits,
base::TimeDelta connect_timeout_duration,
base::TimeDelta proxy_negotiation_timeout_duration,
@@ -47,11 +49,11 @@ HttpProxyClientSocketWrapper::HttpProxyClientSocketWrapper(
SpdySessionPool* spdy_session_pool,
QuicStreamFactory* quic_stream_factory,
bool tunnel,
- ProxyDelegate* proxy_delegate,
const NetLogWithSource& net_log)
: next_state_(STATE_NONE),
group_name_(group_name),
priority_(priority),
+ initial_socket_tag_(socket_tag),
respect_limits_(respect_limits),
connect_timeout_duration_(connect_timeout_duration),
proxy_negotiation_timeout_duration_(proxy_negotiation_timeout_duration),
@@ -65,7 +67,6 @@ HttpProxyClientSocketWrapper::HttpProxyClientSocketWrapper(
spdy_session_pool_(spdy_session_pool),
has_restarted_(false),
tunnel_(tunnel),
- proxy_delegate_(proxy_delegate),
using_spdy_(false),
quic_stream_request_(quic_stream_factory),
http_auth_controller_(
@@ -186,7 +187,6 @@ int HttpProxyClientSocketWrapper::Connect(const CompletionCallback& callback) {
connect_callback_ = callback;
} else {
connect_timer_.Stop();
- NotifyProxyDelegateOfCompletion(rv);
}
return rv;
@@ -291,6 +291,19 @@ int64_t HttpProxyClientSocketWrapper::GetTotalReceivedBytes() const {
return transport_socket_->GetTotalReceivedBytes();
}
+void HttpProxyClientSocketWrapper::ApplySocketTag(const SocketTag& tag) {
+ // HttpProxyClientSocketPool only tags once connected, when transport_socket_
+ // is set. Socket tagging is not supported with tunneling. Socket tagging is
+ // also not supported with proxy auth so ApplySocketTag() won't be called with
+ // a specific (non-default) tag when transport_socket_ is cleared by
+ // RestartWithAuth().
+ if (tunnel_ || !transport_socket_) {
+ CHECK(tag == SocketTag());
+ } else {
+ transport_socket_->ApplySocketTag(tag);
+ }
+}
+
int HttpProxyClientSocketWrapper::Read(IOBuffer* buf,
int buf_len,
const CompletionCallback& callback) {
@@ -299,11 +312,13 @@ int HttpProxyClientSocketWrapper::Read(IOBuffer* buf,
return ERR_SOCKET_NOT_CONNECTED;
}
-int HttpProxyClientSocketWrapper::Write(IOBuffer* buf,
- int buf_len,
- const CompletionCallback& callback) {
+int HttpProxyClientSocketWrapper::Write(
+ IOBuffer* buf,
+ int buf_len,
+ const CompletionCallback& callback,
+ const NetworkTrafficAnnotationTag& traffic_annotation) {
if (transport_socket_)
- return transport_socket_->Write(buf, buf_len, callback);
+ return transport_socket_->Write(buf, buf_len, callback, traffic_annotation);
return ERR_SOCKET_NOT_CONNECTED;
}
@@ -337,7 +352,6 @@ void HttpProxyClientSocketWrapper::OnIOComplete(int result) {
int rv = DoLoop(result);
if (rv != ERR_IO_PENDING) {
connect_timer_.Stop();
- NotifyProxyDelegateOfCompletion(rv);
// May delete |this|.
base::ResetAndReturn(&connect_callback_).Run(rv);
}
@@ -427,7 +441,8 @@ int HttpProxyClientSocketWrapper::DoTransportConnect() {
next_state_ = STATE_TCP_CONNECT_COMPLETE;
transport_socket_handle_.reset(new ClientSocketHandle());
return transport_socket_handle_->Init(
- group_name_, transport_params_, priority_, respect_limits_,
+ group_name_, transport_params_, priority_, initial_socket_tag_,
+ respect_limits_,
base::Bind(&HttpProxyClientSocketWrapper::OnIOComplete,
base::Unretained(this)),
transport_pool_, net_log_);
@@ -466,7 +481,7 @@ int HttpProxyClientSocketWrapper::DoSSLConnect() {
next_state_ = STATE_SSL_CONNECT_COMPLETE;
transport_socket_handle_.reset(new ClientSocketHandle());
return transport_socket_handle_->Init(
- group_name_, ssl_params_, priority_, respect_limits_,
+ group_name_, ssl_params_, priority_, initial_socket_tag_, respect_limits_,
base::Bind(&HttpProxyClientSocketWrapper::OnIOComplete,
base::Unretained(this)),
ssl_pool_, net_log_);
@@ -548,9 +563,8 @@ int HttpProxyClientSocketWrapper::DoHttpProxyConnect() {
// Add a HttpProxy connection on top of the tcp socket.
transport_socket_.reset(new HttpProxyClientSocket(
- transport_socket_handle_.release(), user_agent_, endpoint_,
- GetDestination().host_port_pair(), http_auth_controller_.get(), tunnel_,
- using_spdy_, negotiated_protocol_, proxy_delegate_,
+ std::move(transport_socket_handle_), user_agent_, endpoint_,
+ http_auth_controller_.get(), tunnel_, using_spdy_, negotiated_protocol_,
ssl_params_.get() != nullptr));
return transport_socket_->Connect(base::Bind(
&HttpProxyClientSocketWrapper::OnIOComplete, base::Unretained(this)));
@@ -703,14 +717,6 @@ int HttpProxyClientSocketWrapper::DoRestartWithAuthComplete(int result) {
return result;
}
-void HttpProxyClientSocketWrapper::NotifyProxyDelegateOfCompletion(int result) {
- if (!proxy_delegate_)
- return;
-
- const HostPortPair& proxy_server = GetDestination().host_port_pair();
- proxy_delegate_->OnTunnelConnectCompleted(endpoint_, proxy_server, result);
-}
-
void HttpProxyClientSocketWrapper::SetConnectTimer(base::TimeDelta delay) {
connect_timer_.Stop();
connect_timer_.Start(FROM_HERE, delay, this,
@@ -734,8 +740,6 @@ void HttpProxyClientSocketWrapper::ConnectTimeout() {
}
}
- NotifyProxyDelegateOfCompletion(ERR_CONNECTION_TIMED_OUT);
-
CompletionCallback callback = connect_callback_;
Disconnect();
callback.Run(ERR_CONNECTION_TIMED_OUT);
diff --git a/chromium/net/http/http_proxy_client_socket_wrapper.h b/chromium/net/http/http_proxy_client_socket_wrapper.h
index 26974540839..66774cbb448 100644
--- a/chromium/net/http/http_proxy_client_socket_wrapper.h
+++ b/chromium/net/http/http_proxy_client_socket_wrapper.h
@@ -26,6 +26,7 @@
#include "net/socket/ssl_client_socket_pool.h"
#include "net/socket/transport_client_socket_pool.h"
#include "net/spdy/chromium/spdy_session.h"
+#include "net/traffic_annotation/network_traffic_annotation.h"
namespace net {
@@ -35,7 +36,6 @@ class HttpAuthCache;
class HttpResponseInfo;
class HttpStream;
class IOBuffer;
-class ProxyDelegate;
class SpdySessionPool;
class SSLClientSocketPool;
class TransportClientSocketPool;
@@ -57,6 +57,7 @@ class NET_EXPORT_PRIVATE HttpProxyClientSocketWrapper
HttpProxyClientSocketWrapper(
const std::string& group_name,
RequestPriority priority,
+ const SocketTag& socket_tag,
ClientSocketPool::RespectLimits respect_limits,
base::TimeDelta connect_timeout_duration,
base::TimeDelta proxy_negotiation_timeout_duration,
@@ -72,7 +73,6 @@ class NET_EXPORT_PRIVATE HttpProxyClientSocketWrapper
SpdySessionPool* spdy_session_pool,
QuicStreamFactory* quic_stream_factory,
bool tunnel,
- ProxyDelegate* proxy_delegate,
const NetLogWithSource& net_log);
// On destruction Disconnect() is called.
@@ -108,6 +108,7 @@ class NET_EXPORT_PRIVATE HttpProxyClientSocketWrapper
void ClearConnectionAttempts() override;
void AddConnectionAttempts(const ConnectionAttempts& attempts) override;
int64_t GetTotalReceivedBytes() const override;
+ void ApplySocketTag(const SocketTag& tag) override;
// Socket implementation.
int Read(IOBuffer* buf,
@@ -115,7 +116,8 @@ class NET_EXPORT_PRIVATE HttpProxyClientSocketWrapper
const CompletionCallback& callback) override;
int Write(IOBuffer* buf,
int buf_len,
- const CompletionCallback& callback) override;
+ const CompletionCallback& callback,
+ const NetworkTrafficAnnotationTag& traffic_annotation) override;
int SetReceiveBufferSize(int32_t size) override;
int SetSendBufferSize(int32_t size) override;
int GetPeerAddress(IPEndPoint* address) const override;
@@ -169,8 +171,6 @@ class NET_EXPORT_PRIVATE HttpProxyClientSocketWrapper
int DoRestartWithAuth();
int DoRestartWithAuthComplete(int result);
- void NotifyProxyDelegateOfCompletion(int result);
-
void SetConnectTimer(base::TimeDelta duration);
void ConnectTimeout();
@@ -180,6 +180,7 @@ class NET_EXPORT_PRIVATE HttpProxyClientSocketWrapper
const std::string group_name_;
RequestPriority priority_;
+ const SocketTag initial_socket_tag_;
ClientSocketPool::RespectLimits respect_limits_;
const base::TimeDelta connect_timeout_duration_;
const base::TimeDelta proxy_negotiation_timeout_duration_;
@@ -197,7 +198,6 @@ class NET_EXPORT_PRIVATE HttpProxyClientSocketWrapper
bool has_restarted_;
const bool tunnel_;
- ProxyDelegate* const proxy_delegate_;
bool using_spdy_;
NextProto negotiated_protocol_;
diff --git a/chromium/net/http/http_proxy_client_socket_wrapper_unittest.cc b/chromium/net/http/http_proxy_client_socket_wrapper_unittest.cc
index 63398086c1c..9d5e034bf1e 100644
--- a/chromium/net/http/http_proxy_client_socket_wrapper_unittest.cc
+++ b/chromium/net/http/http_proxy_client_socket_wrapper_unittest.cc
@@ -7,8 +7,8 @@
#include <cstdio>
#include <memory>
-#include "net/cert/cert_verifier.h"
-#include "net/cert/multi_log_ct_verifier.h"
+#include "net/cert/do_nothing_ct_verifier.h"
+#include "net/cert/mock_cert_verifier.h"
#include "net/dns/mock_host_resolver.h"
#include "net/http/http_auth_cache.h"
#include "net/http/http_auth_handler_factory.h"
@@ -21,6 +21,7 @@
#include "net/quic/core/quic_versions.h"
#include "net/quic/test_tools/mock_clock.h"
#include "net/quic/test_tools/mock_random.h"
+#include "net/socket/socket_tag.h"
#include "net/socket/socket_test_util.h"
#include "net/ssl/channel_id_service.h"
#include "net/ssl/default_channel_id_store.h"
@@ -58,7 +59,7 @@ class MockSSLConfigService : public SSLConfigService {
namespace test {
class HttpProxyClientSocketWrapperTest
- : public ::testing::TestWithParam<QuicTransportVersion> {
+ : public ::testing::TestWithParam<std::tuple<QuicTransportVersion, bool>> {
protected:
static const bool kFin = true;
static const bool kIncludeVersion = true;
@@ -68,22 +69,25 @@ class HttpProxyClientSocketWrapperTest
: proxy_host_port_(kProxyHost, kProxyPort),
endpoint_host_port_(kOriginHost, kOriginPort),
ssl_config_service_(new MockSSLConfigService()),
- cert_verifier_(CertVerifier::CreateDefault()),
+ cert_verifier_(new MockCertVerifier()),
channel_id_service_(
new ChannelIDService(new DefaultChannelIDStore(nullptr))),
- cert_transparency_verifier_(new MultiLogCTVerifier()),
+ cert_transparency_verifier_(new DoNothingCTVerifier()),
random_generator_(0),
- quic_version_(GetParam()),
+ quic_version_(std::get<0>(GetParam())),
+ client_headers_include_h2_stream_dependency_(std::get<1>(GetParam())),
client_maker_(quic_version_,
0,
&clock_,
kProxyHost,
- Perspective::IS_CLIENT),
+ Perspective::IS_CLIENT,
+ client_headers_include_h2_stream_dependency_),
server_maker_(quic_version_,
0,
&clock_,
kProxyHost,
- Perspective::IS_SERVER),
+ Perspective::IS_SERVER,
+ false),
header_stream_offset_(0),
response_offset_(0),
store_server_configs_in_properties_(false),
@@ -125,9 +129,11 @@ class HttpProxyClientSocketWrapperTest
/*connect_using_default_network=*/true,
migrate_sessions_on_network_change_, migrate_sessions_early_,
migrate_sessions_on_network_change_v2_, migrate_sessions_early_v2_,
+ base::TimeDelta::FromSeconds(kMaxTimeOnNonDefaultNetworkSecs),
+ kMaxMigrationsToNonDefaultNetworkOnPathDegrading,
allow_server_migration_, race_cert_verification_, estimate_initial_rtt_,
- connection_options_, client_connection_options_,
- /*enable_token_binding=*/false));
+ client_headers_include_h2_stream_dependency_, connection_options_,
+ client_connection_options_, /*enable_token_binding=*/false));
}
void PopulateConnectRequestIR(SpdyHeaderBlock* block) {
@@ -149,7 +155,7 @@ class HttpProxyClientSocketWrapperTest
return client_maker_.MakeRequestHeadersPacket(
packet_number, kClientDataStreamId1, kIncludeVersion, !kFin,
ConvertRequestPriorityToQuicPriority(DEFAULT_PRIORITY),
- std::move(block), nullptr, &header_stream_offset_);
+ std::move(block), 0, nullptr, &header_stream_offset_);
}
std::unique_ptr<QuicReceivedPacket> ConstructServerConnectReplyPacket(
@@ -197,15 +203,16 @@ class HttpProxyClientSocketWrapperTest
scoped_refptr<SSLConfigService> ssl_config_service_;
MockClientSocketFactory socket_factory_;
HttpServerPropertiesImpl http_server_properties_;
- std::unique_ptr<CertVerifier> cert_verifier_;
+ std::unique_ptr<MockCertVerifier> cert_verifier_;
CTPolicyEnforcer ct_policy_enforcer_;
std::unique_ptr<ChannelIDService> channel_id_service_;
TransportSecurityState transport_security_state_;
- std::unique_ptr<CTVerifier> cert_transparency_verifier_;
+ std::unique_ptr<DoNothingCTVerifier> cert_transparency_verifier_;
MockCryptoClientStreamFactory crypto_client_stream_factory_;
MockRandom random_generator_;
- QuicTransportVersion quic_version_;
+ const QuicTransportVersion quic_version_;
+ const bool client_headers_include_h2_stream_dependency_;
QuicTestPacketMaker client_maker_;
QuicTestPacketMaker server_maker_;
QuicStreamOffset header_stream_offset_;
@@ -260,6 +267,7 @@ TEST_P(HttpProxyClientSocketWrapperTest, QuicProxy) {
client_socket_wrapper_.reset(new HttpProxyClientSocketWrapper(
/*group_name=*/std::string(), /*requiest_priority=*/DEFAULT_PRIORITY,
+ /*socket_tag=*/SocketTag(),
/*respect_limits=*/ClientSocketPool::RespectLimits::DISABLED,
/*connect_timeout_duration=*/base::TimeDelta::FromHours(1),
/*proxy_negotiation_timeout_duration=*/base::TimeDelta::FromHours(1),
@@ -267,7 +275,7 @@ TEST_P(HttpProxyClientSocketWrapperTest, QuicProxy) {
/*transport_params=*/nullptr, ssl_params, quic_version_, kUserAgent,
endpoint_host_port_, &http_auth_cache_, http_auth_handler_factory_.get(),
/*spdy_session_pool=*/nullptr, quic_stream_factory_.get(),
- /*tunnel=*/true, /*proxy_delegate=*/nullptr, net_log_));
+ /*tunnel=*/true, net_log_));
TestCompletionCallback callback;
client_socket_wrapper_->Connect(callback.callback());
@@ -279,9 +287,11 @@ TEST_P(HttpProxyClientSocketWrapperTest, QuicProxy) {
EXPECT_TRUE(mock_quic_data_.AllWriteDataConsumed());
}
-INSTANTIATE_TEST_CASE_P(Version,
- HttpProxyClientSocketWrapperTest,
- ::testing::ValuesIn(AllSupportedTransportVersions()));
+INSTANTIATE_TEST_CASE_P(
+ VersionIncludeStreamDependencySequnece,
+ HttpProxyClientSocketWrapperTest,
+ ::testing::Combine(::testing::ValuesIn(AllSupportedTransportVersions()),
+ ::testing::Bool()));
}; // namespace test
}; // namespace net
diff --git a/chromium/net/http/http_request_info.h b/chromium/net/http/http_request_info.h
index ceca265be3b..419227ca2a4 100644
--- a/chromium/net/http/http_request_info.h
+++ b/chromium/net/http/http_request_info.h
@@ -10,6 +10,7 @@
#include "net/base/net_export.h"
#include "net/base/privacy_mode.h"
#include "net/http/http_request_headers.h"
+#include "net/socket/socket_tag.h"
#include "url/gurl.h"
namespace net {
@@ -56,6 +57,9 @@ struct NET_EXPORT HttpRequestInfo {
// If present, the host of the referrer whose TokenBindingID should be
// included in a referred TokenBinding.
std::string token_binding_referrer;
+
+ // Tag applied to all sockets used to service request.
+ SocketTag socket_tag;
};
} // namespace net
diff --git a/chromium/net/http/http_response_body_drainer_unittest.cc b/chromium/net/http/http_response_body_drainer_unittest.cc
index 9c5dfa89a2d..c3a0fafacdb 100644
--- a/chromium/net/http/http_response_body_drainer_unittest.cc
+++ b/chromium/net/http/http_response_body_drainer_unittest.cc
@@ -88,6 +88,7 @@ class MockHttpStream : public HttpStream {
// HttpStream implementation.
int InitializeStream(const HttpRequestInfo* request_info,
+ bool can_send_early,
RequestPriority priority,
const NetLogWithSource& net_log,
const CompletionCallback& callback) override {
diff --git a/chromium/net/http/http_security_headers_unittest.cc b/chromium/net/http/http_security_headers_unittest.cc
index 1171e333269..8ca4ccab489 100644
--- a/chromium/net/http/http_security_headers_unittest.cc
+++ b/chromium/net/http/http_security_headers_unittest.cc
@@ -37,12 +37,12 @@ std::string GetTestPinImpl(uint8_t label, HashValueTag tag, bool quoted) {
reinterpret_cast<char*>(hash_value.data()), hash_value.size()), &base64);
std::string ret;
- switch (hash_value.tag) {
+ switch (hash_value.tag()) {
case HASH_VALUE_SHA256:
ret = "pin-sha256=";
break;
default:
- NOTREACHED() << "Unknown HashValueTag " << hash_value.tag;
+ NOTREACHED() << "Unknown HashValueTag " << hash_value.tag();
return std::string("ERROR");
}
if (quoted)
diff --git a/chromium/net/http/http_server_properties.h b/chromium/net/http/http_server_properties.h
index b8efe93258d..22f0a5db0f5 100644
--- a/chromium/net/http/http_server_properties.h
+++ b/chromium/net/http/http_server_properties.h
@@ -13,6 +13,7 @@
#include <tuple>
#include <vector>
+#include "base/callback.h"
#include "base/containers/mru_cache.h"
#include "base/macros.h"
#include "base/time/time.h"
@@ -313,8 +314,10 @@ class NET_EXPORT HttpServerProperties {
HttpServerProperties() {}
virtual ~HttpServerProperties() {}
- // Deletes all data.
- virtual void Clear() = 0;
+ // Deletes all data. If |callback| is non-null, flushes data to disk
+ // and invokes the callback asynchronously once changes have been written to
+ // disk.
+ virtual void Clear(base::OnceClosure callback) = 0;
// Returns true if |server| supports a network protocol which honors
// request prioritization.
diff --git a/chromium/net/http/http_server_properties_impl.cc b/chromium/net/http/http_server_properties_impl.cc
index 37248e625b1..ccd60cb109a 100644
--- a/chromium/net/http/http_server_properties_impl.cc
+++ b/chromium/net/http/http_server_properties_impl.cc
@@ -21,7 +21,9 @@
namespace net {
HttpServerPropertiesImpl::HttpServerPropertiesImpl(base::TickClock* clock)
- : broken_alternative_services_(this, clock ? clock : &default_clock_),
+ : broken_alternative_services_(
+ this,
+ clock ? clock : base::DefaultTickClock::GetInstance()),
quic_server_info_map_(kDefaultMaxQuicServerEntries),
max_server_configs_stored_in_properties_(kDefaultMaxQuicServerEntries) {
canonical_suffixes_.push_back(".ggpht.com");
@@ -175,7 +177,7 @@ HttpServerPropertiesImpl::recently_broken_alternative_services() const {
return broken_alternative_services_.recently_broken_alternative_services();
}
-void HttpServerPropertiesImpl::Clear() {
+void HttpServerPropertiesImpl::Clear(base::OnceClosure callback) {
DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
spdy_servers_map_.Clear();
alternative_service_map_.Clear();
@@ -185,6 +187,11 @@ void HttpServerPropertiesImpl::Clear() {
server_network_stats_map_.Clear();
quic_server_info_map_.Clear();
canonical_server_info_map_.clear();
+
+ if (!callback.is_null()) {
+ base::ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE,
+ std::move(callback));
+ }
}
bool HttpServerPropertiesImpl::SupportsRequestPriority(
diff --git a/chromium/net/http/http_server_properties_impl.h b/chromium/net/http/http_server_properties_impl.h
index dbb0ffdd096..7967e86adc9 100644
--- a/chromium/net/http/http_server_properties_impl.h
+++ b/chromium/net/http/http_server_properties_impl.h
@@ -13,6 +13,7 @@
#include <string>
#include <vector>
+#include "base/callback.h"
#include "base/macros.h"
#include "base/memory/weak_ptr.h"
#include "base/threading/thread_checker.h"
@@ -86,7 +87,7 @@ class NET_EXPORT HttpServerPropertiesImpl
// HttpServerProperties methods:
// -----------------------------
- void Clear() override;
+ void Clear(base::OnceClosure callback) override;
bool SupportsRequestPriority(const url::SchemeHostPort& server) override;
bool GetSupportsSpdy(const url::SchemeHostPort& server) override;
void SetSupportsSpdy(const url::SchemeHostPort& server,
@@ -176,8 +177,6 @@ class NET_EXPORT HttpServerPropertiesImpl
// have an entry associated with |server|, the method will add one.
void UpdateCanonicalServerInfoMap(const QuicServerId& server);
- base::DefaultTickClock default_clock_;
-
SpdyServersMap spdy_servers_map_;
Http11ServerHostPortSet http11_servers_;
diff --git a/chromium/net/http/http_server_properties_impl_unittest.cc b/chromium/net/http/http_server_properties_impl_unittest.cc
index 32f80acf5c9..c3b04f60ae3 100644
--- a/chromium/net/http/http_server_properties_impl_unittest.cc
+++ b/chromium/net/http/http_server_properties_impl_unittest.cc
@@ -280,9 +280,21 @@ TEST_F(SpdyServerPropertiesTest, Clear) {
EXPECT_TRUE(impl_.SupportsRequestPriority(spdy_server_google));
EXPECT_TRUE(impl_.SupportsRequestPriority(spdy_server_mail));
- impl_.Clear();
+ base::RunLoop run_loop;
+ bool callback_invoked_ = false;
+ impl_.Clear(base::BindOnce(
+ [](bool* callback_invoked, base::OnceClosure quit_closure) {
+ *callback_invoked = true;
+ std::move(quit_closure).Run();
+ },
+ &callback_invoked_, run_loop.QuitClosure()));
EXPECT_FALSE(impl_.SupportsRequestPriority(spdy_server_google));
EXPECT_FALSE(impl_.SupportsRequestPriority(spdy_server_mail));
+
+ // Callback should be run asynchronously.
+ EXPECT_FALSE(callback_invoked_);
+ run_loop.Run();
+ EXPECT_TRUE(callback_invoked_);
}
TEST_F(SpdyServerPropertiesTest, MRUOfSpdyServersMap) {
@@ -329,7 +341,7 @@ TEST_F(AlternateProtocolServerPropertiesTest, Basic) {
EXPECT_EQ(alternative_service,
alternative_service_info_vector[0].alternative_service());
- impl_.Clear();
+ impl_.Clear(base::OnceClosure());
EXPECT_FALSE(HasAlternativeService(test_server));
}
@@ -933,7 +945,7 @@ TEST_F(AlternateProtocolServerPropertiesTest, ClearWithCanonical) {
"bar.c.youtube.com", 1234);
SetAlternativeService(canonical_server, canonical_alternative_service);
- impl_.Clear();
+ impl_.Clear(base::OnceClosure());
EXPECT_FALSE(HasAlternativeService(test_server));
}
@@ -1093,7 +1105,7 @@ TEST_F(SupportsQuicServerPropertiesTest, SetSupportsQuic) {
EXPECT_TRUE(impl_.GetSupportsQuic(&address));
EXPECT_EQ(actual_address, address);
- impl_.Clear();
+ impl_.Clear(base::OnceClosure());
EXPECT_FALSE(impl_.GetSupportsQuic(&address));
}
@@ -1186,7 +1198,7 @@ TEST_F(ServerNetworkStatsServerPropertiesTest, SetServerNetworkStats) {
// Https server should have nothing set for server network stats.
EXPECT_EQ(NULL, impl_.GetServerNetworkStats(foo_https_server));
- impl_.Clear();
+ impl_.Clear(base::OnceClosure());
EXPECT_EQ(NULL, impl_.GetServerNetworkStats(foo_http_server));
EXPECT_EQ(NULL, impl_.GetServerNetworkStats(foo_https_server));
}
@@ -1305,7 +1317,7 @@ TEST_F(QuicServerInfoServerPropertiesTest, SetQuicServerInfo) {
EXPECT_EQ(1u, impl_.quic_server_info_map().size());
EXPECT_EQ(quic_server_info1, *(impl_.GetQuicServerInfo(quic_server_id)));
- impl_.Clear();
+ impl_.Clear(base::OnceClosure());
EXPECT_EQ(0u, impl_.quic_server_info_map().size());
EXPECT_EQ(nullptr, impl_.GetQuicServerInfo(quic_server_id));
}
diff --git a/chromium/net/http/http_server_properties_manager.cc b/chromium/net/http/http_server_properties_manager.cc
index 389487143e3..af84c1d48ba 100644
--- a/chromium/net/http/http_server_properties_manager.cc
+++ b/chromium/net/http/http_server_properties_manager.cc
@@ -86,6 +86,16 @@ struct ServerPref {
ServerNetworkStats server_network_stats;
};
+QuicServerId QuicServerIdFromString(const std::string& str) {
+ GURL url(str);
+ if (!url.is_valid()) {
+ return QuicServerId();
+ }
+ return QuicServerId(HostPortPair::FromURL(url), url.path_piece() == "/private"
+ ? PRIVACY_MODE_ENABLED
+ : PRIVACY_MODE_DISABLED);
+}
+
} // namespace
////////////////////////////////////////////////////////////////////////////////
@@ -98,7 +108,7 @@ HttpServerPropertiesManager::HttpServerPropertiesManager(
NetLog* net_log,
base::TickClock* clock)
: pref_delegate_(std::move(pref_delegate)),
- clock_(clock ? clock : &default_clock_),
+ clock_(clock ? clock : base::DefaultTickClock::GetInstance()),
net_log_(
NetLogWithSource::Make(net_log,
NetLogSourceType::HTTP_SERVER_PROPERTIES)) {
@@ -106,9 +116,9 @@ HttpServerPropertiesManager::HttpServerPropertiesManager(
DCHECK(pref_delegate_);
DCHECK(clock_);
- pref_delegate_->StartListeningForUpdates(
- base::Bind(&HttpServerPropertiesManager::OnHttpServerPropertiesChanged,
- base::Unretained(this)));
+ pref_delegate_->StartListeningForUpdates(base::BindRepeating(
+ &HttpServerPropertiesManager::OnHttpServerPropertiesChanged,
+ base::Unretained(this)));
net_log_.BeginEvent(NetLogEventType::HTTP_SERVER_PROPERTIES_INITIALIZATION);
http_server_properties_impl_.reset(new HttpServerPropertiesImpl(clock_));
@@ -117,7 +127,7 @@ HttpServerPropertiesManager::HttpServerPropertiesManager(
HttpServerPropertiesManager::~HttpServerPropertiesManager() {
DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
// Flush settings on destruction.
- UpdatePrefsFromCache();
+ UpdatePrefsFromCache(base::OnceClosure());
}
// static
@@ -131,11 +141,11 @@ void HttpServerPropertiesManager::SetVersion(
http_server_properties_dict->SetInteger(kVersionKey, version_number);
}
-void HttpServerPropertiesManager::Clear() {
+void HttpServerPropertiesManager::Clear(base::OnceClosure callback) {
DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
- http_server_properties_impl_->Clear();
- UpdatePrefsFromCache();
+ http_server_properties_impl_->Clear(base::OnceClosure());
+ UpdatePrefsFromCache(std::move(callback));
}
bool HttpServerPropertiesManager::SupportsRequestPriority(
@@ -773,7 +783,6 @@ bool HttpServerPropertiesManager::ParseAlternativeServiceInfoDictOfServer(
alternative_service_info->set_alternative_service(alternative_service);
// Expiration is optional, defaults to one day.
- base::Time expiration;
if (!dict.HasKey(kExpirationKey)) {
alternative_service_info->set_expiration(base::Time::Now() +
base::TimeDelta::FromDays(1));
@@ -928,9 +937,8 @@ bool HttpServerPropertiesManager::AddToQuicServerInfoMap(
it.Advance()) {
// Get quic_server_id.
const std::string& quic_server_id_str = it.key();
- QuicServerId quic_server_id;
- QuicHostnameUtils::StringToQuicServerId(quic_server_id_str,
- &quic_server_id);
+
+ QuicServerId quic_server_id = QuicServerIdFromString(quic_server_id_str);
if (quic_server_id.host().empty()) {
DVLOG(1) << "Malformed http_server_properties for quic server: "
<< quic_server_id_str;
@@ -969,15 +977,17 @@ void HttpServerPropertiesManager::ScheduleUpdatePrefs(Location location) {
return;
network_prefs_update_timer_.Start(
- FROM_HERE, kUpdatePrefsDelay, this,
- &HttpServerPropertiesManager::UpdatePrefsFromCache);
+ FROM_HERE, kUpdatePrefsDelay,
+ base::Bind(&HttpServerPropertiesManager::UpdatePrefsFromCache,
+ base::Unretained(this), base::Passed(base::OnceClosure())));
// TODO(rtenneti): Delete the following histogram after collecting some data.
UMA_HISTOGRAM_ENUMERATION("Net.HttpServerProperties.UpdatePrefs", location,
HttpServerPropertiesManager::NUM_LOCATIONS);
}
-void HttpServerPropertiesManager::UpdatePrefsFromCache() {
+void HttpServerPropertiesManager::UpdatePrefsFromCache(
+ base::OnceClosure callback) {
DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
typedef base::MRUCache<url::SchemeHostPort, ServerPref> ServerPrefMap;
@@ -1105,7 +1115,8 @@ void HttpServerPropertiesManager::UpdatePrefsFromCache() {
&http_server_properties_dict);
setting_prefs_ = true;
- pref_delegate_->SetServerProperties(http_server_properties_dict);
+ pref_delegate_->SetServerProperties(http_server_properties_dict,
+ std::move(callback));
setting_prefs_ = false;
net_log_.AddEvent(NetLogEventType::HTTP_SERVER_PROPERTIES_UPDATE_PREFS,
diff --git a/chromium/net/http/http_server_properties_manager.h b/chromium/net/http/http_server_properties_manager.h
index b77b9057c5d..5f346262100 100644
--- a/chromium/net/http/http_server_properties_manager.h
+++ b/chromium/net/http/http_server_properties_manager.h
@@ -11,6 +11,7 @@
#include <string>
#include <vector>
+#include "base/callback.h"
#include "base/compiler_specific.h"
#include "base/gtest_prod_util.h"
#include "base/macros.h"
@@ -51,13 +52,17 @@ class NET_EXPORT HttpServerPropertiesManager : public HttpServerProperties {
// 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;
+ // Sets the server properties to the given value. If |callback| is
+ // non-empty, flushes data to persistent storage and invokes |callback|
+ // asynchronously when complete.
+ virtual void SetServerProperties(const base::DictionaryValue& value,
+ base::OnceClosure callback) = 0;
// 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 StartListeningForUpdates(
+ const base::RepeatingClosure& callback) = 0;
};
// Create an instance of the HttpServerPropertiesManager.
@@ -83,7 +88,7 @@ class NET_EXPORT HttpServerPropertiesManager : public HttpServerProperties {
// HttpServerProperties methods:
// ----------------------------------
- void Clear() override;
+ void Clear(base::OnceClosure callback) override;
bool SupportsRequestPriority(const url::SchemeHostPort& server) override;
bool GetSupportsSpdy(const url::SchemeHostPort& server) override;
void SetSupportsSpdy(const url::SchemeHostPort& server,
@@ -182,8 +187,9 @@ class NET_EXPORT HttpServerPropertiesManager : public HttpServerProperties {
void ScheduleUpdatePrefs(Location location);
// Update prefs::kHttpServerProperties in preferences with the cached data
- // from |http_server_properties_impl_|.
- void UpdatePrefsFromCache();
+ // from |http_server_properties_impl_|. Invokes |callback| when changes have
+ // been committed, if non-null.
+ void UpdatePrefsFromCache(base::OnceClosure callback);
private:
FRIEND_TEST_ALL_PREFIXES(HttpServerPropertiesManagerTest,
@@ -253,8 +259,6 @@ class NET_EXPORT HttpServerPropertiesManager : public HttpServerProperties {
recently_broken_alternative_services,
base::DictionaryValue* http_server_properties_dict);
- base::DefaultTickClock default_clock_;
-
// Used to post cache update tasks.
base::OneShotTimer pref_cache_update_timer_;
diff --git a/chromium/net/http/http_server_properties_manager_unittest.cc b/chromium/net/http/http_server_properties_manager_unittest.cc
index e5eea969abc..20e835cf060 100644
--- a/chromium/net/http/http_server_properties_manager_unittest.cc
+++ b/chromium/net/http/http_server_properties_manager_unittest.cc
@@ -46,7 +46,8 @@ class MockPrefDelegate : public net::HttpServerPropertiesManager::PrefDelegate {
const base::DictionaryValue* GetServerProperties() const override {
return &prefs_;
}
- void SetServerProperties(const base::DictionaryValue& value) override {
+ void SetServerProperties(const base::DictionaryValue& value,
+ base::OnceClosure callback) override {
prefs_.Clear();
prefs_.MergeDictionary(&value);
++num_pref_updates_;
@@ -54,6 +55,7 @@ class MockPrefDelegate : public net::HttpServerPropertiesManager::PrefDelegate {
prefs_changed_callback_.Run();
if (!extra_prefs_changed_callback_.is_null())
extra_prefs_changed_callback_.Run();
+ set_properties_callback_ = std::move(callback);
}
void StartListeningForUpdates(const base::Closure& callback) override {
CHECK(prefs_changed_callback_.is_null());
@@ -80,12 +82,20 @@ class MockPrefDelegate : public net::HttpServerPropertiesManager::PrefDelegate {
extra_prefs_changed_callback_ = callback;
}
+ // Returns the base::OnceCallback, if any, passed to the last call to
+ // SetServerProperties().
+ base::OnceClosure GetSetPropertiesCallback() {
+ return std::move(set_properties_callback_);
+ }
+
private:
base::DictionaryValue prefs_;
base::Closure prefs_changed_callback_;
base::Closure extra_prefs_changed_callback_;
int num_pref_updates_ = 0;
+ base::OnceClosure set_properties_callback_;
+
DISALLOW_COPY_AND_ASSIGN(MockPrefDelegate);
};
@@ -104,10 +114,11 @@ class HttpServerPropertiesManagerTest : public testing::TestWithParam<int> {
advertised_versions_ = HttpNetworkSession::Params().quic_supported_versions;
pref_delegate_ = new MockPrefDelegate;
- net_test_task_runner_clock_ = test_task_runner_->GetMockTickClock();
+ clock_ = test_task_runner_->GetMockTickClock();
+ net_test_task_runner_clock_ = clock_.get();
http_server_props_manager_ = std::make_unique<HttpServerPropertiesManager>(
base::WrapUnique(pref_delegate_), /*net_log=*/nullptr,
- net_test_task_runner_clock_.get());
+ net_test_task_runner_clock_);
EXPECT_FALSE(http_server_props_manager_->IsInitialized());
pref_delegate_->SetPrefs(base::DictionaryValue());
@@ -140,7 +151,11 @@ class HttpServerPropertiesManagerTest : public testing::TestWithParam<int> {
// 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_;
+ // TODO(tzik): Remove |clock_| after updating GetMockTickClock to own the
+ // instance.
+ std::unique_ptr<base::TickClock> clock_;
+
+ base::TickClock* net_test_task_runner_clock_;
private:
DISALLOW_COPY_AND_ASSIGN(HttpServerPropertiesManagerTest);
@@ -802,8 +817,14 @@ TEST_P(HttpServerPropertiesManagerTest, Clear) {
// Clear http server data, which should instantly update prefs.
EXPECT_EQ(0, pref_delegate_->GetAndClearNumPrefUpdates());
- http_server_props_manager_->Clear();
+ bool callback_invoked_ = false;
+ http_server_props_manager_->Clear(
+ base::BindOnce([](bool* callback_invoked) { *callback_invoked = true; },
+ &callback_invoked_));
EXPECT_EQ(1, pref_delegate_->GetAndClearNumPrefUpdates());
+ EXPECT_FALSE(callback_invoked_);
+ std::move(pref_delegate_->GetSetPropertiesCallback()).Run();
+ EXPECT_TRUE(callback_invoked_);
EXPECT_FALSE(http_server_props_manager_->IsAlternativeServiceBroken(
broken_alternative_service));
diff --git a/chromium/net/http/http_stream.h b/chromium/net/http/http_stream.h
index 1763722ab02..35146de3c60 100644
--- a/chromium/net/http/http_stream.h
+++ b/chromium/net/http/http_stream.h
@@ -51,9 +51,12 @@ class NET_EXPORT_PRIVATE HttpStream {
// Initialize stream. Must be called before calling SendRequest().
// The consumer should ensure that request_info points to a valid value till
// final response headers are received; after that point, the HttpStream
- // will not access |*request_info| and it may be deleted.
+ // will not access |*request_info| and it may be deleted. If |can_send_early|
+ // is true, this stream may send data early without confirming the handshake
+ // if this is a resumption of a previously established connection.
// Returns a net error code, possibly ERR_IO_PENDING.
virtual int InitializeStream(const HttpRequestInfo* request_info,
+ bool can_send_early,
RequestPriority priority,
const NetLogWithSource& net_log,
const CompletionCallback& callback) = 0;
diff --git a/chromium/net/http/http_stream_factory_impl.cc b/chromium/net/http/http_stream_factory_impl.cc
index caaaa315110..ffc73e280a6 100644
--- a/chromium/net/http/http_stream_factory_impl.cc
+++ b/chromium/net/http/http_stream_factory_impl.cc
@@ -31,17 +31,10 @@
namespace net {
-HttpStreamFactoryImpl::HttpStreamFactoryImpl(HttpNetworkSession* session,
- bool for_websockets)
- : session_(session),
- job_factory_(new JobFactory()),
- for_websockets_(for_websockets),
- last_logged_job_controller_count_(0) {}
-
-HttpStreamFactoryImpl::~HttpStreamFactoryImpl() {
- UMA_HISTOGRAM_COUNTS_1M("Net.JobControllerSet.CountOfJobControllerAtShutDown",
- job_controller_set_.size());
-}
+HttpStreamFactoryImpl::HttpStreamFactoryImpl(HttpNetworkSession* session)
+ : session_(session), job_factory_(new JobFactory()) {}
+
+HttpStreamFactoryImpl::~HttpStreamFactoryImpl() {}
std::unique_ptr<HttpStreamRequest> HttpStreamFactoryImpl::RequestStream(
const HttpRequestInfo& request_info,
@@ -52,11 +45,10 @@ std::unique_ptr<HttpStreamRequest> HttpStreamFactoryImpl::RequestStream(
bool enable_ip_based_pooling,
bool enable_alternative_services,
const NetLogWithSource& net_log) {
- DCHECK(!for_websockets_);
return RequestStreamInternal(
request_info, priority, server_ssl_config, proxy_ssl_config, delegate,
- nullptr, HttpStreamRequest::HTTP_STREAM, enable_ip_based_pooling,
- enable_alternative_services, net_log);
+ nullptr, HttpStreamRequest::HTTP_STREAM, false /* is_websocket */,
+ enable_ip_based_pooling, enable_alternative_services, net_log);
}
std::unique_ptr<HttpStreamRequest>
@@ -70,12 +62,11 @@ HttpStreamFactoryImpl::RequestWebSocketHandshakeStream(
bool enable_ip_based_pooling,
bool enable_alternative_services,
const NetLogWithSource& net_log) {
- DCHECK(for_websockets_);
DCHECK(create_helper);
return RequestStreamInternal(
request_info, priority, server_ssl_config, proxy_ssl_config, delegate,
- create_helper, HttpStreamRequest::HTTP_STREAM, enable_ip_based_pooling,
- enable_alternative_services, net_log);
+ create_helper, HttpStreamRequest::HTTP_STREAM, true /* is_websocket */,
+ enable_ip_based_pooling, enable_alternative_services, net_log);
}
std::unique_ptr<HttpStreamRequest>
@@ -88,12 +79,12 @@ HttpStreamFactoryImpl::RequestBidirectionalStreamImpl(
bool enable_ip_based_pooling,
bool enable_alternative_services,
const NetLogWithSource& net_log) {
- DCHECK(!for_websockets_);
DCHECK(request_info.url.SchemeIs(url::kHttpsScheme));
return RequestStreamInternal(
request_info, priority, server_ssl_config, proxy_ssl_config, delegate,
- nullptr, HttpStreamRequest::BIDIRECTIONAL_STREAM, enable_ip_based_pooling,
+ nullptr, HttpStreamRequest::BIDIRECTIONAL_STREAM,
+ false /* is_websocket */, enable_ip_based_pooling,
enable_alternative_services, net_log);
}
@@ -106,14 +97,13 @@ std::unique_ptr<HttpStreamRequest> HttpStreamFactoryImpl::RequestStreamInternal(
WebSocketHandshakeStreamBase::CreateHelper*
websocket_handshake_stream_create_helper,
HttpStreamRequest::StreamType stream_type,
+ bool is_websocket,
bool enable_ip_based_pooling,
bool enable_alternative_services,
const NetLogWithSource& net_log) {
- AddJobControllerCountToHistograms();
-
auto job_controller = std::make_unique<JobController>(
this, delegate, session_, job_factory_.get(), request_info,
- /* is_preconnect = */ false, enable_ip_based_pooling,
+ /* is_preconnect = */ false, is_websocket, enable_ip_based_pooling,
enable_alternative_services, server_ssl_config, proxy_ssl_config);
JobController* job_controller_raw_ptr = job_controller.get();
job_controller_set_.insert(std::move(job_controller));
@@ -127,8 +117,6 @@ void HttpStreamFactoryImpl::PreconnectStreams(
const HttpRequestInfo& request_info) {
DCHECK(request_info.url.is_valid());
- AddJobControllerCountToHistograms();
-
SSLConfig server_ssl_config;
SSLConfig proxy_ssl_config;
session_->GetSSLConfig(request_info, &server_ssl_config, &proxy_ssl_config);
@@ -136,11 +124,10 @@ void HttpStreamFactoryImpl::PreconnectStreams(
server_ssl_config.verify_ev_cert = true;
proxy_ssl_config.verify_ev_cert = true;
- DCHECK(!for_websockets_);
-
auto job_controller = std::make_unique<JobController>(
this, nullptr, session_, job_factory_.get(), request_info,
/* is_preconnect = */ true,
+ /* is_websocket = */ false,
/* enable_ip_based_pooling = */ true,
/* enable_alternative_services = */ true, server_ssl_config,
proxy_ssl_config);
@@ -244,45 +231,6 @@ bool HttpStreamFactoryImpl::ProxyServerSupportsPriorities(
scheme_host_port);
}
-void HttpStreamFactoryImpl::AddJobControllerCountToHistograms() {
- // Only log the count of JobControllers when the count is hitting one of the
- // boundaries for the first time which is a multiple of 1000: 1000, 2000,
- // 3000, etc.
- if (job_controller_set_.size() % 1000 != 0 ||
- job_controller_set_.size() <= last_logged_job_controller_count_) {
- return;
- }
- last_logged_job_controller_count_ = job_controller_set_.size();
-
- UMA_HISTOGRAM_COUNTS_1M("Net.JobControllerSet.CountOfJobController",
- job_controller_set_.size());
-
- size_t num_controllers_with_request = 0;
- size_t num_controllers_for_preconnect = 0;
- for (const auto& job_controller : job_controller_set_) {
- // Additionally log the states of the jobs.
- job_controller->LogHistograms();
- // For a preconnect controller, it should have exactly the main job.
- if (job_controller->is_preconnect()) {
- num_controllers_for_preconnect++;
- continue;
- }
- // For non-preconnects.
- if (job_controller->HasPendingRequest())
- num_controllers_with_request++;
- }
- UMA_HISTOGRAM_COUNTS_1M(
- "Net.JobControllerSet.CountOfJobController.Preconnect",
- num_controllers_for_preconnect);
- UMA_HISTOGRAM_COUNTS_1M(
- "Net.JobControllerSet.CountOfJobController.NonPreconnect.PendingRequest",
- num_controllers_with_request);
- UMA_HISTOGRAM_COUNTS_1M(
- "Net.JobControllerSet.CountOfJobController.NonPreconnect.RequestGone",
- job_controller_set_.size() - num_controllers_for_preconnect -
- num_controllers_with_request);
-}
-
void HttpStreamFactoryImpl::DumpMemoryStats(
base::trace_event::ProcessMemoryDump* pmd,
const std::string& parent_absolute_name) const {
diff --git a/chromium/net/http/http_stream_factory_impl.h b/chromium/net/http/http_stream_factory_impl.h
index 058d702a440..30480ed5347 100644
--- a/chromium/net/http/http_stream_factory_impl.h
+++ b/chromium/net/http/http_stream_factory_impl.h
@@ -36,10 +36,7 @@ class NET_EXPORT_PRIVATE HttpStreamFactoryImpl : public HttpStreamFactory {
class NET_EXPORT_PRIVATE JobController;
class NET_EXPORT_PRIVATE JobFactory;
class NET_EXPORT_PRIVATE Request;
- // RequestStream may only be called if |for_websockets| is false.
- // RequestWebSocketHandshakeStream may only be called if |for_websockets|
- // is true.
- HttpStreamFactoryImpl(HttpNetworkSession* session, bool for_websockets);
+ HttpStreamFactoryImpl(HttpNetworkSession* session);
~HttpStreamFactoryImpl() override;
// HttpStreamFactory interface
@@ -126,6 +123,7 @@ class NET_EXPORT_PRIVATE HttpStreamFactoryImpl : public HttpStreamFactory {
HttpStreamRequest::Delegate* delegate,
WebSocketHandshakeStreamBase::CreateHelper* create_helper,
HttpStreamRequest::StreamType stream_type,
+ bool is_websocket,
bool enable_ip_based_pooling,
bool enable_alternative_services,
const NetLogWithSource& net_log);
@@ -157,11 +155,6 @@ class NET_EXPORT_PRIVATE HttpStreamFactoryImpl : public HttpStreamFactory {
// priorities.
bool ProxyServerSupportsPriorities(const ProxyInfo& proxy_info) const;
- // Adds the count of JobControllers that are not completed to UMA histogram if
- // the count is a multiple of 100: 100, 200, 400, etc. Break down
- // JobControllers count based on the type of JobController.
- void AddJobControllerCountToHistograms();
-
HttpNetworkSession* const session_;
// All Requests/Preconnects are assigned with a JobController to manage
@@ -178,11 +171,6 @@ class NET_EXPORT_PRIVATE HttpStreamFactoryImpl : public HttpStreamFactory {
// preconnects should be skipped.
std::set<PreconnectingProxyServer> preconnecting_proxy_servers_;
- const bool for_websockets_;
-
- // The count of JobControllers that was most recently logged to histograms.
- size_t last_logged_job_controller_count_;
-
DISALLOW_COPY_AND_ASSIGN(HttpStreamFactoryImpl);
};
diff --git a/chromium/net/http/http_stream_factory_impl_job.cc b/chromium/net/http/http_stream_factory_impl_job.cc
index 8b1a2a49a23..0a5801a0835 100644
--- a/chromium/net/http/http_stream_factory_impl_job.cc
+++ b/chromium/net/http/http_stream_factory_impl_job.cc
@@ -165,6 +165,7 @@ HttpStreamFactoryImpl::Job::Job(Delegate* delegate,
NextProto alternative_protocol,
QuicTransportVersion quic_version,
const ProxyServer& alternative_proxy_server,
+ bool is_websocket,
bool enable_ip_based_pooling,
NetLog* net_log)
: request_info_(request_info),
@@ -177,11 +178,11 @@ HttpStreamFactoryImpl::Job::Job(Delegate* delegate,
io_callback_(base::Bind(&Job::OnIOComplete, base::Unretained(this))),
connection_(new ClientSocketHandle),
session_(session),
- state_(STATE_NONE),
next_state_(STATE_NONE),
destination_(destination),
origin_url_(origin_url),
alternative_proxy_server_(alternative_proxy_server),
+ is_websocket_(is_websocket),
enable_ip_based_pooling_(enable_ip_based_pooling),
delegate_(delegate),
job_type_(job_type),
@@ -195,11 +196,13 @@ HttpStreamFactoryImpl::Job::Job(Delegate* delegate,
using_spdy_(false),
should_reconsider_proxy_(false),
quic_request_(session_->quic_stream_factory()),
+ expect_on_quic_host_resolution_(false),
using_existing_quic_session_(false),
establishing_tunnel_(false),
was_alpn_negotiated_(false),
negotiated_protocol_(kProtoUnknown),
num_streams_(0),
+ pushed_stream_id_(kNoPushedStreamFound),
spdy_session_direct_(
!(proxy_info.is_https() && origin_url_.SchemeIs(url::kHttpScheme))),
spdy_session_key_(using_quic_
@@ -244,6 +247,9 @@ HttpStreamFactoryImpl::Job::Job(Delegate* delegate,
if (using_quic_) {
DCHECK(session_->IsQuicEnabled());
}
+ if (job_type_ == PRECONNECT || is_websocket_) {
+ DCHECK(request_info_.socket_tag == SocketTag());
+ }
}
HttpStreamFactoryImpl::Job::~Job() {
@@ -367,20 +373,6 @@ const ProxyInfo& HttpStreamFactoryImpl::Job::proxy_info() const {
return proxy_info_;
}
-void HttpStreamFactoryImpl::Job::LogHistograms() const {
- if (job_type_ == MAIN) {
- UMA_HISTOGRAM_ENUMERATION("Net.HttpStreamFactoryJob.Main.NextState",
- next_state_, STATE_MAX);
- UMA_HISTOGRAM_ENUMERATION("Net.HttpStreamFactoryJob.Main.State", state_,
- STATE_MAX);
- } else if (job_type_ == ALTERNATIVE) {
- UMA_HISTOGRAM_ENUMERATION("Net.HttpStreamFactoryJob.Alt.NextState",
- next_state_, STATE_MAX);
- UMA_HISTOGRAM_ENUMERATION("Net.HttpStreamFactoryJob.Alt.State", state_,
- STATE_MAX);
- }
-}
-
void HttpStreamFactoryImpl::Job::GetSSLInfo(SSLInfo* ssl_info) {
DCHECK(using_ssl_);
DCHECK(!establishing_tunnel_);
@@ -433,12 +425,12 @@ bool HttpStreamFactoryImpl::Job::CanUseExistingSpdySession() const {
}
// 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/.
+ // https://somehost/ then we do not use that session for http://somehost:443/.
// The only time we can use an existing session is if the request URL is
- // https (the normal case) or if we're connection to a SPDY proxy.
+ // https (the normal case) or if we are connecting to a SPDY proxy.
// https://crbug.com/133176
- // TODO(ricea): Add "wss" back to this list when SPDY WebSocket support is
- // working.
+ // TODO(bnc): Add kWssScheme back to this list when WebSockets over HTTP/2 is
+ // implemented. https://crbug.com/801564.
return origin_url_.SchemeIs(url::kHttpsScheme) ||
proxy_info_.proxy_server().is_https();
}
@@ -446,7 +438,7 @@ bool HttpStreamFactoryImpl::Job::CanUseExistingSpdySession() const {
void HttpStreamFactoryImpl::Job::OnStreamReadyCallback() {
DCHECK(stream_.get());
DCHECK_NE(job_type_, PRECONNECT);
- DCHECK(!delegate_->for_websockets());
+ DCHECK(!is_websocket_);
MaybeCopyConnectionAttemptsFromSocketOrHandle();
@@ -457,7 +449,7 @@ void HttpStreamFactoryImpl::Job::OnStreamReadyCallback() {
void HttpStreamFactoryImpl::Job::OnWebSocketHandshakeStreamReadyCallback() {
DCHECK(websocket_stream_);
DCHECK_NE(job_type_, PRECONNECT);
- DCHECK(delegate_->for_websockets());
+ DCHECK(is_websocket_);
MaybeCopyConnectionAttemptsFromSocketOrHandle();
@@ -657,7 +649,7 @@ void HttpStreamFactoryImpl::Job::RunLoop(int result) {
base::ThreadTaskRunnerHandle::Get()->PostTask(
FROM_HERE, base::Bind(&Job::OnNewSpdySessionReadyCallback,
ptr_factory_.GetWeakPtr()));
- } else if (delegate_->for_websockets()) {
+ } else if (is_websocket_) {
DCHECK(websocket_stream_);
base::ThreadTaskRunnerHandle::Get()->PostTask(
FROM_HERE, base::Bind(&Job::OnWebSocketHandshakeStreamReadyCallback,
@@ -694,8 +686,6 @@ int HttpStreamFactoryImpl::Job::DoLoop(int result) {
int rv = result;
do {
State state = next_state_;
- // Added to investigate crbug.com/711721.
- state_ = state;
next_state_ = STATE_NONE;
switch (state) {
case STATE_START:
@@ -841,9 +831,10 @@ void HttpStreamFactoryImpl::Job::ResumeInitConnection() {
int HttpStreamFactoryImpl::Job::DoInitConnection() {
net_log_.BeginEvent(NetLogEventType::HTTP_STREAM_JOB_INIT_CONNECTION);
int result = DoInitConnectionImpl();
- if (result != ERR_SPDY_SESSION_ALREADY_EXISTS)
+ if (result != ERR_SPDY_SESSION_ALREADY_EXISTS &&
+ !expect_on_quic_host_resolution_) {
delegate_->OnConnectionInitialized(this, result);
-
+ }
return result;
}
@@ -913,13 +904,14 @@ int HttpStreamFactoryImpl::Job::DoInitConnectionImpl() {
net_log_, &net_error_details_, io_callback_);
if (rv == OK) {
using_existing_quic_session_ = true;
- } else {
+ } else if (rv == ERR_IO_PENDING) {
// There's no available QUIC session. Inform the delegate how long to
// delay the main job.
- if (rv == ERR_IO_PENDING) {
- delegate_->MaybeSetWaitTimeForMainJob(
- quic_request_.GetTimeDelayForWaitingJob());
- }
+ delegate_->MaybeSetWaitTimeForMainJob(
+ quic_request_.GetTimeDelayForWaitingJob());
+ expect_on_quic_host_resolution_ =
+ quic_request_.WaitForHostResolution(base::BindRepeating(
+ &Job::OnQuicHostResolution, base::Unretained(this)));
}
return rv;
}
@@ -928,9 +920,9 @@ int HttpStreamFactoryImpl::Job::DoInitConnectionImpl() {
// connection this request can pool to. If so, then go straight to using
// that.
if (CanUseExistingSpdySession()) {
- existing_spdy_session_ =
- session_->spdy_session_pool()->push_promise_index()->Find(
- spdy_session_key_, origin_url_);
+ session_->spdy_session_pool()->push_promise_index()->ClaimPushedStream(
+ spdy_session_key_, origin_url_, request_info_, &existing_spdy_session_,
+ &pushed_stream_id_);
if (!existing_spdy_session_) {
existing_spdy_session_ =
session_->spdy_session_pool()->FindAvailableSession(
@@ -961,7 +953,8 @@ int HttpStreamFactoryImpl::Job::DoInitConnectionImpl() {
}
if (job_type_ == PRECONNECT) {
- DCHECK(!delegate_->for_websockets());
+ DCHECK(!is_websocket_);
+ DCHECK(request_info_.socket_tag == SocketTag());
return PreconnectSocketsForHttpRequest(
GetSocketGroup(), destination_, request_info_.extra_headers,
request_info_.load_flags, priority_, session_, proxy_info_,
@@ -977,7 +970,8 @@ int HttpStreamFactoryImpl::Job::DoInitConnectionImpl() {
? base::Bind(&Job::OnHostResolution, session_->spdy_session_pool(),
spdy_session_key_, enable_ip_based_pooling_)
: OnHostResolutionCallback();
- if (delegate_->for_websockets()) {
+ if (is_websocket_) {
+ DCHECK(request_info_.socket_tag == SocketTag());
SSLConfig websocket_server_ssl_config = server_ssl_config_;
websocket_server_ssl_config.alpn_protos.clear();
return InitSocketHandleForWebSocketRequest(
@@ -992,8 +986,14 @@ int HttpStreamFactoryImpl::Job::DoInitConnectionImpl() {
GetSocketGroup(), destination_, request_info_.extra_headers,
request_info_.load_flags, priority_, session_, proxy_info_, expect_spdy_,
quic_version_, server_ssl_config_, proxy_ssl_config_,
- request_info_.privacy_mode, net_log_, connection_.get(),
- resolution_callback, io_callback_);
+ request_info_.privacy_mode, request_info_.socket_tag, net_log_,
+ connection_.get(), resolution_callback, io_callback_);
+}
+
+void HttpStreamFactoryImpl::Job::OnQuicHostResolution(int result) {
+ DCHECK(expect_on_quic_host_resolution_);
+ expect_on_quic_host_resolution_ = false;
+ delegate_->OnConnectionInitialized(this, result);
}
int HttpStreamFactoryImpl::Job::DoInitConnectionComplete(int result) {
@@ -1105,7 +1105,7 @@ int HttpStreamFactoryImpl::Job::DoInitConnectionComplete(int result) {
// Quic session is closed before stream can be created.
return ERR_CONNECTION_CLOSED;
}
- stream_.reset(new QuicHttpStream(std::move(session)));
+ stream_ = std::make_unique<QuicHttpStream>(std::move(session));
}
next_state_ = STATE_NONE;
return OK;
@@ -1146,9 +1146,9 @@ int HttpStreamFactoryImpl::Job::DoWaitingUserAction(int result) {
int HttpStreamFactoryImpl::Job::SetSpdyHttpStreamOrBidirectionalStreamImpl(
base::WeakPtr<SpdySession> session,
bool direct) {
- // TODO(ricea): Restore the code for WebSockets over SPDY once it's
- // implemented.
- if (delegate_->for_websockets())
+ // TODO(bnc): Restore the code for WebSockets over HTTP/2 once it is
+ // implemented. https://crbug.com/801564.
+ if (is_websocket_)
return ERR_NOT_IMPLEMENTED;
if (stream_type_ == HttpStreamRequest::BIDIRECTIONAL_STREAM) {
bidirectional_stream_impl_ = std::make_unique<BidirectionalStreamSpdyImpl>(
@@ -1162,8 +1162,8 @@ int HttpStreamFactoryImpl::Job::SetSpdyHttpStreamOrBidirectionalStreamImpl(
bool use_relative_url =
direct || request_info_.url.SchemeIs(url::kHttpsScheme);
- stream_ = std::make_unique<SpdyHttpStream>(session, use_relative_url,
- net_log_.source());
+ stream_ = std::make_unique<SpdyHttpStream>(
+ session, pushed_stream_id_, use_relative_url, net_log_.source());
return OK;
}
@@ -1186,7 +1186,7 @@ int HttpStreamFactoryImpl::Job::DoCreateStream() {
bool using_proxy = (proxy_info_.is_http() || proxy_info_.is_https()) &&
(request_info_.url.SchemeIs(url::kHttpScheme) ||
request_info_.url.SchemeIs(url::kFtpScheme));
- if (delegate_->for_websockets()) {
+ if (is_websocket_) {
DCHECK_NE(job_type_, PRECONNECT);
DCHECK(delegate_->websocket_handshake_stream_create_helper());
websocket_stream_ =
@@ -1205,9 +1205,9 @@ int HttpStreamFactoryImpl::Job::DoCreateStream() {
// 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_);
+ session_->spdy_session_pool()->push_promise_index()->ClaimPushedStream(
+ spdy_session_key_, origin_url_, request_info_, &existing_spdy_session_,
+ &pushed_stream_id_);
// It is also possible that an HTTP/2 connection has been established since
// last time Job checked above.
if (!existing_spdy_session_) {
@@ -1472,12 +1472,13 @@ HttpStreamFactoryImpl::JobFactory::CreateMainJob(
const SSLConfig& proxy_ssl_config,
HostPortPair destination,
GURL origin_url,
+ bool is_websocket,
bool enable_ip_based_pooling,
NetLog* net_log) {
return std::make_unique<HttpStreamFactoryImpl::Job>(
delegate, job_type, session, request_info, priority, proxy_info,
server_ssl_config, proxy_ssl_config, destination, origin_url,
- kProtoUnknown, QUIC_VERSION_UNSUPPORTED, ProxyServer(),
+ kProtoUnknown, QUIC_VERSION_UNSUPPORTED, ProxyServer(), is_websocket,
enable_ip_based_pooling, net_log);
}
@@ -1495,12 +1496,13 @@ HttpStreamFactoryImpl::JobFactory::CreateAltSvcJob(
GURL origin_url,
NextProto alternative_protocol,
QuicTransportVersion quic_version,
+ bool is_websocket,
bool enable_ip_based_pooling,
NetLog* net_log) {
return std::make_unique<HttpStreamFactoryImpl::Job>(
delegate, job_type, session, request_info, priority, proxy_info,
server_ssl_config, proxy_ssl_config, destination, origin_url,
- alternative_protocol, quic_version, ProxyServer(),
+ alternative_protocol, quic_version, ProxyServer(), is_websocket,
enable_ip_based_pooling, net_log);
}
@@ -1517,13 +1519,14 @@ HttpStreamFactoryImpl::JobFactory::CreateAltProxyJob(
HostPortPair destination,
GURL origin_url,
const ProxyServer& alternative_proxy_server,
+ bool is_websocket,
bool enable_ip_based_pooling,
NetLog* net_log) {
return std::make_unique<HttpStreamFactoryImpl::Job>(
delegate, job_type, session, request_info, priority, proxy_info,
server_ssl_config, proxy_ssl_config, destination, origin_url,
kProtoUnknown, QUIC_VERSION_UNSUPPORTED, alternative_proxy_server,
- enable_ip_based_pooling, net_log);
+ is_websocket, enable_ip_based_pooling, net_log);
}
} // namespace net
diff --git a/chromium/net/http/http_stream_factory_impl_job.h b/chromium/net/http/http_stream_factory_impl_job.h
index 3fdec071b95..aa87699644b 100644
--- a/chromium/net/http/http_stream_factory_impl_job.h
+++ b/chromium/net/http/http_stream_factory_impl_job.h
@@ -152,8 +152,6 @@ class HttpStreamFactoryImpl::Job {
websocket_handshake_stream_create_helper() = 0;
virtual void MaybeSetWaitTimeForMainJob(const base::TimeDelta& delay) = 0;
-
- virtual bool for_websockets() = 0;
};
// Job is owned by |delegate|, hence |delegate| is valid for the lifetime of
@@ -192,6 +190,7 @@ class HttpStreamFactoryImpl::Job {
NextProto alternative_protocol,
QuicTransportVersion quic_version,
const ProxyServer& alternative_proxy_server,
+ bool is_websocket,
bool enable_ip_based_pooling,
NetLog* net_log);
virtual ~Job();
@@ -254,10 +253,6 @@ class HttpStreamFactoryImpl::Job {
bool should_reconsider_proxy() const { return should_reconsider_proxy_; }
- // TODO(xunjieli): Added to investigate crbug.com/711721. Remove when no
- // longer needed.
- void LogHistograms() const;
-
NetErrorDetails* net_error_details() { return &net_error_details_; }
private:
@@ -318,6 +313,11 @@ class HttpStreamFactoryImpl::Job {
int StartInternal();
int DoInitConnectionImpl();
+ // If this is a QUIC alt job, then this function is called when host
+ // resolution completes. It's called with the next result after host
+ // resolution, not the result of host resolution itself.
+ void OnQuicHostResolution(int result);
+
// Each of these methods corresponds to a State value. Those with an input
// argument receive the result from the previous state. If a method returns
// ERR_IO_PENDING, then the result from OnIOComplete will be passed to the
@@ -337,7 +337,7 @@ class HttpStreamFactoryImpl::Job {
void ResumeInitConnection();
// Creates a SpdyHttpStream or a BidirectionalStreamImpl from the given values
// and sets to |stream_| or |bidirectional_stream_impl_| respectively. Does
- // nothing if |stream_factory_| is for WebSockets.
+ // nothing if |stream_factory_| is for WebSocket.
int SetSpdyHttpStreamOrBidirectionalStreamImpl(
base::WeakPtr<SpdySession> session,
bool direct);
@@ -415,9 +415,6 @@ class HttpStreamFactoryImpl::Job {
std::unique_ptr<ClientSocketHandle> connection_;
HttpNetworkSession* const session_;
- // |state_| is only used for LogHistograms().
- State state_;
-
State next_state_;
// The server we are trying to reach, could be that of the origin or of the
@@ -432,6 +429,9 @@ class HttpStreamFactoryImpl::Job {
// request.
const ProxyServer alternative_proxy_server_;
+ // True if request is for Websocket.
+ const bool is_websocket_;
+
// Enable pooling to a SpdySession with matching IP and certificate
// even if the SpdySessionKey is different.
const bool enable_ip_based_pooling_;
@@ -464,6 +464,10 @@ class HttpStreamFactoryImpl::Job {
QuicStreamRequest quic_request_;
+ // Only valid for a QUIC job. Set when a QUIC connection is started. If true,
+ // then OnQuicHostResolution() is expected to be called in the future.
+ bool expect_on_quic_host_resolution_;
+
// True if this job used an existing QUIC session.
bool using_existing_quic_session_;
@@ -491,6 +495,12 @@ class HttpStreamFactoryImpl::Job {
// Initialized when we have an existing SpdySession.
base::WeakPtr<SpdySession> existing_spdy_session_;
+ // Once Job claims a pushed stream on a SpdySession, |pushed_stream_id_| is
+ // the ID of the claimed stream, and |existing_spdy_session_| points to that
+ // SpdySession. Otherwise |pushed_stream_id_| is set to kNoPushedStreamFound
+ // (but |existing_spdy_session_| can still be non-null).
+ SpdyStreamId pushed_stream_id_;
+
// True if not connecting to an Https proxy for an Http url.
const bool spdy_session_direct_;
@@ -527,6 +537,7 @@ class HttpStreamFactoryImpl::JobFactory {
const SSLConfig& proxy_ssl_config,
HostPortPair destination,
GURL origin_url,
+ bool is_websocket,
bool enable_ip_based_pooling,
NetLog* net_log);
@@ -543,6 +554,7 @@ class HttpStreamFactoryImpl::JobFactory {
GURL origin_url,
NextProto alternative_protocol,
QuicTransportVersion quic_version,
+ bool is_websocket,
bool enable_ip_based_pooling,
NetLog* net_log);
@@ -558,6 +570,7 @@ class HttpStreamFactoryImpl::JobFactory {
HostPortPair destination,
GURL origin_url,
const ProxyServer& alternative_proxy_server,
+ bool is_websocket,
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 e5631fece20..0722a6393d7 100644
--- a/chromium/net/http/http_stream_factory_impl_job_controller.cc
+++ b/chromium/net/http/http_stream_factory_impl_job_controller.cc
@@ -7,6 +7,7 @@
#include <string>
#include <utility>
+#include "base/metrics/histogram_functions.h"
#include "base/metrics/histogram_macros.h"
#include "base/strings/string_number_conversions.h"
#include "base/strings/string_util.h"
@@ -64,6 +65,7 @@ HttpStreamFactoryImpl::JobController::JobController(
JobFactory* job_factory,
const HttpRequestInfo& request_info,
bool is_preconnect,
+ bool is_websocket,
bool enable_ip_based_pooling,
bool enable_alternative_services,
const SSLConfig& server_ssl_config,
@@ -74,6 +76,7 @@ HttpStreamFactoryImpl::JobController::JobController(
request_(nullptr),
delegate_(delegate),
is_preconnect_(is_preconnect),
+ is_websocket_(is_websocket),
enable_ip_based_pooling_(enable_ip_based_pooling),
enable_alternative_services_(enable_alternative_services),
alternative_job_net_error_(OK),
@@ -83,7 +86,7 @@ HttpStreamFactoryImpl::JobController::JobController(
bound_job_(nullptr),
can_start_alternative_proxy_job_(true),
next_state_(STATE_RESOLVE_PROXY),
- pac_request_(nullptr),
+ proxy_resolve_request_(nullptr),
io_callback_(
base::Bind(&JobController::OnIOComplete, base::Unretained(this))),
request_info_(request_info),
@@ -105,17 +108,13 @@ HttpStreamFactoryImpl::JobController::~JobController() {
main_job_.reset();
alternative_job_.reset();
bound_job_ = nullptr;
- if (pac_request_) {
+ if (proxy_resolve_request_) {
DCHECK_EQ(STATE_RESOLVE_PROXY_COMPLETE, next_state_);
- session_->proxy_service()->CancelPacRequest(pac_request_);
+ session_->proxy_service()->CancelRequest(proxy_resolve_request_);
}
net_log_.EndEvent(NetLogEventType::HTTP_STREAM_JOB_CONTROLLER);
}
-bool HttpStreamFactoryImpl::JobController::for_websockets() {
- return factory_->for_websockets_;
-}
-
std::unique_ptr<HttpStreamFactoryImpl::Request>
HttpStreamFactoryImpl::JobController::Start(
HttpStreamRequest::Delegate* delegate,
@@ -160,7 +159,7 @@ void HttpStreamFactoryImpl::JobController::Preconnect(int num_streams) {
LoadState HttpStreamFactoryImpl::JobController::GetLoadState() const {
DCHECK(request_);
if (next_state_ == STATE_RESOLVE_PROXY_COMPLETE)
- return session_->proxy_service()->GetLoadState(pac_request_);
+ return session_->proxy_service()->GetLoadState(proxy_resolve_request_);
if (bound_job_)
return bound_job_->GetLoadState();
if (main_job_)
@@ -210,7 +209,7 @@ void HttpStreamFactoryImpl::JobController::OnStreamReadyOnPooledConnection(
const ProxyInfo& proxy_info,
std::unique_ptr<HttpStream> stream) {
DCHECK(request_->completed());
- DCHECK(!factory_->for_websockets_);
+ DCHECK(!is_websocket_);
DCHECK_EQ(HttpStreamRequest::HTTP_STREAM, request_->stream_type());
main_job_.reset();
@@ -227,7 +226,7 @@ void HttpStreamFactoryImpl::JobController::
const ProxyInfo& used_proxy_info,
std::unique_ptr<BidirectionalStreamImpl> stream) {
DCHECK(request_->completed());
- DCHECK(!factory_->for_websockets_);
+ DCHECK(!is_websocket_);
DCHECK_EQ(HttpStreamRequest::BIDIRECTIONAL_STREAM, request_->stream_type());
main_job_.reset();
@@ -257,7 +256,7 @@ void HttpStreamFactoryImpl::JobController::OnStreamReady(
if (!request_)
return;
- DCHECK(!factory_->for_websockets_);
+ DCHECK(!is_websocket_);
DCHECK_EQ(HttpStreamRequest::HTTP_STREAM, request_->stream_type());
OnJobSucceeded(job);
DCHECK(request_->completed());
@@ -285,7 +284,7 @@ void HttpStreamFactoryImpl::JobController::OnBidirectionalStreamImplReady(
std::unique_ptr<BidirectionalStreamImpl> stream =
job->ReleaseBidirectionalStream();
DCHECK(stream);
- DCHECK(!factory_->for_websockets_);
+ DCHECK(!is_websocket_);
DCHECK_EQ(HttpStreamRequest::BIDIRECTIONAL_STREAM, request_->stream_type());
OnJobSucceeded(job);
@@ -305,7 +304,7 @@ void HttpStreamFactoryImpl::JobController::OnWebSocketHandshakeStreamReady(
if (!request_)
return;
- DCHECK(factory_->for_websockets_);
+ DCHECK(is_websocket_);
DCHECK_EQ(HttpStreamRequest::HTTP_STREAM, request_->stream_type());
DCHECK(stream);
@@ -494,9 +493,9 @@ void HttpStreamFactoryImpl::JobController::OnNewSpdySessionReady(
MarkRequestComplete(was_alpn_negotiated, negotiated_protocol, using_spdy);
- if (for_websockets()) {
- // TODO(ricea): Re-instate this code when WebSockets over SPDY is
- // implemented.
+ if (is_websocket_) {
+ // TODO(bnc): Re-instate this code when WebSockets over HTTP/2 is
+ // implemented. https://crbug.com/801564.
NOTREACHED();
} else if (job->stream_type() == HttpStreamRequest::BIDIRECTIONAL_STREAM) {
std::unique_ptr<BidirectionalStreamImpl> bidirectional_stream_impl =
@@ -680,13 +679,6 @@ bool HttpStreamFactoryImpl::JobController::HasPendingAltJob() const {
return alternative_job_.get() != nullptr;
}
-void HttpStreamFactoryImpl::JobController::LogHistograms() const {
- if (main_job_)
- main_job_->LogHistograms();
- if (alternative_job_)
- alternative_job_->LogHistograms();
-}
-
size_t HttpStreamFactoryImpl::JobController::EstimateMemoryUsage() const {
return base::trace_event::EstimateMemoryUsage(main_job_) +
base::trace_event::EstimateMemoryUsage(alternative_job_);
@@ -745,7 +737,7 @@ int HttpStreamFactoryImpl::JobController::DoLoop(int rv) {
}
int HttpStreamFactoryImpl::JobController::DoResolveProxy() {
- DCHECK(!pac_request_);
+ DCHECK(!proxy_resolve_request_);
DCHECK(session_);
next_state_ = STATE_RESOLVE_PROXY_COMPLETE;
@@ -760,13 +752,13 @@ int HttpStreamFactoryImpl::JobController::DoResolveProxy() {
return session_->proxy_service()->ResolveProxy(
origin_url, request_info_.method, &proxy_info_, io_callback_,
- &pac_request_, session_->context().proxy_delegate, net_log_);
+ &proxy_resolve_request_, session_->context().proxy_delegate, net_log_);
}
int HttpStreamFactoryImpl::JobController::DoResolveProxyComplete(int rv) {
DCHECK_NE(ERR_IO_PENDING, rv);
- pac_request_ = nullptr;
+ proxy_resolve_request_ = nullptr;
net_log_.AddEvent(
NetLogEventType::HTTP_STREAM_JOB_CONTROLLER_PROXY_SERVER_RESOLVED,
base::Bind(
@@ -824,12 +816,12 @@ int HttpStreamFactoryImpl::JobController::DoCreateJobs() {
this, PRECONNECT, session_, request_info_, IDLE, proxy_info_,
server_ssl_config_, proxy_ssl_config_, alternative_destination,
origin_url, alternative_service_info_.protocol(), quic_version,
- enable_ip_based_pooling_, session_->net_log());
+ is_websocket_, enable_ip_based_pooling_, session_->net_log());
} else {
main_job_ = job_factory_->CreateMainJob(
this, PRECONNECT, session_, request_info_, IDLE, proxy_info_,
server_ssl_config_, proxy_ssl_config_, destination, origin_url,
- enable_ip_based_pooling_, session_->net_log());
+ is_websocket_, enable_ip_based_pooling_, session_->net_log());
}
main_job_->Preconnect(num_streams_);
return OK;
@@ -837,7 +829,7 @@ int HttpStreamFactoryImpl::JobController::DoCreateJobs() {
main_job_ = job_factory_->CreateMainJob(
this, MAIN, session_, request_info_, priority_, proxy_info_,
server_ssl_config_, proxy_ssl_config_, destination, origin_url,
- enable_ip_based_pooling_, net_log_.net_log());
+ is_websocket_, enable_ip_based_pooling_, net_log_.net_log());
// Alternative Service can only be set for HTTPS requests while Alternative
// Proxy is set for HTTP requests.
if (alternative_service_info_.protocol() != kProtoUnknown) {
@@ -855,7 +847,7 @@ int HttpStreamFactoryImpl::JobController::DoCreateJobs() {
this, ALTERNATIVE, session_, request_info_, priority_, proxy_info_,
server_ssl_config_, proxy_ssl_config_, alternative_destination,
origin_url, alternative_service_info_.protocol(), quic_version,
- enable_ip_based_pooling_, net_log_.net_log());
+ is_websocket_, enable_ip_based_pooling_, net_log_.net_log());
main_job_is_blocked_ = true;
alternative_job_->Start(request_->stream_type());
@@ -870,7 +862,7 @@ int HttpStreamFactoryImpl::JobController::DoCreateJobs() {
alternative_job_ = job_factory_->CreateAltProxyJob(
this, ALTERNATIVE, session_, request_info_, priority_,
alternative_proxy_info, server_ssl_config_, proxy_ssl_config_,
- destination, origin_url, alternative_proxy_server,
+ destination, origin_url, alternative_proxy_server, is_websocket_,
enable_ip_based_pooling_, net_log_.net_log());
can_start_alternative_proxy_job_ = false;
@@ -921,7 +913,7 @@ void HttpStreamFactoryImpl::JobController::OrphanUnboundJob() {
RemoveRequestFromSpdySessionRequestMap();
if (bound_job_->job_type() == MAIN && alternative_job_) {
- DCHECK(!for_websockets());
+ DCHECK(!is_websocket_);
// Allow |alternative_job_| to run to completion, rather than resetting it
// to check if there is any broken alternative service to report.
// OnOrphanedJobComplete() will clean up |this| when the job completes.
@@ -998,7 +990,7 @@ void HttpStreamFactoryImpl::JobController::ReportBrokenAlternativeService() {
int error_to_report = alternative_job_net_error_;
alternative_job_net_error_ = OK;
- UMA_HISTOGRAM_SPARSE_SLOWLY("Net.AlternateServiceFailed", -error_to_report);
+ base::UmaHistogramSparse("Net.AlternateServiceFailed", -error_to_report);
if (error_to_report == ERR_NETWORK_CHANGED ||
error_to_report == ERR_INTERNET_DISCONNECTED) {
@@ -1228,12 +1220,7 @@ bool HttpStreamFactoryImpl::JobController::
return false;
}
- ProxyDelegate* proxy_delegate = session_->context().proxy_delegate;
- if (!proxy_delegate)
- return false;
- proxy_delegate->GetAlternativeProxy(url, proxy_info.proxy_server(),
- alternative_proxy_server);
-
+ *alternative_proxy_server = proxy_info.alternative_proxy();
if (!alternative_proxy_server->is_valid())
return false;
@@ -1286,7 +1273,7 @@ int HttpStreamFactoryImpl::JobController::ReconsiderProxyAfterError(Job* job,
int error) {
// ReconsiderProxyAfterError() should only be called when the last job fails.
DCHECK(!(alternative_job_ && main_job_));
- DCHECK(!pac_request_);
+ DCHECK(!proxy_resolve_request_);
DCHECK(session_);
if (!job->should_reconsider_proxy())
@@ -1311,7 +1298,7 @@ int HttpStreamFactoryImpl::JobController::ReconsiderProxyAfterError(Job* job,
int rv = session_->proxy_service()->ReconsiderProxyAfterError(
origin_url, request_info_.method, error, &proxy_info_, io_callback_,
- &pac_request_, session_->context().proxy_delegate, net_log_);
+ &proxy_resolve_request_, session_->context().proxy_delegate, net_log_);
if (rv == OK || rv == ERR_IO_PENDING) {
if (!job->using_quic())
RemoveRequestFromSpdySessionRequestMap();
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 ddd4dc07c9c..48d5cc65e76 100644
--- a/chromium/net/http/http_stream_factory_impl_job_controller.h
+++ b/chromium/net/http/http_stream_factory_impl_job_controller.h
@@ -35,6 +35,7 @@ class HttpStreamFactoryImpl::JobController
JobFactory* job_factory,
const HttpRequestInfo& request_info,
bool is_preconnect,
+ bool is_websocket,
bool enable_ip_based_pooling,
bool enable_alternative_services,
const SSLConfig& server_ssl_config,
@@ -42,8 +43,6 @@ class HttpStreamFactoryImpl::JobController
~JobController() override;
- bool for_websockets() override;
-
// Used in tests only for verification purpose.
const Job* main_job() const { return main_job_.get(); }
const Job* alternative_job() const { return alternative_job_.get(); }
@@ -192,10 +191,6 @@ class HttpStreamFactoryImpl::JobController
// Returns true if |this| has a pending alternative job that is not completed.
bool HasPendingAltJob() const;
- // TODO(xunjieli): Added to investigate crbug.com/711721. Remove when no
- // longer needed.
- void LogHistograms() const;
-
// Returns the estimated memory usage in bytes.
size_t EstimateMemoryUsage() const;
@@ -331,6 +326,9 @@ class HttpStreamFactoryImpl::JobController
// True if this JobController is used to preconnect streams.
const bool is_preconnect_;
+ // True if request is for Websocket.
+ const bool is_websocket_;
+
// Enable pooling to a SpdySession with matching IP and certificate even if
// the SpdySessionKey is different.
const bool enable_ip_based_pooling_;
@@ -373,7 +371,7 @@ class HttpStreamFactoryImpl::JobController
bool can_start_alternative_proxy_job_;
State next_state_;
- ProxyService::PacRequest* pac_request_;
+ ProxyService::Request* proxy_resolve_request_;
CompletionCallback io_callback_;
const HttpRequestInfo request_info_;
ProxyInfo proxy_info_;
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 df7a00d97b1..48bfe8c0b56 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
@@ -15,6 +15,7 @@
#include "base/test/scoped_feature_list.h"
#include "base/test/scoped_mock_time_message_loop_task_runner.h"
#include "base/test/scoped_task_environment.h"
+#include "base/test/test_mock_time_task_runner.h"
#include "base/threading/platform_thread.h"
#include "net/base/test_proxy_delegate.h"
#include "net/dns/mock_host_resolver.h"
@@ -244,8 +245,9 @@ class HttpStreamFactoryImplJobControllerTest : public ::testing::Test {
if (create_job_controller_) {
job_controller_ = new HttpStreamFactoryImpl::JobController(
factory_, &request_delegate_, session_.get(), &job_factory_,
- request_info, is_preconnect_, enable_ip_based_pooling_,
- enable_alternative_services_, SSLConfig(), SSLConfig());
+ request_info, is_preconnect_, false /* is_websocket */,
+ enable_ip_based_pooling_, enable_alternative_services_, SSLConfig(),
+ SSLConfig());
HttpStreamFactoryImplPeer::AddJobController(factory_, job_controller_);
}
}
@@ -303,8 +305,12 @@ class HttpStreamFactoryImplJobControllerTest : public ::testing::Test {
MockClock clock_;
MockRandom random_generator_{0};
QuicTestPacketMaker client_maker_{
- HttpNetworkSession::Params().quic_supported_versions[0], 0, &clock_,
- kServerHostname, Perspective::IS_CLIENT};
+ HttpNetworkSession::Params().quic_supported_versions[0],
+ 0,
+ &clock_,
+ kServerHostname,
+ Perspective::IS_CLIENT,
+ false};
protected:
BoundTestNetLog net_log_;
@@ -433,8 +439,9 @@ class JobControllerReconsiderProxyAfterErrorTest
HttpStreamFactoryImpl::JobController* job_controller =
new HttpStreamFactoryImpl::JobController(
factory_, &request_delegate_, session_.get(), &default_job_factory_,
- request_info, is_preconnect_, enable_ip_based_pooling_,
- enable_alternative_services_, SSLConfig(), SSLConfig());
+ request_info, is_preconnect_, false /* is_websocket */,
+ enable_ip_based_pooling_, enable_alternative_services_, SSLConfig(),
+ SSLConfig());
HttpStreamFactoryImplPeer::AddJobController(factory_, job_controller);
return job_controller->Start(&request_delegate_, nullptr, net_log_.bound(),
HttpStreamRequest::HTTP_STREAM,
@@ -546,18 +553,6 @@ TEST_P(JobControllerReconsiderProxyAfterErrorTest, ReconsiderProxyAfterError) {
// as invalid so that it is not used for subsequent requests.
EXPECT_FALSE(
test_proxy_delegate_raw->alternative_proxy_server().is_valid());
-
- if (set_alternative_proxy_server) {
- // GetAlternativeProxy should be called only once for the first
- // request.
- EXPECT_EQ(1,
- test_proxy_delegate_raw->get_alternative_proxy_invocations());
- } else {
- // Alternative proxy server job is never started. So, ProxyDelegate is
- // queried once per request.
- EXPECT_EQ(2,
- test_proxy_delegate_raw->get_alternative_proxy_invocations());
- }
}
EXPECT_TRUE(HttpStreamFactoryImplPeer::IsJobControllerDeleted(factory_));
}
@@ -1375,12 +1370,18 @@ TEST_F(HttpStreamFactoryImplJobControllerTest, InvalidPortForQuic) {
base::RunLoop().RunUntilIdle();
}
-TEST_F(HttpStreamFactoryImplJobControllerTest, DelayedTCP) {
- base::ScopedMockTimeMessageLoopTaskRunner test_task_runner;
- auto failing_resolver = std::make_unique<MockHostResolver>();
- failing_resolver->set_ondemand_mode(true);
- failing_resolver->rules()->AddSimulatedFailure("*google.com");
- session_deps_.host_resolver = std::move(failing_resolver);
+// Verifies that the main job is not resumed until after the alt job completes
+// host resolution.
+TEST_F(HttpStreamFactoryImplJobControllerTest, HostResolutionHang) {
+ scoped_refptr<base::TestMockTimeTaskRunner> test_task_runner(
+ new base::TestMockTimeTaskRunner());
+ base::TestMockTimeTaskRunner::ScopedContext test_task_runner_context(
+ test_task_runner.get());
+
+ auto hanging_resolver = std::make_unique<MockHostResolver>();
+ hanging_resolver->set_ondemand_mode(true);
+ hanging_resolver->set_synchronous_mode(false);
+ session_deps_.host_resolver = std::move(hanging_resolver);
HttpRequestInfo request_info;
request_info.method = "GET";
@@ -1388,6 +1389,13 @@ TEST_F(HttpStreamFactoryImplJobControllerTest, DelayedTCP) {
Initialize(request_info);
+ // handshake will fail asynchronously after mock data is unpaused.
+ MockQuicData quic_data;
+ quic_data.AddRead(ASYNC, ERR_IO_PENDING); // Pause
+ quic_data.AddRead(ASYNC, ERR_FAILED);
+ quic_data.AddWrite(ASYNC, ERR_FAILED);
+ quic_data.AddSocketDataToFactory(session_deps_.socket_factory.get());
+
// 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);
@@ -1400,35 +1408,116 @@ TEST_F(HttpStreamFactoryImplJobControllerTest, DelayedTCP) {
AlternativeService alternative_service(kProtoQUIC, server.host(), 443);
SetAlternativeService(request_info, alternative_service);
+ // This prevents handshake from immediately succeeding.
+ crypto_client_stream_factory_.set_handshake_mode(
+ MockCryptoClientStream::COLD_START);
+
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_TRUE(job_controller_->main_job()->is_waiting());
+ EXPECT_TRUE(JobControllerPeer::main_job_is_blocked(job_controller_));
- // The alternative job stalls as host resolution hangs when creating the QUIC
- // request and controller should resume the main job after delay.
+ // Since the alt job has not finished host resolution, there should be no
+ // delayed task posted to resume the main job.
+ EXPECT_CALL(*job_factory_.main_job(), Resume()).Times(0);
+ test_task_runner->FastForwardBy(base::TimeDelta::FromMicroseconds(50));
+ EXPECT_TRUE(JobControllerPeer::main_job_is_blocked(job_controller_));
+
+ // Allow alt job host resolution to complete.
+ session_deps_.host_resolver->ResolveAllPending();
+
+ // Task to resume main job in 15 microseconds should be posted.
EXPECT_TRUE(test_task_runner->HasPendingTask());
- EXPECT_EQ(1u, test_task_runner->GetPendingTaskCount());
+ EXPECT_CALL(*job_factory_.main_job(), Resume()).Times(0);
+ test_task_runner->FastForwardBy(base::TimeDelta::FromMicroseconds(14));
EXPECT_CALL(*job_factory_.main_job(), Resume()).Times(1);
- test_task_runner->FastForwardBy(base::TimeDelta::FromMicroseconds(15));
- EXPECT_FALSE(test_task_runner->HasPendingTask());
+ test_task_runner->FastForwardBy(base::TimeDelta::FromMicroseconds(1));
EXPECT_TRUE(job_controller_->main_job());
EXPECT_TRUE(job_controller_->alternative_job());
+ EXPECT_FALSE(JobControllerPeer::main_job_is_blocked(job_controller_));
+ EXPECT_TRUE(JobControllerPeer::main_job_is_resumed(job_controller_));
- // |alternative_job| fails but should not report status to Request.
+ // Unpause mock quic data.
+ // Will cause |alternative_job| to fail, but its failure should not be
+ // reported to Request.
EXPECT_CALL(request_delegate_, OnStreamFailed(_, _, _)).Times(0);
-
- EXPECT_FALSE(JobControllerPeer::main_job_is_blocked(job_controller_));
// OnStreamFailed will post a task to resume the main job immediately but
// won't call Resume() on the main job since it's been resumed already.
EXPECT_CALL(*job_factory_.main_job(), Resume()).Times(0);
- // Now unblock Resolver so that alternate job (and QuicStreamFactory::Job) can
- // be cleaned up.
- session_deps_.host_resolver->ResolveAllPending();
- EXPECT_EQ(1u, test_task_runner->GetPendingTaskCount());
+ quic_data.GetSequencedSocketData()->Resume();
+ test_task_runner->FastForwardUntilNoTasksRemain();
+ // Alt job should be cleaned up
+ EXPECT_FALSE(job_controller_->alternative_job());
+}
+
+TEST_F(HttpStreamFactoryImplJobControllerTest, DelayedTCP) {
+ scoped_refptr<base::TestMockTimeTaskRunner> test_task_runner(
+ new base::TestMockTimeTaskRunner());
+ base::TestMockTimeTaskRunner::ScopedContext test_task_runner_context(
+ test_task_runner.get());
+
+ auto immediate_resolver = std::make_unique<MockHostResolver>();
+ immediate_resolver->set_synchronous_mode(true);
+ session_deps_.host_resolver = std::move(immediate_resolver);
+
+ HttpRequestInfo request_info;
+ request_info.method = "GET";
+ request_info.url = GURL("https://www.google.com");
+
+ Initialize(request_info);
+
+ // Handshake will fail asynchronously after mock data is unpaused.
+ MockQuicData quic_data;
+ quic_data.AddRead(ASYNC, ERR_IO_PENDING); // Pause
+ quic_data.AddRead(ASYNC, ERR_FAILED);
+ quic_data.AddWrite(ASYNC, ERR_FAILED);
+ quic_data.AddSocketDataToFactory(session_deps_.socket_factory.get());
+
+ // 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(10);
+ session_->http_server_properties()->SetServerNetworkStats(
+ url::SchemeHostPort(GURL("https://www.google.com")), stats1);
+
+ url::SchemeHostPort server(request_info.url);
+ AlternativeService alternative_service(kProtoQUIC, server.host(), 443);
+ SetAlternativeService(request_info, alternative_service);
+
+ // This prevents handshake from immediately succeeding.
+ crypto_client_stream_factory_.set_handshake_mode(
+ MockCryptoClientStream::COLD_START);
+
+ 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_TRUE(job_controller_->main_job()->is_waiting());
+ // Main job is not blocked but hasn't resumed yet; it should resume in 15us.
+ EXPECT_FALSE(JobControllerPeer::main_job_is_blocked(job_controller_));
+ EXPECT_FALSE(JobControllerPeer::main_job_is_resumed(job_controller_));
+
+ // Task to resume main job in 15us should be posted.
+ EXPECT_TRUE(test_task_runner->HasPendingTask());
+ EXPECT_CALL(*job_factory_.main_job(), Resume()).Times(0);
+ test_task_runner->FastForwardBy(base::TimeDelta::FromMicroseconds(14));
+ EXPECT_CALL(*job_factory_.main_job(), Resume()).Times(1);
+ test_task_runner->FastForwardBy(base::TimeDelta::FromMicroseconds(1));
+
+ EXPECT_TRUE(job_controller_->main_job());
+ EXPECT_TRUE(job_controller_->alternative_job());
+ EXPECT_TRUE(JobControllerPeer::main_job_is_resumed(job_controller_));
+
+ // Unpause mock quic data and run all remaining tasks. Alt-job should fail
+ // and be cleaned up.
+ quic_data.GetSequencedSocketData()->Resume();
test_task_runner->FastForwardUntilNoTasksRemain();
EXPECT_FALSE(job_controller_->alternative_job());
}
@@ -1510,8 +1599,7 @@ TEST_F(HttpStreamFactoryImplJobControllerTest, ResumeMainJobLaterCanceled) {
// Reset task environment back to the default type.
// TODO(xunjieli): Remove this temporary workaround once crbug.com/791831 is
// fixed.
- NetTestSuite::SetScopedTaskEnvironment(
- base::test::ScopedTaskEnvironment::MainThreadType::IO);
+ NetTestSuite::ResetScopedTaskEnvironment();
}
// Test that main job is blocked for kMaxDelayTimeForMainJob(3s) if
@@ -1519,15 +1607,17 @@ TEST_F(HttpStreamFactoryImplJobControllerTest, ResumeMainJobLaterCanceled) {
// which would potentially delay the main job for a extremely long time in
// delayed tcp case.
TEST_F(HttpStreamFactoryImplJobControllerTest, DelayedTCPWithLargeSrtt) {
- // Overrides the main thread's message loop with a mock tick clock so that we
- // could verify the main job is resumed with appropriate delay.
- base::ScopedMockTimeMessageLoopTaskRunner test_task_runner;
+ scoped_refptr<base::TestMockTimeTaskRunner> test_task_runner(
+ new base::TestMockTimeTaskRunner());
+ base::TestMockTimeTaskRunner::ScopedContext test_task_runner_context(
+ test_task_runner.get());
+
// The max delay time should be in sync with .cc file.
base::TimeDelta kMaxDelayTimeForMainJob = base::TimeDelta::FromSeconds(3);
- auto failing_resolver = std::make_unique<MockHostResolver>();
- failing_resolver->set_ondemand_mode(true);
- failing_resolver->rules()->AddSimulatedFailure("*google.com");
- session_deps_.host_resolver = std::move(failing_resolver);
+
+ auto immediate_resolver = std::make_unique<MockHostResolver>();
+ immediate_resolver->set_synchronous_mode(true);
+ session_deps_.host_resolver = std::move(immediate_resolver);
HttpRequestInfo request_info;
request_info.method = "GET";
@@ -1535,7 +1625,14 @@ TEST_F(HttpStreamFactoryImplJobControllerTest, DelayedTCPWithLargeSrtt) {
Initialize(request_info);
- // Enable delayed TCP and set a extremely large time delay for waiting job.
+ // handshake will fail asynchronously after mock data is unpaused.
+ MockQuicData quic_data;
+ quic_data.AddRead(ASYNC, ERR_IO_PENDING); // Pause
+ quic_data.AddRead(ASYNC, ERR_FAILED);
+ quic_data.AddWrite(ASYNC, ERR_FAILED);
+ quic_data.AddSocketDataToFactory(session_deps_.socket_factory.get());
+
+ // 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;
@@ -1543,47 +1640,53 @@ TEST_F(HttpStreamFactoryImplJobControllerTest, DelayedTCPWithLargeSrtt) {
session_->http_server_properties()->SetServerNetworkStats(
url::SchemeHostPort(GURL("https://www.google.com")), stats1);
- // Set a SPDY alternative service for the server.
url::SchemeHostPort server(request_info.url);
AlternativeService alternative_service(kProtoQUIC, server.host(), 443);
SetAlternativeService(request_info, alternative_service);
+ // This prevents handshake from immediately succeeding.
+ crypto_client_stream_factory_.set_handshake_mode(
+ MockCryptoClientStream::COLD_START);
+
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_TRUE(job_controller_->main_job()->is_waiting());
+ // Main job is not blocked but hasn't resumed yet; it should resume in 3s.
+ EXPECT_FALSE(JobControllerPeer::main_job_is_blocked(job_controller_));
+ EXPECT_FALSE(JobControllerPeer::main_job_is_resumed(job_controller_));
- // The alternative job stalls as host resolution hangs when creating the QUIC
- // request and controller should resume the main job after delay.
+ // Task to resume main job in 3 seconds should be posted.
EXPECT_TRUE(test_task_runner->HasPendingTask());
- EXPECT_EQ(1u, test_task_runner->GetPendingTaskCount());
-
+ EXPECT_CALL(*job_factory_.main_job(), Resume()).Times(0);
+ test_task_runner->FastForwardBy(kMaxDelayTimeForMainJob -
+ base::TimeDelta::FromMicroseconds(1));
EXPECT_CALL(*job_factory_.main_job(), Resume()).Times(1);
- // Move forward the task runner with kMaxDelayTimeForMainJob and verify the
- // main job is resumed.
- test_task_runner->FastForwardBy(kMaxDelayTimeForMainJob);
- EXPECT_FALSE(test_task_runner->HasPendingTask());
+ test_task_runner->FastForwardBy(base::TimeDelta::FromMicroseconds(1));
- // Now unblock Resolver so that alternate job (and QuicStreamFactory::Job) can
- // be cleaned up.
- session_deps_.host_resolver->ResolveAllPending();
- EXPECT_EQ(1u, test_task_runner->GetPendingTaskCount());
+ EXPECT_TRUE(job_controller_->main_job());
+ EXPECT_TRUE(job_controller_->alternative_job());
+ EXPECT_TRUE(JobControllerPeer::main_job_is_resumed(job_controller_));
+
+ // Unpause mock quic data and run all remaining tasks. Alt-job should fail
+ // and be cleaned up.
+ quic_data.GetSequencedSocketData()->Resume();
test_task_runner->FastForwardUntilNoTasksRemain();
EXPECT_FALSE(job_controller_->alternative_job());
}
TEST_F(HttpStreamFactoryImplJobControllerTest,
ResumeMainJobImmediatelyOnStreamFailed) {
- // Overrides the main thread's message loop with a mock tick clock so that we
- // could verify the main job is resumed with appropriate delay.
- base::ScopedMockTimeMessageLoopTaskRunner test_task_runner;
+ scoped_refptr<base::TestMockTimeTaskRunner> test_task_runner(
+ new base::TestMockTimeTaskRunner());
+ base::TestMockTimeTaskRunner::ScopedContext test_task_runner_context(
+ test_task_runner.get());
- auto failing_resolver = std::make_unique<MockHostResolver>();
- failing_resolver->set_ondemand_mode(true);
- failing_resolver->rules()->AddSimulatedFailure("*google.com");
- session_deps_.host_resolver = std::move(failing_resolver);
+ auto immediate_resolver = std::make_unique<MockHostResolver>();
+ immediate_resolver->set_synchronous_mode(true);
+ session_deps_.host_resolver = std::move(immediate_resolver);
HttpRequestInfo request_info;
request_info.method = "GET";
@@ -1591,6 +1694,13 @@ TEST_F(HttpStreamFactoryImplJobControllerTest,
Initialize(request_info);
+ // handshake will fail asynchronously after mock data is unpaused.
+ MockQuicData quic_data;
+ quic_data.AddRead(ASYNC, ERR_IO_PENDING); // Pause
+ quic_data.AddRead(ASYNC, ERR_FAILED);
+ quic_data.AddWrite(ASYNC, ERR_FAILED);
+ quic_data.AddSocketDataToFactory(session_deps_.socket_factory.get());
+
// 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);
@@ -1599,44 +1709,48 @@ TEST_F(HttpStreamFactoryImplJobControllerTest,
session_->http_server_properties()->SetServerNetworkStats(
url::SchemeHostPort(GURL("https://www.google.com")), stats1);
- // Set a SPDY alternative service for the server.
url::SchemeHostPort server(request_info.url);
AlternativeService alternative_service(kProtoQUIC, server.host(), 443);
SetAlternativeService(request_info, alternative_service);
- // The alternative job stalls as host resolution hangs when creating the QUIC
- // request and controller should resume the main job with delay.
- // OnStreamFailed should resume the main job immediately.
+ // This prevents handshake from immediately succeeding.
+ crypto_client_stream_factory_.set_handshake_mode(
+ MockCryptoClientStream::COLD_START);
+
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_TRUE(job_controller_->main_job()->is_waiting());
+ // Main job is not blocked but hasn't resumed yet; it's scheduled to resume
+ // in 15us.
+ EXPECT_FALSE(JobControllerPeer::main_job_is_blocked(job_controller_));
+ EXPECT_FALSE(JobControllerPeer::main_job_is_resumed(job_controller_));
+ // Task to resume main job in 15us should be posted.
EXPECT_TRUE(test_task_runner->HasPendingTask());
- EXPECT_EQ(1u, test_task_runner->GetPendingTaskCount());
- // |alternative_job| fails but should not report status to Request.
- EXPECT_CALL(request_delegate_, OnStreamFailed(_, _, _)).Times(0);
- // Now unblock Resolver to fail the alternate job.
- session_deps_.host_resolver->ResolveAllPending();
- EXPECT_EQ(2u, test_task_runner->GetPendingTaskCount());
+ EXPECT_CALL(*job_factory_.main_job(), Resume()).Times(0);
+ test_task_runner->FastForwardBy(base::TimeDelta::FromMicroseconds(1));
- // Verify the main job will be resumed immediately.
+ // Now unpause the mock quic data to fail the alt job. This should immediately
+ // resume the main job.
EXPECT_CALL(*job_factory_.main_job(), Resume()).Times(1);
- // Execute tasks that have no remaining delay. Tasks with nonzero delay will
- // remain queued.
- test_task_runner->RunUntilIdle();
+ quic_data.GetSequencedSocketData()->Resume();
+ test_task_runner->FastForwardBy(base::TimeDelta());
+
+ EXPECT_TRUE(job_controller_->main_job());
+ EXPECT_FALSE(job_controller_->alternative_job());
+ EXPECT_TRUE(JobControllerPeer::main_job_is_resumed(job_controller_));
// Verify there is another task to resume main job with delay but should
// not call Resume() on the main job as main job has been resumed.
EXPECT_TRUE(test_task_runner->HasPendingTask());
- EXPECT_EQ(1u, test_task_runner->GetPendingTaskCount());
EXPECT_CALL(*job_factory_.main_job(), Resume()).Times(0);
test_task_runner->FastForwardBy(base::TimeDelta::FromMicroseconds(15));
- EXPECT_FALSE(test_task_runner->HasPendingTask());
- EXPECT_FALSE(job_controller_->alternative_job());
+
+ test_task_runner->FastForwardUntilNoTasksRemain();
}
// Verifies that the alternative proxy server job is not created if the URL
@@ -1660,7 +1774,6 @@ TEST_F(HttpStreamFactoryImplJobControllerTest, HttpsURL) {
EXPECT_CALL(*job_factory_.main_job(), Resume()).Times(0);
base::RunLoop().RunUntilIdle();
- EXPECT_EQ(0, test_proxy_delegate()->get_alternative_proxy_invocations());
}
// Verifies that the alternative proxy server job is not created if the main job
@@ -1685,31 +1798,37 @@ TEST_F(HttpStreamFactoryImplJobControllerTest, HttpURLWithNoProxy) {
EXPECT_CALL(*job_factory_.main_job(), Resume()).Times(0);
base::RunLoop().RunUntilIdle();
-
- EXPECT_EQ(0, test_proxy_delegate()->get_alternative_proxy_invocations());
}
// Verifies that the main job is resumed properly after a delay when the
// alternative proxy server job hangs.
TEST_F(HttpStreamFactoryImplJobControllerTest, DelayedTCPAlternativeProxy) {
- // Overrides the main thread's message loop with a mock tick clock so that we
- // could verify the main job is resumed with appropriate delay.
- base::ScopedMockTimeMessageLoopTaskRunner test_task_runner;
+ scoped_refptr<base::TestMockTimeTaskRunner> test_task_runner(
+ new base::TestMockTimeTaskRunner());
+ base::TestMockTimeTaskRunner::ScopedContext test_task_runner_context(
+ test_task_runner.get());
- auto failing_resolver = std::make_unique<MockHostResolver>();
- failing_resolver->set_ondemand_mode(true);
- failing_resolver->rules()->AddSimulatedFailure("*myproxy.org");
- session_deps_.host_resolver = std::move(failing_resolver);
+ auto immediate_resolver = std::make_unique<MockHostResolver>();
+ immediate_resolver->set_synchronous_mode(true);
+ session_deps_.host_resolver = std::move(immediate_resolver);
UseAlternativeProxy();
HttpRequestInfo request_info;
request_info.method = "GET";
- request_info.url = GURL("http://mail.example.org/");
+ request_info.url = GURL("http://www.mail.example.org/");
+
Initialize(request_info);
EXPECT_TRUE(test_proxy_delegate()->alternative_proxy_server().is_quic());
+ // Handshake will fail asynchronously after mock data is unpaused.
+ MockQuicData quic_data;
+ quic_data.AddRead(ASYNC, ERR_IO_PENDING); // Pause
+ quic_data.AddRead(ASYNC, ERR_FAILED);
+ quic_data.AddWrite(ASYNC, ERR_FAILED);
+ quic_data.AddSocketDataToFactory(session_deps_.socket_factory.get());
+
// 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);
@@ -1718,32 +1837,39 @@ TEST_F(HttpStreamFactoryImplJobControllerTest, DelayedTCPAlternativeProxy) {
session_->http_server_properties()->SetServerNetworkStats(
url::SchemeHostPort(GURL("https://myproxy.org")), stats1);
+ url::SchemeHostPort server(request_info.url);
+ AlternativeService alternative_service(kProtoQUIC, server.host(), 443);
+ SetAlternativeService(request_info, alternative_service);
+
+ // This prevents handshake from immediately succeeding.
+ crypto_client_stream_factory_.set_handshake_mode(
+ MockCryptoClientStream::COLD_START);
+
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_->main_job()->is_waiting());
EXPECT_TRUE(job_controller_->alternative_job());
- // The main job is unblocked but is resumed one message loop iteration later.
+ EXPECT_TRUE(job_controller_->main_job()->is_waiting());
+ // Main job is not blocked but hasn't resumed yet; it should resume in 15us.
EXPECT_FALSE(JobControllerPeer::main_job_is_blocked(job_controller_));
EXPECT_FALSE(JobControllerPeer::main_job_is_resumed(job_controller_));
- EXPECT_EQ(1u, test_task_runner->GetPendingTaskCount());
- // Move forward the delay and verify the main job is resumed.
+ // Task to resume main job in 15us should be posted.
+ EXPECT_TRUE(test_task_runner->HasPendingTask());
+ EXPECT_CALL(*job_factory_.main_job(), Resume()).Times(0);
+ test_task_runner->FastForwardBy(base::TimeDelta::FromMicroseconds(14));
EXPECT_CALL(*job_factory_.main_job(), Resume()).Times(1);
- test_task_runner->FastForwardBy(base::TimeDelta::FromMicroseconds(15));
- EXPECT_FALSE(JobControllerPeer::main_job_is_blocked(job_controller_));
- EXPECT_TRUE(JobControllerPeer::main_job_is_resumed(job_controller_));
+ test_task_runner->FastForwardBy(base::TimeDelta::FromMicroseconds(1));
- test_task_runner->RunUntilIdle();
- EXPECT_TRUE(test_proxy_delegate()->alternative_proxy_server().is_valid());
- EXPECT_EQ(1, test_proxy_delegate()->get_alternative_proxy_invocations());
- EXPECT_FALSE(test_task_runner->HasPendingTask());
+ EXPECT_TRUE(job_controller_->main_job());
+ EXPECT_TRUE(job_controller_->alternative_job());
+ EXPECT_TRUE(JobControllerPeer::main_job_is_resumed(job_controller_));
- // Now unblock Resolver so that alternate job (and QuicStreamFactory::Job) can
- // be cleaned up.
- session_deps_.host_resolver->ResolveAllPending();
- EXPECT_EQ(1u, test_task_runner->GetPendingTaskCount());
+ // Unpause mock quic data and run all remaining tasks. Alt-job should fail
+ // and be cleaned up.
+ quic_data.GetSequencedSocketData()->Resume();
test_task_runner->FastForwardUntilNoTasksRemain();
EXPECT_FALSE(job_controller_->alternative_job());
}
@@ -1789,7 +1915,6 @@ TEST_F(HttpStreamFactoryImplJobControllerTest, FailAlternativeProxy) {
// The alternative proxy server should be marked as bad.
EXPECT_FALSE(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_));
}
@@ -1836,7 +1961,6 @@ TEST_F(HttpStreamFactoryImplJobControllerTest,
// 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_));
}
@@ -1987,8 +2111,9 @@ TEST_F(JobControllerLimitMultipleH2Requests, MultipleRequests) {
HttpStreamFactoryImpl::JobController* job_controller =
new HttpStreamFactoryImpl::JobController(
factory_, request_delegates[i].get(), session_.get(), &job_factory_,
- request_info, is_preconnect_, enable_ip_based_pooling_,
- enable_alternative_services_, SSLConfig(), SSLConfig());
+ request_info, is_preconnect_, false /* is_websocket */,
+ enable_ip_based_pooling_, enable_alternative_services_, SSLConfig(),
+ SSLConfig());
HttpStreamFactoryImplPeer::AddJobController(factory_, job_controller);
auto request = job_controller->Start(
request_delegates[i].get(), nullptr, net_log_.bound(),
@@ -2060,8 +2185,9 @@ TEST_F(JobControllerLimitMultipleH2Requests, MultipleRequestsFirstRequestHang) {
HttpStreamFactoryImpl::JobController* job_controller =
new HttpStreamFactoryImpl::JobController(
factory_, request_delegates[i].get(), session_.get(), &job_factory_,
- request_info, is_preconnect_, enable_ip_based_pooling_,
- enable_alternative_services_, SSLConfig(), SSLConfig());
+ request_info, is_preconnect_, false /* is_websocket */,
+ enable_ip_based_pooling_, enable_alternative_services_, SSLConfig(),
+ SSLConfig());
HttpStreamFactoryImplPeer::AddJobController(factory_, job_controller);
auto request = job_controller->Start(
request_delegates[i].get(), nullptr, net_log_.bound(),
@@ -2132,8 +2258,9 @@ TEST_F(JobControllerLimitMultipleH2Requests,
HttpStreamFactoryImpl::JobController* job_controller =
new HttpStreamFactoryImpl::JobController(
factory_, request_delegates[i].get(), session_.get(), &job_factory_,
- request_info, is_preconnect_, enable_ip_based_pooling_,
- enable_alternative_services_, SSLConfig(), SSLConfig());
+ request_info, is_preconnect_, false /* is_websocket */,
+ enable_ip_based_pooling_, enable_alternative_services_, SSLConfig(),
+ SSLConfig());
HttpStreamFactoryImplPeer::AddJobController(factory_, job_controller);
auto request = job_controller->Start(
request_delegates[i].get(), nullptr, net_log_.bound(),
@@ -2185,8 +2312,9 @@ TEST_F(JobControllerLimitMultipleH2Requests, MultiplePreconnects) {
HttpStreamFactoryImpl::JobController* job_controller =
new HttpStreamFactoryImpl::JobController(
factory_, request_delegates[i].get(), session_.get(), &job_factory_,
- request_info, is_preconnect_, enable_ip_based_pooling_,
- enable_alternative_services_, SSLConfig(), SSLConfig());
+ request_info, is_preconnect_, false /* is_websocket */,
+ enable_ip_based_pooling_, enable_alternative_services_, SSLConfig(),
+ SSLConfig());
HttpStreamFactoryImplPeer::AddJobController(factory_, job_controller);
job_controller->Preconnect(1);
EXPECT_TRUE(job_controller->main_job());
@@ -2231,8 +2359,9 @@ TEST_F(JobControllerLimitMultipleH2Requests, H1NegotiatedForFirstRequest) {
HttpStreamFactoryImpl::JobController* job_controller =
new HttpStreamFactoryImpl::JobController(
factory_, request_delegates[i].get(), session_.get(), &job_factory_,
- request_info, is_preconnect_, enable_ip_based_pooling_,
- enable_alternative_services_, SSLConfig(), SSLConfig());
+ request_info, is_preconnect_, false /* is_websocket */,
+ enable_ip_based_pooling_, enable_alternative_services_, SSLConfig(),
+ SSLConfig());
HttpStreamFactoryImplPeer::AddJobController(factory_, job_controller);
auto request = job_controller->Start(
request_delegates[i].get(), nullptr, net_log_.bound(),
@@ -2291,8 +2420,9 @@ TEST_F(JobControllerLimitMultipleH2Requests, QuicJobNotThrottled) {
HttpStreamFactoryImpl::JobController* job_controller =
new HttpStreamFactoryImpl::JobController(
factory_, &request_delegate_, session_.get(), &default_job_factory,
- request_info, is_preconnect_, enable_ip_based_pooling_,
- enable_alternative_services_, SSLConfig(), SSLConfig());
+ request_info, is_preconnect_, false /* is_websocket */,
+ enable_ip_based_pooling_, enable_alternative_services_, SSLConfig(),
+ SSLConfig());
HttpStreamFactoryImplPeer::AddJobController(factory_, job_controller);
request_ =
job_controller->Start(&request_delegate_, nullptr, net_log_.bound(),
@@ -2385,6 +2515,7 @@ class HttpStreamFactoryImplJobControllerPreconnectTest
job_controller_ = new HttpStreamFactoryImpl::JobController(
factory_, &request_delegate_, session_.get(), &job_factory_,
request_info_, /* is_preconnect = */ true,
+ /* is_websocket = */ false,
/* enable_ip_based_pooling = */ true,
/* enable_alternative_services = */ true, SSLConfig(), SSLConfig());
HttpStreamFactoryImplPeer::AddJobController(factory_, job_controller_);
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 612b136d851..7e965679077 100644
--- a/chromium/net/http/http_stream_factory_impl_request_unittest.cc
+++ b/chromium/net/http/http_stream_factory_impl_request_unittest.cc
@@ -42,6 +42,7 @@ TEST_F(HttpStreamFactoryImplRequestTest, SetPriority) {
auto job_controller = std::make_unique<HttpStreamFactoryImpl::JobController>(
factory, &request_delegate, session.get(), &job_factory, request_info,
/* is_preconnect = */ false,
+ /* is_websocket = */ false,
/* enable_ip_based_pooling = */ true,
/* enable_alternative_services = */ true, SSLConfig(), SSLConfig());
HttpStreamFactoryImpl::JobController* job_controller_raw_ptr =
diff --git a/chromium/net/http/http_stream_factory_impl_unittest.cc b/chromium/net/http/http_stream_factory_impl_unittest.cc
index b6a1a482d5e..b7ff5492b8c 100644
--- a/chromium/net/http/http_stream_factory_impl_unittest.cc
+++ b/chromium/net/http/http_stream_factory_impl_unittest.cc
@@ -50,6 +50,7 @@
#include "net/socket/client_socket_handle.h"
#include "net/socket/mock_client_socket_pool_manager.h"
#include "net/socket/next_proto.h"
+#include "net/socket/socket_tag.h"
#include "net/socket/socket_test_util.h"
#include "net/spdy/chromium/spdy_session.h"
#include "net/spdy/chromium/spdy_session_pool.h"
@@ -99,6 +100,7 @@ class MockWebSocketHandshakeStream : public WebSocketHandshakeStreamBase {
// HttpStream methods
int InitializeStream(const HttpRequestInfo* request_info,
+ bool can_send_early,
RequestPriority priority,
const NetLogWithSource& net_log,
const CompletionCallback& callback) override {
@@ -157,7 +159,7 @@ class MockWebSocketHandshakeStream : public WebSocketHandshakeStreamBase {
class MockHttpStreamFactoryImplForPreconnect : public HttpStreamFactoryImpl {
public:
explicit MockHttpStreamFactoryImplForPreconnect(HttpNetworkSession* session)
- : HttpStreamFactoryImpl(session, false),
+ : HttpStreamFactoryImpl(session),
preconnect_done_(false),
waiting_for_preconnect_(false) {}
@@ -388,6 +390,7 @@ class CapturePreconnectsSocketPool : public ParentPool {
int RequestSocket(const std::string& group_name,
const void* socket_params,
RequestPriority priority,
+ const SocketTag& socket_tag,
ClientSocketPool::RespectLimits respect_limits,
ClientSocketHandle* handle,
const CompletionCallback& callback,
@@ -1021,16 +1024,6 @@ TEST_F(HttpStreamFactoryTest, WithQUICAlternativeProxyMarkedAsBad) {
// If alternative proxy server was specified, it should have been marked
// as invalid so that it is not used for subsequent requests.
EXPECT_FALSE(test_proxy_delegate.alternative_proxy_server().is_valid());
-
- if (set_alternative_proxy_server) {
- // GetAlternativeProxy should be called only once for the first
- // request.
- EXPECT_EQ(1, test_proxy_delegate.get_alternative_proxy_invocations());
- } else {
- // Alternative proxy server job is never started. So, ProxyDelegate is
- // queried once per request.
- EXPECT_EQ(2, test_proxy_delegate.get_alternative_proxy_invocations());
- }
}
}
}
@@ -1126,10 +1119,6 @@ TEST_F(HttpStreamFactoryTest, WithQUICAlternativeProxyNotMarkedAsBad) {
// Alternative proxy server should be marked as invalid so that it is
// not used for subsequent requests.
EXPECT_FALSE(test_proxy_delegate.alternative_proxy_server().is_quic());
-
- // GetAlternativeProxy should be called only once per request.
- EXPECT_EQ(static_cast<int>(i + 1),
- test_proxy_delegate.get_alternative_proxy_invocations());
}
}
}
@@ -1818,12 +1807,11 @@ TEST_F(HttpStreamFactoryTest, RequestWebSocketBasicHandshakeStream) {
StreamRequestWaiter waiter;
WebSocketStreamCreateHelper create_helper;
std::unique_ptr<HttpStreamRequest> request(
- session->http_stream_factory_for_websocket()
- ->RequestWebSocketHandshakeStream(
- request_info, DEFAULT_PRIORITY, ssl_config, ssl_config, &waiter,
- &create_helper,
- /* enable_ip_based_pooling = */ true,
- /* enable_alternative_services = */ true, NetLogWithSource()));
+ session->http_stream_factory()->RequestWebSocketHandshakeStream(
+ request_info, DEFAULT_PRIORITY, ssl_config, ssl_config, &waiter,
+ &create_helper,
+ /* enable_ip_based_pooling = */ true,
+ /* enable_alternative_services = */ true, NetLogWithSource()));
waiter.WaitForStream();
EXPECT_TRUE(waiter.stream_done());
EXPECT_TRUE(nullptr == waiter.stream());
@@ -1863,12 +1851,11 @@ TEST_F(HttpStreamFactoryTest, RequestWebSocketBasicHandshakeStreamOverSSL) {
StreamRequestWaiter waiter;
WebSocketStreamCreateHelper create_helper;
std::unique_ptr<HttpStreamRequest> request(
- session->http_stream_factory_for_websocket()
- ->RequestWebSocketHandshakeStream(
- request_info, DEFAULT_PRIORITY, ssl_config, ssl_config, &waiter,
- &create_helper,
- /* enable_ip_based_pooling = */ true,
- /* enable_alternative_services = */ true, NetLogWithSource()));
+ session->http_stream_factory()->RequestWebSocketHandshakeStream(
+ request_info, DEFAULT_PRIORITY, ssl_config, ssl_config, &waiter,
+ &create_helper,
+ /* enable_ip_based_pooling = */ true,
+ /* enable_alternative_services = */ true, NetLogWithSource()));
waiter.WaitForStream();
EXPECT_TRUE(waiter.stream_done());
EXPECT_TRUE(nullptr == waiter.stream());
@@ -1906,12 +1893,11 @@ TEST_F(HttpStreamFactoryTest, RequestWebSocketBasicHandshakeStreamOverProxy) {
StreamRequestWaiter waiter;
WebSocketStreamCreateHelper create_helper;
std::unique_ptr<HttpStreamRequest> request(
- session->http_stream_factory_for_websocket()
- ->RequestWebSocketHandshakeStream(
- request_info, DEFAULT_PRIORITY, ssl_config, ssl_config, &waiter,
- &create_helper,
- /* enable_ip_based_pooling = */ true,
- /* enable_alternative_services = */ true, NetLogWithSource()));
+ session->http_stream_factory()->RequestWebSocketHandshakeStream(
+ request_info, DEFAULT_PRIORITY, ssl_config, ssl_config, &waiter,
+ &create_helper,
+ /* enable_ip_based_pooling = */ true,
+ /* enable_alternative_services = */ true, NetLogWithSource()));
waiter.WaitForStream();
EXPECT_TRUE(waiter.stream_done());
EXPECT_TRUE(nullptr == waiter.stream());
@@ -2081,7 +2067,7 @@ TEST_F(HttpStreamFactoryTest, NewSpdySessionCloseIdleH2Sockets) {
ssl_config, PRIVACY_MODE_DISABLED, 0, false));
std::string group_name = "ssl/" + host_port_pair.ToString();
int rv = connection->Init(
- group_name, ssl_params, MEDIUM,
+ group_name, ssl_params, MEDIUM, SocketTag(),
ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
session->GetSSLSocketPool(HttpNetworkSession::NORMAL_SOCKET_POOL),
NetLogWithSource());
@@ -2236,20 +2222,25 @@ TEST_F(HttpStreamFactoryTest, RequestBidirectionalStreamImpl) {
class HttpStreamFactoryBidirectionalQuicTest
: public ::testing::Test,
- public ::testing::WithParamInterface<QuicTransportVersion> {
+ public ::testing::WithParamInterface<
+ std::tuple<QuicTransportVersion, bool>> {
protected:
HttpStreamFactoryBidirectionalQuicTest()
: default_url_(kDefaultUrl),
- client_packet_maker_(GetParam(),
+ version_(std::get<0>(GetParam())),
+ client_headers_include_h2_stream_dependency_(std::get<1>(GetParam())),
+ client_packet_maker_(version_,
0,
&clock_,
"www.example.org",
- Perspective::IS_CLIENT),
- server_packet_maker_(GetParam(),
+ Perspective::IS_CLIENT,
+ client_headers_include_h2_stream_dependency_),
+ server_packet_maker_(version_,
0,
&clock_,
"www.example.org",
- Perspective::IS_SERVER),
+ Perspective::IS_SERVER,
+ false),
random_generator_(0),
proxy_service_(ProxyService::CreateDirect()),
ssl_config_service_(new SSLConfigServiceDefaults) {
@@ -2267,7 +2258,9 @@ class HttpStreamFactoryBidirectionalQuicTest
void Initialize() {
params_.enable_quic = true;
params_.quic_supported_versions =
- test::SupportedTransportVersions(GetParam());
+ test::SupportedTransportVersions(version_);
+ params_.quic_headers_include_h2_stream_dependency =
+ client_headers_include_h2_stream_dependency_;
HttpNetworkSession::Context session_context;
session_context.http_server_properties = &http_server_properties_;
@@ -2320,10 +2313,12 @@ class HttpStreamFactoryBidirectionalQuicTest
const GURL default_url_;
QuicStreamId GetNthClientInitiatedStreamId(int n) {
- return test::GetNthClientInitiatedStreamId(GetParam(), n);
+ return test::GetNthClientInitiatedStreamId(version_, n);
}
private:
+ const QuicTransportVersion version_;
+ const bool client_headers_include_h2_stream_dependency_;
MockClock clock_;
test::QuicTestPacketMaker client_packet_maker_;
test::QuicTestPacketMaker server_packet_maker_;
@@ -2343,9 +2338,11 @@ class HttpStreamFactoryBidirectionalQuicTest
HttpNetworkSession::Params params_;
};
-INSTANTIATE_TEST_CASE_P(Version,
- HttpStreamFactoryBidirectionalQuicTest,
- ::testing::ValuesIn(AllSupportedTransportVersions()));
+INSTANTIATE_TEST_CASE_P(
+ VersionIncludeStreamDependencySequnece,
+ HttpStreamFactoryBidirectionalQuicTest,
+ ::testing::Combine(::testing::ValuesIn(AllSupportedTransportVersions()),
+ ::testing::Bool()));
TEST_P(HttpStreamFactoryBidirectionalQuicTest,
RequestBidirectionalStreamImplQuicAlternative) {
@@ -2360,7 +2357,8 @@ TEST_P(HttpStreamFactoryBidirectionalQuicTest,
2, GetNthClientInitiatedStreamId(0), /*should_include_version=*/true,
/*fin=*/true, priority,
client_packet_maker().GetRequestHeaders("GET", "https", "/"),
- &spdy_headers_frame_length, &header_stream_offset));
+ /*parent_stream_id=*/0, &spdy_headers_frame_length,
+ &header_stream_offset));
size_t spdy_response_headers_frame_length;
mock_quic_data.AddRead(server_packet_maker().MakeResponseHeadersPacket(
1, GetNthClientInitiatedStreamId(0), /*should_include_version=*/false,
@@ -2486,7 +2484,8 @@ TEST_P(HttpStreamFactoryBidirectionalQuicTest,
2, GetNthClientInitiatedStreamId(0), /*should_include_version=*/true,
/*fin=*/true, priority,
client_packet_maker().GetRequestHeaders("GET", "https", "/"),
- &spdy_headers_frame_length, &header_stream_offset));
+ /*parent_stream_id=*/0, &spdy_headers_frame_length,
+ &header_stream_offset));
size_t spdy_response_headers_frame_length;
mock_quic_data.AddRead(server_packet_maker().MakeResponseHeadersPacket(
1, GetNthClientInitiatedStreamId(0), /*should_include_version=*/false,
diff --git a/chromium/net/http/http_stream_factory_test_util.cc b/chromium/net/http/http_stream_factory_test_util.cc
index 264030e342c..b3c0fae11e6 100644
--- a/chromium/net/http/http_stream_factory_test_util.cc
+++ b/chromium/net/http/http_stream_factory_test_util.cc
@@ -29,6 +29,7 @@ MockHttpStreamFactoryImplJob::MockHttpStreamFactoryImplJob(
NextProto alternative_protocol,
QuicTransportVersion quic_version,
const ProxyServer& alternative_proxy_server,
+ bool is_websocket,
bool enable_ip_based_pooling,
NetLog* net_log)
: HttpStreamFactoryImpl::Job(delegate,
@@ -44,6 +45,7 @@ MockHttpStreamFactoryImplJob::MockHttpStreamFactoryImplJob(
alternative_protocol,
quic_version,
alternative_proxy_server,
+ is_websocket,
enable_ip_based_pooling,
net_log) {
DCHECK(!is_waiting());
@@ -69,6 +71,7 @@ std::unique_ptr<HttpStreamFactoryImpl::Job> TestJobFactory::CreateMainJob(
const SSLConfig& proxy_ssl_config,
HostPortPair destination,
GURL origin_url,
+ bool is_websocket,
bool enable_ip_based_pooling,
NetLog* net_log) {
if (override_main_job_url_)
@@ -77,8 +80,8 @@ std::unique_ptr<HttpStreamFactoryImpl::Job> TestJobFactory::CreateMainJob(
auto main_job = std::make_unique<MockHttpStreamFactoryImplJob>(
delegate, job_type, session, request_info, priority, proxy_info,
SSLConfig(), SSLConfig(), destination, origin_url, kProtoUnknown,
- QUIC_VERSION_UNSUPPORTED, ProxyServer(), enable_ip_based_pooling,
- net_log);
+ QUIC_VERSION_UNSUPPORTED, ProxyServer(), is_websocket,
+ enable_ip_based_pooling, net_log);
// Keep raw pointer to Job but pass ownership.
main_job_ = main_job.get();
@@ -99,12 +102,14 @@ std::unique_ptr<HttpStreamFactoryImpl::Job> TestJobFactory::CreateAltSvcJob(
GURL origin_url,
NextProto alternative_protocol,
QuicTransportVersion quic_version,
+ bool is_websocket,
bool enable_ip_based_pooling,
NetLog* net_log) {
auto alternative_job = std::make_unique<MockHttpStreamFactoryImplJob>(
delegate, job_type, session, request_info, priority, proxy_info,
SSLConfig(), SSLConfig(), destination, origin_url, alternative_protocol,
- quic_version, ProxyServer(), enable_ip_based_pooling, net_log);
+ quic_version, ProxyServer(), is_websocket, enable_ip_based_pooling,
+ net_log);
// Keep raw pointer to Job but pass ownership.
alternative_job_ = alternative_job.get();
@@ -124,12 +129,13 @@ std::unique_ptr<HttpStreamFactoryImpl::Job> TestJobFactory::CreateAltProxyJob(
HostPortPair destination,
GURL origin_url,
const ProxyServer& alternative_proxy_server,
+ bool is_websocket,
bool enable_ip_based_pooling,
NetLog* net_log) {
auto alternative_job = std::make_unique<MockHttpStreamFactoryImplJob>(
delegate, job_type, session, request_info, priority, proxy_info,
SSLConfig(), SSLConfig(), destination, origin_url, kProtoUnknown,
- QUIC_VERSION_UNSUPPORTED, alternative_proxy_server,
+ QUIC_VERSION_UNSUPPORTED, alternative_proxy_server, is_websocket,
enable_ip_based_pooling, net_log);
// Keep raw pointer to Job but pass ownership.
diff --git a/chromium/net/http/http_stream_factory_test_util.h b/chromium/net/http/http_stream_factory_test_util.h
index 238cc508744..b22d53a7a59 100644
--- a/chromium/net/http/http_stream_factory_test_util.h
+++ b/chromium/net/http/http_stream_factory_test_util.h
@@ -120,6 +120,7 @@ class MockHttpStreamFactoryImplJob : public HttpStreamFactoryImpl::Job {
NextProto alternative_protocol,
QuicTransportVersion quic_version,
const ProxyServer& alternative_proxy_server,
+ bool is_websocket,
bool enable_ip_based_pooling,
NetLog* net_log);
@@ -147,6 +148,7 @@ class TestJobFactory : public HttpStreamFactoryImpl::JobFactory {
const SSLConfig& proxy_ssl_config,
HostPortPair destination,
GURL origin_url,
+ bool is_websocket,
bool enable_ip_based_pooling,
NetLog* net_log) override;
@@ -163,6 +165,7 @@ class TestJobFactory : public HttpStreamFactoryImpl::JobFactory {
GURL origin_url,
NextProto alternative_protocol,
QuicTransportVersion quic_version,
+ bool is_websocket,
bool enable_ip_based_pooling,
NetLog* net_log) override;
@@ -178,6 +181,7 @@ class TestJobFactory : public HttpStreamFactoryImpl::JobFactory {
HostPortPair destination,
GURL origin_url,
const ProxyServer& alternative_proxy_server,
+ bool is_websocket,
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 ced3da36322..b192b80ce9e 100644
--- a/chromium/net/http/http_stream_parser.cc
+++ b/chromium/net/http/http_stream_parser.cc
@@ -207,16 +207,20 @@ HttpStreamParser::HttpStreamParser(ClientSocketHandle* connection,
sent_last_chunk_(false),
upload_error_(OK),
weak_ptr_factory_(this) {
+ CHECK(connection_) << "ClientSocketHandle passed to HttpStreamParser must "
+ "not be NULL. See crbug.com/790776";
io_callback_ = base::Bind(&HttpStreamParser::OnIOComplete,
weak_ptr_factory_.GetWeakPtr());
}
HttpStreamParser::~HttpStreamParser() = default;
-int HttpStreamParser::SendRequest(const std::string& request_line,
- const HttpRequestHeaders& headers,
- HttpResponseInfo* response,
- const CompletionCallback& callback) {
+int HttpStreamParser::SendRequest(
+ const std::string& request_line,
+ const HttpRequestHeaders& headers,
+ const NetworkTrafficAnnotationTag& traffic_annotation,
+ HttpResponseInfo* response,
+ const CompletionCallback& callback) {
DCHECK_EQ(STATE_NONE, io_state_);
DCHECK(callback_.is_null());
DCHECK(!callback.is_null());
@@ -228,6 +232,7 @@ int HttpStreamParser::SendRequest(const std::string& request_line,
DVLOG(1) << __func__ << "() request_line = \"" << request_line << "\""
<< " headers = \"" << headers.ToString() << "\"";
+ traffic_annotation_ = MutableNetworkTrafficAnnotationTag(traffic_annotation);
response_ = response;
// Put the peer's IP address and port into the response.
@@ -455,8 +460,9 @@ int HttpStreamParser::DoSendHeaders() {
response_->request_time = base::Time::Now();
io_state_ = STATE_SEND_HEADERS_COMPLETE;
- return connection_->socket()
- ->Write(request_headers_.get(), bytes_remaining, io_callback_);
+ return connection_->socket()->Write(
+ request_headers_.get(), bytes_remaining, io_callback_,
+ NetworkTrafficAnnotationTag(traffic_annotation_));
}
int HttpStreamParser::DoSendHeadersComplete(int result) {
@@ -503,10 +509,9 @@ int HttpStreamParser::DoSendHeadersComplete(int result) {
int HttpStreamParser::DoSendBody() {
if (request_body_send_buf_->BytesRemaining() > 0) {
io_state_ = STATE_SEND_BODY_COMPLETE;
- return connection_->socket()
- ->Write(request_body_send_buf_.get(),
- request_body_send_buf_->BytesRemaining(),
- io_callback_);
+ return connection_->socket()->Write(
+ request_body_send_buf_.get(), request_body_send_buf_->BytesRemaining(),
+ io_callback_, NetworkTrafficAnnotationTag(traffic_annotation_));
}
if (request_->upload_data_stream->is_chunked() && sent_last_chunk_) {
diff --git a/chromium/net/http/http_stream_parser.h b/chromium/net/http/http_stream_parser.h
index 6a0248202c2..56f5dae8775 100644
--- a/chromium/net/http/http_stream_parser.h
+++ b/chromium/net/http/http_stream_parser.h
@@ -21,6 +21,7 @@
#include "net/base/net_export.h"
#include "net/log/net_log_with_source.h"
#include "net/ssl/token_binding.h"
+#include "net/traffic_annotation/network_traffic_annotation.h"
namespace net {
@@ -61,6 +62,7 @@ class NET_EXPORT_PRIVATE HttpStreamParser {
// some additional functionality
int SendRequest(const std::string& request_line,
const HttpRequestHeaders& headers,
+ const NetworkTrafficAnnotationTag& traffic_annotation,
HttpResponseInfo* response,
const CompletionCallback& callback);
@@ -284,6 +286,8 @@ class NET_EXPORT_PRIVATE HttpStreamParser {
// Error received when uploading the body, if any.
int upload_error_;
+ MutableNetworkTrafficAnnotationTag traffic_annotation_;
+
base::WeakPtrFactory<HttpStreamParser> weak_ptr_factory_;
DISALLOW_COPY_AND_ASSIGN(HttpStreamParser);
diff --git a/chromium/net/http/http_stream_parser_fuzzer.cc b/chromium/net/http/http_stream_parser_fuzzer.cc
index f31d0edeacc..cb509f33d5d 100644
--- a/chromium/net/http/http_stream_parser_fuzzer.cc
+++ b/chromium/net/http/http_stream_parser_fuzzer.cc
@@ -25,6 +25,7 @@
#include "net/log/test_net_log.h"
#include "net/socket/client_socket_handle.h"
#include "net/socket/fuzzed_socket.h"
+#include "net/traffic_annotation/network_traffic_annotation_test_helper.h"
#include "url/gurl.h"
// Fuzzer for HttpStreamParser.
@@ -52,9 +53,9 @@ extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
bound_test_net_log.bound());
net::HttpResponseInfo response_info;
- int result =
- parser.SendRequest("GET / HTTP/1.1\r\n", net::HttpRequestHeaders(),
- &response_info, callback.callback());
+ int result = parser.SendRequest(
+ "GET / HTTP/1.1\r\n", net::HttpRequestHeaders(),
+ TRAFFIC_ANNOTATION_FOR_TESTS, &response_info, callback.callback());
result = callback.GetResult(result);
if (net::OK != result)
return 0;
diff --git a/chromium/net/http/http_stream_parser_unittest.cc b/chromium/net/http/http_stream_parser_unittest.cc
index 0ad717f10b1..7b6de3d8b1e 100644
--- a/chromium/net/http/http_stream_parser_unittest.cc
+++ b/chromium/net/http/http_stream_parser_unittest.cc
@@ -32,6 +32,7 @@
#include "net/socket/client_socket_handle.h"
#include "net/socket/socket_test_util.h"
#include "net/test/gtest_util.h"
+#include "net/traffic_annotation/network_traffic_annotation_test_helper.h"
#include "testing/gmock/include/gmock/gmock.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "url/gurl.h"
@@ -138,7 +139,8 @@ TEST(HttpStreamParser, DataReadErrorSynchronous) {
HttpResponseInfo response;
TestCompletionCallback callback;
- int result = parser.SendRequest("POST / HTTP/1.1\r\n", headers, &response,
+ int result = parser.SendRequest("POST / HTTP/1.1\r\n", headers,
+ TRAFFIC_ANNOTATION_FOR_TESTS, &response,
callback.callback());
EXPECT_THAT(callback.GetResult(result), IsError(ERR_FAILED));
@@ -179,7 +181,8 @@ TEST(HttpStreamParser, DataReadErrorAsynchronous) {
HttpResponseInfo response;
TestCompletionCallback callback;
- int result = parser.SendRequest("POST / HTTP/1.1\r\n", headers, &response,
+ int result = parser.SendRequest("POST / HTTP/1.1\r\n", headers,
+ TRAFFIC_ANNOTATION_FOR_TESTS, &response,
callback.callback());
EXPECT_THAT(result, IsError(ERR_IO_PENDING));
@@ -255,7 +258,8 @@ TEST(HttpStreamParser, InitAsynchronousUploadDataStream) {
HttpResponseInfo response;
TestCompletionCallback callback1;
- int result1 = parser.SendRequest("POST / HTTP/1.1\r\n", headers, &response,
+ int result1 = parser.SendRequest("POST / HTTP/1.1\r\n", headers,
+ TRAFFIC_ANNOTATION_FOR_TESTS, &response,
callback1.callback());
EXPECT_EQ(ERR_IO_PENDING, result1);
base::RunLoop().RunUntilIdle();
@@ -438,7 +442,8 @@ TEST(HttpStreamParser, SentBytesNoHeaders) {
HttpResponseInfo response;
TestCompletionCallback callback;
EXPECT_EQ(OK, parser.SendRequest("GET / HTTP/1.1\r\n", HttpRequestHeaders(),
- &response, callback.callback()));
+ TRAFFIC_ANNOTATION_FOR_TESTS, &response,
+ callback.callback()));
EXPECT_EQ(CountWriteBytes(writes, arraysize(writes)), parser.sent_bytes());
}
@@ -469,7 +474,8 @@ TEST(HttpStreamParser, SentBytesWithHeaders) {
HttpResponseInfo response;
TestCompletionCallback callback;
- EXPECT_EQ(OK, parser.SendRequest("GET / HTTP/1.1\r\n", headers, &response,
+ EXPECT_EQ(OK, parser.SendRequest("GET / HTTP/1.1\r\n", headers,
+ TRAFFIC_ANNOTATION_FOR_TESTS, &response,
callback.callback()));
EXPECT_EQ(CountWriteBytes(writes, arraysize(writes)), parser.sent_bytes());
@@ -501,7 +507,8 @@ TEST(HttpStreamParser, SentBytesWithHeadersMultiWrite) {
HttpResponseInfo response;
TestCompletionCallback callback;
- EXPECT_EQ(OK, parser.SendRequest("GET / HTTP/1.1\r\n", headers, &response,
+ EXPECT_EQ(OK, parser.SendRequest("GET / HTTP/1.1\r\n", headers,
+ TRAFFIC_ANNOTATION_FOR_TESTS, &response,
callback.callback()));
EXPECT_EQ(CountWriteBytes(writes, arraysize(writes)), parser.sent_bytes());
@@ -533,7 +540,8 @@ TEST(HttpStreamParser, SentBytesWithErrorWritingHeaders) {
HttpResponseInfo response;
TestCompletionCallback callback;
EXPECT_EQ(ERR_CONNECTION_RESET,
- parser.SendRequest("GET / HTTP/1.1\r\n", headers, &response,
+ parser.SendRequest("GET / HTTP/1.1\r\n", headers,
+ TRAFFIC_ANNOTATION_FOR_TESTS, &response,
callback.callback()));
EXPECT_EQ(CountWriteBytes(writes, arraysize(writes)), parser.sent_bytes());
@@ -572,7 +580,8 @@ TEST(HttpStreamParser, SentBytesPost) {
HttpResponseInfo response;
TestCompletionCallback callback;
- EXPECT_EQ(OK, parser.SendRequest("POST / HTTP/1.1\r\n", headers, &response,
+ EXPECT_EQ(OK, parser.SendRequest("POST / HTTP/1.1\r\n", headers,
+ TRAFFIC_ANNOTATION_FOR_TESTS, &response,
callback.callback()));
EXPECT_EQ(CountWriteBytes(writes, arraysize(writes)), parser.sent_bytes());
@@ -616,6 +625,7 @@ TEST(HttpStreamParser, SentBytesChunkedPostError) {
HttpResponseInfo response;
TestCompletionCallback callback;
EXPECT_EQ(ERR_IO_PENDING, parser.SendRequest("POST / HTTP/1.1\r\n", headers,
+ TRAFFIC_ANNOTATION_FOR_TESTS,
&response, callback.callback()));
base::RunLoop().RunUntilIdle();
@@ -685,7 +695,8 @@ TEST(HttpStreamParser, AsyncSingleChunkAndAsyncSocket) {
// complete asynchronously.
ASSERT_EQ(ERR_IO_PENDING,
parser.SendRequest("GET /one.html HTTP/1.1\r\n", request_headers,
- &response_info, callback.callback()));
+ TRAFFIC_ANNOTATION_FOR_TESTS, &response_info,
+ callback.callback()));
// Complete the initial request write. Callback should not have been invoked.
base::RunLoop().RunUntilIdle();
@@ -765,7 +776,8 @@ TEST(HttpStreamParser, SyncSingleChunkAndAsyncSocket) {
// complete asynchronously.
ASSERT_EQ(ERR_IO_PENDING,
parser.SendRequest("GET /one.html HTTP/1.1\r\n", request_headers,
- &response_info, callback.callback()));
+ TRAFFIC_ANNOTATION_FOR_TESTS, &response_info,
+ callback.callback()));
ASSERT_THAT(callback.WaitForResult(), IsOk());
// Attempt to read the response status and the response headers.
@@ -845,7 +857,8 @@ TEST(HttpStreamParser, AsyncChunkAndAsyncSocketWithMultipleChunks) {
// complete asynchronously.
ASSERT_EQ(ERR_IO_PENDING,
parser.SendRequest("GET /one.html HTTP/1.1\r\n", request_headers,
- &response_info, callback.callback()));
+ TRAFFIC_ANNOTATION_FOR_TESTS, &response_info,
+ callback.callback()));
ASSERT_FALSE(callback.have_result());
// Sending the request and the first chunk completes.
@@ -929,7 +942,8 @@ TEST(HttpStreamParser, AsyncEmptyChunkedUpload) {
// complete asynchronously.
ASSERT_EQ(ERR_IO_PENDING,
parser.SendRequest("GET /one.html HTTP/1.1\r\n", request_headers,
- &response_info, callback.callback()));
+ TRAFFIC_ANNOTATION_FOR_TESTS, &response_info,
+ callback.callback()));
// Now append the terminal 0-byte "chunk".
upload_stream.AppendData(nullptr, 0, true);
@@ -1004,7 +1018,8 @@ TEST(HttpStreamParser, SyncEmptyChunkedUpload) {
// complete asynchronously.
ASSERT_EQ(ERR_IO_PENDING,
parser.SendRequest("GET /one.html HTTP/1.1\r\n", request_headers,
- &response_info, callback.callback()));
+ TRAFFIC_ANNOTATION_FOR_TESTS, &response_info,
+ callback.callback()));
// Complete writing the request headers and body.
ASSERT_THAT(callback.WaitForResult(), IsOk());
@@ -1101,6 +1116,7 @@ TEST(HttpStreamParser, TruncatedHeaders) {
HttpResponseInfo response_info;
TestCompletionCallback callback;
ASSERT_EQ(OK, parser.SendRequest("GET / HTTP/1.1\r\n", request_headers,
+ TRAFFIC_ANNOTATION_FOR_TESTS,
&response_info, callback.callback()));
int rv = parser.ReadResponseHeaders(callback.callback());
@@ -1158,7 +1174,8 @@ TEST(HttpStreamParser, Websocket101Response) {
HttpResponseInfo response_info;
TestCompletionCallback callback;
ASSERT_EQ(OK, parser.SendRequest("GET / HTTP/1.1\r\n", request_headers,
- &response_info, callback.callback()));
+ TRAFFIC_ANNOTATION_FOR_TESTS, &response_info,
+ callback.callback()));
EXPECT_THAT(parser.ReadResponseHeaders(callback.callback()), IsOk());
ASSERT_TRUE(response_info.headers.get());
@@ -1236,6 +1253,7 @@ class SimpleGetRunner {
TestCompletionCallback callback;
ASSERT_EQ(OK, parser_->SendRequest("GET / HTTP/1.1\r\n", request_headers_,
+ TRAFFIC_ANNOTATION_FOR_TESTS,
&response_info_, callback.callback()));
}
@@ -1673,8 +1691,10 @@ TEST(HttpStreamParser, ReadAfterUnownedObjectsDestroyed) {
std::unique_ptr<HttpRequestHeaders> request_headers(new HttpRequestHeaders());
std::unique_ptr<HttpResponseInfo> response_info(new HttpResponseInfo());
TestCompletionCallback callback;
- ASSERT_EQ(OK, parser.SendRequest("GET /foo.html HTTP/1.1\r\n",
- *request_headers, response_info.get(), callback.callback()));
+ ASSERT_EQ(
+ OK, parser.SendRequest("GET /foo.html HTTP/1.1\r\n", *request_headers,
+ TRAFFIC_ANNOTATION_FOR_TESTS, response_info.get(),
+ callback.callback()));
ASSERT_THAT(parser.ReadResponseHeaders(callback.callback()), IsOk());
// If the object that owns the HttpStreamParser is deleted, it takes the
diff --git a/chromium/net/http/proxy_connect_redirect_http_stream.cc b/chromium/net/http/proxy_connect_redirect_http_stream.cc
index 2fc8eb8b0a3..699d71aad59 100644
--- a/chromium/net/http/proxy_connect_redirect_http_stream.cc
+++ b/chromium/net/http/proxy_connect_redirect_http_stream.cc
@@ -22,6 +22,7 @@ ProxyConnectRedirectHttpStream::~ProxyConnectRedirectHttpStream() = default;
int ProxyConnectRedirectHttpStream::InitializeStream(
const HttpRequestInfo* request_info,
+ bool can_send_early,
RequestPriority priority,
const NetLogWithSource& net_log,
const CompletionCallback& callback) {
diff --git a/chromium/net/http/proxy_connect_redirect_http_stream.h b/chromium/net/http/proxy_connect_redirect_http_stream.h
index 5df1ffa25e6..285a9b4e8d4 100644
--- a/chromium/net/http/proxy_connect_redirect_http_stream.h
+++ b/chromium/net/http/proxy_connect_redirect_http_stream.h
@@ -29,6 +29,7 @@ class ProxyConnectRedirectHttpStream : public HttpStream {
// marked one.
int InitializeStream(const HttpRequestInfo* request_info,
+ bool can_send_early,
RequestPriority priority,
const NetLogWithSource& net_log,
const CompletionCallback& callback) override;
diff --git a/chromium/net/http/transport_security_persister_unittest.cc b/chromium/net/http/transport_security_persister_unittest.cc
index 3ad29887f51..f18c4ae7a01 100644
--- a/chromium/net/http/transport_security_persister_unittest.cc
+++ b/chromium/net/http/transport_security_persister_unittest.cc
@@ -283,7 +283,7 @@ TEST_F(TransportSecurityPersisterTest, PublicKeyPins) {
TransportSecurityState::PKPState new_pkp_state;
EXPECT_TRUE(state_.GetDynamicPKPState(kTestDomain, &new_pkp_state));
EXPECT_EQ(1u, new_pkp_state.spki_hashes.size());
- EXPECT_EQ(sha256.tag, new_pkp_state.spki_hashes[0].tag);
+ EXPECT_EQ(sha256.tag(), new_pkp_state.spki_hashes[0].tag());
EXPECT_EQ(0, memcmp(new_pkp_state.spki_hashes[0].data(), sha256.data(),
sha256.size()));
EXPECT_EQ(report_uri, new_pkp_state.report_uri);
diff --git a/chromium/net/http/transport_security_state.cc b/chromium/net/http/transport_security_state.cc
index a433afd0217..6eaa321ef4b 100644
--- a/chromium/net/http/transport_security_state.cc
+++ b/chromium/net/http/transport_security_state.cc
@@ -12,8 +12,8 @@
#include "base/build_time.h"
#include "base/json/json_writer.h"
#include "base/logging.h"
+#include "base/metrics/histogram_functions.h"
#include "base/metrics/histogram_macros.h"
-#include "base/metrics/sparse_histogram.h"
#include "base/stl_util.h"
#include "base/strings/string_number_conversions.h"
#include "base/strings/string_util.h"
@@ -72,8 +72,7 @@ bool IsDynamicExpectCTEnabled() {
void RecordUMAForHPKPReportFailure(const GURL& report_uri,
int net_error,
int http_response_code) {
- UMA_HISTOGRAM_SPARSE_SLOWLY("Net.PublicKeyPinReportSendingFailure2",
- -net_error);
+ base::UmaHistogramSparse("Net.PublicKeyPinReportSendingFailure2", -net_error);
}
std::string TimeToISO8601(const base::Time& t) {
@@ -143,7 +142,7 @@ bool GetHPKPReport(const HostPortPair& host_port_pair,
for (const auto& hash_value : pkp_state.spki_hashes) {
std::string known_pin;
- switch (hash_value.tag) {
+ switch (hash_value.tag()) {
case HASH_VALUE_SHA256:
known_pin += "pin-sha256=";
break;
@@ -901,6 +900,9 @@ TransportSecurityState::CheckCTRequirements(
ExpectCTState state;
if (is_issued_by_known_root && IsDynamicExpectCTEnabled() &&
GetDynamicExpectCTState(hostname, &state)) {
+ UMA_HISTOGRAM_ENUMERATION(
+ "Net.ExpectCTHeader.PolicyComplianceOnConnectionSetup",
+ policy_compliance, ct::CTPolicyCompliance::CT_POLICY_MAX);
if (!complies && expect_ct_reporter_ && !state.report_uri.is_empty() &&
report_status == ENABLE_EXPECT_CT_REPORTS) {
MaybeNotifyExpectCTFailed(host_port_pair, state.report_uri, state.expiry,
@@ -947,9 +949,12 @@ TransportSecurityState::CheckCTRequirements(
const base::Time epoch = base::Time::UnixEpoch();
const CTRequiredPolicies& ct_required_policies = GetCTRequiredPolicies();
+
+ bool found = false;
for (const auto& restricted_ca : ct_required_policies) {
- if (epoch + restricted_ca.effective_date >
- validated_certificate_chain->valid_start()) {
+ if (!restricted_ca.effective_date.is_zero() &&
+ (epoch + restricted_ca.effective_date >
+ validated_certificate_chain->valid_start())) {
// The candidate cert is not subject to the CT policy, because it
// was issued before the effective CT date.
continue;
@@ -964,15 +969,21 @@ TransportSecurityState::CheckCTRequirements(
// Found a match, indicating this certificate is potentially
// restricted. Determine if any of the hashes are on the exclusion
// list as exempt from the CT requirement.
- if (IsAnySHA256HashInSortedArray(public_key_hashes,
+ if (restricted_ca.exceptions &&
+ IsAnySHA256HashInSortedArray(public_key_hashes,
restricted_ca.exceptions,
restricted_ca.exceptions_length)) {
// Found an excluded sub-CA; CT is not required.
- return default_response;
+ continue;
}
- // No exception found. This certificate must conform to the CT policy.
- return complies ? CT_REQUIREMENTS_MET : CT_REQUIREMENTS_NOT_MET;
+
+ // No exception found. This certificate must conform to the CT policy. The
+ // compliance state is treated as additive - it must comply with all
+ // stated policies.
+ found = true;
}
+ if (found)
+ return complies ? CT_REQUIREMENTS_MET : CT_REQUIREMENTS_NOT_MET;
return default_response;
}
@@ -1507,6 +1518,9 @@ void TransportSecurityState::ProcessExpectCTHeader(
// public root or did not comply with CT policy.
if (!ssl_info.is_issued_by_known_root)
return;
+ UMA_HISTOGRAM_ENUMERATION(
+ "Net.ExpectCTHeader.PolicyComplianceOnHeaderProcessing",
+ ssl_info.ct_policy_compliance, ct::CTPolicyCompliance::CT_POLICY_MAX);
if (ssl_info.ct_policy_compliance !=
ct::CTPolicyCompliance::CT_POLICY_COMPLIES_VIA_SCTS) {
// If an Expect-CT header is observed over a non-compliant connection, the
diff --git a/chromium/net/http/transport_security_state_ct_policies.inc b/chromium/net/http/transport_security_state_ct_policies.inc
index d01cbd2ad7b..f7ea8e51ef5 100644
--- a/chromium/net/http/transport_security_state_ct_policies.inc
+++ b/chromium/net/http/transport_security_state_ct_policies.inc
@@ -20,7 +20,8 @@ struct CTRequiredPolicy {
size_t roots_length;
// The date at which enforcement should begin, relative to the Unix
- // Epoch.
+ // Epoch. If equivalent to zero (base::TimeDelta()), then it is enforced
+ // for all certificates.
base::TimeDelta effective_date;
// However, if a certificate ALSO chains to or through one of
@@ -33,7 +34,7 @@ struct CTRequiredPolicy {
size_t exceptions_length;
};
-typedef CTRequiredPolicy CTRequiredPolicies[1];
+typedef CTRequiredPolicy CTRequiredPolicies[2];
const CTRequiredPolicies& GetCTRequiredPolicies() {
static const CTRequiredPolicy kCTRequiredPolicies[] = {
@@ -41,8 +42,12 @@ const CTRequiredPolicies& GetCTRequiredPolicies() {
{
kSymantecRoots, kSymantecRootsLength,
// 1 June 2016, 00:00:00 GMT.
- base::TimeDelta::FromSeconds(1464739200), kSymantecExceptions,
- kSymantecExceptionsLength,
+ base::TimeDelta::FromSeconds(1464739200),
+ kSymantecExceptions, kSymantecExceptionsLength,
+ },
+ {
+ kSymantecManagedCAs, kSymantecManagedCAsLength,
+ base::TimeDelta(), nullptr, 0
},
};
diff --git a/chromium/net/http/transport_security_state_static.json b/chromium/net/http/transport_security_state_static.json
index 0e18132ed4e..5a6fea71063 100644
--- a/chromium/net/http/transport_security_state_static.json
+++ b/chromium/net/http/transport_security_state_static.json
@@ -275,15 +275,15 @@
"expect_staple_report_uri": "https://report.badssl.com/expect-staple"
},
- // eTLDs
- // At the moment, this only includes Google-owned gTLDs,
- // but other gTLDs and eTLDs are welcome to preload if they are interested.
- { "name": "google", "policy": "public-suffix", "mode": "force-https", "include_subdomains": true, "pins": "google" },
+ // gTLDs and eTLDs are welcome to preload if they are interested.
+ { "name": "app", "policy": "public-suffix", "mode": "force-https", "include_subdomains": true },
+ { "name": "bank", "policy": "public-suffix", "mode": "force-https", "include_subdomains": true },
+ { "name": "chrome", "policy": "public-suffix", "mode": "force-https", "include_subdomains": true },
{ "name": "dev", "policy": "public-suffix", "mode": "force-https", "include_subdomains": true },
{ "name": "foo", "policy": "public-suffix", "mode": "force-https", "include_subdomains": true },
+ { "name": "google", "policy": "public-suffix", "mode": "force-https", "include_subdomains": true, "pins": "google" },
+ { "name": "insurance", "policy": "public-suffix", "mode": "force-https", "include_subdomains": true },
{ "name": "page", "policy": "public-suffix", "mode": "force-https", "include_subdomains": true },
- { "name": "app", "policy": "public-suffix", "mode": "force-https", "include_subdomains": true },
- { "name": "chrome", "policy": "public-suffix", "mode": "force-https", "include_subdomains": true },
// Google domains using Expect-CT.
{
@@ -364,6 +364,7 @@
{ "name": "groups.google.com", "policy": "google", "mode": "force-https", "include_subdomains": true, "pins": "google" },
{ "name": "gvt2.com", "policy": "google", "mode": "force-https", "include_subdomains": true, "pins": "google" },
{ "name": "gvt3.com", "policy": "google", "mode": "force-https", "include_subdomains": true, "pins": "google" },
+ { "name": "developer.android.com", "policy": "google", "mode": "force-https", "include_subdomains": true, "pins": "google" },
{ "name": "market.android.com", "policy": "google", "mode": "force-https", "include_subdomains": true, "pins": "google" },
{ "name": "translate.googleapis.com", "policy": "google", "mode": "force-https", "include_subdomains": true, "pins": "google" },
{ "name": "withgoogle.com", "policy": "google", "mode": "force-https", "include_subdomains": true, "pins": "google" },
@@ -639,6 +640,7 @@
{ "name": "googleweblight.com", "policy": "google", "include_subdomains": true, "pins": "google" },
{ "name": "google.ws", "policy": "google", "include_subdomains": true, "pins": "google" },
{ "name": "gstatic.com", "policy": "google", "include_subdomains": true, "pins": "google" },
+ { "name": "gvt1.com", "policy": "google", "include_subdomains": true, "pins": "google" },
{ "name": "static.googleadsserving.cn", "policy": "google", "include_subdomains": true, "pins": "google" },
{ "name": "urchin.com", "policy": "google", "include_subdomains": true, "pins": "google" },
{
@@ -650,9 +652,6 @@
{ "name": "youtu.be", "policy": "google", "include_subdomains": true, "pins": "google" },
{ "name": "youtube-nocookie.com", "policy": "google", "include_subdomains": true, "pins": "google" },
{ "name": "ytimg.com", "policy": "google", "include_subdomains": true, "pins": "google" },
- // Exclude the learn.doubleclick.net subdomain because it uses a different
- // CA.
- { "name": "learn.doubleclick.net", "policy": "google", "include_subdomains": true },
// Enforce HSTS and public key pins for Yahoo domains.
{ "name": "at.search.yahoo.com", "policy": "custom", "mode": "force-https", "include_subdomains": false, "pins": "yahoo" },
@@ -2049,7 +2048,6 @@
{ "name": "leonklingele.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
{ "name": "madars.org", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
{ "name": "magneticanvil.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
- { "name": "mimeit.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
{ "name": "mobilcom-debitel-empfehlen.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
{ "name": "morethanadream.lv", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
{ "name": "narodniki.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -3341,7 +3339,6 @@
{ "name": "endlesshorizon.net", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
{ "name": "entrepreneur.or.id", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
{ "name": "eol34.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
- { "name": "eroticen.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
{ "name": "eucl3d.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
{ "name": "firmapi.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
{ "name": "freeweibo.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -3772,7 +3769,6 @@
{ "name": "sifls.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
{ "name": "smkn1lengkong.sch.id", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
{ "name": "ssldecoder.org", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
- { "name": "startupsort.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
{ "name": "sx3.no", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
{ "name": "tech-seminar.jp", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
{ "name": "tncnanet.com.br", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -5311,7 +5307,6 @@
{ "name": "jonathancarter.org", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
{ "name": "jonfor.net", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
{ "name": "jorgemesa.me", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
- { "name": "josephrees.uk", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
{ "name": "joyofcookingandbaking.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
{ "name": "kachlikova2.cz", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
{ "name": "kanotijd.nl", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -5416,7 +5411,6 @@
{ "name": "ronwo.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
{ "name": "rootwpn.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
{ "name": "russmarshall.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
- { "name": "rww.name", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
{ "name": "saltercane.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
{ "name": "saveyour.biz", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
{ "name": "scienceathome.org", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -6944,7 +6938,6 @@
{ "name": "tsumi.it", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
{ "name": "tty.space", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
{ "name": "tuvalie.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
- { "name": "tuxcall.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
{ "name": "ty2u.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
{ "name": "uat-activesg.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
{ "name": "ukrgadget.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -7359,7 +7352,6 @@
{ "name": "kleinerarchitekturfuehrer.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
{ "name": "klicktojob.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
{ "name": "kmkz.jp", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
- { "name": "kojima-life.co.jp", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
{ "name": "kolmann.eu", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
{ "name": "krasota.ru", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
{ "name": "krmela.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -7706,7 +7698,6 @@
{ "name": "xn--3lqp21gwna.xn--fiqs8s", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
{ "name": "xn--3lqt7ir4md4tzwa.cn", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
{ "name": "xn--3lqt7ir4md4tzwa.xn--fiqs8s", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
- { "name": "xn--jobbrse-d1a.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
{ "name": "xn--qckss0j.tk", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
{ "name": "xqin.net", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
{ "name": "xuri.me", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -8454,7 +8445,6 @@
{ "name": "polypet.com.sg", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
{ "name": "posylka.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
{ "name": "ppro.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
- { "name": "prezola.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
{ "name": "pro-link.eu", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
{ "name": "projectarmy.net", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
{ "name": "punknews.org", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -9377,7 +9367,6 @@
{ "name": "dentallaborgeraeteservice.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
{ "name": "dentystabirmingham.co.uk", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
{ "name": "derchris.me", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
- { "name": "deregowski.net", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
{ "name": "desiccantpackets.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
{ "name": "designgears.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
{ "name": "designthinking.or.jp", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -10078,7 +10067,6 @@
{ "name": "lanbyte.se", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
{ "name": "langbein.org", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
{ "name": "lansinoh.co.uk", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
- { "name": "laposte.net", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
{ "name": "lasnaves.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
{ "name": "latinphone.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
{ "name": "lauftreff-himmelgeist.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -11233,7 +11221,6 @@
{ "name": "waylaydesign.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
{ "name": "wdt.cz", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
{ "name": "wealthcentral.com.au", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
- { "name": "wealthfactory.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
{ "name": "wealthreport.com.au", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
{ "name": "wear2work.nl", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
{ "name": "wearandcare.net", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -12343,7 +12330,6 @@
{ "name": "svatba-frantovi.cz", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
{ "name": "sumoatm.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
{ "name": "tails.com.ar", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
- { "name": "tabelfirme.ro", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
{ "name": "sv-turm-hohenlimburg.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
{ "name": "taravancil.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
{ "name": "tangibilizing.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -15814,7 +15800,6 @@
{ "name": "itilo.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
{ "name": "jamessmith.me.uk", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
{ "name": "justmy.website", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
- { "name": "johnmcgovern.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
{ "name": "karmaassurance.ca", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
{ "name": "jiyuu-ni.net", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
{ "name": "joe-pagan.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -16034,7 +16019,6 @@
{ "name": "magnets.jp", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
{ "name": "mfxbe.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
{ "name": "miegl.cz", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
- { "name": "lmkts.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
{ "name": "logicio.ch", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
{ "name": "lwl12.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
{ "name": "mockmyapp.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -17651,7 +17635,6 @@
{ "name": "mariehane.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
{ "name": "mdma.net", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
{ "name": "matthewkenny.co.uk", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
- { "name": "meledia.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
{ "name": "marksouthall.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
{ "name": "kinniyaonlus.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
{ "name": "martins.im", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -18243,7 +18226,6 @@
{ "name": "xn--yoamomisuasbcn-ynb.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
{ "name": "yuzu.tk", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
{ "name": "zlc1994.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
- { "name": "xuwei.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
{ "name": "woufbox.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
{ "name": "zenycosta.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
{ "name": "worldsbeststory.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -18601,7 +18583,6 @@
{ "name": "bundespolizei-forum.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
{ "name": "carbon12.org", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
{ "name": "cesipagano.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
- { "name": "businesshub.cz", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
{ "name": "c3vo.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
{ "name": "card-toka.jp", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
{ "name": "achterstieg.dedyn.io", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -19920,7 +19901,6 @@
{ "name": "politik-bei-uns.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
{ "name": "pm13-media.cz", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
{ "name": "principia-journal.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
- { "name": "pornbase.info", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
{ "name": "practicepanther.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
{ "name": "pozytywnyplan.pl", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
{ "name": "personalizedtouch.co", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -22550,7 +22530,6 @@
{ "name": "planktonholland.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
{ "name": "premiership-predictors.co.uk", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
{ "name": "pikeitservices.com.au", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
- { "name": "pnyxnet.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
{ "name": "pottshome.co.uk", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
{ "name": "philia-sa.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
{ "name": "proxybay.eu.org", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -25760,7 +25739,6 @@
{ "name": "fitea.cz", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
{ "name": "fivestepfunnels.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
{ "name": "fixmyalarmpanel.co.uk", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
- { "name": "fixvoltage.ru", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
{ "name": "fktpm.ru", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
{ "name": "flairbros.at", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
{ "name": "flaretechnologies.io", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -26440,7 +26418,6 @@
{ "name": "kineto.space", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
{ "name": "kingclass.cn", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
{ "name": "kingdomcrc.org", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
- { "name": "kingopen.cn", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
{ "name": "kintoandar.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
{ "name": "kirainmoe.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
{ "name": "kisallatorvos.hu", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -26880,7 +26857,6 @@
{ "name": "mplanetphl.fr", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
{ "name": "mpy.ovh", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
{ "name": "mr-anderson.org", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
- { "name": "mrhack.cz", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
{ "name": "mrx.one", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
{ "name": "mscenter.cf", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
{ "name": "mshemailmarketer.com.au", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -27879,7 +27855,6 @@
{ "name": "sugarcitycon.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
{ "name": "suiranfes.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
{ "name": "sumguy.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
- { "name": "sungo.wtf", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
{ "name": "sunsmartresorts.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
{ "name": "supa.sexy", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
{ "name": "supercalorias.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -28050,7 +28025,6 @@
{ "name": "tiste.org", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
{ "name": "titusetcompagnies.net", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
{ "name": "tjandpals.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
- { "name": "tjullrich.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
{ "name": "tkacz.pro", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
{ "name": "tkts.cl", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
{ "name": "tkusano.jp", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -31212,7 +31186,6 @@
{ "name": "pokemontabletopadventures.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
{ "name": "portalcarriers.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
{ "name": "pixelfou.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
- { "name": "popcultureshack.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
{ "name": "plut.org", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
{ "name": "plaque-funeraire.fr", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
{ "name": "phdwuda.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -31279,7 +31252,6 @@
{ "name": "privacynow.eu", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
{ "name": "promods.net", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
{ "name": "privacyscore.org", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
- { "name": "polkam.go.id", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
{ "name": "propepper.net", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
{ "name": "prodinger.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
{ "name": "plantastique.ch", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -32000,7 +31972,6 @@
{ "name": "thisoldearth.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
{ "name": "tommic.eu", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
{ "name": "top-opakowania.pl", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
- { "name": "truehealthreport.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
{ "name": "tavolaquadrada.com.br", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
{ "name": "topeng-emas.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
{ "name": "treinonerd.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -34317,7 +34288,6 @@
{ "name": "sonoecoracao.com.br", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
{ "name": "sobelift.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
{ "name": "staxflax.tk", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
- { "name": "studentshare.net", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
{ "name": "stephsolis.net", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
{ "name": "steinbergmedia.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
{ "name": "soldout-app.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -34916,7 +34886,6 @@
{ "name": "ripmixmake.org", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
{ "name": "00001.am", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
{ "name": "pascalmathis.net", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
- { "name": "zqwqz.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
{ "name": "scrumbleship.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
{ "name": "sidpod.ru", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
{ "name": "saintaardvarkthecarpeted.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -35075,7 +35044,6 @@
{ "name": "globalprojetores.com.br", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
{ "name": "great.nagoya", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
{ "name": "grouphomes.com.au", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
- { "name": "gym-old.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
{ "name": "halitopuroprodutos.com.br", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
{ "name": "hanys.xyz", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
{ "name": "haogoodair.ca", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -36586,7 +36554,6 @@
{ "name": "dnfc.rocks", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
{ "name": "dockerm.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
{ "name": "documaniatv.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
- { "name": "doesnotscale.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
{ "name": "domengrad.ru", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
{ "name": "domian.cz", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
{ "name": "dominik-schlueter.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -37337,7 +37304,6 @@
{ "name": "owl-stat.ch", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
{ "name": "owlishmedia.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
{ "name": "paazmaya.fi", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
- { "name": "pagalworld.la", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
{ "name": "painlessproperty.co.uk", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
{ "name": "paktolos.net", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
{ "name": "pantallasled.com.mx", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -37466,7 +37432,6 @@
{ "name": "ref1oct.nl", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
{ "name": "refficience.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
{ "name": "refreshliving.us", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
- { "name": "reimu.ink", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
{ "name": "reismil.ch", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
{ "name": "reneleu.ch", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
{ "name": "replicaswiss.nl", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -37810,10 +37775,6 @@
{ "name": "votercircle.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
{ "name": "voyagesdetective.fr", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
{ "name": "vozami.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
- { "name": "vpls.co.th", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
- { "name": "vpls.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
- { "name": "vpls.net", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
- { "name": "vplssolutions.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
{ "name": "vranjske.co.rs", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
{ "name": "vsamsonov.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
{ "name": "vuzi.fr", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -39550,7 +39511,6 @@
{ "name": "m.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
{ "name": "ma-musique.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
{ "name": "maaya.jp", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
- { "name": "machineryhouse.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
{ "name": "maciespartyhire.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
{ "name": "mactools.com.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
{ "name": "madbouncycastles.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -40213,7 +40173,6 @@
{ "name": "mncr.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
{ "name": "monolithindustries.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
{ "name": "mystatus24.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
- { "name": "nil2.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
{ "name": "ortho-graz.at", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
{ "name": "os24.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
{ "name": "oyesunn.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -41107,7 +41066,6 @@
{ "name": "docs.tw", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
{ "name": "dokan-e.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
{ "name": "dolci-delizie.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
- { "name": "dongkexue.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
{ "name": "dont.watch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
{ "name": "dotjs.party", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
{ "name": "dragonsunited.at", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -41492,7 +41450,6 @@
{ "name": "urcentral.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
{ "name": "vaindil.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
{ "name": "vales.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
- { "name": "vampyrium.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
{ "name": "vapecom-shop.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
{ "name": "vectro.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
{ "name": "venninvestorplatform.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -41542,7 +41499,6 @@
{ "name": "xchating.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
{ "name": "xdavidhu.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
{ "name": "xfce.space", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
- { "name": "xiaowutou.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
{ "name": "xingiahanvisa.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
{ "name": "xlboo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
{ "name": "xn--mgbmmp7eub.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -41557,6 +41513,2676 @@
{ "name": "zhima.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
{ "name": "zivagold.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
{ "name": "zlcp.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "100pounds.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "123termpapers.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "2333666.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "3queens.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "3queens.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "3vlnaeet.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "5000yz.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "506pay.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "6lo.zgora.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "aaron.xin", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "ac.milan.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "accessoripersmartphone.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "acemypaper.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "acordes.online", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "activeworld.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "adorade.ro", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "africanimpact.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "agoodmind.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "agoravox.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "agoravox.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "agoravox.tv", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "agr.asia", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "ahoy.travel", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "aigenpul.se", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "albertify.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "aliaswp.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "alttrackr.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "amalfirock.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "amato.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "amministratorecondominio.roma.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "andronika.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "anhaffen.lu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "antama.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "anthro.id", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "anynode.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "aomonk.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "apio.systems", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "aporia.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "aquabar.co.il", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "areallyneatwebsite.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "artea.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "arteaga.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "asiesvenezuela.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "assadrivesloirecher.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "assistenzamicroonde.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "ateliers-veronese-nantes.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "atheoryofchange.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "aulaschrank.gq", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "aurosa.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "auskunftsbegehren.at", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "autoscuola.roma.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "autosearch.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "avalon-studios.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "avova.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "babyphototime.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "balconnr.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "balconsverdun.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "bankofrealty.review", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "baobeiglass.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "baustils.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "bcradio.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "beautybear.dk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "bennygommers.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "bgr34.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "bilsho.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "bipyo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "bleep.zone", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "blm.gov", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "bluefinger.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "bngs.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "bologna-disinfestazioni.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "bonprix.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "bookingapp.be", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "bouk.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "brainwork.space", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "brammingfys.dk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "bran.soy", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "brandweertrainingen.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "bravehearts.org.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "bridgevest.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "brokervalues.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "bsdunix.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "buy-thing.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "calafont.cat", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "calidoinvierno.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "calypso-tour.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "canerkorkmaz.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "canmipai.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "cash-4x4.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "catuniverse.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "causae.es", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "cazaviajes.es", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "chapiteauxduleman.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "chasing-coins.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "chcsct.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "cheapestgamecards.at", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "cheapestgamecards.be", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "cheapestgamecards.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "cheapestgamecards.fi", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "cheapestgamecards.no", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "childvisitationassistance.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "class.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "claster.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "clearance365.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "climaencusco.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "code-judge.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "colorlifesupport.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "comphare.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "crag.com.tw", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "crowdliminal.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "crypto-armory.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "curvissa.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "cutephil.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "cy.technology", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "danielsteiner.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "danna-salary.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "daravk.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "dcards.in.th", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "deai-life.biz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "dealapp.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "degoulet.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "delitto.top", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "derattizzazione.name", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "derattizzazioni.biz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "derattizzazioni.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "detekenmuze.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "detoxetmoi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "detuinmuze.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "developyourelement.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "dierabenmutti.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "digitalbox.jp", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "digitalwasteland.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "direct2uk.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "dirtygeek.ovh", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "disinfestando.info", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "disinfestazione.brescia.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "distribuidoracristal.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "doctafit.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "dorth.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "doypacky.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "dpisecuretests.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "dragonprogrammer.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "dukefox.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "e9a.at", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "economias.pt", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "edholm.pub", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "edsh.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "edv-bv.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "eff-bee-eye.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "egarden.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "electricalagoura.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "elguadia.faith", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "elitesensual.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "elucron.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "empower.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "enpalmademallorca.info", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "epiteugma.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "eppelblei.lu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "eppelpress.lu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "eroticforce.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "eru.im", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "esailinggear.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "escortshotsexy.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "espressivo.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "exteriorservices.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "faidanoi.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "faithindemocracy.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "falcibiosystems.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "falcoz.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "fatowltees.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "fburl.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "ferret.zone", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "find-mba.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "finflix.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "fioulmarket.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "flowersbylegacy.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "fm992.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "foreversummertime.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "framedpaws.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "freelanceshipping.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "freemans.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "freeshkre.li", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "friederes.lu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "fsk.fo", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "funarena.com.ua", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "funinbeds.org.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "gambitboard.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "ganztagplus.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "gastoudererenda.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "gatomix.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "gazflynn.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "gcbit.dk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "geekshirts.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "geekz.sk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "geloofindemocratie.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "gensenwedding.jp", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "geocommunicator.gov", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "getcleartouch.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "getticker.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "giardinaggio.napoli.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "gifts365.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "giochiecodici.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "gitesdeshautescourennes.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "global-village.koeln", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "goodyearsotn.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "goubi.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "gpio.gq", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "grandjunctionbrewing.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "grattan.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "grayowlworks.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "grendel.no", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "grinnellplans.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "grootinadvies.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "groupe-neurologique-nord.lu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "guhei.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "guillaume-briand.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "ha6.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "haccp.roma.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "handynummer.online", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "haqaza.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "harilova.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "healthery.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "hearty.taipei", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "hightimes.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "hilhorst-uitvaartverzorging.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "hiresteve.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "homebasedsalons.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "homoglyph.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "hr98.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "hub385.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "humblebee.at", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "humblebee.be", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "humblebee.co.in", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "humblebee.com.ph", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "humblebee.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "humblebee.dk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "humblebee.es", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "humblebee.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "humblebee.gr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "humblebee.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "humblebee.me.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "humblebee.nz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "humblebee.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "humblebeeshop.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "hypothyroidmom.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "ibwc.gov", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "idolshop.dk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "igd.chat", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "igk.nz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "ik-life.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "imaginetricks.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "imgup.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "inanyevent.london", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "infomegastore.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "infomisto.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "infotolium.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "institutmaupertuis.hopto.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "investcountry.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "irstaxforumsonline.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "isaackabel.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "isaackabel.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "isaackabel.gq", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "isaackabel.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "isaackabel.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "it-shamans.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "itad.top", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "jakpremyslet.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "janschaumann.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "jdncr.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "jeuxetcodes.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "jinanshen.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "jkest.cc", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "joliettech.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "jonathanschle.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "joshlovephotography.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "juegosycodigos.es", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "jugh.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "juliedecubber.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "jumboquid.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "kaleidoscope.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "kansaiyamamoto.jp", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "katalogakci.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "kcore.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "keakon.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "keldan.fo", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "kevlar.pw", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "khasiatmanfaat.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "kisiselveri.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "klimaloven.no", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "kniwweler.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "koreaboo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "krautomat.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "kruisselbrink.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "laassari.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "labcoat.jp", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "landinfo.no", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "lascana.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "lebarbatruc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "ledeguisement.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "lemonop.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "lenguajedeprogramacion.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "lib64.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "lifescience-japan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "linostassi.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "livecards.es", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "livecards.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "livecards.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "livekarten.at", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "livekarten.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "lixtick.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "llm-guide.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "loeildansledoigt.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "logicchen.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "lolnames.gg", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "lon-so.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "lookagain.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "lookbetweenthelines.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "losebellyfat.pro", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "lostandcash.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "lsvih.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "lucassoler.com.ar", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "luckyfrog.hk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "lukestebbing.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "lunis.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "lunorian.is", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "lusynth.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "lv5.top", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "lyoness.digital", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "magnificentdata.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "maispa.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "maplenorth.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "marlonlosurdopictures.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "mcfedries.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "medcrowd.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "meddigital.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "media-access.online", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "meiqia.cn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "meiqia.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "mes-finances.be", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "mia.ac", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "micromata.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "mijn-financien.be", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "mindwork.space", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "minei.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "minerstat.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "minor.news", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "modaperuimport.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "mojeco2.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "mondedesnovels.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "monotsuku.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "moodifiers.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "mosaicadvisors.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "moskeedieren.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "motezazer.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "movie-infos.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "muffet.pw", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "multibase.pt", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "myhatsuden.jp", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "mymommyworld.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "n-design.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "na.hn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "namazvakitleri.com.tr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "nani.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "natchmatch.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "nationalcprfoundation.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "natlec.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "naturalkitchen.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "ncc-qualityandsafety.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "needle.net.nz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "needle.nz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "neko.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "nerfroute.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "nerpa-club.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "netnik.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "neutralvehicle.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "nightmoose.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "ninebytes.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "ninfora.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "noovell.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "northern-lakes.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "nunnun.jp", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "nutrifyyourself.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "nyanco.space", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "occmon.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "oducs.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "offbyinfinity.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "office-morimoto.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "omoteura.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "one-resource.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "onepointzero.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "organisatieteam.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "origamika.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "oscarmashauri.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "overstemmen.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "parkwayminyan.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "paulward.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "pbqs.site", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "pcmkrembangan.or.id", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "pcrypt.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "pedicurean.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "perrone.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "petlife.vet", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "philippe-mignotte.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "photolium.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "pianetatatuaggi.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "pidginhost.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "pirateproxy.ist", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "pixelution.at", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "plumbingbenoni.co.za", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "pmarques.info", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "ponzi.life", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "pottersheartministry.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "prakhar.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "primotiles.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "primotilesandbathrooms.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "privacyforjournalists.org.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "progeon.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "proggersession.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "projectforge.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "purplebricksplc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "pyjiaoyi.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "qimiao.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "quarryhillrentals.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "quatrefoiscent.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "quehacerencusco.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "r-ay.club", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "ravenger.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "raw-diets.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "rcmlinx.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "rechtenliteratuurleiden.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "remejeanne.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "rentacaramerica.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "retrowave.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "reverse.design", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "rittau.biz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "rittau.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "ritzlux.com.tw", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "rixter.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "robotattack.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "rockthebabybump.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "rubenkruisselbrink.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "ruri.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "rybox.info", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "safeinfra.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "safesecret.info", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "sana-store.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "sana-store.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "sana-store.sk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "sandyrobsonhypnotherapy.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "sanilodge.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "sbsnursery.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "sci-internet.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "scp500.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "searchgov.gov.il", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "sebastiaandouma.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "selectel.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "shawnstarrcustomhomes.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "shieldcomputer.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "shutter-shower.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "siciliadisinfestazioni.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "sinsojb.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "skyquid.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "slides.zone", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "solonotizie24.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "soohealthy.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "soopure.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "sorellecollection.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "spilogkoder.dk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "sportparks.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "sportparks.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "squadlinx.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "ssuiteoffice.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "ssuitesoft.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "stackhub.cc", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "standardequipment.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "stanthonymaryclaret.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "stevenz.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "stimmgabel.lu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "stuarts.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "stucydee.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "studionowystyl.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "stuudium.life", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "stuudium.pro", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "suluvir.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "superbdistribute.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "supersec.es", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "suseasky.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "sveinerik.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "swattransport.ae", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "swimwear365.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "tabledusud.be", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "tabledusud.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "taichi-jade.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "tailandfur.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "techview.link", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "techviewforum.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "tejarat98.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "thebit.link", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "theoverfly.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "thestyle.city", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "thewebdexter.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "thinkmarketing.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "thoroquel.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "tintenprofi.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "todocracy.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "todoscomciro.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "tolle-wolke.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "tommy-bordas.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "tomravinmd.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "toxicboot.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "tracfinancialservices.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "tracinsurance.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "trickedguys.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "tronflix.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "trunk-show.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "tune-web.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "uel-thompson-okanagan.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "unblocked.vc", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "unsacsurledos.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "utahfireinfo.gov", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "vagaerg.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "vagaerg.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "vampyrium.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "varcare.jp", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "velonustraduction.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "vendserve.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "vernonatvclub.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "vik.im", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "violet-letter.delivery", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "vize.ai", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "vliegensvlug.services", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "vvdbronckhorst.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "vww-8522.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "w10club.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "walravensax.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "webdesignerinwarwickshire.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "webdesignssussex.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "wellsplasticsurgery.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "whatsahoy.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "whoimg.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "willywangstory.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "witt-international.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "wiz.farm", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "wlog.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "worldchess.london", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "worldnettps.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "wot-tudasbazis.hu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "wvw-8522.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "xdty.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "xeedbeam.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "xjpvictor.info", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "xn--dragni-g1a.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "xn--o77hka.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "xn--r77hya.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "yamashita-clinic.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "ybin.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "yogabhawnamission.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "youcaitian.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "young-sheldon.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "yurinet.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "z-coder.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "zenics.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "zoomseoservices.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "00100010.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "00120012.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "00130013.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "00140014.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "00150015.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "00160016.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "00180018.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "00190019.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "00330033.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "00440044.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "00550055.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "00660066.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "00770077.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "00880088.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "00990099.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "110110110.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "112112112.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "113113113.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "118118118.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "1481481.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "1481481.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "1481482.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "1481482.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "1481483.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "1481483.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "1481485.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "1481485.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "1481486.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "1481486.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "168bet9.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "168bo9.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "168bo9.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "168esb.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "174343.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "1day1ac.red", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "2333blog.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "233boy.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "24hourscienceprojects.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "2fl.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "2li.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "304squadron.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "3839.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "404.guide", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "439050.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "4flex.info", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "5214889.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "5214889.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "52b9.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "52b9.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "5310899.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "5310899.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "53ningen.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "546802.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "598598598.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "788da.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "7bwin.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "81uc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "8888esb.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "8901178.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "8901178.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "8910899.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "8910899.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "8917168.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "8917168.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "8917818.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "8917818.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "8951889.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "8951889.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "8992088.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "8992088.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "9617818.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "9617818.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "9696178.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "9696178.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "9bingo.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "a-1basements.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "aa6688.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "abckam.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "aboutyou.at", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "aboutyou.be", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "aboutyou.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "aboutyou.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "aboutyou.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "abstractbarista.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "abstractbarista.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "accredit.ly", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "aceanswering.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "acroso.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "actom.cc", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "actom.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "adamcoffee.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "adhd-inattentive.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "admin-forms.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "adminwerk.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "adminwerk.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "advancyte.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "agelesscitizen.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "agelesscitizens.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "agoravm.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "agouraelectrician.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "ai1989.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "aimerworld.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "aimrom.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "akcounselingservices.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "alainodea.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "alcoholapi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "alexsinnott.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "alextjam.es", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "alibababee.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "allenosgood.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "allenscaravans.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "allgrass.es", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "allgrass.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "allgreenturf.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "allincoin.shop", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "alljamin.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "allpropertyservices.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "allseasons-cleaning.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "allsync.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "allsync.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "alpinechaletrental.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "alpinetrek.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "alpiniste.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "altaplana.be", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "altitudemoversdenver.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "altruistgroup.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "alwaysonssl.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "alzonaprinting.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "amaderelectronics.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "amalficoastchauffeur.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "amalfitabula.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "amauf.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "america.gov", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "ameriikanpoijat.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "amielucha.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "amitpatra.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "ammanagingdirectors.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "amosng.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "andariegocusco.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "andys-place.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "ankya9.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "ansermfg.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "antennisti.milano.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "anthony.codes", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "antyblokada.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "apache-portal.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "apination.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "appformacpc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "apps4all.sytes.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "archivero.es", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "arcridge.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "areqgaming.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "arimarie.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "arlingtonwine.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "armedpoet.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "aromacos.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "artboja.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "arteaga.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "arteaga.tech", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "arteaga.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "arteaga.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "artecat.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "artisansoftaste.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "artmarketingnews.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "ashlocklawgroup.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "asspinter.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "astal.rs", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "atac.no", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "ateamsport.dk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "atedificacion.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "atelierdeloulou.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "atheist-refugees.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "attac.us", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "audividi.shop", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "augix.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "aupasdecourses.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "aurelienaltarriba.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "auroware.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "austinuniversityhouse.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "australianarmedforces.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "australianimmigrationadvisors.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "autocrypt.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "autopapo.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "autostock.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "autres-talents.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "av0ndale.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "avanet.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "avatarrecruit.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "avexon.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "avia-krasnoyarsk.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "avia-ufa.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "aviapoisk.kz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "avietech.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "awxg.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "ayon.group", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "b0618.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "b0618.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "b0868.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "b0868.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "b1236.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "b1758.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "b1758.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "b1768.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "b1768.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "b1788.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "b1788.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "b1rd.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "b2486.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "b2486.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "b5189.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "b5189.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "b5289.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "b5289.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "b5989.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "b5989.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "b61688.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "b8591.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "b8591.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "b8979.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "b8979.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "b9018.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "b9018.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "b9108.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "b9108.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "b9110.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "b9112.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "b9112.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "b911gt.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "b911gt.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "b9168.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "b91688.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "b91688.info", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "b91688.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "b91688.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "b9175.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "b9175.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "b9258.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "b9258.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "b9318.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "b9318.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "b9418.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "b9418.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "b9428.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "b9428.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "b9453.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "b9453.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "b9468.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "b9468.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "b9488.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "b9488.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "b9498.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "b9498.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "b9518.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "b9518.info", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "b9518.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "b9518.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "b9520.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "b9528.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "b9528.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "b9538.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "b9538.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "b9568.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "b9586.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "b9588.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "b95888.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "b9589.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "b9598.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "b9598.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "b9658.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "b9658.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "b96899.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "b9758.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "b9758.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "b9818.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "b9818.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "b9858.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "b9858.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "b9880.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "b9883.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "b9884.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "b9885.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "b9886.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "b9886.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "b9887.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "b9888.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "b98886.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "b9889.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "b9920.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "b9930.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "b9948.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "b9948.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "b99520.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "b9960.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "b9970.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "b9980.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "b99881.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "b99882.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "b99883.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "b99885.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "b99886.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "b9best.cc", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "b9best.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "b9king.cc", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "b9king.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "b9king.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "b9winner.cc", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "b9winner.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "b9winner.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "bachata.info", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "baka-gamer.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "ballinarsl.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "bamboorelay.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "banduhn.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "banknet.gov", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "bao-in.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "bao-in.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "baodan666.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "baptistedeleris.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "barabrume.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "barryswebdesign.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "bat909.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "bat9vip.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "bat9vip.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "batvip9.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "bayz.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "bbnbb.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "bbswin9.cc", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "bbswin9.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "bbxin9.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "bbxin9.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "bcdonadio.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "bcdonadio.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "bcodeur.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "be9418.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "be9418.info", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "be9418.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "be9418.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "be9458.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "be9458.info", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "be9458.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "be9458.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "be958.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "be958.info", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "be958.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "be958.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "be9966.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "bealpha.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "bebout.domains", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "beerview.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "bellthrogh.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "bellthrough.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "benevisim.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "benjii.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "benriya.shiga.jp", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "benzi.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "bergfreunde.dk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "bergfreunde.es", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "bergfreunde.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "bergfreunde.fi", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "bergfreunde.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "bergfreunde.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "bergfreunde.no", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "bergfreunde.se", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "berodes.be", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "bessettenotaire.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "bestattorney.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "bestbatteriesonline.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "bestesb.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "bestesb.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "bestinductioncooktop.us", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "bestoffert.club", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "bet-99.cc", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "bet-99.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "bet168wy.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "bet168wy.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "bet909.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "bet990.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "bet9bet9.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "betgo9.cc", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "betterjapanese.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "betwin9.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "betwin9.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "beylikduzum.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "beylikduzuvaillant.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "bh.sb", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "bicecontracting.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "bihub.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "biletyplus.by", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "biletyplus.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "biletyplus.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "biletyplus.ua", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "bill-nye-the.science", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "binbin9.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "binbin9.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "bingo9.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "binkanhada.biz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "biocheminee.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "birgitandmerlin.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "bistrotdelagare.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "bitcoinwalletscript.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "bitenose.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "bitenose.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "bitgrapes.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "bitxel.com.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "bjl5689.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "bjl5689.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "bkhayes.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "blackislegroup.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "blackscreen.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "blazing.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "bling9.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "bling999.cc", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "bling999.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "bling999.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "blip.website", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "blobfolio.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "blockshopauto.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "blok56.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "bludnykoren.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "blueblou.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "bluecardlottery.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "bluedeck.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "blunderify.se", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "bluproducts.com.es", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "bmriv.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "bo1689.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "bo1689.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "bo9club.cc", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "bo9club.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "bo9club.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "bo9fun.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "bo9fun.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "bo9game.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "bo9game.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "bo9king.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "boards.ie", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "bodypainting.waw.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "bolgarnyelv.hu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "bondingwithbaby.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "booksearch.jp", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "bopiweb.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "bordes.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "boredhackers.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "boundarybrighton.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "bovenwebdesign.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "bozit.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "bramburek.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "bramstaps.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "breatheav.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "breatheproduction.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "briandwells.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "brownihc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "brztec.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "bsa157.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "bsd-box.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "bsdes.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "bserved.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "budget.gov", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "bulario.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "burtplasticsurgery.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "buryit.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "busybee360.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "buybike.shop", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "buycarpet.shop", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "buycook.shop", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "buyhealth.shop", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "buyjewel.shop", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "buyplussize.shop", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "buyprofessional.shop", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "buywine.shop", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "buywood.shop", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "bx-web.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "bytema.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "bytema.sk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "bythen.cn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "bywin9.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "caarecord.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "cadams.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "cadra.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "calcedge.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "campingskyhooks.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "canglong.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "canker.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "canterbury.ws", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "canx.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "captainark.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "car-rental24.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "carlscatering.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "carolinaclimatecontrolsc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "cartadeviajes.cl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "cartadeviajes.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "cartadeviajes.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "cartadeviajes.com.ar", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "cartadeviajes.com.ve", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "cartadeviajes.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "cartadeviajes.ec", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "cartadeviajes.es", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "cartadeviajes.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "cartadeviajes.mx", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "cartadeviajes.pe", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "cartadeviajes.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "casacameo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "caseplus-daem.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "cashsector.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "casino-trio.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "caspar.ai", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "cayounglab.co.jp", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "cdbtech.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "cdsdigital.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "centralebigmat.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "cerberusinformatica.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "cercevelet.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "certifiednurses.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "cfpa-formation.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "changes.jp", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "chaosriftgames.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "chasse-et-plaisir.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "chd-expert.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "checkspf.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "cheladmin.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "chemicalcrux.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "chemiphys.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "cherie-belle.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "cherylsoleway.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "chiboard.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "chikazawa.info", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "chinwag.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "chloca.jp", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "chrisaitch.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "christopherkennelly.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "chriswald.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "cidersus.com.ec", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "circulatedigital.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "civicunicorn.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "civicunicorn.us", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "ckenelley.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "ckenelly.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "ckenely.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "ckenneley.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "ckennelley.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "ckennely.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "claritysrv.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "clash.lol", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "classroomcountdown.co.nz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "clazzrooms.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "cleansewellness.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "clearbreezesecuritydoors.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "clicksaveandprint.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "clinicminds.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "clnc.to", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "clorophilla.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "club-duomo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "clubcall.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "clubiconkenosha.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "cmdtelecom.net.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "cmrss.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "cocktail-shaken.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "cocubes.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "cokebar.info", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "coldstreamcreekfarm.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "collectorknives.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "coltonrb.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "comidasperuanas.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "commco.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "comoeliminarlaspapulasperladasenelglande.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "comosatisfaceraunhombreenlacamaydejarloloco.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "compeat.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "compusolve.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "concertsenboite.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "conory.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "contentdesign.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "convergencela.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "cookeatup.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "coolprylar.se", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "corintech.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "corporateclash.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "corpsepaint.life", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "corrbee.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "cosmechic.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "couscous.recipes", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "creatieven.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "creativeconceptsvernon.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "creato.top", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "creatujoya.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "creditreporttips.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "cribcore.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "crimevictims.gov", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "cronologie.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "crose.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "crypteianetworks.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "cryptolinc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "csehnyelv.hu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "csgoswap.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "ctcue.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "cubix.host", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "cueca.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "cumplegenial.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "cupcakesandcrinoline.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "cupcao.gov", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "cybercrew.cc", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "cyberseguranca.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "cyelint.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "cygnaltech.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "czfa.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "d-msg.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "dabuttonfactory.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "damienpontifex.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "daminiphysio.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "darknetlive.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "datacave.is", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "daverandom.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "davidbranco.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "davidbrito.tech", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "deanisa.ninja", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "decaffeinated.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "decs.es", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "dedg3.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "deeps.cat", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "deeps.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "dekonix.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "delfino.cr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "deltaonlineguards.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "deparis.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "depedtayo.ph", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "desuperheroes.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "devagency.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "dewaard.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "dicio.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "digitalcitizen.life", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "digitalcitizen.ro", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "digitalfishfun.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "dildoexperten.se", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "direct-sel.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "directspa.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "dischempharmacie.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "disinfestazioni.venezia.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "distiduffer.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "dj-leszwolle.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "djcursuszwolle.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "djursland-psykologen.dk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "dnscrawler.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "doc-justice.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "doesburg-comp.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "dogcontrol.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "domen-reg.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "dominique-haas.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "domquixoteepi.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "dongxuwang.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "dotshule.ug", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "doubleaste.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "downrightcute.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "dp.cx", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "dreadd.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "dreax.win", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "dreischneidiger.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "drillingsupplystore.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "drmtransit.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "dronnet.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "drugs.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "drvr.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "dsmjs.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "dsouzamusic.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "dsrw.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "dubai-company.ae", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "dunklau.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "duoquadragintien.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "durfteparticiperen.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "dusnan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "dustplanet.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "dzytdl.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "e-tech-solution.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "e-techsolution.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "e-techsolutions.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "e-vo-linka.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "e1488.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "e4metech.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "e52888.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "e52888.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "e53888.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "e53888.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "e59888.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "e59888.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "eagle.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "eaglemessaging.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "eastsidecottages.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "easycontentplan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "ebene-bpo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "ebizarts.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "ecodedi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "eddokloosterman.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "edehsa.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "edincmovie.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "edservicing.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "edxn.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "egrp365.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "ekati.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "ekb-avia.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "ekyu.moe", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "electric-vault.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "electricalagourahills.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "electricalcalabasas.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "electricalcamarillo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "electricalconejovalley.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "eleicoes2018.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "elektronickakancelar.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "eleonorengland.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "eline168.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "elviraszabo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "elvispresley.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "elwix.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "elysiria.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "empyrean-advisors.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "emvoiceapp.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "en4u.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "enderbycamping.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "endoftenancycleaninglondon.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "enginx.cn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "ensemble-vos-idees.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "entheorie.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "enviatufoto.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "epa.com.es", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "ephesusbreeze.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "epreskripce.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "equinetherapy.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "eroimatome.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "eroma.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "erwinpaal.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "es888.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "es8888.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "es888999.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "es999.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "es9999.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "esb-in.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "esb-top.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "esb-top.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "esb111.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "esb116.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "esb1314.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "esb1668.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "esb168168.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "esb168168.info", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "esb168168.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "esb168168.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "esb1688.biz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "esb1688.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "esb1688.info", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "esb1688.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "esb1688.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "esb16888.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "esb1711.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "esb1711.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "esb1788.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "esb1788.info", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "esb1788.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "esb1788.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "esb17888.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "esb2013.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "esb2013.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "esb2099.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "esb2099.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "esb222.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "esb258.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "esb325.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "esb325.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "esb333.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "esb336.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "esb369.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "esb433.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "esb518.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "esb553.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "esb555.biz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "esb555.cc", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "esb555.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "esb556.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "esb5889.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "esb5889.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "esb6.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "esb666.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "esb666.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "esb66666.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "esb677.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "esb688.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "esb68888.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "esb775.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "esb777.biz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "esb777.cc", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "esb777.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "esb777.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "esb777.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "esb777.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "esb777.us", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "esb886.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "esb888.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "esb8886.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "esb9527.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "esb9588.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "esb9588.info", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "esb9588.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "esb9588.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "esb999.biz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "esb999.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "esb999.info", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "esb999.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "esb999.us", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "esba11.cc", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "esba11.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "esba11.in", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "esba11.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "esba11.us", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "esball-in.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "esball-in.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "esball.bz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "esball.cc", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "esball.in", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "esball.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "esball.mx", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "esball.online", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "esball.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "esball.win", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "esball.ws", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "esball518.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "esball518.info", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "esball518.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "esball518.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "esball888.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "esballs.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "esbbon.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "esbbon.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "esbfun.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "esbfun.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "esbgood.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "esbin.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "esbjon.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "esbjon.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "esbm4.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "esbm5.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "esmoney.cc", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "esmoney.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "etech-solution.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "etech-solution.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "etech-solutions.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "etechsolution.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "ethandelany.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "eurolocarno.es", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "europeantimberconnectors.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "europeos.es", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "euroskano.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "eurousa.us", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "euvo.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "eva-select.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "evailoil.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "evamira.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "event64.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "everydaywp.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "evilsite.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "exatmiseis.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "exchaser.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "exploringenderby.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "extreme.co.th", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "eyona.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "f2h.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "f3nws.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "facekungfu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "factcool.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "faerb.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "fanboi.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "faradome.ws", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "farmaciamedicom.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "fastvistorias.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "faui2k17.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "fbiic.gov", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "fbtholdings.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "fedemo.top", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "federatedbank.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "fedpartnership.gov", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "feeriedesign-event.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "feetpa.ws", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "felger-times.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "feng-in.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "feng-in.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "feudaltactics.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "feuerwehr-mehring.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "ffiec.gov", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "fibo-forex.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "filanthropystar.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "finchnest.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "fingerscrossed.style", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "fintry.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "firefly-iii.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "fireworkcoaching.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "fitfitup.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "fiveboosts.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "fixvoltage.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "flamero.fi", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "flangaapis.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "fleurenplume.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "flextribly.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "fliino.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "fliino.info", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "fliino.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "fliino.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "flipbell.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "flirtycourts.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "flmortgagebank.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "florenceapp.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "floro.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "flowinvoice.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "flugsportvereinigungcelle.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "fluhrers.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "fluitbeurt.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "fmussatmd.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "focuspointtechnologies.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "forbid.life", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "force-des-maths.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "fordlibrarymuseum.gov", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "forecastcity.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "forfunssake.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "forpc.us", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "fotonjan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "fowlsmurf.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "francescoservida.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "frankenhost.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "frankslaughterinsurance.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "frederikvig.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "freelancecollab.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "freepnglogos.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "frejasdal.dk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "frosthall.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "frugal-millennial.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "fs-community.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "fu-li88.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "fu-li88.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "fullhost.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "futurehack.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "fwest98.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "gaff-rig.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "galle.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "gamecdn.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "ganaenergia.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "ganasoku.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "gaudeamus-folklor.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "gavinsblog.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "gayukai.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "gazachallenge.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "generalinsuranceservices.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "generationsweldom.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "geojs.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "georgewbushlibrary.gov", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "getenergized2018.kpn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "getpagespeed.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "getteamninja.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "gfms.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "gfw.moe", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "ghid-pitesti.ro", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "giethoorn.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "gigime.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "ginza-luce.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "gites-alizea.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "gkvsc.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "glaciernursery.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "gladystudio.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "globalgovernancewatch.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "god-esb.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "godbo9.cc", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "godbo9.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "godbo9.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "godesb.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "goedkopeonesies.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "goetic.space", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "goozp.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "goquiq.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "gorgias.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "gorognyelv.hu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "gotrail.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "gowin9.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "gowin9.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "grahamcluley.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "gram.tips", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "grandcafetwist.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "gratiswifivoorjegasten.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "greatagain.gov", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "greenitpark.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "grengine.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "grexx.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "grexx.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "grifomarchetti.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "grimstveit.no", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "groenewoud.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "gruenderwoche-dresden.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "grumpygamers.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "guiacidade.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "guideline.gov", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "guidelines.gov", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "guishem.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "gumannp.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "gumballs.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "guoliang.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "gutschein-spezialist.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "h1z1swap.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "ha-kunamatata.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "habbixed.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "habitat-domotique.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "habview.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "haccp.bergamo.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "hakase.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "hamon.cc", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "hanoibuffet.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "hansbijster.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "haptemic.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "has-no-email-set.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "hasecuritysolutions.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "hashimoto-jimusho.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "hayleishop.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "hdnastudio.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "healey.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "health.gov", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "healthfinder.gov", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "healthypeople.gov", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "hearty.gq", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "hearty.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "hebocon.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "heijdel.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "heinemann.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "heinemeier.dk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "heistheguy.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "helpfute.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "helpverif.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "helpwithmybank.gov", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "henkboelman.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "hermann.in", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "herrenmuehle-wein.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "heute.training", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "heyjournal.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "hf-tekst.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "hf51.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "hibari.moe", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "hideout.agency", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "hightechgadgets.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "hipnoseinstitute.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "hireprofs.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "hitokoto-mania.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "hiyobi.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "hl8999.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "hnyp.hu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "hoaas.no", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "hochzeitsgezwitscher.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "hodnos.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "homepage.shiga.jp", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "homyremedies.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "honeycreeper.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "hoorr.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "hope-line-earth.jp", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "horizonmoto.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "horvatnyelvkonyv.hu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "hotesb.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "hotesb.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "housekeeperlondon.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "howgoodwasmysex.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "hstspreload.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "hua-in.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "hua-li88.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "hua-li88.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "huangting.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "hubrecht.at", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "hui-in.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "hui-in.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "huislijn.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "humboldtmfg.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "hunstoncanoeclub.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "huntexpired.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "hyperactive.am", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "hztgzz.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "i-scream.space", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "i5y.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "iainsimms.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "iainsimms.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "iane-ccs.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "ich-hab-die-schnauze-voll-von-der-suche-nach-ner-kurzen-domain.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "icnsoft.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "ideapaisajistas.es", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "ideasenfoto.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "idered.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "idesignstudio.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "idrissi.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "ig.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "iha6.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "ikkbb.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "ikkev.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "imeid.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "immaternity.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "imponet.com.ar", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "imprenta-es.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "inetsoftware.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "infinite.hosting", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "infruction.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "ing89.cc", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "ing89.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "ingatlanneked.hu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "ingi.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "inmoodforsex.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "inspirationconcepts.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "instamojo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "intergenx.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "intergenx.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "intergenx.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "intergenx.org.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "interiery-waters.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "interiorprofesional.com.ar", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "interspot.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "invitethemhome.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "invuelto.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "iodine.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "iplayradio.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "ironhide.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "isaaczais.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "iskkk.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "istheinternetonfire.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "it-maker.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "iwch.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "iworos.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "iyassu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "izzys.casa", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "j0bs.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "jakob-server.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "jamalfi.bio", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "janhermann.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "jape.today", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "jastrow.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "javiermixdjs.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "jaysenjohnson.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "jci.cc", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "jdgonzalez95.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "jedayoshi.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "jeepeg.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "jenniferchan.id.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "jetapi.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "jetbrains.pw", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "jexler.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "jfsa.jp", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "jiid.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "jing-in.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "jing-in.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "jiosongs.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "jldp.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "jlot.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "jobers.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "jobers.pt", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "joblab.com.ua", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "joel.coffee", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "joeyhoer.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "johannes-bugenhagen.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "johanneskonrad.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "johego.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "jonespayne.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "jonincharacter.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "jonlu.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "joonatoona.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "jose-alexand.re", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "joshuadmiller.info", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "journalof.tech", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "jselby.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "judge2020.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "judge2020.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "juliohernandezgt.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "jungundwild-design.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "juridiqueo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "justiceo.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "justinrudio.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "jzachpearson.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "k38.cc", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "k4r.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "kaeru-seitai.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "kai.cool", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "kakuto.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "kalamos-psychiatrie.be", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "kaleidoskop-freiburg.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "kalwestelectric.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "kamppailusali.fi", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "kana-mono.biz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "kanag.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "kanr.in", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "kanzakiranko.jp", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "kanzlei-myca.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "kaotik4266.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "kargl.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "keematdekho.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "kescher.site", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "kfirba.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "kidsareatrip.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "kin.life", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "kinderjugendfreizeitverein.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "kirwandigital.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "kissesb.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "kissesb.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "kivitelezesbiztositas.hu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "klseet.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "kocherev.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "kochereva.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "kochhar.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "kogcoder.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "koka-shop.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "koninkrijk.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "konventa.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "kopio.jp", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "kopjethee.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "koppelvlak.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "korben.info", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "kostal.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "kotly-marten.com.ua", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "kouten-jp.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "koval.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "kowalstwo.com.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "kpforme.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "kraftzeiten.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "kraken.site", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "krasnodar-avia.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "krausen.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "kreditkarte-fuer-backpacker.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "kryptomodkingz.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "kupinska.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "kuroinu.jp", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "kwench.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "kyprexxo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "la-compagnie-des-elfes.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "laatjeniethackmaken.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "laboutiquedejuliette.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "labrat.mobi", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "lachosetypo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "ladyanna.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "lafcheta.info", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "lagit.in", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "lalalab.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "lalunecreative.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "lamaisondelatransformationculturelle.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "lamereabizix.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "langstreckensaufen.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "lanternhealth.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "lassesworld.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "lassesworld.se", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "launchpadder2.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "lauraofrank.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "lauriemilne.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "laut.digital", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "law.co.il", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "lc-cs.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "lcrmscp.gov", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "le-drive-de-just-vet.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "leaderoftheresistance.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "leaderoftheresistance.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "leadquest.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "learnforestry.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "lecoinchocolat.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "ledlampor365.se", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "legaleus.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "lengyelnyelvoktatas.hu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "lengyelul.hu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "leodraxler.at", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "leonauto.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "lesaffre.es", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "lesh.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "letempsdunefleur.be", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "leviaan.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "lhajn.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "lian-in.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "lian-in.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "liang-li88.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "liang-li88.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "librarytools.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "libre-service.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "lichttechnik-tumler.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "lieblingsholz.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "lieuu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "lifeinsurances.pro", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "lifeinsurances24.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "light-up.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "limbo.services", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "limn.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "lincnaarzorg.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "linux.im", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "linuxincluded.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "liquimoly.market", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "littlegreece.ae", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "liufengyu.cn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "livelifewithintent.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "localdata.us", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "locomotive.net.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "lojadarenda.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "lojavirtualfc.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "loket.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "loli.ski", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "losangelestown.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "lovebo9.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "lovebo9.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "lovingpenguin.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "lswim.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "ltaake.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "lucaslarson.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "ludum.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "luedeke-bremen.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "lufu.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "lui.pink", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "lxd.cc", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "lycly.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "lyscnd.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "mackiehouse.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "maddreefer.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "madridartcollection.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "maelstrom-fury.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "mahraartisan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "maisonpaulmier.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "makemyvape.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "makeurbiz.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "malone.link", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "mamaasia.info", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "mamafit.club", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "mamuko.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "manageathome.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "mantabiofuel.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "marcelinofranchini.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "marcelinofranchini.info", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "marcelinofranchini.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "marcelinofranchini.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "marco-goltz.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "marjoriecarvalho.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "mark-armstrong-gaming.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "marketingco.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "marketingromania.ro", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "marklauman.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "marpa-wohnen.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "marshyplay.live", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "martijnhielema.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "marustat.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "math.hamburg", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "matrixim.cc", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "mattari-app.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "mattmcshane.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "mauricedb.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "maxpl0it.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "mchan.us", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "mcpaoffice.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "md-clinica.com.ua", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "mdlayher.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "mediarocks.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "medinside.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "medinside.li", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "medinsider.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "medinsider.li", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "medschat.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "medvet.com.es", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "melopie.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "memo.ee", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "mendozagenevieve.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "mennace.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "menntagatt.is", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "metro-web.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "meujeitodigital.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "meyash.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "mfen.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "mfxer.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "miaonagemi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "michal-s.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "micomi.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "midkam.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "mikewritesstuff.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "mikhirev.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "min.kiwi", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "minehattan.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "minerva2015.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "ministeriumfuerinternet.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "minu.link", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "mirabalphoto.es", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "mirrorsedgearchive.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "mirrorsedgearchive.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "mitigationcommission.gov", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "mixer.cash", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "mjscustomcreations.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "mlmjam.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "mlpvector.club", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "mms.is", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "mobilebingoclub.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "mobilecasinoclub.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "mobilemalin.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "mobimalin.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "mobmp4.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "mobmp4.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "mobmp4.info", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "mockerel.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "modding-forum.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "modelclub-draveil.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "moebel-vergleichen.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "moisesbarrio.es", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "momfulfilled.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "momy-genealogie.info", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "mon-mobile.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "monalyse.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "monicabeckstrom.no", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "monodukuri.cafe", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "monodzukuri.cafe", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "monozukuri.cafe", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "moodforsex.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "moolah.rocks", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "moonbot.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "moreal.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "morepopcorn.co.nz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "motowilliams.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "movienized.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "mozartgroup.hu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "mrbuckykat.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "mrknee.gr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "mrparker.pw", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "mufibot.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "mushman.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "mustafaturhan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "myabcm.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "mycareersfuture.sg", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "myessaygeek.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "mygreatlakes.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "mymarketingcourses.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "mypaperdone.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "myref.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "mysexydate24.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "mysongbird.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "mytun.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "n64chan.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "nakada4610.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "nameme.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "namskra.is", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "naomi.es", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "nataniel-perissier.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "nationalbank.gov", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "nationalbanknet.gov", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "nay.moe", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "nba669.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "nba686.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "nbad.al", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "nc-beautypro.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "nc-formation.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "nc-network.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "necio.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "neilfarrington.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "nekox.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "neocyd.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "neoeliteconsulting.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "neonataleducationalresources.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "neonatalgoldenhours.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "nepageeks.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "nepremicninar.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "nepremicnine.click", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "nepremicnine.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "net-masters.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "nethask.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "netsparker.com.tr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "nettamente.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "neurolab.no", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "news4c.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "ngc.gov", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "nhsuites.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "nicholaswilliams.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "nickscomputers.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "nightsi.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "nikkasystems.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "nimidam.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "ninepints.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "nirjonmela.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "noelblog.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "noise.agency", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "noisetor.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "nolimits.net.nz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "nomenclator.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "nordlichter-brv.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "norichanmama.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "normanschwaneberg.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "northokanaganbookkeeping.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "novgorod-avia.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "novosibavia.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "nsa.ovh", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "nsapwn.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "nutriciametabolics-shop.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "nutrishop.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "o8b.club", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "oclausen.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "octo.im", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "octohost.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "ohohrazi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "oisd.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "olgui.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "oliveoil.bot", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "oliverclausen.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "oliviervaillancourt.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "ollies.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "onahonavi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "ondcp.gov", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "oneidentity.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "onetly.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "oni.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "online-calculator.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "online-stopwatch.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "online.net.gr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "onlyesb.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "onlyesb.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "onsgenoegen-waz.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "onspring.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "opalesurfcasting.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "openclima.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "opentuition.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "operationforever.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "oppag.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "optm.us", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "orbitdefence.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "oregonmu.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "orum.in", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "osla.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "osmre.gov", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "otus-magnum.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "ouowo.gq", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "pablo.scot", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "pablo.sh", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "pabloarteaga.com.es", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "pabloarteaga.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "pabloarteaga.info", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "pabloarteaga.nom.es", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "pabloarteaga.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "pabloarteaga.science", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "pabloarteaga.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "pacifique-web.nc", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "packshot-creator.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "padron.com.es", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "pagalworld.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "pagalworld.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "pagalworld.info", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "pagalworld.la", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "paincareehr.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "paket.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "palawan.jp", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "palazzotalamo.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "pangci.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "papapa-members.club", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "papotage.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "paradependentesquimicos.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "parisderriere.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "pasearch.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "passvanille-reservation.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "patentados.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "patika-biztositas.hu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "paulmeier.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "pay.gov", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "pb.ax", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "pcdocjim.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "peaceispossible.cc", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "pearlcohen.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "peddy.dyndns.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "pedro.com.es", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "pelotonimports.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "penguinprotocols.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "penispumpen.se", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "pepper.dog", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "perm-avia.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "permajackofstlouis.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "petit-archer.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "pflan.dk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "pflegesalon-siebke.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "pi-net.dedyn.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "pierreprinetti.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "pimpmypaper.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "pinklittlenotebook.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "pixiv.cat", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "pixloc.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "plagiarismcheck.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "planer.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "planetanim.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "plannedlink.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "planujemywesele.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "plasticsurgerynola.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "playreal.city", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "plerion.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "pm25.im", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "pmgnet.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "pneu01.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "pneu74.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "pocakdrops.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "pocakking.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "pocitacezababku.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "pocket-lint.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "pohlmann.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "pointworksacademy.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "policereferencecheck.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "pomfeed.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "pomozmruczkom.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "poolspondsandwaterscapes.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "popcultureshack.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "port.im", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "posijson.stream", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "powerserg.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "powersergholdings.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "powertothebuilder.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "pozlife.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "praktijkdevecht.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "pritchett.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "privatecapsecurity.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "pro-esb.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "pro-esb.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "prodware.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "proesb.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "proesb.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "projectl1b1t1na.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "promotioncentre.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "proteogenix-products.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "protocol.ai", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "prylarprylar.se", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "psdsuc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "pthsec.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "publicinquiry.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "pulpproject.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "punchunique.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "purplehippie.in", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "putman-it.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "puzzlage.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "pvda.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "pvpctutorials.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "pycycle.info", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "pzsearch.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "qc.immo", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "qclt.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "qruiser.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "quanwuji.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "quartix.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "quartzclinical.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "quilmo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "quimsertek.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "qwdqwd.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "qwq.moe", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "r1ch.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "radartatska.se", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "radartek.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "radiorsvp.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "rammstein-portugal.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "rangsmo.se", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "ranyeh.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "raphrfg.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "rapidemobile.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "rapidflow.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "raucris.ro", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "raviparekh.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "raystark.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "raywin168.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "raywin168.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "raywin88.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "recipex.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "red-trigger.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "red2fred2.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "redactieco.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "regency-fire.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "regency-fire.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "regisearch.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "registerra.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "renewmedispa.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "resfriatech.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "reviewninja.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "richamorindonesia.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "ricky.capital", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "ristrutturazioneappartamento.roma.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "rizalpalawan.gov.ph", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "rlnunez.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "robertnemec.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "robertocasares.no-ip.biz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "roboth.am", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "rodarion.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "roelbazuin.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "roligprylar.se", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "rollercoasteritalia.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "rollingbarge.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "rook-playz.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "roopakv.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "rootkea.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "ropd.info", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "roseparkhouse.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "rosetiger.life", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "rostov-avia.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "ruaneattorneys.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "ruobr.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "rushyo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "rwx.ovh", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "s-n-unso.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "s-s-paint.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "s3cases.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "s44.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "sabtunes.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "saintw.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "sajamstudija.info", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "salon1.ee", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "samanthasicecream.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "samara-avia.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "sandiegotown.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "sapphireblue.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "sarahplusdrei.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "sasrobotics.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "sativatunja.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "saxeandthecity.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "sbrouwer.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "schollbox.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "schwerkraftlabor.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "scib.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "scicomm.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "scijinks.gov", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "scrapmalin.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "screenmachine.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "sdxcentral.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "sean-wright.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "season.moe", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "sebastianpedersen.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "sebasveeke.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "sec.red", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "sec455.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "sec530.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "sec555.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "secureim.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "seehimnaked.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "seehimnude.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "seehisnudes.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "seobutler.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "sergiozygmunt.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "servida.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "setenforce.one", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "sevenicealimentos.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "sexdocka.nu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "sharelovenotsecrets.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "shaunandamyswedding.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "shico.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "shiga1.jp", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "shihadwiki.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "shouttag.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "shteiman.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "shura.eu.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "silerfamily.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "sim-minaoshi.jp", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "simhaf.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "simplyregister.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "sinclairinat0r.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "sinn.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "sipsik.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "sjaakgilsingfashion.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "skanword.info", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "skedda.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "skepneklaw.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "skiddle.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "skippy.dog", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "sknclinics.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "skolagatt.is", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "skyderby.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "slashcrypto.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "sleepstar.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "slonep.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "smadav.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "smalle-voet.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "smartcpa.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "smilingmiao.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "smx.net.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "socialtrends.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "societe-chablaisienne-de-revetements.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "societe-chablaisienne-de-revetements.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "sodadigital.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "softart.club", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "sokouchousa.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "solvingproblems.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "sommefeldt.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "sompani.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "sonicdoe.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "sorenam.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "sortesim.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "soruly.moe", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "spaconnection.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "spaldingwall.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "spanyolul.hu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "sparendirekt.at", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "sparprofi.at", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "spcx.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "specialtyalloys.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "speechdrop.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "speedof.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "speedway.com.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "spellchecker.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "spindrift.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "splintermail.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "spoluck.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "sponsormatch.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "spookyinternet.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "spot-lumiere-led.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "spotrebitelskecentrum.sk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "sr-33.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "ssbgportal.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "ssc8689.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "ssc8689.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "ssdservers.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "ssready.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "staktrace.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "startle.cloud", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "stdev.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "steamhours.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "stemapp.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "steuerberater-essen-steele.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "stevemonteyne.be", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "stickeramoi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "stiffordacademy.org.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "stouter.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "striata.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "stuudium.cloud", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "stuudium.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "subrosr.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "succesprojekter.dk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "sudo.org.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "sunfulong.blog", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "sunriseafricarelief.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "super-demarche.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "supperclub.es", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "surfocal.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "suroil.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "swallsoft.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "swallsoft.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "swap.gg", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "sweep.cards", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "sweet-orr.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "sweets-mimatsu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "swisstechtalks.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "swordfighting.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "sym01.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "symetria.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "systemadmin.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "systemd.eu.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "szerbnyelvkonyv.hu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "szlovaknyelv.hu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "szlovennyelv.hu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "tacklinglife.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "tadluedtke.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "tai-in.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "tai-in.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "takebackyourstate.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "takebackyourstate.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "takebackyourstate.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "tangsisi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "taniafitness.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "taniafitness.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "tanie-uslugi-ksiegowe.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "tariff.cc", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "tass.nu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "tbys.us", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "tchaka.top", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "teambodyproject.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "teamninjaapp.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "techdroid.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "techformator.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "technosuport.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "tecnologiasurbanas.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "telefonogratuito.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "telfordwhitehouse.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "tematicas.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "tennisapp.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "tenpo-iku.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "tenzer.dk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "termax.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "terra.fitness", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "tfreeman.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "theadultswiki.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "theconcordbridge.azurewebsites.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "theemasphere.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "thefasterweb.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "thefengshuioffice.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "thegemriverside.com.vn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "thehiddenbay.ws", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "theplaidpoodle.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "thesaurus.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "thesignacademy.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "thesmallbusinesswebsiteguy.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "thewarrencenter.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "thewoolroom.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "thinegen.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "thisdot.site", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "thomas.love", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "thriveweb.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "tigit.co.nz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "tiglitub.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "timetech.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "timothybjacobs.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "tinlc.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "tiny.ee", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "titanpointe.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "tju.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "to2mbn.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "tobias-kleinmann.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "tobyx.is", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "todacarreira.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "toekomstperspectief.be", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "tokinoha.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "tokky.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "tomaspatera.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "tomlowenthal.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "tomosm.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "toolkits.design", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "toothdoc.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "top-esb.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "topbilan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "topesb.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "topicdesk.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "toponlinecasinosites.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "topwindowcleaners.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "torngalaxy.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "torte.roma.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "totodil.es", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "totolabs.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "touchweb.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "touhou.fm", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "tourtrektrip.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "tovp.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "toyota-kinenkan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "trackingstream.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "trade-arcade.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "travel1x1.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "travellovers.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "treaslockbox.gov", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "treetopsecurity.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "tribly.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "troomcafe.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "trouver-son-chemin.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "troykelly.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "trustednetworks.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "tryfm.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "trygarciniaslimdiet.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "ttyystudio.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "turnaroundforum.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "tutorme.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "tuwaner.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "tuza.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "tv-programme.be", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "tv-programme.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "txbi.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "uahs.org.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "uhlhosting.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "ultimate-uk.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "ultrasite.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "umbriel.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "unblock-zh.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "unccelearn.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "unefleur.be", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "unidevgroup.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "unifiednetwork.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "uno.fi", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "upperroommission.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "urbanmic.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "urth.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "usbr.gov", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "utcast-mate.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "utgifter.no", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "valudo.st", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "vanderbiltcisa.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "vantagepointpreneed.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "vasilikieleftheriou.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "vats.im", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "vatsim-uk.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "vatsim.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "vaughanrisher.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "vcps.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "vega-motor.com.ua", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "vegalengd.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "vegguide.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "veit.zone", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "ventilateurs-plafond.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "veraandsteve.date", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "verbier-lechable.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "vernonfigureskatingclub.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "very-kids.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "victoreriksson.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "victoreriksson.info", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "victoreriksson.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "victoreriksson.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "victoreriksson.nu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "victoreriksson.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "vidadu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "vidb.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "videoload.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "videospornogratis.pt", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "villamariaamalfi.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "vinogradovka.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "vintagebandfestival.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "vintagesouthernpicks.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "vipesball.cc", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "vipesball.info", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "vipesball.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "vipesball.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "visit-montenegro.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "vizija-nepremicnine.si", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "vjhfoundation.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "vmstan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "volbyzive.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "vrijgezellenfeestzwolle.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "vucdn.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "vynedmusic.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "w50.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "w84.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "wai-in.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "waka168.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "waka168.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "waka88.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "wakfu.cc", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "wakiminblog.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "waltzmanplasticsurgery.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "walvi.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "wannaridecostarica.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "warcraftjournal.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "wasatchcrest.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "waylee.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "web-demarche.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "webdesignlabor.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "webev.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "websitesabq.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "webwednesday.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "weiltoast.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "weld.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "wen-in.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "wen-in.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "werkenvoorphiladelphia.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "wezl.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "whistler-transfers.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "whitehousedrugpolicy.gov", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "whoasome.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "whocybered.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "willowtree.school", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "wisak.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "woktoss.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "woodcoin.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "woonboulevardvolendam.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "worf.in", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "workissime.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "workshopszwolle.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "workshopzwolle.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "worldcareers.dk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "wpformation.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "wphelpwithhomework.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "writemyessay.today", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "wrmea.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "wuxiaohen.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "wybar.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "wzfetish.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "xanadu-taxi.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "xilegames.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "xin-in.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "xin-in.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "xing-in.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "xinghuokeji.xin", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "xn--lnakuten-9za.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "xn--n8jubz39q0g0afpa985c.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "xn--pckqk6xk43lunk.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "xn--zr9h.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "xn--zr9h.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "xn--zr9h.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "xn--zr9h.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "xnu.kr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "xsec.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "xuan-li88.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "xuan-li88.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "xxxlbox.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "yacineboumaza.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "yakaz.cl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "yakaz.com.ar", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "yakaz.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "yakaz.com.mx", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "yakaz.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "yakaz.es", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "yakaz.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "yakaz.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "yannick.cloud", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "yao-in.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "yao-in.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "ybscareers.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "yenibilgi.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "yetishirt.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "yimgo.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "yocchan1513.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "yoga-alliance-teacher-training.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "yongbin.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "yourfriendlytech.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "ysx.me.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "yubico.se", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "yubikey.se", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "yuema.net.cn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "yummylooks.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "yurisviridov.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "yusu.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "yutang.vn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "yvetteerasmus.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "yzcloud.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "z-latko.info", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "zacharyschneider.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "zachschneider.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "zaem.tv", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "zaghyr.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "zalohovaniburian.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "zargescases.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "zekesnider.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "zeroseteatacado.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "zgan.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "zhiwei.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "zhuweiyou.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "zitseng.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "zorki.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "zrnieckapresny.sk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "zuan-in.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "zyciedogorynogami.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+ { "name": "zyrillezuno.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
// END OF 1-YEAR BULK HSTS ENTRIES
// Only eTLD+1 domains can be submitted automatically to hstspreload.org,
@@ -41627,6 +44253,8 @@
{ "name": "mitm-software.badssl.com", "policy": "custom", "mode": "force-https", "include_subdomains": true },
{ "name": "www.hyatt.com", "policy": "custom", "mode": "force-https", "include_subdomains": true },
{ "name": "connect.facebook.net", "policy": "custom", "mode": "force-https", "include_subdomains": true },
+ { "name": "bing.com", "policy": "custom", "mode": "force-https", "include_subdomains": true },
+ { "name": "fan.gov", "policy": "custom", "mode": "force-https", "include_subdomains": true },
// No subdomains
{ "name": "wordpress.com", "policy": "custom", "mode": "force-https", "include_subdomains": false },
{ "name": "www.wordpress.com", "policy": "custom", "mode": "force-https", "include_subdomains": false },
@@ -41635,11 +44263,12 @@
{ "name": "swehack.org", "policy": "custom", "mode": "force-https", "include_subdomains": true, "pins": "swehackCom" },
{ "name": "ncsccs.com", "policy": "custom", "mode": "force-https", "include_subdomains": true, "pins": "ncsccs" },
{ "name": "themathematician.uk", "policy": "custom", "mode": "force-https", "include_subdomains": true, "pins": "ncsccs" },
- // TODO(lgarron): hstspreload.org can't scan IPv6-only sites due to Google
+ // TODO(elawrence): hstspreload.org can't scan IPv6-only sites due to Google
// Cloud limitations. Move these entries to the bulk entries once they can
// be handled automatically: github.com/chromium/hstspreload.org/issues/43
// IPv6
{ "name": "ipv6only.network", "policy": "custom", "mode": "force-https", "include_subdomains": true },
+ { "name": "trinity.fr.eu.org", "policy": "custom", "mode": "force-https", "include_subdomains": true },
// Expect-CT/Expect-Staple
{
"name": "crt.sh", "policy": "custom",
@@ -41827,6 +44456,7 @@
{ "name": "safecar.gov", "policy": "public-suffix-requested", "mode": "force-https", "include_subdomains": true },
{ "name": "famep.gov", "policy": "public-suffix-requested", "mode": "force-https", "include_subdomains": true },
{ "name": "nationalmall.gov", "policy": "public-suffix-requested", "mode": "force-https", "include_subdomains": true },
+ { "name": "mytuleap.com", "policy": "public-suffix-requested", "mode": "force-https", "include_subdomains": true },
// 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_unittest.cc b/chromium/net/http/transport_security_state_unittest.cc
index d7a0df28483..c1569892b3d 100644
--- a/chromium/net/http/transport_security_state_unittest.cc
+++ b/chromium/net/http/transport_security_state_unittest.cc
@@ -246,7 +246,7 @@ void CheckHPKPReport(
const HashValueVector& known_pins) {
std::unique_ptr<base::Value> value(base::JSONReader::Read(report));
ASSERT_TRUE(value);
- ASSERT_TRUE(value->IsType(base::Value::Type::DICTIONARY));
+ ASSERT_TRUE(value->is_dict());
base::DictionaryValue* report_dict;
ASSERT_TRUE(value->GetAsDictionary(&report_dict));
@@ -311,7 +311,7 @@ void CheckSerializedExpectStapleReport(const std::string& report,
const std::string& cert_status) {
std::unique_ptr<base::Value> value(base::JSONReader::Read(report));
ASSERT_TRUE(value);
- ASSERT_TRUE(value->IsType(base::Value::Type::DICTIONARY));
+ ASSERT_TRUE(value->is_dict());
base::DictionaryValue* report_dict;
ASSERT_TRUE(value->GetAsDictionary(&report_dict));
@@ -2220,8 +2220,8 @@ TEST_F(TransportSecurityStateTest, RequireCTConsultsDelegate) {
ASSERT_TRUE(cert);
HashValueVector hashes;
- hashes.push_back(HashValue(
- X509Certificate::CalculateFingerprint256(cert->os_cert_handle())));
+ hashes.push_back(
+ HashValue(X509Certificate::CalculateFingerprint256(cert->cert_buffer())));
{
TransportSecurityState state;
@@ -2357,11 +2357,11 @@ TEST_F(TransportSecurityStateTest, RequireCTForSymantec) {
ImportCertFromFile(GetTestCertsDirectory(), "post_june_2016.pem");
ASSERT_TRUE(after_cert);
- SHA256HashValue symantec_hash_value = {
+ const SHA256HashValue symantec_hash_value = {
{0xb2, 0xde, 0xf5, 0x36, 0x2a, 0xd3, 0xfa, 0xcd, 0x04, 0xbd, 0x29,
0x04, 0x7a, 0x43, 0x84, 0x4f, 0x76, 0x70, 0x34, 0xea, 0x48, 0x92,
0xf8, 0x0e, 0x56, 0xbe, 0xe6, 0x90, 0x24, 0x3e, 0x25, 0x02}};
- SHA256HashValue google_hash_value = {
+ const SHA256HashValue google_hash_value = {
{0xec, 0x72, 0x29, 0x69, 0xcb, 0x64, 0x20, 0x0a, 0xb6, 0x63, 0x8f,
0x68, 0xac, 0x53, 0x8e, 0x40, 0xab, 0xab, 0x5b, 0x19, 0xa6, 0x48,
0x56, 0x61, 0x04, 0x2a, 0x10, 0x61, 0xc4, 0x61, 0x27, 0x76}};
@@ -2473,6 +2473,93 @@ TEST_F(TransportSecurityStateTest, RequireCTForSymantec) {
ct::CTPolicyCompliance::CT_POLICY_NOT_ENOUGH_SCTS));
}
+// Tests that Certificate Transparency is required for all of the Symantec
+// Managed CAs, regardless of when the certificate was issued.
+TEST_F(TransportSecurityStateTest, RequireCTForSymantecManagedCAs) {
+ const SHA256HashValue symantec_hash_value = {
+ {0xb2, 0xde, 0xf5, 0x36, 0x2a, 0xd3, 0xfa, 0xcd, 0x04, 0xbd, 0x29,
+ 0x04, 0x7a, 0x43, 0x84, 0x4f, 0x76, 0x70, 0x34, 0xea, 0x48, 0x92,
+ 0xf8, 0x0e, 0x56, 0xbe, 0xe6, 0x90, 0x24, 0x3e, 0x25, 0x02}};
+ const SHA256HashValue managed_hash_value = {
+ {0x7c, 0xac, 0x9a, 0x0f, 0xf3, 0x15, 0x38, 0x77, 0x50, 0xba, 0x8b,
+ 0xaf, 0xdb, 0x1c, 0x2b, 0xc2, 0x9b, 0x3f, 0x0b, 0xba, 0x16, 0x36,
+ 0x2c, 0xa9, 0x3a, 0x90, 0xf8, 0x4d, 0xa2, 0xdf, 0x5f, 0x3e}};
+
+ TransportSecurityState state;
+
+ HashValueVector hashes;
+ hashes.push_back(HashValue(symantec_hash_value));
+ hashes.push_back(HashValue(managed_hash_value));
+
+ // All certificates, both before and after the pre-existing 1 June 2016
+ // date, are expected to be compliant.
+ scoped_refptr<X509Certificate> before_cert =
+ ImportCertFromFile(GetTestCertsDirectory(), "pre_june_2016.pem");
+ ASSERT_TRUE(before_cert);
+
+ EXPECT_EQ(
+ TransportSecurityState::CT_REQUIREMENTS_NOT_MET,
+ state.CheckCTRequirements(
+ HostPortPair("www.example.com", 443), true, hashes, before_cert.get(),
+ before_cert.get(), SignedCertificateTimestampAndStatusList(),
+ TransportSecurityState::ENABLE_EXPECT_CT_REPORTS,
+ ct::CTPolicyCompliance::CT_POLICY_NOT_ENOUGH_SCTS));
+ EXPECT_EQ(
+ TransportSecurityState::CT_REQUIREMENTS_NOT_MET,
+ state.CheckCTRequirements(
+ HostPortPair("www.example.com", 443), true, hashes, before_cert.get(),
+ before_cert.get(), SignedCertificateTimestampAndStatusList(),
+ TransportSecurityState::ENABLE_EXPECT_CT_REPORTS,
+ ct::CTPolicyCompliance::CT_POLICY_NOT_DIVERSE_SCTS));
+ EXPECT_EQ(
+ TransportSecurityState::CT_REQUIREMENTS_MET,
+ state.CheckCTRequirements(
+ HostPortPair("www.example.com", 443), true, hashes, before_cert.get(),
+ before_cert.get(), SignedCertificateTimestampAndStatusList(),
+ TransportSecurityState::ENABLE_EXPECT_CT_REPORTS,
+ ct::CTPolicyCompliance::CT_POLICY_BUILD_NOT_TIMELY));
+ EXPECT_EQ(
+ TransportSecurityState::CT_REQUIREMENTS_MET,
+ state.CheckCTRequirements(
+ HostPortPair("www.example.com", 443), true, hashes, before_cert.get(),
+ before_cert.get(), SignedCertificateTimestampAndStatusList(),
+ TransportSecurityState::ENABLE_EXPECT_CT_REPORTS,
+ ct::CTPolicyCompliance::CT_POLICY_COMPLIES_VIA_SCTS));
+
+ scoped_refptr<X509Certificate> after_cert =
+ ImportCertFromFile(GetTestCertsDirectory(), "post_june_2016.pem");
+ ASSERT_TRUE(after_cert);
+
+ EXPECT_EQ(
+ TransportSecurityState::CT_REQUIREMENTS_NOT_MET,
+ state.CheckCTRequirements(
+ HostPortPair("www.example.com", 443), true, hashes, after_cert.get(),
+ after_cert.get(), SignedCertificateTimestampAndStatusList(),
+ TransportSecurityState::ENABLE_EXPECT_CT_REPORTS,
+ ct::CTPolicyCompliance::CT_POLICY_NOT_ENOUGH_SCTS));
+ EXPECT_EQ(
+ TransportSecurityState::CT_REQUIREMENTS_NOT_MET,
+ state.CheckCTRequirements(
+ HostPortPair("www.example.com", 443), true, hashes, after_cert.get(),
+ after_cert.get(), SignedCertificateTimestampAndStatusList(),
+ TransportSecurityState::ENABLE_EXPECT_CT_REPORTS,
+ ct::CTPolicyCompliance::CT_POLICY_NOT_DIVERSE_SCTS));
+ EXPECT_EQ(
+ TransportSecurityState::CT_REQUIREMENTS_MET,
+ state.CheckCTRequirements(
+ HostPortPair("www.example.com", 443), true, hashes, after_cert.get(),
+ after_cert.get(), SignedCertificateTimestampAndStatusList(),
+ TransportSecurityState::ENABLE_EXPECT_CT_REPORTS,
+ ct::CTPolicyCompliance::CT_POLICY_BUILD_NOT_TIMELY));
+ EXPECT_EQ(
+ TransportSecurityState::CT_REQUIREMENTS_MET,
+ state.CheckCTRequirements(
+ HostPortPair("www.example.com", 443), true, hashes, after_cert.get(),
+ after_cert.get(), SignedCertificateTimestampAndStatusList(),
+ TransportSecurityState::ENABLE_EXPECT_CT_REPORTS,
+ ct::CTPolicyCompliance::CT_POLICY_COMPLIES_VIA_SCTS));
+}
+
// Tests that dynamic Expect-CT state is cleared from ClearDynamicData().
TEST_F(TransportSecurityStateTest, DynamicExpectCTStateCleared) {
base::test::ScopedFeatureList feature_list;
@@ -3104,6 +3191,8 @@ TEST_F(TransportSecurityStateStaticTest, IsPreloaded) {
const std::string google = "google";
const std::string www_google = "www.google";
const std::string foo = "foo";
+ const std::string bank = "example.bank";
+ const std::string insurance = "sub.example.insurance";
TransportSecurityState state;
TransportSecurityState::STSState sts_state;
@@ -3115,6 +3204,10 @@ TEST_F(TransportSecurityStateStaticTest, IsPreloaded) {
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_TRUE(GetStaticDomainState(&state, bank, &sts_state, &pkp_state));
+ EXPECT_TRUE(sts_state.include_subdomains);
+ EXPECT_TRUE(GetStaticDomainState(&state, insurance, &sts_state, &pkp_state));
+ EXPECT_TRUE(sts_state.include_subdomains);
EXPECT_FALSE(
GetStaticDomainState(&state, a_www_paypal, &sts_state, &pkp_state));
EXPECT_FALSE(
@@ -3347,6 +3440,9 @@ TEST_F(TransportSecurityStateStaticTest, Preloaded) {
EXPECT_TRUE(StaticShouldRedirect("crate.io"));
EXPECT_TRUE(StaticShouldRedirect("foo.crate.io"));
+
+ EXPECT_TRUE(StaticShouldRedirect("sub.bank"));
+ EXPECT_TRUE(StaticShouldRedirect("sub.insurance"));
}
TEST_F(TransportSecurityStateStaticTest, PreloadedPins) {
@@ -3498,7 +3594,7 @@ TEST_F(TransportSecurityStateStaticTest, OptionalHSTSCertPins) {
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("redirector.gvt1.com"));
EXPECT_TRUE(HasStaticPublicKeyPins("a.googlegroups.com"));
}