url_request_context.cc revision 2a99a7e74a7f215066514fe81d2bfa6639d9eddd
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/url_request/url_request_context.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/compiler_specific.h" 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/debug/alias.h" 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/debug/stack_trace.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/string_util.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/cookies/cookie_store.h" 122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/dns/host_resolver.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/ftp/ftp_transaction_factory.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/http/http_transaction_factory.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/url_request/http_user_agent_settings.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/url_request/url_request.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace net { 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)URLRequestContext::URLRequestContext() 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : net_log_(NULL), 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) host_resolver_(NULL), 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cert_verifier_(NULL), 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) server_bound_cert_service_(NULL), 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fraudulent_certificate_reporter_(NULL), 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) http_auth_handler_factory_(NULL), 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proxy_service_(NULL), 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) network_delegate_(NULL), 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) http_server_properties_(NULL), 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) http_user_agent_settings_(NULL), 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) transport_security_state_(NULL), 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if !defined(DISABLE_FTP_SUPPORT) 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ftp_auth_cache_(new FtpAuthCache), 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) http_transaction_factory_(NULL), 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ftp_transaction_factory_(NULL), 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) job_factory_(NULL), 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) throttler_manager_(NULL), 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) url_requests_(new std::set<const URLRequest*>) { 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)URLRequestContext::~URLRequestContext() { 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AssertNoURLRequests(); 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void URLRequestContext::CopyFrom(const URLRequestContext* other) { 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Copy URLRequestContext parameters. 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) set_net_log(other->net_log_); 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) set_host_resolver(other->host_resolver_); 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) set_cert_verifier(other->cert_verifier_); 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) set_server_bound_cert_service(other->server_bound_cert_service_); 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) set_fraudulent_certificate_reporter(other->fraudulent_certificate_reporter_); 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) set_http_auth_handler_factory(other->http_auth_handler_factory_); 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) set_proxy_service(other->proxy_service_); 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) set_ssl_config_service(other->ssl_config_service_); 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) set_network_delegate(other->network_delegate_); 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) set_http_server_properties(other->http_server_properties_); 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) set_cookie_store(other->cookie_store_); 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) set_transport_security_state(other->transport_security_state_); 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // FTPAuthCache is unique per context. 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) set_http_transaction_factory(other->http_transaction_factory_); 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) set_ftp_transaction_factory(other->ftp_transaction_factory_); 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) set_job_factory(other->job_factory_); 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) set_throttler_manager(other->throttler_manager_); 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) set_http_user_agent_settings(other->http_user_agent_settings_); 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const HttpNetworkSession::Params* URLRequestContext::GetNetworkSessionParams( 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ) const { 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HttpTransactionFactory* transaction_factory = http_transaction_factory(); 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!transaction_factory) 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HttpNetworkSession* network_session = transaction_factory->GetSession(); 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!network_session) 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return &network_session->params(); 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)URLRequest* URLRequestContext::CreateRequest( 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& url, URLRequest::Delegate* delegate) const { 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return new URLRequest(url, delegate, this, network_delegate_); 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void URLRequestContext::set_cookie_store(CookieStore* cookie_store) { 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cookie_store_ = cookie_store; 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::string URLRequestContext::GetAcceptLanguage() const { 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return http_user_agent_settings_ ? 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) http_user_agent_settings_->GetAcceptLanguage() : EmptyString(); 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::string URLRequestContext::GetUserAgent(const GURL& url) const { 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return http_user_agent_settings_ ? 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) http_user_agent_settings_->GetUserAgent(url) : EmptyString(); 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void URLRequestContext::AssertNoURLRequests() const { 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int num_requests = url_requests_->size(); 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (num_requests != 0) { 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We're leaking URLRequests :( Dump the URL of the first one and record how 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // many we leaked so we have an idea of how bad it is. 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char url_buf[128]; 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const URLRequest* request = *url_requests_->begin(); 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::strlcpy(url_buf, request->url().spec().c_str(), arraysize(url_buf)); 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool has_delegate = request->has_delegate(); 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int load_flags = request->load_flags(); 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::debug::StackTrace stack_trace(NULL, 0); 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (request->stack_trace()) 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) stack_trace = *request->stack_trace(); 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::debug::Alias(url_buf); 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::debug::Alias(&num_requests); 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::debug::Alias(&has_delegate); 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::debug::Alias(&load_flags); 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::debug::Alias(&stack_trace); 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CHECK(false) << "Leaked " << num_requests << " URLRequest(s). First URL: " 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) << request->url().spec().c_str() << "."; 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace net 122