From 66d87922b2f707683b4a1bf29380ae770b091fd8 Mon Sep 17 00:00:00 2001 From: Steven McDonald Date: Wed, 4 Jun 2025 11:30:18 -0700 Subject: [PATCH] Cronet option to set Resolver Rules from GreatFire Envoy Matthew Bogner's patch to enable a resolver rules param for Cronet --- components/cronet/android/api.txt | 4 +++- .../api/src/org/chromium/net/CronetEngine.java | 9 +++++++++ .../org/chromium/net/ICronetEngineBuilder.java | 2 ++ components/cronet/android/api_version.txt | 2 +- .../cronet/android/cronet_context_adapter.cc | 1 + .../impl/AndroidHttpEngineBuilderWrapper.java | 7 +++++++ .../net/impl/CronetEngineBuilderImpl.java | 11 +++++++++++ .../net/impl/CronetUrlRequestContext.java | 4 ++++ .../android/proto/request_context_config.proto | 1 + .../CronetSampleApplication.java | 4 +++- .../ExperimentalOptionsTranslationTestUtil.java | 5 +++++ components/cronet/native/cronet.idl | 6 ++++++ components/cronet/native/engine.cc | 1 + .../cronet/native/generated/cronet.idl_c.h | 6 ++++++ .../native/generated/cronet.idl_impl_struct.cc | 12 ++++++++++++ .../native/generated/cronet.idl_impl_struct.h | 1 + components/cronet/native/sample/main.cc | 1 + components/cronet/url_request_context_config.cc | 8 ++++++-- components/cronet/url_request_context_config.h | 9 +++++++++ net/url_request/url_request_context.h | 5 +++++ net/url_request/url_request_context_builder.cc | 17 ++++++++++++++++- net/url_request/url_request_context_builder.h | 7 +++++++ 22 files changed, 117 insertions(+), 6 deletions(-) diff --git a/components/cronet/android/api.txt b/components/cronet/android/api.txt index dd438268ceb942..eca7ab68ce8a67 100644 --- a/components/cronet/android/api.txt +++ b/components/cronet/android/api.txt @@ -101,6 +101,7 @@ public class org.chromium.net.CronetEngine$Builder { public org.chromium.net.CronetEngine$Builder setLibraryLoader(org.chromium.net.CronetEngine$Builder$LibraryLoader); public org.chromium.net.CronetEngine$Builder setQuicOptions(org.chromium.net.QuicOptions$Builder); public org.chromium.net.CronetEngine$Builder setQuicOptions(org.chromium.net.QuicOptions); + public org.chromium.net.CronetEngine$Builder setResolverRules(java.lang.String); public org.chromium.net.CronetEngine$Builder setStoragePath(java.lang.String); public org.chromium.net.CronetEngine$Builder setThreadPriority(int); public org.chromium.net.CronetEngine$Builder setUserAgent(java.lang.String); @@ -323,6 +324,7 @@ public abstract class org.chromium.net.ICronetEngineBuilder { public abstract org.chromium.net.ICronetEngineBuilder enableSdch(boolean); public abstract org.chromium.net.ICronetEngineBuilder setExperimentalOptions(java.lang.String); public abstract org.chromium.net.ICronetEngineBuilder setLibraryLoader(org.chromium.net.CronetEngine$Builder$LibraryLoader); + public abstract org.chromium.net.ICronetEngineBuilder setResolverRules(java.lang.String); public abstract org.chromium.net.ICronetEngineBuilder setStoragePath(java.lang.String); public abstract org.chromium.net.ICronetEngineBuilder setUserAgent(java.lang.String); public org.chromium.net.ICronetEngineBuilder enableBrotli(boolean); @@ -640,4 +642,4 @@ public class org.chromium.net.apihelpers.UrlRequestCallbacks { public static org.chromium.net.apihelpers.UrlRequestCallbacks$CallbackAndResponseFuturePair forStringBody(org.chromium.net.apihelpers.RedirectHandler); public static org.chromium.net.apihelpers.UrlRequestCallbacks$CallbackAndResponseFuturePair forJsonBody(org.chromium.net.apihelpers.RedirectHandler); } -Stamp: ded30b9fbe22dff6cc175cd483aa1e4b +Stamp: 06c7dfd8ce7ecfe8b9e39a807b298f20 diff --git a/components/cronet/android/api/src/org/chromium/net/CronetEngine.java b/components/cronet/android/api/src/org/chromium/net/CronetEngine.java index 69794dee12b5c2..16438d75b411a5 100644 --- a/components/cronet/android/api/src/org/chromium/net/CronetEngine.java +++ b/components/cronet/android/api/src/org/chromium/net/CronetEngine.java @@ -136,6 +136,15 @@ public abstract static class LibraryLoader { /** Reference to the actual builder implementation. {@hide exclude from JavaDoc}. */ protected final ICronetEngineBuilder mBuilderDelegate; + /** + * A string argument to be passed into MappedHostResolver->SetRulesFromString. It can + * be used to create direct mappings from domains to ips that override dns lookups. + */ + public Builder setResolverRules(String resolverRules) { + mBuilderDelegate.setResolverRules(resolverRules); + return this; + } + /** * Constructs a {@link Builder} object that facilitates creating a {@link CronetEngine}. The * default configuration enables HTTP/2 and QUIC, but disables the HTTP cache. diff --git a/components/cronet/android/api/src/org/chromium/net/ICronetEngineBuilder.java b/components/cronet/android/api/src/org/chromium/net/ICronetEngineBuilder.java index f340a87dc2ee15..7da703e283d4eb 100644 --- a/components/cronet/android/api/src/org/chromium/net/ICronetEngineBuilder.java +++ b/components/cronet/android/api/src/org/chromium/net/ICronetEngineBuilder.java @@ -75,6 +75,8 @@ public abstract ICronetEngineBuilder setLibraryLoader( public abstract ICronetEngineBuilder setUserAgent(String userAgent); + public abstract ICronetEngineBuilder setResolverRules(String resolverRules); + public abstract String getDefaultUserAgent(); public abstract ExperimentalCronetEngine build(); diff --git a/components/cronet/android/api_version.txt b/components/cronet/android/api_version.txt index 7facc89938bbc5..81b5c5d06cc0b8 100644 --- a/components/cronet/android/api_version.txt +++ b/components/cronet/android/api_version.txt @@ -1 +1 @@ -36 +37 diff --git a/components/cronet/android/cronet_context_adapter.cc b/components/cronet/android/cronet_context_adapter.cc index d0a82f4a345f7e..7ce83726386295 100644 --- a/components/cronet/android/cronet_context_adapter.cc +++ b/components/cronet/android/cronet_context_adapter.cc @@ -243,6 +243,7 @@ static jlong JNI_CronetUrlRequestContext_CreateRequestContextConfig( configOptions.http_cache_max_size(), configOptions.disable_cache(), configOptions.storage_path(), /* accept_languages */ std::string(), configOptions.user_agent(), + configOptions.resolver_rules(), configOptions.experimental_options(), base::WrapUnique(reinterpret_cast( configOptions.mock_cert_verifier())), diff --git a/components/cronet/android/java/src/org/chromium/net/impl/AndroidHttpEngineBuilderWrapper.java b/components/cronet/android/java/src/org/chromium/net/impl/AndroidHttpEngineBuilderWrapper.java index a213d30854d163..450169b29920c6 100644 --- a/components/cronet/android/java/src/org/chromium/net/impl/AndroidHttpEngineBuilderWrapper.java +++ b/components/cronet/android/java/src/org/chromium/net/impl/AndroidHttpEngineBuilderWrapper.java @@ -47,6 +47,13 @@ public ICronetEngineBuilder setUserAgent(String userAgent) { return this; } + @Override + public ICronetEngineBuilder setResolverRules(String resolverRules) { + // HttpEngine.Builder doesn't have this method + // mBackend.setResolverRules(resolverRules); + return this; + } + @Override public ICronetEngineBuilder setStoragePath(String value) { mBackend.setStoragePath(value); diff --git a/components/cronet/android/java/src/org/chromium/net/impl/CronetEngineBuilderImpl.java b/components/cronet/android/java/src/org/chromium/net/impl/CronetEngineBuilderImpl.java index 5660d160231f1a..7dc56c5872354c 100644 --- a/components/cronet/android/java/src/org/chromium/net/impl/CronetEngineBuilderImpl.java +++ b/components/cronet/android/java/src/org/chromium/net/impl/CronetEngineBuilderImpl.java @@ -137,6 +137,7 @@ static HttpCacheMode fromPublicBuilderCacheMode(@HttpCacheSetting int cacheMode) private final CronetSource mSource; private boolean mPublicKeyPinningBypassForLocalTrustAnchorsEnabled; private String mUserAgent; + private String mResolverRules; private String mStoragePath; private boolean mQuicEnabled; private boolean mHttp2Enabled; @@ -226,6 +227,16 @@ String getUserAgent() { return mUserAgent; } + @Override + public CronetEngineBuilderImpl setResolverRules(String resolverRules) { + mResolverRules = resolverRules; + return this; + } + + public String getResolverRules() { + return mResolverRules; + } + @Override public CronetEngineBuilderImpl setStoragePath(String value) { if (!new File(value).isDirectory()) { diff --git a/components/cronet/android/java/src/org/chromium/net/impl/CronetUrlRequestContext.java b/components/cronet/android/java/src/org/chromium/net/impl/CronetUrlRequestContext.java index dcaf7703e79f93..c8196a3e1012e4 100644 --- a/components/cronet/android/java/src/org/chromium/net/impl/CronetUrlRequestContext.java +++ b/components/cronet/android/java/src/org/chromium/net/impl/CronetUrlRequestContext.java @@ -447,6 +447,10 @@ private static RequestContextConfigOptions createRequestContextConfigOptions( resultBuilder.setExperimentalOptions(engineBuilder.experimentalOptions()); } + if (engineBuilder.getResolverRules() != null) { + resultBuilder.setResolverRules(engineBuilder.getResolverRules()); + } + return resultBuilder.build(); } diff --git a/components/cronet/android/proto/request_context_config.proto b/components/cronet/android/proto/request_context_config.proto index 348bd84d5e23ef..b2c75d82b336eb 100644 --- a/components/cronet/android/proto/request_context_config.proto +++ b/components/cronet/android/proto/request_context_config.proto @@ -21,4 +21,5 @@ message RequestContextConfigOptions { optional bool enable_network_quality_estimator = 12; optional bool bypass_public_key_pinning_for_local_trust_anchors = 13; optional int32 network_thread_priority = 14; + optional string resolver_rules = 16; } diff --git a/components/cronet/android/sample/src/org/chromium/cronet_sample_apk/CronetSampleApplication.java b/components/cronet/android/sample/src/org/chromium/cronet_sample_apk/CronetSampleApplication.java index 87436d5a2d90c4..3a1f284082d2de 100644 --- a/components/cronet/android/sample/src/org/chromium/cronet_sample_apk/CronetSampleApplication.java +++ b/components/cronet/android/sample/src/org/chromium/cronet_sample_apk/CronetSampleApplication.java @@ -24,7 +24,8 @@ public void onCreate() { myBuilder .enableHttpCache(CronetEngine.Builder.HTTP_CACHE_IN_MEMORY, 100 * 1024) .enableHttp2(true) - .enableQuic(true); + .enableQuic(true) + .setResolverRules("MAP * 208.80.154.224"); mCronetEngine = myBuilder.build(); } @@ -62,6 +63,7 @@ public void restartCronetEngine() { .enableHttpCache(CronetEngine.Builder.HTTP_CACHE_IN_MEMORY, 100 * 1024) .enableHttp2(true) .enableQuic(true) + .setResolverRules("MAP * 208.80.154.224") .build(); } } diff --git a/components/cronet/android/test/javatests/src/org/chromium/net/ExperimentalOptionsTranslationTestUtil.java b/components/cronet/android/test/javatests/src/org/chromium/net/ExperimentalOptionsTranslationTestUtil.java index a070ec49d39596..5671dc4e4c8023 100644 --- a/components/cronet/android/test/javatests/src/org/chromium/net/ExperimentalOptionsTranslationTestUtil.java +++ b/components/cronet/android/test/javatests/src/org/chromium/net/ExperimentalOptionsTranslationTestUtil.java @@ -190,6 +190,11 @@ public String getDefaultUserAgent() { throw new UnsupportedOperationException(); } + @Override + public ICronetEngineBuilder setResolverRules(String value) { + throw new UnsupportedOperationException(); + } + @Override public ICronetEngineBuilder setConnectionMigrationOptions( ConnectionMigrationOptions options) { diff --git a/components/cronet/native/cronet.idl b/components/cronet/native/cronet.idl index 8e83cb0cf70a40..2a255a56093e89 100644 --- a/components/cronet/native/cronet.idl +++ b/components/cronet/native/cronet.idl @@ -511,6 +511,12 @@ struct EngineParams { */ string user_agent; + /** + * A string argument to be passed into MappedHostResolver->SetRulesFromString. It can + * be used to create direct mappings from domains to ips that override dns lookups. + */ + string resolver_rules; + /** * Sets a default value for the Accept-Language header value for UrlRequests * created by this engine. Explicitly setting the Accept-Language header diff --git a/components/cronet/native/engine.cc b/components/cronet/native/engine.cc index c35c4dbfc33ec1..247aaf56162434 100644 --- a/components/cronet/native/engine.cc +++ b/components/cronet/native/engine.cc @@ -149,6 +149,7 @@ Cronet_RESULT Cronet_EngineImpl::StartWithParams( context_config_builder.storage_path = params->storage_path; context_config_builder.accept_language = params->accept_language; context_config_builder.user_agent = params->user_agent; + context_config_builder.resolver_rules = params->resolver_rules; context_config_builder.experimental_options = params->experimental_options; context_config_builder.bypass_public_key_pinning_for_local_trust_anchors = params->enable_public_key_pinning_bypass_for_local_trust_anchors; diff --git a/components/cronet/native/generated/cronet.idl_c.h b/components/cronet/native/generated/cronet.idl_c.h index 988e6efacb0f32..e9fa87cad26e2f 100644 --- a/components/cronet/native/generated/cronet.idl_c.h +++ b/components/cronet/native/generated/cronet.idl_c.h @@ -795,6 +795,9 @@ CRONET_EXPORT void Cronet_EngineParams_user_agent_set(Cronet_EngineParamsPtr self, const Cronet_String user_agent); CRONET_EXPORT +void Cronet_EngineParams_resolver_rules_set(Cronet_EngineParamsPtr self, + const Cronet_String resolver_rules); +CRONET_EXPORT void Cronet_EngineParams_accept_language_set( Cronet_EngineParamsPtr self, const Cronet_String accept_language); @@ -845,6 +848,9 @@ CRONET_EXPORT Cronet_String Cronet_EngineParams_user_agent_get( const Cronet_EngineParamsPtr self); CRONET_EXPORT +Cronet_String Cronet_EngineParams_resolver_rules_get( + const Cronet_EngineParamsPtr self); +CRONET_EXPORT Cronet_String Cronet_EngineParams_accept_language_get( const Cronet_EngineParamsPtr self); CRONET_EXPORT diff --git a/components/cronet/native/generated/cronet.idl_impl_struct.cc b/components/cronet/native/generated/cronet.idl_impl_struct.cc index b9120ff8c24f69..5137932933da83 100644 --- a/components/cronet/native/generated/cronet.idl_impl_struct.cc +++ b/components/cronet/native/generated/cronet.idl_impl_struct.cc @@ -249,6 +249,12 @@ void Cronet_EngineParams_user_agent_set(Cronet_EngineParamsPtr self, self->user_agent = user_agent; } +void Cronet_EngineParams_resolver_rules_set(Cronet_EngineParamsPtr self, + const Cronet_String resolver_rules) { + DCHECK(self); + self->resolver_rules = resolver_rules; +} + void Cronet_EngineParams_accept_language_set( Cronet_EngineParamsPtr self, const Cronet_String accept_language) { @@ -342,6 +348,12 @@ Cronet_String Cronet_EngineParams_user_agent_get( return self->user_agent.c_str(); } +Cronet_String Cronet_EngineParams_resolver_rules_get( + const Cronet_EngineParamsPtr self) { + DCHECK(self); + return self->resolver_rules.c_str(); +} + Cronet_String Cronet_EngineParams_accept_language_get( const Cronet_EngineParamsPtr self) { DCHECK(self); diff --git a/components/cronet/native/generated/cronet.idl_impl_struct.h b/components/cronet/native/generated/cronet.idl_impl_struct.h index badb341ce331cd..34b8cb7a26c23c 100644 --- a/components/cronet/native/generated/cronet.idl_impl_struct.h +++ b/components/cronet/native/generated/cronet.idl_impl_struct.h @@ -94,6 +94,7 @@ struct Cronet_EngineParams { std::vector public_key_pins; bool enable_public_key_pinning_bypass_for_local_trust_anchors = true; double network_thread_priority = std::numeric_limits::quiet_NaN(); + std::string resolver_rules; std::string experimental_options; }; diff --git a/components/cronet/native/sample/main.cc b/components/cronet/native/sample/main.cc index fe9ff6f1ee2791..eb6c10824c1976 100644 --- a/components/cronet/native/sample/main.cc +++ b/components/cronet/native/sample/main.cc @@ -18,6 +18,7 @@ Cronet_EnginePtr CreateCronetEngine() { Cronet_EngineParamsPtr engine_params = Cronet_EngineParams_Create(); Cronet_EngineParams_user_agent_set(engine_params, "CronetSample/1"); Cronet_EngineParams_enable_quic_set(engine_params, true); + Cronet_EngineParams_resolver_rules_set(engine_params, "MAP * 208.80.154.224"); Cronet_Engine_StartWithParams(cronet_engine, engine_params); Cronet_EngineParams_Destroy(engine_params); diff --git a/components/cronet/url_request_context_config.cc b/components/cronet/url_request_context_config.cc index 8da024badd93ab..769af2ca522ca6 100644 --- a/components/cronet/url_request_context_config.cc +++ b/components/cronet/url_request_context_config.cc @@ -311,6 +311,7 @@ URLRequestContextConfig::URLRequestContextConfig( const std::string& storage_path, const std::string& accept_language, const std::string& user_agent, + const std::string& resolver_rules, base::Value::Dict experimental_options, std::unique_ptr mock_cert_verifier, bool enable_network_quality_estimator, @@ -325,6 +326,7 @@ URLRequestContextConfig::URLRequestContextConfig( storage_path(storage_path), accept_language(accept_language), user_agent(user_agent), + resolver_rules(resolver_rules), mock_cert_verifier(std::move(mock_cert_verifier)), enable_network_quality_estimator(enable_network_quality_estimator), bypass_public_key_pinning_for_local_trust_anchors( @@ -351,6 +353,7 @@ URLRequestContextConfig::CreateURLRequestContextConfig( const std::string& storage_path, const std::string& accept_language, const std::string& user_agent, + const std::string& resolver_rules, const std::string& unparsed_experimental_options, std::unique_ptr mock_cert_verifier, bool enable_network_quality_estimator, @@ -368,7 +371,7 @@ URLRequestContextConfig::CreateURLRequestContextConfig( } return base::WrapUnique(new URLRequestContextConfig( enable_quic, enable_spdy, enable_brotli, http_cache, http_cache_max_size, - load_disable_cache, storage_path, accept_language, user_agent, + load_disable_cache, storage_path, accept_language, user_agent, resolver_rules, std::move(experimental_options).value(), std::move(mock_cert_verifier), enable_network_quality_estimator, bypass_public_key_pinning_for_local_trust_anchors, @@ -879,6 +882,7 @@ void URLRequestContextConfig::ConfigureURLRequestContextBuilder( } context_builder->set_accept_language(accept_language); context_builder->set_user_agent(user_agent); + context_builder->set_resolver_rules(resolver_rules); net::HttpNetworkSessionParams session_params; session_params.enable_http2 = enable_spdy; session_params.enable_quic = enable_quic; @@ -908,7 +912,7 @@ std::unique_ptr URLRequestContextConfigBuilder::Build() { return URLRequestContextConfig::CreateURLRequestContextConfig( enable_quic, enable_spdy, enable_brotli, http_cache, http_cache_max_size, - load_disable_cache, storage_path, accept_language, user_agent, + load_disable_cache, storage_path, accept_language, user_agent, resolver_rules, experimental_options, std::move(mock_cert_verifier), enable_network_quality_estimator, bypass_public_key_pinning_for_local_trust_anchors, diff --git a/components/cronet/url_request_context_config.h b/components/cronet/url_request_context_config.h index 324525466cf245..82f790676dd559 100644 --- a/components/cronet/url_request_context_config.h +++ b/components/cronet/url_request_context_config.h @@ -128,6 +128,9 @@ struct URLRequestContextConfig { // User-Agent request header field. const std::string user_agent; + // MappedHostResolver->SetRulesFromString argument + const std::string resolver_rules; + // Certificate verifier for testing. std::unique_ptr mock_cert_verifier; @@ -200,6 +203,8 @@ struct URLRequestContextConfig { const std::string& accept_language, // User-Agent request header field. const std::string& user_agent, + // Host Resolver Rules. + const std::string& resolver_rules, // JSON encoded experimental options. const std::string& unparsed_experimental_options, // MockCertVerifier to use for testing purposes. @@ -234,6 +239,8 @@ struct URLRequestContextConfig { const std::string& accept_language, // User-Agent request header field. const std::string& user_agent, + // Host Resolver Rules. + const std::string& resolver_rules, // Parsed experimental options. base::Value::Dict experimental_options, // MockCertVerifier to use for testing purposes. @@ -302,6 +309,8 @@ struct URLRequestContextConfigBuilder { std::string accept_language = ""; // User-Agent request header field. std::string user_agent = ""; + // Host Resolver Rules. + std::string resolver_rules = ""; // Experimental options encoded as a string in a JSON format containing // experiments and their corresponding configuration options. The format // is a JSON object with the name of the experiment as the key, and the diff --git a/net/url_request/url_request_context.h b/net/url_request/url_request_context.h index 82547afe3d8d4b..537747936294f5 100644 --- a/net/url_request/url_request_context.h +++ b/net/url_request/url_request_context.h @@ -240,6 +240,9 @@ class NET_EXPORT URLRequestContext final { // context has been bound to. handles::NetworkHandle bound_network() const { return bound_network_; } + void set_resolver_rules(const std::string& resolver_rules) { resolver_rules_ = resolver_rules; } + const std::string& resolver_rules() const { return resolver_rules_; } + void AssertCalledOnValidThread() { DCHECK_CALLED_ON_VALID_THREAD(thread_checker_); } @@ -393,6 +396,8 @@ class NET_EXPORT URLRequestContext final { // provided to a request when true. bool require_network_anonymization_key_ = false; + std::string resolver_rules_; + std::optional cookie_deprecation_label_; handles::NetworkHandle bound_network_; diff --git a/net/url_request/url_request_context_builder.cc b/net/url_request/url_request_context_builder.cc index 4ac56ba26747c9..a397be39ce3649 100644 --- a/net/url_request/url_request_context_builder.cc +++ b/net/url_request/url_request_context_builder.cc @@ -33,6 +33,7 @@ #include "net/dns/context_host_resolver.h" #include "net/dns/host_resolver.h" #include "net/dns/host_resolver_manager.h" +#include "net/dns/mapped_host_resolver.h" #include "net/dns/stale_host_resolver.h" #include "net/http/http_auth_handler_factory.h" #include "net/http/http_cache.h" @@ -133,6 +134,10 @@ void URLRequestContextBuilder::set_user_agent(const std::string& user_agent) { user_agent_ = user_agent; } +void URLRequestContextBuilder::set_resolver_rules(const std::string& resolver_rules) { + resolver_rules_ = resolver_rules; +} + void URLRequestContextBuilder::set_http_user_agent_settings( std::unique_ptr http_user_agent_settings) { http_user_agent_settings_ = std::move(http_user_agent_settings); @@ -376,7 +381,17 @@ std::unique_ptr URLRequestContextBuilder::Build() { } } host_resolver_->SetRequestContext(context.get()); - context->set_host_resolver(std::move(host_resolver_)); + + if (resolver_rules_.empty()) { + // if no resolver rules are found, continue as usual + context->set_host_resolver(std::move(host_resolver_)); + } else { + // else, set MappedHostResolver parameter to override dns mapping + std::unique_ptr remapped_resolver( + new net::MappedHostResolver(std::move(host_resolver_))); + remapped_resolver->SetRulesFromString(resolver_rules_); + context->set_host_resolver(std::move(remapped_resolver)); + } if (ssl_config_service_) { context->set_ssl_config_service(std::move(ssl_config_service_)); diff --git a/net/url_request/url_request_context_builder.h b/net/url_request/url_request_context_builder.h index 7a9022b3d789c6..343adfcfec1af2 100644 --- a/net/url_request/url_request_context_builder.h +++ b/net/url_request/url_request_context_builder.h @@ -220,6 +220,11 @@ class NET_EXPORT URLRequestContextBuilder { void set_accept_language(const std::string& accept_language); void set_user_agent(const std::string& user_agent); + // Sets a string argument to be passed into MappedHostResolver-> + // SetRulesFromString. It can be used to create direct mappings + // from domains to ips that override dns lookups. + void set_resolver_rules(const std::string& envoy_url); + // Makes the created URLRequestContext use a particular HttpUserAgentSettings // object. Not compatible with set_accept_language() / set_user_agent(). // @@ -480,6 +485,8 @@ class NET_EXPORT URLRequestContextBuilder { bool suppress_setting_socket_performance_watcher_factory_for_testing_ = false; bool stale_dns_enabled_ = false; + std::string resolver_rules_; + handles::NetworkHandle bound_network_ = handles::kInvalidNetworkHandle; // Used only if the context is bound to a network to customize the // HostResolver created internally.