blob: 4dde5fdaaaa83a12a6b672b845739160f3fec72b [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"
mmenkef73a5122017-07-13 23:27:3912#include "content/network/network_service_impl.h"
jamc1905862017-05-16 14:45:3013#include "content/network/network_service_url_loader_factory_impl.h"
jam6f02ddc2017-04-12 01:43:5014#include "content/network/url_loader_impl.h"
15#include "content/public/common/content_client.h"
yzshen6da6865f2017-04-18 17:49:1316#include "content/public/common/content_switches.h"
jam6f02ddc2017-04-12 01:43:5017#include "net/dns/host_resolver.h"
18#include "net/dns/mapped_host_resolver.h"
mmenke7c7f4faf52017-06-01 00:25:2219#include "net/http/http_network_session.h"
yzshena90291c2017-04-26 16:22:5220#include "net/proxy/proxy_config.h"
21#include "net/proxy/proxy_config_service_fixed.h"
jam6f02ddc2017-04-12 01:43:5022#include "net/url_request/url_request_context.h"
23#include "net/url_request/url_request_context_builder.h"
24
25namespace content {
26
27namespace {
jam6f02ddc2017-04-12 01:43:5028
29std::unique_ptr<net::URLRequestContext> MakeURLRequestContext() {
30 net::URLRequestContextBuilder builder;
mmenke7c7f4faf52017-06-01 00:25:2231 net::HttpNetworkSession::Params params;
jam6f02ddc2017-04-12 01:43:5032 const base::CommandLine* command_line =
33 base::CommandLine::ForCurrentProcess();
yzshen6da6865f2017-04-18 17:49:1334 if (command_line->HasSwitch(switches::kIgnoreCertificateErrors))
jam6f02ddc2017-04-12 01:43:5035 params.ignore_certificate_errors = true;
yzshen6da6865f2017-04-18 17:49:1336
37 if (command_line->HasSwitch(switches::kTestingFixedHttpPort)) {
38 int value;
39 base::StringToInt(
40 command_line->GetSwitchValueASCII(switches::kTestingFixedHttpPort),
41 &value);
42 params.testing_fixed_http_port = value;
43 }
44 if (command_line->HasSwitch(switches::kTestingFixedHttpsPort)) {
45 int value;
46 base::StringToInt(
47 command_line->GetSwitchValueASCII(switches::kTestingFixedHttpsPort),
48 &value);
49 params.testing_fixed_https_port = value;
50 }
jam6f02ddc2017-04-12 01:43:5051 builder.set_http_network_session_params(params);
yzshen6da6865f2017-04-18 17:49:1352 if (command_line->HasSwitch(switches::kHostResolverRules)) {
jam6f02ddc2017-04-12 01:43:5053 std::unique_ptr<net::HostResolver> host_resolver(
54 net::HostResolver::CreateDefaultResolver(nullptr));
55 std::unique_ptr<net::MappedHostResolver> remapped_host_resolver(
56 new net::MappedHostResolver(std::move(host_resolver)));
57 remapped_host_resolver->SetRulesFromString(
yzshen6da6865f2017-04-18 17:49:1358 command_line->GetSwitchValueASCII(switches::kHostResolverRules));
jam6f02ddc2017-04-12 01:43:5059 builder.set_host_resolver(std::move(remapped_host_resolver));
60 }
61 builder.set_accept_language("en-us,en");
62 builder.set_user_agent(GetContentClient()->GetUserAgent());
jam6f02ddc2017-04-12 01:43:5063 net::URLRequestContextBuilder::HttpCacheParams cache_params;
64
65 // We store the cache in memory so we can run many shells in parallel when
66 // running tests, otherwise the network services in each shell will corrupt
67 // the disk cache.
68 cache_params.type = net::URLRequestContextBuilder::HttpCacheParams::IN_MEMORY;
69
70 builder.EnableHttpCache(cache_params);
71 builder.set_file_enabled(true);
jam734386542017-05-08 21:21:3572 builder.set_data_enabled(true);
scottmgfd5066f2017-04-14 00:49:1773
yzshena90291c2017-04-26 16:22:5274 if (command_line->HasSwitch(switches::kProxyServer)) {
75 net::ProxyConfig config;
76 config.proxy_rules().ParseFromString(
77 command_line->GetSwitchValueASCII(switches::kProxyServer));
78 std::unique_ptr<net::ProxyConfigService> fixed_config_service =
79 base::MakeUnique<net::ProxyConfigServiceFixed>(config);
80 builder.set_proxy_config_service(std::move(fixed_config_service));
81 } else {
82 builder.set_proxy_service(net::ProxyService::CreateDirect());
83 }
84
jam6f02ddc2017-04-12 01:43:5085 return builder.Build();
86}
87
88} // namespace
89
mmenkef73a5122017-07-13 23:27:3990NetworkContext::NetworkContext(NetworkServiceImpl* network_service,
mmenke502a6132017-06-29 00:36:2991 mojom::NetworkContextRequest request,
jamc1905862017-05-16 14:45:3092 mojom::NetworkContextParamsPtr params)
mmenke502a6132017-06-29 00:36:2993 : network_service_(network_service),
94 url_request_context_(MakeURLRequestContext()),
jamc1905862017-05-16 14:45:3095 params_(std::move(params)),
mmenke502a6132017-06-29 00:36:2996 binding_(this, std::move(request)) {
97 network_service_->RegisterNetworkContext(this);
98 binding_.set_connection_error_handler(
99 base::Bind(&NetworkContext::OnConnectionError, base::Unretained(this)));
100}
jam6f02ddc2017-04-12 01:43:50101
mmenkef73a5122017-07-13 23:27:39102// TODO(mmenke): Share URLRequestContextBulder configuration between two
103// constructors. Can only share them once consumer code is ready for its
104// corresponding options to be overwritten.
105NetworkContext::NetworkContext(
106 mojom::NetworkContextRequest request,
107 mojom::NetworkContextParamsPtr params,
108 std::unique_ptr<net::URLRequestContextBuilder> builder)
109 : network_service_(nullptr),
110 url_request_context_(builder->Build()),
111 params_(std::move(params)),
112 binding_(this, std::move(request)) {}
113
jam6f02ddc2017-04-12 01:43:50114NetworkContext::~NetworkContext() {
jam6f02ddc2017-04-12 01:43:50115 // Call each URLLoaderImpl and ask it to release its net::URLRequest, as the
116 // corresponding net::URLRequestContext is going away with this
117 // NetworkContext. The loaders can be deregistering themselves in Cleanup(),
mmenke28bcb85f2017-06-23 01:14:39118 // so have to be careful.
119 while (!url_loaders_.empty())
120 (*url_loaders_.begin())->Cleanup();
mmenke502a6132017-06-29 00:36:29121
122 // May be nullptr in tests.
123 if (network_service_)
124 network_service_->DeregisterNetworkContext(this);
jam6f02ddc2017-04-12 01:43:50125}
126
jamc1905862017-05-16 14:45:30127std::unique_ptr<NetworkContext> NetworkContext::CreateForTesting() {
128 return base::WrapUnique(new NetworkContext);
129}
130
jam6f02ddc2017-04-12 01:43:50131void NetworkContext::RegisterURLLoader(URLLoaderImpl* url_loader) {
132 DCHECK(url_loaders_.count(url_loader) == 0);
133 url_loaders_.insert(url_loader);
134}
135
136void NetworkContext::DeregisterURLLoader(URLLoaderImpl* url_loader) {
mmenke28bcb85f2017-06-23 01:14:39137 size_t removed_count = url_loaders_.erase(url_loader);
138 DCHECK(removed_count);
jam6f02ddc2017-04-12 01:43:50139}
140
jamc1905862017-05-16 14:45:30141void NetworkContext::CreateURLLoaderFactory(
142 mojom::URLLoaderFactoryRequest request,
143 uint32_t process_id) {
144 loader_factory_bindings_.AddBinding(
145 base::MakeUnique<NetworkServiceURLLoaderFactoryImpl>(this, process_id),
146 std::move(request));
147}
148
149void NetworkContext::HandleViewCacheRequest(const GURL& url,
150 mojom::URLLoaderClientPtr client) {
151 StartCacheURLLoader(url, url_request_context_.get(), std::move(client));
152}
153
mmenke502a6132017-06-29 00:36:29154void NetworkContext::Cleanup() {
155 // The NetworkService is going away, so have to destroy the
156 // net::URLRequestContext held by this NetworkContext.
157 delete this;
158}
159
jamc1905862017-05-16 14:45:30160NetworkContext::NetworkContext()
mmenke502a6132017-06-29 00:36:29161 : network_service_(nullptr),
162 url_request_context_(MakeURLRequestContext()),
jamc1905862017-05-16 14:45:30163 binding_(this) {}
164
mmenke502a6132017-06-29 00:36:29165void NetworkContext::OnConnectionError() {
166 // Don't delete |this| in response to connection errors when it was created by
167 // CreateForTesting.
168 if (network_service_)
169 delete this;
170}
171
jam6f02ddc2017-04-12 01:43:50172} // namespace content