Index: components/cronet/url_request_context_config.cc |
diff --git a/components/cronet/url_request_context_config.cc b/components/cronet/url_request_context_config.cc |
index 570173b1504c03507f148c1f5881e6b660566222..5852f9c31b948e11a5d9d9a05451734d716e1657 100644 |
--- a/components/cronet/url_request_context_config.cc |
+++ b/components/cronet/url_request_context_config.cc |
@@ -15,6 +15,7 @@ |
#include "base/values.h" |
#include "net/cert/cert_verifier.h" |
#include "net/dns/host_resolver.h" |
+#include "net/dns/mapped_host_resolver.h" |
#include "net/http/http_server_properties.h" |
#include "net/quic/quic_protocol.h" |
#include "net/quic/quic_utils.h" |
@@ -55,6 +56,11 @@ const char kAsyncDnsFieldTrialName[] = "AsyncDNS"; |
// Name of boolean to enable AsyncDNS experiment. |
const char kAsyncDnsEnable[] = "enable"; |
+// Rules to override DNS resolution. Intended for testing. |
+// See explanation of format in net/dns/mapped_host_resolver.h. |
+const char kHostResolverRulesFieldTrialName[] = "HostResolverRules"; |
+const char kHostResolverRules[] = "host_resolver_rules"; |
+ |
const char kSSLKeyLogFile[] = "ssl_key_log_file"; |
void ParseAndSetExperimentalOptions( |
@@ -65,6 +71,8 @@ void ParseAndSetExperimentalOptions( |
if (experimental_options.empty()) |
return; |
+ DCHECK(net_log != nullptr); |
pauljensen
2016/06/10 14:19:37
remove " != nullptr" so it matches other DCHECKs i
mgersh
2016/06/29 17:43:31
Done.
|
+ |
DVLOG(1) << "Experimental Options:" << experimental_options; |
std::unique_ptr<base::Value> options = |
base::JSONReader::Read(experimental_options); |
@@ -185,22 +193,33 @@ void ParseAndSetExperimentalOptions( |
} |
} |
+ std::unique_ptr<net::HostResolver> host_resolver = |
+ net::HostResolver::CreateDefaultResolver(net_log); |
+ |
const base::DictionaryValue* async_dns_args = nullptr; |
if (dict->GetDictionary(kAsyncDnsFieldTrialName, &async_dns_args)) { |
bool async_dns_enable = false; |
if (async_dns_args->GetBoolean(kAsyncDnsEnable, &async_dns_enable) && |
async_dns_enable) { |
- if (net_log == nullptr) { |
- DCHECK(false) << "AsyncDNS experiment requires NetLog."; |
- } else { |
- std::unique_ptr<net::HostResolver> host_resolver( |
- net::HostResolver::CreateDefaultResolver(net_log)); |
- host_resolver->SetDnsClientEnabled(true); |
- context_builder->set_host_resolver(std::move(host_resolver)); |
- } |
+ host_resolver->SetDnsClientEnabled(true); |
} |
} |
+ const base::DictionaryValue* host_resolver_args = nullptr; |
+ if (dict->GetDictionary(kHostResolverRulesFieldTrialName, |
+ &host_resolver_args)) { |
+ std::string host_resolver_rules; |
+ if (host_resolver_args->GetString(kHostResolverRules, |
+ &host_resolver_rules)) { |
+ std::unique_ptr<net::MappedHostResolver> remapped_resolver( |
+ new net::MappedHostResolver(std::move(host_resolver))); |
+ remapped_resolver->SetRulesFromString(host_resolver_rules); |
+ host_resolver = std::move(remapped_resolver); |
+ } |
+ } |
+ |
+ context_builder->set_host_resolver(std::move(host_resolver)); |
+ |
std::string ssl_key_log_file_string; |
if (dict->GetString(kSSLKeyLogFile, &ssl_key_log_file_string)) { |
DCHECK(file_task_runner); |
@@ -273,6 +292,8 @@ void URLRequestContextConfig::ConfigureURLRequestContextBuilder( |
net::URLRequestContextBuilder* context_builder, |
net::NetLog* net_log, |
const scoped_refptr<base::SequencedTaskRunner>& file_task_runner) { |
+ DCHECK(net_log) << "A valid NetLog is required"; |
pauljensen
2016/06/10 14:19:37
Can we remove the error message? This is an inter
mgersh
2016/06/29 17:43:31
Done.
|
+ |
std::string config_cache; |
if (http_cache != DISABLED) { |
net::URLRequestContextBuilder::HttpCacheParams cache_params; |