1 // Copyright (c) 2012 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 "net/url_request/url_request_context.h" 6 7 #include "base/compiler_specific.h" 8 #include "base/debug/alias.h" 9 #include "base/debug/stack_trace.h" 10 #include "base/strings/string_util.h" 11 #include "net/cookies/cookie_store.h" 12 #include "net/dns/host_resolver.h" 13 #include "net/http/http_transaction_factory.h" 14 #include "net/url_request/http_user_agent_settings.h" 15 #include "net/url_request/url_request.h" 16 17 namespace net { 18 19 URLRequestContext::URLRequestContext() 20 : net_log_(NULL), 21 host_resolver_(NULL), 22 cert_verifier_(NULL), 23 server_bound_cert_service_(NULL), 24 fraudulent_certificate_reporter_(NULL), 25 http_auth_handler_factory_(NULL), 26 proxy_service_(NULL), 27 network_delegate_(NULL), 28 http_user_agent_settings_(NULL), 29 transport_security_state_(NULL), 30 cert_transparency_verifier_(NULL), 31 http_transaction_factory_(NULL), 32 job_factory_(NULL), 33 throttler_manager_(NULL), 34 url_requests_(new std::set<const URLRequest*>) { 35 } 36 37 URLRequestContext::~URLRequestContext() { 38 AssertNoURLRequests(); 39 } 40 41 void URLRequestContext::CopyFrom(const URLRequestContext* other) { 42 // Copy URLRequestContext parameters. 43 set_net_log(other->net_log_); 44 set_host_resolver(other->host_resolver_); 45 set_cert_verifier(other->cert_verifier_); 46 set_server_bound_cert_service(other->server_bound_cert_service_); 47 set_fraudulent_certificate_reporter(other->fraudulent_certificate_reporter_); 48 set_http_auth_handler_factory(other->http_auth_handler_factory_); 49 set_proxy_service(other->proxy_service_); 50 set_ssl_config_service(other->ssl_config_service_.get()); 51 set_network_delegate(other->network_delegate_); 52 set_http_server_properties(other->http_server_properties_); 53 set_cookie_store(other->cookie_store_.get()); 54 set_transport_security_state(other->transport_security_state_); 55 set_cert_transparency_verifier(other->cert_transparency_verifier_); 56 set_http_transaction_factory(other->http_transaction_factory_); 57 set_job_factory(other->job_factory_); 58 set_throttler_manager(other->throttler_manager_); 59 set_http_user_agent_settings(other->http_user_agent_settings_); 60 } 61 62 const HttpNetworkSession::Params* URLRequestContext::GetNetworkSessionParams( 63 ) const { 64 HttpTransactionFactory* transaction_factory = http_transaction_factory(); 65 if (!transaction_factory) 66 return NULL; 67 HttpNetworkSession* network_session = transaction_factory->GetSession(); 68 if (!network_session) 69 return NULL; 70 return &network_session->params(); 71 } 72 73 scoped_ptr<URLRequest> URLRequestContext::CreateRequest( 74 const GURL& url, 75 RequestPriority priority, 76 URLRequest::Delegate* delegate) const { 77 return scoped_ptr<URLRequest>(new URLRequest(url, priority, delegate, this)); 78 } 79 80 void URLRequestContext::set_cookie_store(CookieStore* cookie_store) { 81 cookie_store_ = cookie_store; 82 } 83 84 std::string URLRequestContext::GetAcceptLanguage() const { 85 return http_user_agent_settings_ ? 86 http_user_agent_settings_->GetAcceptLanguage() : std::string(); 87 } 88 89 std::string URLRequestContext::GetUserAgent(const GURL& url) const { 90 return http_user_agent_settings_ ? 91 http_user_agent_settings_->GetUserAgent(url) : std::string(); 92 } 93 94 void URLRequestContext::AssertNoURLRequests() const { 95 int num_requests = url_requests_->size(); 96 if (num_requests != 0) { 97 // We're leaking URLRequests :( Dump the URL of the first one and record how 98 // many we leaked so we have an idea of how bad it is. 99 char url_buf[128]; 100 const URLRequest* request = *url_requests_->begin(); 101 base::strlcpy(url_buf, request->url().spec().c_str(), arraysize(url_buf)); 102 bool has_delegate = request->has_delegate(); 103 int load_flags = request->load_flags(); 104 base::debug::StackTrace stack_trace(NULL, 0); 105 if (request->stack_trace()) 106 stack_trace = *request->stack_trace(); 107 base::debug::Alias(url_buf); 108 base::debug::Alias(&num_requests); 109 base::debug::Alias(&has_delegate); 110 base::debug::Alias(&load_flags); 111 base::debug::Alias(&stack_trace); 112 CHECK(false) << "Leaked " << num_requests << " URLRequest(s). First URL: " 113 << request->url().spec().c_str() << "."; 114 } 115 } 116 117 } // namespace net 118