blob: 300c050ea43be007578f712bdb3f495111051170 [file] [log] [blame]
[email protected]aa84a7e2012-03-15 21:29:061// Copyright (c) 2012 The Chromium Authors. All rights reserved.
[email protected]f1d81922010-07-31 17:47:092// 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.h"
6
[email protected]18590f22011-07-29 16:41:287#include "base/compiler_specific.h"
[email protected]7c52ed92012-04-06 15:42:408#include "base/debug/alias.h"
danakj8522a25b2016-04-16 00:17:369#include "base/memory/ptr_util.h"
[email protected]4dc3ad4f2013-06-11 07:15:5010#include "base/strings/string_util.h"
xunjieli96ab36a72016-12-05 21:36:0511#include "base/strings/stringprintf.h"
fdoraya19b7702016-12-23 14:19:3112#include "base/threading/thread_task_runner_handle.h"
xunjieli96ab36a72016-12-05 21:36:0513#include "base/trace_event/memory_allocator_dump.h"
14#include "base/trace_event/memory_dump_manager.h"
15#include "base/trace_event/process_memory_dump.h"
xunjielid701b6e52017-01-04 22:17:4216#include "net/base/sdch_manager.h"
[email protected]aa84a7e2012-03-15 21:29:0617#include "net/cookies/cookie_store.h"
[email protected]f2cb3cf2013-03-21 01:40:5318#include "net/dns/host_resolver.h"
xunjielia0166f42017-02-23 17:44:5719#include "net/http/http_cache.h"
[email protected]f6c21cb2011-02-16 19:45:4120#include "net/http/http_transaction_factory.h"
xunjieli9f8c5fb52016-12-07 22:59:3321#include "net/socket/ssl_client_socket_impl.h"
[email protected]ee4c30d2012-11-07 15:08:4322#include "net/url_request/http_user_agent_settings.h"
[email protected]7c52ed92012-04-06 15:42:4023#include "net/url_request/url_request.h"
[email protected]9349cfb2010-08-31 18:00:5324
[email protected]27a112c2011-01-06 04:19:3025namespace net {
26
[email protected]9349cfb2010-08-31 18:00:5327URLRequestContext::URLRequestContext()
tbansalea2fb8c2015-05-22 22:23:0028 : net_log_(nullptr),
29 host_resolver_(nullptr),
30 cert_verifier_(nullptr),
31 channel_id_service_(nullptr),
tbansalea2fb8c2015-05-22 22:23:0032 http_auth_handler_factory_(nullptr),
33 proxy_service_(nullptr),
34 network_delegate_(nullptr),
bnc525e175a2016-06-20 12:36:4035 http_server_properties_(nullptr),
tbansalea2fb8c2015-05-22 22:23:0036 http_user_agent_settings_(nullptr),
mmenke606c59c2016-03-07 18:20:5537 cookie_store_(nullptr),
tbansalea2fb8c2015-05-22 22:23:0038 transport_security_state_(nullptr),
39 cert_transparency_verifier_(nullptr),
rsleevid6de8302016-06-21 01:33:2040 ct_policy_enforcer_(nullptr),
tbansalea2fb8c2015-05-22 22:23:0041 http_transaction_factory_(nullptr),
42 job_factory_(nullptr),
43 throttler_manager_(nullptr),
xunjieli3bb781a2015-07-22 22:40:3444 backoff_manager_(nullptr),
rdsmithd6ee1642015-05-29 15:01:3045 sdch_manager_(nullptr),
tbansalea2fb8c2015-05-22 22:23:0046 network_quality_estimator_(nullptr),
nharper5babb5e62016-03-09 18:58:0747 url_requests_(new std::set<const URLRequest*>),
mgershd21d6d142016-12-14 23:06:3648 enable_brotli_(false),
49 check_cleartext_permitted_(false) {
xunjieli96ab36a72016-12-05 21:36:0550 base::trace_event::MemoryDumpManager::GetInstance()->RegisterDumpProvider(
51 this, "URLRequestContext", base::ThreadTaskRunnerHandle::Get());
52}
[email protected]f1d81922010-07-31 17:47:0953
[email protected]ef2bf422012-05-11 03:27:0954URLRequestContext::~URLRequestContext() {
55 AssertNoURLRequests();
xunjieli96ab36a72016-12-05 21:36:0556 base::trace_event::MemoryDumpManager::GetInstance()->UnregisterDumpProvider(
57 this);
[email protected]ef2bf422012-05-11 03:27:0958}
59
[email protected]fa22a6f12012-05-11 17:19:5960void URLRequestContext::CopyFrom(const URLRequestContext* other) {
[email protected]d9696672011-03-15 22:45:0961 // Copy URLRequestContext parameters.
[email protected]fa22a6f12012-05-11 17:19:5962 set_net_log(other->net_log_);
63 set_host_resolver(other->host_resolver_);
64 set_cert_verifier(other->cert_verifier_);
[email protected]6b8a3c742014-07-25 00:25:3565 set_channel_id_service(other->channel_id_service_);
[email protected]fa22a6f12012-05-11 17:19:5966 set_http_auth_handler_factory(other->http_auth_handler_factory_);
67 set_proxy_service(other->proxy_service_);
[email protected]90499482013-06-01 00:39:5068 set_ssl_config_service(other->ssl_config_service_.get());
[email protected]fa22a6f12012-05-11 17:19:5969 set_network_delegate(other->network_delegate_);
70 set_http_server_properties(other->http_server_properties_);
mmenke606c59c2016-03-07 18:20:5571 set_cookie_store(other->cookie_store_);
[email protected]fa22a6f12012-05-11 17:19:5972 set_transport_security_state(other->transport_security_state_);
[email protected]284303b62013-11-28 15:11:5473 set_cert_transparency_verifier(other->cert_transparency_verifier_);
rsleevid6de8302016-06-21 01:33:2074 set_ct_policy_enforcer(other->ct_policy_enforcer_);
[email protected]fa22a6f12012-05-11 17:19:5975 set_http_transaction_factory(other->http_transaction_factory_);
[email protected]fa22a6f12012-05-11 17:19:5976 set_job_factory(other->job_factory_);
77 set_throttler_manager(other->throttler_manager_);
xunjieli3bb781a2015-07-22 22:40:3478 set_backoff_manager(other->backoff_manager_);
rdsmithd6ee1642015-05-29 15:01:3079 set_sdch_manager(other->sdch_manager_);
[email protected]ee4c30d2012-11-07 15:08:4380 set_http_user_agent_settings(other->http_user_agent_settings_);
tbansalea2fb8c2015-05-22 22:23:0081 set_network_quality_estimator(other->network_quality_estimator_);
maksim.sisov3d40c812016-05-02 13:27:1682 set_enable_brotli(other->enable_brotli_);
mgershd21d6d142016-12-14 23:06:3683 set_check_cleartext_permitted(other->check_cleartext_permitted_);
[email protected]d9696672011-03-15 22:45:0984}
85
[email protected]c2dad292012-09-07 21:27:3586const HttpNetworkSession::Params* URLRequestContext::GetNetworkSessionParams(
87 ) const {
88 HttpTransactionFactory* transaction_factory = http_transaction_factory();
89 if (!transaction_factory)
tbansalea2fb8c2015-05-22 22:23:0090 return nullptr;
[email protected]c2dad292012-09-07 21:27:3591 HttpNetworkSession* network_session = transaction_factory->GetSession();
92 if (!network_session)
tbansalea2fb8c2015-05-22 22:23:0093 return nullptr;
[email protected]c2dad292012-09-07 21:27:3594 return &network_session->params();
95}
96
danakj8522a25b2016-04-16 00:17:3697std::unique_ptr<URLRequest> URLRequestContext::CreateRequest(
[email protected]2ca01e52013-10-31 22:05:1998 const GURL& url,
99 RequestPriority priority,
davidben151423e2015-03-23 18:48:36100 URLRequest::Delegate* delegate) const {
danakj8522a25b2016-04-16 00:17:36101 return base::WrapUnique(
davidben151423e2015-03-23 18:48:36102 new URLRequest(url, priority, delegate, this, network_delegate_));
[email protected]8a26ff62012-08-24 21:49:20103}
104
rhalavatia9b551d2017-02-09 12:03:00105std::unique_ptr<URLRequest> URLRequestContext::CreateRequest(
106 const GURL& url,
107 RequestPriority priority,
108 URLRequest::Delegate* delegate,
109 NetworkTrafficAnnotationTag traffic_annotation) const {
110 // |traffic_annotation| is just a tag that is extracted during static
111 // code analysis and can be ignored here.
112 return CreateRequest(url, priority, delegate);
113}
114
[email protected]d100e44f2011-01-26 22:47:11115void URLRequestContext::set_cookie_store(CookieStore* cookie_store) {
116 cookie_store_ = cookie_store;
117}
118
[email protected]1e714bba2012-04-10 17:01:05119void URLRequestContext::AssertNoURLRequests() const {
[email protected]7c52ed92012-04-06 15:42:40120 int num_requests = url_requests_->size();
121 if (num_requests != 0) {
122 // We're leaking URLRequests :( Dump the URL of the first one and record how
123 // many we leaked so we have an idea of how bad it is.
124 char url_buf[128];
125 const URLRequest* request = *url_requests_->begin();
126 base::strlcpy(url_buf, request->url().spec().c_str(), arraysize(url_buf));
[email protected]eb4ecaca2012-05-04 01:05:03127 int load_flags = request->load_flags();
[email protected]7c52ed92012-04-06 15:42:40128 base::debug::Alias(url_buf);
129 base::debug::Alias(&num_requests);
[email protected]eb4ecaca2012-05-04 01:05:03130 base::debug::Alias(&load_flags);
[email protected]1f5f8e22012-09-06 23:40:54131 CHECK(false) << "Leaked " << num_requests << " URLRequest(s). First URL: "
132 << request->url().spec().c_str() << ".";
[email protected]7c52ed92012-04-06 15:42:40133 }
[email protected]9349cfb2010-08-31 18:00:53134}
[email protected]2fb629202010-12-23 23:52:57135
xunjieli96ab36a72016-12-05 21:36:05136bool URLRequestContext::OnMemoryDump(
137 const base::trace_event::MemoryDumpArgs& args,
138 base::trace_event::ProcessMemoryDump* pmd) {
139 if (name_.empty())
140 name_ = "unknown";
141 base::trace_event::MemoryAllocatorDump* dump = pmd->CreateAllocatorDump(
142 base::StringPrintf("net/url_request_context/%s_%p", name_.c_str(), this));
143 dump->AddScalar(base::trace_event::MemoryAllocatorDump::kNameObjectCount,
144 base::trace_event::MemoryAllocatorDump::kUnitsObjects,
145 url_requests_->size());
xunjieli9f8c5fb52016-12-07 22:59:33146 HttpTransactionFactory* transaction_factory = http_transaction_factory();
147 if (transaction_factory) {
148 HttpNetworkSession* network_session = transaction_factory->GetSession();
149 if (network_session)
150 network_session->DumpMemoryStats(pmd, dump->absolute_name());
xunjielia0166f42017-02-23 17:44:57151 HttpCache* http_cache = transaction_factory->GetCache();
152 if (http_cache)
153 http_cache->DumpMemoryStats(pmd, dump->absolute_name());
xunjieli9f8c5fb52016-12-07 22:59:33154 }
155 SSLClientSocketImpl::DumpSSLClientSessionMemoryStats(pmd);
xunjielid701b6e52017-01-04 22:17:42156 if (sdch_manager_)
157 sdch_manager_->DumpMemoryStats(pmd, dump->absolute_name());
xunjieli96ab36a72016-12-05 21:36:05158 return true;
159}
160
[email protected]27a112c2011-01-06 04:19:30161} // namespace net