blob: 4eeab3b0bef66294a4da21b292fa3f0ace123aeb [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"
jamc1905862017-05-16 14:45:3010#include "content/network/cache_url_loader.h"
11#include "content/network/network_service_url_loader_factory_impl.h"
jam6f02ddc2017-04-12 01:43:5012#include "content/network/url_loader_impl.h"
13#include "content/public/common/content_client.h"
yzshen6da6865f2017-04-18 17:49:1314#include "content/public/common/content_switches.h"
jam6f02ddc2017-04-12 01:43:5015#include "net/dns/host_resolver.h"
16#include "net/dns/mapped_host_resolver.h"
yzshena90291c2017-04-26 16:22:5217#include "net/proxy/proxy_config.h"
18#include "net/proxy/proxy_config_service_fixed.h"
jam6f02ddc2017-04-12 01:43:5019#include "net/url_request/url_request_context.h"
20#include "net/url_request/url_request_context_builder.h"
21
22namespace content {
23
24namespace {
jam6f02ddc2017-04-12 01:43:5025
26std::unique_ptr<net::URLRequestContext> MakeURLRequestContext() {
27 net::URLRequestContextBuilder builder;
28 net::URLRequestContextBuilder::HttpNetworkSessionParams params;
29 const base::CommandLine* command_line =
30 base::CommandLine::ForCurrentProcess();
yzshen6da6865f2017-04-18 17:49:1331 if (command_line->HasSwitch(switches::kIgnoreCertificateErrors))
jam6f02ddc2017-04-12 01:43:5032 params.ignore_certificate_errors = true;
yzshen6da6865f2017-04-18 17:49:1333
34 if (command_line->HasSwitch(switches::kTestingFixedHttpPort)) {
35 int value;
36 base::StringToInt(
37 command_line->GetSwitchValueASCII(switches::kTestingFixedHttpPort),
38 &value);
39 params.testing_fixed_http_port = value;
40 }
41 if (command_line->HasSwitch(switches::kTestingFixedHttpsPort)) {
42 int value;
43 base::StringToInt(
44 command_line->GetSwitchValueASCII(switches::kTestingFixedHttpsPort),
45 &value);
46 params.testing_fixed_https_port = value;
47 }
jam6f02ddc2017-04-12 01:43:5048 builder.set_http_network_session_params(params);
yzshen6da6865f2017-04-18 17:49:1349 if (command_line->HasSwitch(switches::kHostResolverRules)) {
jam6f02ddc2017-04-12 01:43:5050 std::unique_ptr<net::HostResolver> host_resolver(
51 net::HostResolver::CreateDefaultResolver(nullptr));
52 std::unique_ptr<net::MappedHostResolver> remapped_host_resolver(
53 new net::MappedHostResolver(std::move(host_resolver)));
54 remapped_host_resolver->SetRulesFromString(
yzshen6da6865f2017-04-18 17:49:1355 command_line->GetSwitchValueASCII(switches::kHostResolverRules));
jam6f02ddc2017-04-12 01:43:5056 builder.set_host_resolver(std::move(remapped_host_resolver));
57 }
58 builder.set_accept_language("en-us,en");
59 builder.set_user_agent(GetContentClient()->GetUserAgent());
jam6f02ddc2017-04-12 01:43:5060 net::URLRequestContextBuilder::HttpCacheParams cache_params;
61
62 // We store the cache in memory so we can run many shells in parallel when
63 // running tests, otherwise the network services in each shell will corrupt
64 // the disk cache.
65 cache_params.type = net::URLRequestContextBuilder::HttpCacheParams::IN_MEMORY;
66
67 builder.EnableHttpCache(cache_params);
68 builder.set_file_enabled(true);
jam734386542017-05-08 21:21:3569 builder.set_data_enabled(true);
scottmgfd5066f2017-04-14 00:49:1770
yzshena90291c2017-04-26 16:22:5271 if (command_line->HasSwitch(switches::kProxyServer)) {
72 net::ProxyConfig config;
73 config.proxy_rules().ParseFromString(
74 command_line->GetSwitchValueASCII(switches::kProxyServer));
75 std::unique_ptr<net::ProxyConfigService> fixed_config_service =
76 base::MakeUnique<net::ProxyConfigServiceFixed>(config);
77 builder.set_proxy_config_service(std::move(fixed_config_service));
78 } else {
79 builder.set_proxy_service(net::ProxyService::CreateDirect());
80 }
81
jam6f02ddc2017-04-12 01:43:5082 return builder.Build();
83}
84
85} // namespace
86
jamc1905862017-05-16 14:45:3087NetworkContext::NetworkContext(mojom::NetworkContextRequest request,
88 mojom::NetworkContextParamsPtr params)
89 : url_request_context_(MakeURLRequestContext()),
90 in_shutdown_(false),
91 params_(std::move(params)),
92 binding_(this, std::move(request)) {}
jam6f02ddc2017-04-12 01:43:5093
94NetworkContext::~NetworkContext() {
95 in_shutdown_ = true;
96 // 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(),
99 // so iterate over a copy.
100 for (auto* url_loader : url_loaders_)
101 url_loader->Cleanup();
102}
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) {
114 if (!in_shutdown_) {
115 size_t removed_count = url_loaders_.erase(url_loader);
116 DCHECK(removed_count);
117 }
118}
119
jamc1905862017-05-16 14:45:30120void NetworkContext::CreateURLLoaderFactory(
121 mojom::URLLoaderFactoryRequest request,
122 uint32_t process_id) {
123 loader_factory_bindings_.AddBinding(
124 base::MakeUnique<NetworkServiceURLLoaderFactoryImpl>(this, process_id),
125 std::move(request));
126}
127
128void NetworkContext::HandleViewCacheRequest(const GURL& url,
129 mojom::URLLoaderClientPtr client) {
130 StartCacheURLLoader(url, url_request_context_.get(), std::move(client));
131}
132
133NetworkContext::NetworkContext()
134 : url_request_context_(MakeURLRequestContext()),
135 in_shutdown_(false),
136 binding_(this) {}
137
jam6f02ddc2017-04-12 01:43:50138} // namespace content