blob: 5862ea67d5b17977c9f4bac18390441b8c77a485 [file] [log] [blame]
jam6f02ddc2017-04-12 01:43:501// Copyright 2017 The Chromium Authors. All rights reserved.
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 "content/network/network_context.h"
6
7#include "base/command_line.h"
8#include "base/logging.h"
yzshen6da6865f2017-04-18 17:49:139#include "base/strings/string_number_conversions.h"
mmenke68a50212017-06-12 20:20:3110#include "components/network_session_configurator/common/network_switches.h"
jamc1905862017-05-16 14:45:3011#include "content/network/cache_url_loader.h"
12#include "content/network/network_service_url_loader_factory_impl.h"
jam6f02ddc2017-04-12 01:43:5013#include "content/network/url_loader_impl.h"
14#include "content/public/common/content_client.h"
yzshen6da6865f2017-04-18 17:49:1315#include "content/public/common/content_switches.h"
jam6f02ddc2017-04-12 01:43:5016#include "net/dns/host_resolver.h"
17#include "net/dns/mapped_host_resolver.h"
mmenke7c7f4faf52017-06-01 00:25:2218#include "net/http/http_network_session.h"
yzshena90291c2017-04-26 16:22:5219#include "net/proxy/proxy_config.h"
20#include "net/proxy/proxy_config_service_fixed.h"
jam6f02ddc2017-04-12 01:43:5021#include "net/url_request/url_request_context.h"
22#include "net/url_request/url_request_context_builder.h"
23
24namespace content {
25
26namespace {
jam6f02ddc2017-04-12 01:43:5027
28std::unique_ptr<net::URLRequestContext> MakeURLRequestContext() {
29 net::URLRequestContextBuilder builder;
mmenke7c7f4faf52017-06-01 00:25:2230 net::HttpNetworkSession::Params params;
jam6f02ddc2017-04-12 01:43:5031 const base::CommandLine* command_line =
32 base::CommandLine::ForCurrentProcess();
yzshen6da6865f2017-04-18 17:49:1333 if (command_line->HasSwitch(switches::kIgnoreCertificateErrors))
jam6f02ddc2017-04-12 01:43:5034 params.ignore_certificate_errors = true;
yzshen6da6865f2017-04-18 17:49:1335
36 if (command_line->HasSwitch(switches::kTestingFixedHttpPort)) {
37 int value;
38 base::StringToInt(
39 command_line->GetSwitchValueASCII(switches::kTestingFixedHttpPort),
40 &value);
41 params.testing_fixed_http_port = value;
42 }
43 if (command_line->HasSwitch(switches::kTestingFixedHttpsPort)) {
44 int value;
45 base::StringToInt(
46 command_line->GetSwitchValueASCII(switches::kTestingFixedHttpsPort),
47 &value);
48 params.testing_fixed_https_port = value;
49 }
jam6f02ddc2017-04-12 01:43:5050 builder.set_http_network_session_params(params);
yzshen6da6865f2017-04-18 17:49:1351 if (command_line->HasSwitch(switches::kHostResolverRules)) {
jam6f02ddc2017-04-12 01:43:5052 std::unique_ptr<net::HostResolver> host_resolver(
53 net::HostResolver::CreateDefaultResolver(nullptr));
54 std::unique_ptr<net::MappedHostResolver> remapped_host_resolver(
55 new net::MappedHostResolver(std::move(host_resolver)));
56 remapped_host_resolver->SetRulesFromString(
yzshen6da6865f2017-04-18 17:49:1357 command_line->GetSwitchValueASCII(switches::kHostResolverRules));
jam6f02ddc2017-04-12 01:43:5058 builder.set_host_resolver(std::move(remapped_host_resolver));
59 }
60 builder.set_accept_language("en-us,en");
61 builder.set_user_agent(GetContentClient()->GetUserAgent());
jam6f02ddc2017-04-12 01:43:5062 net::URLRequestContextBuilder::HttpCacheParams cache_params;
63
64 // We store the cache in memory so we can run many shells in parallel when
65 // running tests, otherwise the network services in each shell will corrupt
66 // the disk cache.
67 cache_params.type = net::URLRequestContextBuilder::HttpCacheParams::IN_MEMORY;
68
69 builder.EnableHttpCache(cache_params);
70 builder.set_file_enabled(true);
jam734386542017-05-08 21:21:3571 builder.set_data_enabled(true);
scottmgfd5066f2017-04-14 00:49:1772
yzshena90291c2017-04-26 16:22:5273 if (command_line->HasSwitch(switches::kProxyServer)) {
74 net::ProxyConfig config;
75 config.proxy_rules().ParseFromString(
76 command_line->GetSwitchValueASCII(switches::kProxyServer));
77 std::unique_ptr<net::ProxyConfigService> fixed_config_service =
78 base::MakeUnique<net::ProxyConfigServiceFixed>(config);
79 builder.set_proxy_config_service(std::move(fixed_config_service));
80 } else {
81 builder.set_proxy_service(net::ProxyService::CreateDirect());
82 }
83
jam6f02ddc2017-04-12 01:43:5084 return builder.Build();
85}
86
87} // namespace
88
jamc1905862017-05-16 14:45:3089NetworkContext::NetworkContext(mojom::NetworkContextRequest request,
90 mojom::NetworkContextParamsPtr params)
91 : url_request_context_(MakeURLRequestContext()),
jamc1905862017-05-16 14:45:3092 params_(std::move(params)),
93 binding_(this, std::move(request)) {}
jam6f02ddc2017-04-12 01:43:5094
95NetworkContext::~NetworkContext() {
jam6f02ddc2017-04-12 01:43:5096 // Call each URLLoaderImpl and ask it to release its net::URLRequest, as the
97 // corresponding net::URLRequestContext is going away with this
98 // NetworkContext. The loaders can be deregistering themselves in Cleanup(),
mmenke28bcb85f2017-06-23 01:14:3999 // so have to be careful.
100 while (!url_loaders_.empty())
101 (*url_loaders_.begin())->Cleanup();
jam6f02ddc2017-04-12 01:43:50102}
103
jamc1905862017-05-16 14:45:30104std::unique_ptr<NetworkContext> NetworkContext::CreateForTesting() {
105 return base::WrapUnique(new NetworkContext);
106}
107
jam6f02ddc2017-04-12 01:43:50108void NetworkContext::RegisterURLLoader(URLLoaderImpl* url_loader) {
109 DCHECK(url_loaders_.count(url_loader) == 0);
110 url_loaders_.insert(url_loader);
111}
112
113void NetworkContext::DeregisterURLLoader(URLLoaderImpl* url_loader) {
mmenke28bcb85f2017-06-23 01:14:39114 size_t removed_count = url_loaders_.erase(url_loader);
115 DCHECK(removed_count);
jam6f02ddc2017-04-12 01:43:50116}
117
jamc1905862017-05-16 14:45:30118void NetworkContext::CreateURLLoaderFactory(
119 mojom::URLLoaderFactoryRequest request,
120 uint32_t process_id) {
121 loader_factory_bindings_.AddBinding(
122 base::MakeUnique<NetworkServiceURLLoaderFactoryImpl>(this, process_id),
123 std::move(request));
124}
125
126void NetworkContext::HandleViewCacheRequest(const GURL& url,
127 mojom::URLLoaderClientPtr client) {
128 StartCacheURLLoader(url, url_request_context_.get(), std::move(client));
129}
130
131NetworkContext::NetworkContext()
132 : url_request_context_(MakeURLRequestContext()),
jamc1905862017-05-16 14:45:30133 binding_(this) {}
134
jam6f02ddc2017-04-12 01:43:50135} // namespace content