diff options
author | Allan Sandfeld Jensen <allan.jensen@qt.io> | 2018-01-31 16:33:43 +0100 |
---|---|---|
committer | Allan Sandfeld Jensen <allan.jensen@qt.io> | 2018-02-06 16:33:22 +0000 |
commit | da51f56cc21233c2d30f0fe0d171727c3102b2e0 (patch) | |
tree | 4e579ab70ce4b19bee7984237f3ce05a96d59d83 /chromium/net/http | |
parent | c8c2d1901aec01e934adf561a9fdf0cc776cdef8 (diff) | |
download | qtwebengine-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')
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(¶llel_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")); } |