• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright 2012 The Chromium Authors
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #include "net/url_request/url_request_context_builder.h"
6 
7 #include <memory>
8 #include <string>
9 #include <utility>
10 #include <vector>
11 
12 #include "base/check_op.h"
13 #include "base/compiler_specific.h"
14 #include "base/notreached.h"
15 #include "base/strings/string_util.h"
16 #include "base/task/sequenced_task_runner.h"
17 #include "base/task/single_thread_task_runner.h"
18 #include "base/task/thread_pool.h"
19 #include "base/types/pass_key.h"
20 #include "build/build_config.h"
21 #include "net/base/cache_type.h"
22 #include "net/base/net_errors.h"
23 #include "net/base/network_delegate_impl.h"
24 #include "net/cert/cert_verifier.h"
25 #include "net/cert/ct_log_verifier.h"
26 #include "net/cert/ct_policy_enforcer.h"
27 #include "net/cert/ct_verifier.h"
28 #include "net/cert/multi_log_ct_verifier.h"
29 #include "net/cert/sct_auditing_delegate.h"
30 #include "net/cookies/cookie_monster.h"
31 #include "net/dns/context_host_resolver.h"
32 #include "net/dns/host_resolver.h"
33 #include "net/dns/host_resolver_manager.h"
34 #include "net/http/http_auth_handler_factory.h"
35 #include "net/http/http_cache.h"
36 #include "net/http/http_network_layer.h"
37 #include "net/http/http_network_session.h"
38 #include "net/http/http_server_properties.h"
39 #include "net/http/http_server_properties_manager.h"
40 #include "net/http/transport_security_persister.h"
41 #include "net/http/transport_security_state.h"
42 #include "net/log/net_log.h"
43 #include "net/net_buildflags.h"
44 #include "net/nqe/network_quality_estimator.h"
45 #include "net/proxy_resolution/configured_proxy_resolution_service.h"
46 #include "net/quic/quic_context.h"
47 #include "net/quic/quic_stream_factory.h"
48 #include "net/socket/network_binding_client_socket_factory.h"
49 #include "net/ssl/ssl_config_service_defaults.h"
50 #include "net/url_request/static_http_user_agent_settings.h"
51 #include "net/url_request/url_request_context.h"
52 #include "net/url_request/url_request_job_factory.h"
53 #include "net/url_request/url_request_throttler_manager.h"
54 #include "url/url_constants.h"
55 
56 #if BUILDFLAG(ENABLE_REPORTING)
57 #include "net/network_error_logging/network_error_logging_service.h"
58 #include "net/network_error_logging/persistent_reporting_and_nel_store.h"
59 #include "net/reporting/reporting_policy.h"
60 #include "net/reporting/reporting_service.h"
61 #endif  // BUILDFLAG(ENABLE_REPORTING)
62 
63 #if BUILDFLAG(IS_ANDROID)
64 #include "base/android/build_info.h"
65 #endif  // BUILDFLAG(IS_ANDROID)
66 
67 namespace net {
68 
69 URLRequestContextBuilder::HttpCacheParams::HttpCacheParams() = default;
70 URLRequestContextBuilder::HttpCacheParams::~HttpCacheParams() = default;
71 
72 URLRequestContextBuilder::URLRequestContextBuilder() = default;
73 
74 URLRequestContextBuilder::~URLRequestContextBuilder() = default;
75 
SetHttpNetworkSessionComponents(const URLRequestContext * request_context,HttpNetworkSessionContext * session_context,bool suppress_setting_socket_performance_watcher_factory,ClientSocketFactory * client_socket_factory)76 void URLRequestContextBuilder::SetHttpNetworkSessionComponents(
77     const URLRequestContext* request_context,
78     HttpNetworkSessionContext* session_context,
79     bool suppress_setting_socket_performance_watcher_factory,
80     ClientSocketFactory* client_socket_factory) {
81   session_context->client_socket_factory =
82       client_socket_factory ? client_socket_factory
83                             : ClientSocketFactory::GetDefaultFactory();
84   session_context->host_resolver = request_context->host_resolver();
85   session_context->cert_verifier = request_context->cert_verifier();
86   session_context->transport_security_state =
87       request_context->transport_security_state();
88   session_context->ct_policy_enforcer = request_context->ct_policy_enforcer();
89   session_context->sct_auditing_delegate =
90       request_context->sct_auditing_delegate();
91   session_context->proxy_resolution_service =
92       request_context->proxy_resolution_service();
93   session_context->proxy_delegate = request_context->proxy_delegate();
94   session_context->http_user_agent_settings =
95       request_context->http_user_agent_settings();
96   session_context->ssl_config_service = request_context->ssl_config_service();
97   session_context->http_auth_handler_factory =
98       request_context->http_auth_handler_factory();
99   session_context->http_server_properties =
100       request_context->http_server_properties();
101   session_context->quic_context = request_context->quic_context();
102   session_context->net_log = request_context->net_log();
103   session_context->network_quality_estimator =
104       request_context->network_quality_estimator();
105   if (request_context->network_quality_estimator() &&
106       !suppress_setting_socket_performance_watcher_factory) {
107     session_context->socket_performance_watcher_factory =
108         request_context->network_quality_estimator()
109             ->GetSocketPerformanceWatcherFactory();
110   }
111 #if BUILDFLAG(ENABLE_REPORTING)
112   session_context->reporting_service = request_context->reporting_service();
113   session_context->network_error_logging_service =
114       request_context->network_error_logging_service();
115 #endif
116 }
117 
set_accept_language(const std::string & accept_language)118 void URLRequestContextBuilder::set_accept_language(
119     const std::string& accept_language) {
120   DCHECK(!http_user_agent_settings_);
121   accept_language_ = accept_language;
122 }
set_user_agent(const std::string & user_agent)123 void URLRequestContextBuilder::set_user_agent(const std::string& user_agent) {
124   DCHECK(!http_user_agent_settings_);
125   user_agent_ = user_agent;
126 }
127 
set_http_user_agent_settings(std::unique_ptr<HttpUserAgentSettings> http_user_agent_settings)128 void URLRequestContextBuilder::set_http_user_agent_settings(
129     std::unique_ptr<HttpUserAgentSettings> http_user_agent_settings) {
130   http_user_agent_settings_ = std::move(http_user_agent_settings);
131 }
132 
EnableHttpCache(const HttpCacheParams & params)133 void URLRequestContextBuilder::EnableHttpCache(const HttpCacheParams& params) {
134   http_cache_enabled_ = true;
135   http_cache_params_ = params;
136 }
137 
DisableHttpCache()138 void URLRequestContextBuilder::DisableHttpCache() {
139   http_cache_enabled_ = false;
140   http_cache_params_ = HttpCacheParams();
141 }
142 
SetSpdyAndQuicEnabled(bool spdy_enabled,bool quic_enabled)143 void URLRequestContextBuilder::SetSpdyAndQuicEnabled(bool spdy_enabled,
144                                                      bool quic_enabled) {
145   http_network_session_params_.enable_http2 = spdy_enabled;
146   http_network_session_params_.enable_quic = quic_enabled;
147 }
148 
set_ct_policy_enforcer(std::unique_ptr<CTPolicyEnforcer> ct_policy_enforcer)149 void URLRequestContextBuilder::set_ct_policy_enforcer(
150     std::unique_ptr<CTPolicyEnforcer> ct_policy_enforcer) {
151   ct_policy_enforcer_ = std::move(ct_policy_enforcer);
152 }
153 
set_sct_auditing_delegate(std::unique_ptr<SCTAuditingDelegate> sct_auditing_delegate)154 void URLRequestContextBuilder::set_sct_auditing_delegate(
155     std::unique_ptr<SCTAuditingDelegate> sct_auditing_delegate) {
156   sct_auditing_delegate_ = std::move(sct_auditing_delegate);
157 }
158 
set_quic_context(std::unique_ptr<QuicContext> quic_context)159 void URLRequestContextBuilder::set_quic_context(
160     std::unique_ptr<QuicContext> quic_context) {
161   quic_context_ = std::move(quic_context);
162 }
163 
SetCertVerifier(std::unique_ptr<CertVerifier> cert_verifier)164 void URLRequestContextBuilder::SetCertVerifier(
165     std::unique_ptr<CertVerifier> cert_verifier) {
166   cert_verifier_ = std::move(cert_verifier);
167 }
168 
169 #if BUILDFLAG(ENABLE_REPORTING)
set_reporting_policy(std::unique_ptr<ReportingPolicy> reporting_policy)170 void URLRequestContextBuilder::set_reporting_policy(
171     std::unique_ptr<ReportingPolicy> reporting_policy) {
172   reporting_policy_ = std::move(reporting_policy);
173 }
174 
set_reporting_service(std::unique_ptr<ReportingService> reporting_service)175 void URLRequestContextBuilder::set_reporting_service(
176     std::unique_ptr<ReportingService> reporting_service) {
177   reporting_service_ = std::move(reporting_service);
178 }
179 
set_persistent_reporting_and_nel_store(std::unique_ptr<PersistentReportingAndNelStore> persistent_reporting_and_nel_store)180 void URLRequestContextBuilder::set_persistent_reporting_and_nel_store(
181     std::unique_ptr<PersistentReportingAndNelStore>
182         persistent_reporting_and_nel_store) {
183   persistent_reporting_and_nel_store_ =
184       std::move(persistent_reporting_and_nel_store);
185 }
186 #endif  // BUILDFLAG(ENABLE_REPORTING)
187 
SetCookieStore(std::unique_ptr<CookieStore> cookie_store)188 void URLRequestContextBuilder::SetCookieStore(
189     std::unique_ptr<CookieStore> cookie_store) {
190   cookie_store_set_by_client_ = true;
191   cookie_store_ = std::move(cookie_store);
192 }
193 
SetProtocolHandler(const std::string & scheme,std::unique_ptr<URLRequestJobFactory::ProtocolHandler> protocol_handler)194 void URLRequestContextBuilder::SetProtocolHandler(
195     const std::string& scheme,
196     std::unique_ptr<URLRequestJobFactory::ProtocolHandler> protocol_handler) {
197   DCHECK(protocol_handler);
198   // If a consumer sets a ProtocolHandler and then overwrites it with another,
199   // it's probably a bug.
200   DCHECK_EQ(0u, protocol_handlers_.count(scheme));
201   protocol_handlers_[scheme] = std::move(protocol_handler);
202 }
203 
set_host_resolver(std::unique_ptr<HostResolver> host_resolver)204 void URLRequestContextBuilder::set_host_resolver(
205     std::unique_ptr<HostResolver> host_resolver) {
206   DCHECK(!host_resolver_manager_);
207   DCHECK(host_mapping_rules_.empty());
208   DCHECK(!host_resolver_factory_);
209   host_resolver_ = std::move(host_resolver);
210 }
211 
set_host_mapping_rules(std::string host_mapping_rules)212 void URLRequestContextBuilder::set_host_mapping_rules(
213     std::string host_mapping_rules) {
214   DCHECK(!host_resolver_);
215   host_mapping_rules_ = std::move(host_mapping_rules);
216 }
217 
set_host_resolver_manager(HostResolverManager * manager)218 void URLRequestContextBuilder::set_host_resolver_manager(
219     HostResolverManager* manager) {
220   DCHECK(!host_resolver_);
221   host_resolver_manager_ = manager;
222 }
223 
set_host_resolver_factory(HostResolver::Factory * factory)224 void URLRequestContextBuilder::set_host_resolver_factory(
225     HostResolver::Factory* factory) {
226   DCHECK(!host_resolver_);
227   host_resolver_factory_ = factory;
228 }
229 
set_proxy_delegate(std::unique_ptr<ProxyDelegate> proxy_delegate)230 void URLRequestContextBuilder::set_proxy_delegate(
231     std::unique_ptr<ProxyDelegate> proxy_delegate) {
232   proxy_delegate_ = std::move(proxy_delegate);
233 }
234 
SetHttpAuthHandlerFactory(std::unique_ptr<HttpAuthHandlerFactory> factory)235 void URLRequestContextBuilder::SetHttpAuthHandlerFactory(
236     std::unique_ptr<HttpAuthHandlerFactory> factory) {
237   http_auth_handler_factory_ = std::move(factory);
238 }
239 
SetHttpServerProperties(std::unique_ptr<HttpServerProperties> http_server_properties)240 void URLRequestContextBuilder::SetHttpServerProperties(
241     std::unique_ptr<HttpServerProperties> http_server_properties) {
242   http_server_properties_ = std::move(http_server_properties);
243 }
244 
SetCreateHttpTransactionFactoryCallback(CreateHttpTransactionFactoryCallback create_http_network_transaction_factory)245 void URLRequestContextBuilder::SetCreateHttpTransactionFactoryCallback(
246     CreateHttpTransactionFactoryCallback
247         create_http_network_transaction_factory) {
248   http_transaction_factory_.reset();
249   create_http_network_transaction_factory_ =
250       std::move(create_http_network_transaction_factory);
251 }
252 
BindToNetwork(handles::NetworkHandle network,absl::optional<HostResolver::ManagerOptions> options)253 void URLRequestContextBuilder::BindToNetwork(
254     handles::NetworkHandle network,
255     absl::optional<HostResolver::ManagerOptions> options) {
256 #if BUILDFLAG(IS_ANDROID)
257   DCHECK(NetworkChangeNotifier::AreNetworkHandlesSupported());
258   // DNS lookups for this context will need to target `network`. NDK to do that
259   // has been introduced in Android Marshmallow
260   // (https://developer.android.com/ndk/reference/group/networking#android_getaddrinfofornetwork)
261   // This is also checked later on in the codepath (at lookup time), but
262   // failing here should be preferred to return a more intuitive crash path.
263   CHECK(base::android::BuildInfo::GetInstance()->sdk_int() >=
264         base::android::SDK_VERSION_MARSHMALLOW);
265   bound_network_ = network;
266   manager_options_ = options.value_or(manager_options_);
267 #else
268   NOTIMPLEMENTED();
269 #endif  // BUILDFLAG(IS_ANDROID)
270 }
271 
Build()272 std::unique_ptr<URLRequestContext> URLRequestContextBuilder::Build() {
273   auto context = std::make_unique<URLRequestContext>(
274       base::PassKey<URLRequestContextBuilder>());
275 
276   context->set_enable_brotli(enable_brotli_);
277   context->set_check_cleartext_permitted(check_cleartext_permitted_);
278   context->set_require_network_isolation_key(require_network_isolation_key_);
279   context->set_network_quality_estimator(network_quality_estimator_);
280 
281   if (http_user_agent_settings_) {
282     context->set_http_user_agent_settings(std::move(http_user_agent_settings_));
283   } else {
284     context->set_http_user_agent_settings(
285         std::make_unique<StaticHttpUserAgentSettings>(accept_language_,
286                                                       user_agent_));
287   }
288 
289   if (!network_delegate_)
290     network_delegate_ = std::make_unique<NetworkDelegateImpl>();
291   context->set_network_delegate(std::move(network_delegate_));
292 
293   if (net_log_) {
294     // Unlike the other builder parameters, |net_log_| is not owned by the
295     // builder or resulting context.
296     context->set_net_log(net_log_);
297   } else {
298     context->set_net_log(NetLog::Get());
299   }
300 
301   if (bound_network_ != handles::kInvalidNetworkHandle) {
302     DCHECK(!client_socket_factory_raw_);
303     DCHECK(!host_resolver_);
304     DCHECK(!host_resolver_manager_);
305     DCHECK(!host_resolver_factory_);
306 
307     context->set_bound_network(bound_network_);
308 
309     // All sockets created for this context will need to be bound to
310     // `bound_network_`.
311     auto client_socket_factory =
312         std::make_unique<NetworkBindingClientSocketFactory>(bound_network_);
313     set_client_socket_factory(client_socket_factory.get());
314     context->set_client_socket_factory(std::move(client_socket_factory));
315 
316     host_resolver_ = HostResolver::CreateStandaloneNetworkBoundResolver(
317         context->net_log(), bound_network_, manager_options_);
318 
319     if (!quic_context_)
320       set_quic_context(std::make_unique<QuicContext>());
321     auto* quic_params = quic_context_->params();
322     // QUIC sessions for this context should not be closed (or go away) after a
323     // network change.
324     quic_params->close_sessions_on_ip_change = false;
325     quic_params->goaway_sessions_on_ip_change = false;
326 
327     // QUIC connection migration should not be enabled when binding a context
328     // to a network.
329     quic_params->migrate_sessions_on_network_change_v2 = false;
330 
331     // Objects used by network sessions for this context shouldn't listen to
332     // network changes.
333     http_network_session_params_.ignore_ip_address_changes = true;
334   }
335 
336   if (client_socket_factory_) {
337     context->set_client_socket_factory(std::move(client_socket_factory_));
338   }
339 
340   if (host_resolver_) {
341     DCHECK(host_mapping_rules_.empty());
342     DCHECK(!host_resolver_manager_);
343     DCHECK(!host_resolver_factory_);
344   } else if (host_resolver_manager_) {
345     if (host_resolver_factory_) {
346       host_resolver_ = host_resolver_factory_->CreateResolver(
347           host_resolver_manager_, host_mapping_rules_,
348           true /* enable_caching */);
349     } else {
350       host_resolver_ = HostResolver::CreateResolver(host_resolver_manager_,
351                                                     host_mapping_rules_,
352                                                     true /* enable_caching */);
353     }
354   } else {
355     if (host_resolver_factory_) {
356       host_resolver_ = host_resolver_factory_->CreateStandaloneResolver(
357           context->net_log(), HostResolver::ManagerOptions(),
358           host_mapping_rules_, true /* enable_caching */);
359     } else {
360       host_resolver_ = HostResolver::CreateStandaloneResolver(
361           context->net_log(), HostResolver::ManagerOptions(),
362           host_mapping_rules_, true /* enable_caching */);
363     }
364   }
365   host_resolver_->SetRequestContext(context.get());
366   context->set_host_resolver(std::move(host_resolver_));
367 
368   if (ssl_config_service_) {
369     context->set_ssl_config_service(std::move(ssl_config_service_));
370   } else {
371     context->set_ssl_config_service(
372         std::make_unique<SSLConfigServiceDefaults>());
373   }
374 
375   if (http_auth_handler_factory_) {
376     context->set_http_auth_handler_factory(
377         std::move(http_auth_handler_factory_));
378   } else {
379     context->set_http_auth_handler_factory(
380         HttpAuthHandlerRegistryFactory::CreateDefault());
381   }
382 
383   if (cookie_store_set_by_client_) {
384     context->set_cookie_store(std::move(cookie_store_));
385   } else {
386     auto cookie_store = std::make_unique<CookieMonster>(nullptr /* store */,
387                                                         context->net_log());
388     context->set_cookie_store(std::move(cookie_store));
389   }
390 
391   context->set_transport_security_state(
392       std::make_unique<TransportSecurityState>(hsts_policy_bypass_list_));
393   if (!transport_security_persister_file_path_.empty()) {
394     // Use a low priority because saving this should not block anything
395     // user-visible. Block shutdown to ensure it does get persisted to disk,
396     // since it contains security-relevant information.
397     scoped_refptr<base::SequencedTaskRunner> task_runner(
398         base::ThreadPool::CreateSequencedTaskRunner(
399             {base::MayBlock(), base::TaskPriority::BEST_EFFORT,
400              base::TaskShutdownBehavior::BLOCK_SHUTDOWN}));
401 
402     context->set_transport_security_persister(
403         std::make_unique<TransportSecurityPersister>(
404             context->transport_security_state(), task_runner,
405             transport_security_persister_file_path_));
406   }
407 
408   if (http_server_properties_) {
409     context->set_http_server_properties(std::move(http_server_properties_));
410   } else {
411     context->set_http_server_properties(
412         std::make_unique<HttpServerProperties>());
413   }
414 
415   if (cert_verifier_) {
416     context->set_cert_verifier(std::move(cert_verifier_));
417   } else {
418     // TODO(mattm): Should URLRequestContextBuilder create a CertNetFetcher?
419     context->set_cert_verifier(
420         CertVerifier::CreateDefault(/*cert_net_fetcher=*/nullptr));
421   }
422 
423   if (ct_policy_enforcer_) {
424     context->set_ct_policy_enforcer(std::move(ct_policy_enforcer_));
425   } else {
426     context->set_ct_policy_enforcer(
427         std::make_unique<DefaultCTPolicyEnforcer>());
428   }
429 
430   if (sct_auditing_delegate_) {
431     context->set_sct_auditing_delegate(std::move(sct_auditing_delegate_));
432   }
433 
434   if (quic_context_) {
435     context->set_quic_context(std::move(quic_context_));
436   } else {
437     context->set_quic_context(std::make_unique<QuicContext>());
438   }
439 
440   if (throttling_enabled_) {
441     context->set_throttler_manager(
442         std::make_unique<URLRequestThrottlerManager>());
443   }
444 
445   if (!proxy_resolution_service_) {
446 #if !BUILDFLAG(IS_LINUX) && !BUILDFLAG(IS_CHROMEOS) && !BUILDFLAG(IS_ANDROID)
447     // TODO(willchan): Switch to using this code when
448     // ProxyConfigService::CreateSystemProxyConfigService()'s
449     // signature doesn't suck.
450     if (!proxy_config_service_) {
451       proxy_config_service_ =
452           ProxyConfigService::CreateSystemProxyConfigService(
453               base::SingleThreadTaskRunner::GetCurrentDefault().get());
454     }
455 #endif  // !BUILDFLAG(IS_LINUX) && !BUILDFLAG(IS_CHROMEOS) &&
456         // !BUILDFLAG(IS_ANDROID)
457     proxy_resolution_service_ = CreateProxyResolutionService(
458         std::move(proxy_config_service_), context.get(),
459         context->host_resolver(), context->network_delegate(),
460         context->net_log(), pac_quick_check_enabled_);
461   }
462   ProxyResolutionService* proxy_resolution_service =
463       proxy_resolution_service_.get();
464   context->set_proxy_resolution_service(std::move(proxy_resolution_service_));
465 
466 #if BUILDFLAG(ENABLE_REPORTING)
467   // Note: ReportingService::Create and NetworkErrorLoggingService::Create can
468   // both return nullptr if the corresponding base::Feature is disabled.
469 
470   if (reporting_service_) {
471     context->set_reporting_service(std::move(reporting_service_));
472   } else if (reporting_policy_) {
473     context->set_reporting_service(
474         ReportingService::Create(*reporting_policy_, context.get(),
475                                  persistent_reporting_and_nel_store_.get()));
476   }
477 
478   if (network_error_logging_enabled_) {
479     if (!network_error_logging_service_) {
480       network_error_logging_service_ = NetworkErrorLoggingService::Create(
481           persistent_reporting_and_nel_store_.get());
482     }
483     context->set_network_error_logging_service(
484         std::move(network_error_logging_service_));
485   }
486 
487   if (persistent_reporting_and_nel_store_) {
488     context->set_persistent_reporting_and_nel_store(
489         std::move(persistent_reporting_and_nel_store_));
490   }
491 
492   // If both Reporting and Network Error Logging are actually enabled, then
493   // connect them so Network Error Logging can use Reporting to deliver error
494   // reports.
495   if (context->reporting_service() &&
496       context->network_error_logging_service()) {
497     context->network_error_logging_service()->SetReportingService(
498         context->reporting_service());
499   }
500 #endif  // BUILDFLAG(ENABLE_REPORTING)
501 
502   if (proxy_delegate_) {
503     proxy_resolution_service->SetProxyDelegate(proxy_delegate_.get());
504     context->set_proxy_delegate(std::move(proxy_delegate_));
505   }
506 
507   HttpNetworkSessionContext network_session_context;
508   // Unlike the other fields of HttpNetworkSession::Context,
509   // |client_socket_factory| is not mirrored in URLRequestContext.
510   SetHttpNetworkSessionComponents(
511       context.get(), &network_session_context,
512       suppress_setting_socket_performance_watcher_factory_for_testing_,
513       client_socket_factory_raw_);
514 
515   context->set_http_network_session(std::make_unique<HttpNetworkSession>(
516       http_network_session_params_, network_session_context));
517 
518   std::unique_ptr<HttpTransactionFactory> http_transaction_factory;
519   if (http_transaction_factory_) {
520     http_transaction_factory = std::move(http_transaction_factory_);
521   } else if (!create_http_network_transaction_factory_.is_null()) {
522     http_transaction_factory =
523         std::move(create_http_network_transaction_factory_)
524             .Run(context->http_network_session());
525   } else {
526     http_transaction_factory =
527         std::make_unique<HttpNetworkLayer>(context->http_network_session());
528   }
529 
530   if (http_cache_enabled_) {
531     std::unique_ptr<HttpCache::BackendFactory> http_cache_backend;
532     if (http_cache_params_.type != HttpCacheParams::IN_MEMORY) {
533       // TODO(mmenke): Maybe merge BackendType and HttpCacheParams::Type? The
534       // first doesn't include in memory, so may require some work.
535       BackendType backend_type = CACHE_BACKEND_DEFAULT;
536       switch (http_cache_params_.type) {
537         case HttpCacheParams::DISK:
538           backend_type = CACHE_BACKEND_DEFAULT;
539           break;
540         case HttpCacheParams::DISK_BLOCKFILE:
541           backend_type = CACHE_BACKEND_BLOCKFILE;
542           break;
543         case HttpCacheParams::DISK_SIMPLE:
544           backend_type = CACHE_BACKEND_SIMPLE;
545           break;
546         case HttpCacheParams::IN_MEMORY:
547           NOTREACHED();
548           break;
549       }
550       http_cache_backend = std::make_unique<HttpCache::DefaultBackend>(
551           DISK_CACHE, backend_type, http_cache_params_.file_operations_factory,
552           http_cache_params_.path, http_cache_params_.max_size,
553           http_cache_params_.reset_cache);
554     } else {
555       http_cache_backend =
556           HttpCache::DefaultBackend::InMemory(http_cache_params_.max_size);
557     }
558 #if BUILDFLAG(IS_ANDROID)
559     http_cache_backend->SetAppStatusListener(
560         http_cache_params_.app_status_listener);
561 #endif
562 
563     http_transaction_factory = std::make_unique<HttpCache>(
564         std::move(http_transaction_factory), std::move(http_cache_backend));
565   }
566   context->set_http_transaction_factory(std::move(http_transaction_factory));
567 
568   std::unique_ptr<URLRequestJobFactory> job_factory =
569       std::make_unique<URLRequestJobFactory>();
570   for (auto& scheme_handler : protocol_handlers_) {
571     job_factory->SetProtocolHandler(scheme_handler.first,
572                                     std::move(scheme_handler.second));
573   }
574   protocol_handlers_.clear();
575 
576   context->set_job_factory(std::move(job_factory));
577 
578   return context;
579 }
580 
581 std::unique_ptr<ProxyResolutionService>
CreateProxyResolutionService(std::unique_ptr<ProxyConfigService> proxy_config_service,URLRequestContext * url_request_context,HostResolver * host_resolver,NetworkDelegate * network_delegate,NetLog * net_log,bool pac_quick_check_enabled)582 URLRequestContextBuilder::CreateProxyResolutionService(
583     std::unique_ptr<ProxyConfigService> proxy_config_service,
584     URLRequestContext* url_request_context,
585     HostResolver* host_resolver,
586     NetworkDelegate* network_delegate,
587     NetLog* net_log,
588     bool pac_quick_check_enabled) {
589   return ConfiguredProxyResolutionService::CreateUsingSystemProxyResolver(
590       std::move(proxy_config_service), net_log, pac_quick_check_enabled);
591 }
592 
593 }  // namespace net
594