diff options
21 files changed, 396 insertions, 185 deletions
diff --git a/chrome/browser/chromeos/gview_request_interceptor_unittest.cc b/chrome/browser/chromeos/gview_request_interceptor_unittest.cc index ca074a9..4799224 100644 --- a/chrome/browser/chromeos/gview_request_interceptor_unittest.cc +++ b/chrome/browser/chromeos/gview_request_interceptor_unittest.cc @@ -21,6 +21,7 @@ #include "net/url_request/url_request.h" #include "net/url_request/url_request_job.h" #include "net/url_request/url_request_job_factory.h" +#include "net/url_request/url_request_job_factory_impl.h" #include "net/url_request/url_request_test_job.h" #include "net/url_request/url_request_test_util.h" #include "testing/gtest/include/gtest/gtest.h" @@ -175,7 +176,7 @@ class GViewRequestInterceptorTest : public testing::Test { webkit::npapi::MockPluginList plugin_list_; TestingPrefService prefs_; scoped_refptr<PluginPrefs> plugin_prefs_; - net::URLRequestJobFactory job_factory_; + net::URLRequestJobFactoryImpl job_factory_; const net::URLRequestJobFactory* old_factory_; TestDelegate test_delegate_; FilePath pdf_path_; diff --git a/chrome/browser/extensions/api/downloads/downloads_api_unittest.cc b/chrome/browser/extensions/api/downloads/downloads_api_unittest.cc index 0c14e98..e34f6af 100644 --- a/chrome/browser/extensions/api/downloads/downloads_api_unittest.cc +++ b/chrome/browser/extensions/api/downloads/downloads_api_unittest.cc @@ -44,6 +44,7 @@ #include "net/url_request/url_request.h" #include "net/url_request/url_request_context.h" #include "net/url_request/url_request_job.h" +#include "net/url_request/url_request_job_factory_impl.h" #include "net/url_request/url_request_job_factory.h" #include "webkit/blob/blob_data.h" #include "webkit/blob/blob_storage_controller.h" @@ -658,7 +659,7 @@ class TestURLRequestContext : public net::URLRequestContext { } private: - net::URLRequestJobFactory job_factory_; + net::URLRequestJobFactoryImpl job_factory_; scoped_ptr<webkit_blob::BlobStorageController> blob_storage_controller_; DISALLOW_COPY_AND_ASSIGN(TestURLRequestContext); diff --git a/chrome/browser/extensions/extension_protocols_unittest.cc b/chrome/browser/extensions/extension_protocols_unittest.cc index 368bd97..0cd6836 100644 --- a/chrome/browser/extensions/extension_protocols_unittest.cc +++ b/chrome/browser/extensions/extension_protocols_unittest.cc @@ -13,6 +13,7 @@ #include "content/public/test/mock_resource_context.h" #include "content/public/test/test_browser_thread.h" #include "net/url_request/url_request.h" +#include "net/url_request/url_request_job_factory_impl.h" #include "net/url_request/url_request_status.h" #include "net/url_request/url_request_test_util.h" #include "testing/gtest/include/gtest/gtest.h" @@ -82,7 +83,7 @@ class ExtensionProtocolTest : public testing::Test { content::TestBrowserThread file_thread_; content::TestBrowserThread io_thread_; scoped_refptr<ExtensionInfoMap> extension_info_map_; - net::URLRequestJobFactory job_factory_; + net::URLRequestJobFactoryImpl job_factory_; const net::URLRequestJobFactory* old_factory_; TestDelegate test_delegate_; content::MockResourceContext resource_context_; diff --git a/chrome/browser/net/http_intercept_job_factory.cc b/chrome/browser/net/http_intercept_job_factory.cc new file mode 100644 index 0000000..e3f2e77 --- /dev/null +++ b/chrome/browser/net/http_intercept_job_factory.cc @@ -0,0 +1,82 @@ +// Copyright (c) 2011 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "chrome/browser/net/http_intercept_job_factory.h" + +#include "base/stl_util.h" +#include "googleurl/src/gurl.h" +#include "net/base/load_flags.h" +#include "net/url_request/url_request_job_manager.h" + +class GURL; + +namespace net { + +const char* kHttpScheme = "http"; +const char* kHttpsScheme = "https"; + +HttpInterceptJobFactory::HttpInterceptJobFactory( + const URLRequestJobFactory* job_factory, + ProtocolHandler* protocol_handler) + : job_factory_(job_factory), + protocol_handler_(protocol_handler) { +} + +HttpInterceptJobFactory::~HttpInterceptJobFactory() {} + +bool HttpInterceptJobFactory::SetProtocolHandler( + const std::string& scheme, ProtocolHandler* protocol_handler) { + NOTREACHED(); + return false; +} + +void HttpInterceptJobFactory::AddInterceptor(Interceptor* interceptor) { + // Interceptor addition is not allowed. + NOTREACHED(); +} + +URLRequestJob* HttpInterceptJobFactory::MaybeCreateJobWithInterceptor( + URLRequest* request, NetworkDelegate* network_delegate) const { + return job_factory_->MaybeCreateJobWithInterceptor(request, network_delegate); +} + +URLRequestJob* HttpInterceptJobFactory::MaybeCreateJobWithProtocolHandler( + const std::string& scheme, + URLRequest* request, + NetworkDelegate* network_delegate) const { + DCHECK(CalledOnValidThread()); + if (scheme == kHttpScheme || scheme == kHttpsScheme) + return protocol_handler_->MaybeCreateJob(request, network_delegate); + return job_factory_->MaybeCreateJobWithProtocolHandler( + scheme, request, network_delegate); +} + +URLRequestJob* HttpInterceptJobFactory::MaybeInterceptRedirect( + const GURL& location, + URLRequest* request, + NetworkDelegate* network_delegate) const { + return job_factory_->MaybeInterceptRedirect( + location, request, network_delegate); +} + +URLRequestJob* HttpInterceptJobFactory::MaybeInterceptResponse( + URLRequest* request, NetworkDelegate* network_delegate) const { + return job_factory_->MaybeInterceptResponse(request, network_delegate); +} + +bool HttpInterceptJobFactory::IsHandledProtocol( + const std::string& scheme) const { + DCHECK(CalledOnValidThread()); + if (scheme == kHttpScheme || scheme == kHttpsScheme) + return true; + return job_factory_->IsHandledProtocol(scheme); +} + +bool HttpInterceptJobFactory::IsHandledURL(const GURL& url) const { + if (url.scheme() == kHttpScheme || url.scheme() == kHttpsScheme) + return true; + return job_factory_->IsHandledURL(url); +} + +} // namespace net diff --git a/chrome/browser/net/http_intercept_job_factory.h b/chrome/browser/net/http_intercept_job_factory.h new file mode 100644 index 0000000..7e78d3d --- /dev/null +++ b/chrome/browser/net/http_intercept_job_factory.h @@ -0,0 +1,56 @@ +// Copyright (c) 2011 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CHROME_BROWSER_NET_HTTP_INTERCEPT_JOB_FACTORY_H_ +#define CHROME_BROWSER_NET_HTTP_INTERCEPT_JOB_FACTORY_H_ + +#include "base/basictypes.h" +#include "base/compiler_specific.h" +#include "net/url_request/url_request_job_factory.h" + +class GURL; + +namespace net { + +class URLRequest; +class URLRequestJob; + +// This class acts as a wrapper for URLRequestJobFactory. It handles HTTP and +// HTTPS jobs using |protocol_handler_|, but forwards all other schemes to the +// old job factory to be handled there. +class HttpInterceptJobFactory : public URLRequestJobFactory { + public: + HttpInterceptJobFactory(const URLRequestJobFactory* job_factory, + ProtocolHandler* protocol_handler); + virtual ~HttpInterceptJobFactory(); + + // URLRequestJobFactory implementation + virtual bool SetProtocolHandler(const std::string& scheme, + ProtocolHandler* protocol_handler) OVERRIDE; + virtual void AddInterceptor(Interceptor* interceptor) OVERRIDE; + virtual URLRequestJob* MaybeCreateJobWithInterceptor( + URLRequest* request, NetworkDelegate* network_delegate) const OVERRIDE; + virtual URLRequestJob* MaybeCreateJobWithProtocolHandler( + const std::string& scheme, + URLRequest* request, + NetworkDelegate* network_delegate) const OVERRIDE; + virtual URLRequestJob* MaybeInterceptRedirect( + const GURL& location, + URLRequest* request, + NetworkDelegate* network_delegate) const OVERRIDE; + virtual URLRequestJob* MaybeInterceptResponse( + URLRequest* request, NetworkDelegate* network_delegate) const OVERRIDE; + virtual bool IsHandledProtocol(const std::string& scheme) const OVERRIDE; + virtual bool IsHandledURL(const GURL& url) const OVERRIDE; + + private: + const URLRequestJobFactory* job_factory_; + ProtocolHandler* protocol_handler_; + + DISALLOW_COPY_AND_ASSIGN(HttpInterceptJobFactory); +}; + +} // namespace net + +#endif // CHROME_BROWSER_NET_HTTP_INTERCEPT_JOB_FACTORY_H_ diff --git a/chrome/browser/profiles/off_the_record_profile_io_data.cc b/chrome/browser/profiles/off_the_record_profile_io_data.cc index 2e0b896..6897619 100644 --- a/chrome/browser/profiles/off_the_record_profile_io_data.cc +++ b/chrome/browser/profiles/off_the_record_profile_io_data.cc @@ -32,7 +32,7 @@ #include "net/http/http_server_properties_impl.h" #include "net/url_request/file_protocol_handler.h" #include "net/url_request/ftp_protocol_handler.h" -#include "net/url_request/url_request_job_factory.h" +#include "net/url_request/url_request_job_factory_impl.h" #include "webkit/database/database_tracker.h" using content::BrowserThread; @@ -252,8 +252,8 @@ void OffTheRecordProfileIOData::LazyInitializeInternal( main_context->set_chrome_url_data_manager_backend( chrome_url_data_manager_backend()); - main_job_factory_.reset(new net::URLRequestJobFactory); - extensions_job_factory_.reset(new net::URLRequestJobFactory); + main_job_factory_.reset(new net::URLRequestJobFactoryImpl); + extensions_job_factory_.reset(new net::URLRequestJobFactoryImpl); int set_protocol = main_job_factory_->SetProtocolHandler( chrome::kFileScheme, new net::FileProtocolHandler()); diff --git a/chrome/browser/profiles/profile_impl_io_data.cc b/chrome/browser/profiles/profile_impl_io_data.cc index d2afc28..973049f 100644 --- a/chrome/browser/profiles/profile_impl_io_data.cc +++ b/chrome/browser/profiles/profile_impl_io_data.cc @@ -37,7 +37,7 @@ #include "net/http/http_cache.h" #include "net/url_request/file_protocol_handler.h" #include "net/url_request/ftp_protocol_handler.h" -#include "net/url_request/url_request_job_factory.h" +#include "net/url_request/url_request_job_factory_impl.h" #include "webkit/quota/special_storage_policy.h" using content::BrowserThread; @@ -451,9 +451,9 @@ void ProfileImplIOData::LazyInitializeInternal( // media cache. media_request_context_.reset(InitializeMediaRequestContext(main_context, "")); - main_job_factory_.reset(new net::URLRequestJobFactory); - media_request_job_factory_.reset(new net::URLRequestJobFactory); - extensions_job_factory_.reset(new net::URLRequestJobFactory); + main_job_factory_.reset(new net::URLRequestJobFactoryImpl); + media_request_job_factory_.reset(new net::URLRequestJobFactoryImpl); + extensions_job_factory_.reset(new net::URLRequestJobFactoryImpl); int set_protocol = main_job_factory_->SetProtocolHandler( chrome::kFileScheme, new net::FileProtocolHandler()); diff --git a/chrome/chrome_browser.gypi b/chrome/chrome_browser.gypi index f225934..eaa4a2b 100644 --- a/chrome/chrome_browser.gypi +++ b/chrome/chrome_browser.gypi @@ -1540,6 +1540,8 @@ 'browser/net/gaia/gaia_oauth_fetcher.h', 'browser/net/load_timing_observer.cc', 'browser/net/load_timing_observer.h', + 'browser/net/http_intercept_job_factory.cc', + 'browser/net/http_intercept_job_factory.h', 'browser/net/http_pipelining_compatibility_client.cc', 'browser/net/http_pipelining_compatibility_client.h', 'browser/net/http_server_properties_manager.h', diff --git a/content/shell/shell_url_request_context_getter.cc b/content/shell/shell_url_request_context_getter.cc index 06af8f7..cba69cb 100644 --- a/content/shell/shell_url_request_context_getter.cc +++ b/content/shell/shell_url_request_context_getter.cc @@ -21,7 +21,7 @@ #include "net/proxy/proxy_service.h" #include "net/url_request/url_request_context.h" #include "net/url_request/url_request_context_storage.h" -#include "net/url_request/url_request_job_factory.h" +#include "net/url_request/url_request_job_factory_impl.h" namespace content { @@ -104,7 +104,7 @@ net::URLRequestContext* ShellURLRequestContextGetter::GetURLRequestContext() { "" /* trusted_spdy_proxy */ ); storage_->set_http_transaction_factory(main_cache); - storage_->set_job_factory(new net::URLRequestJobFactory); + storage_->set_job_factory(new net::URLRequestJobFactoryImpl); } return url_request_context_.get(); diff --git a/net/net.gyp b/net/net.gyp index 572f052..27632fb 100644 --- a/net/net.gyp +++ b/net/net.gyp @@ -776,6 +776,8 @@ 'url_request/url_request_job.h', 'url_request/url_request_job_factory.cc', 'url_request/url_request_job_factory.h', + 'url_request/url_request_job_factory_impl.cc', + 'url_request/url_request_job_factory_impl.h', 'url_request/url_request_job_manager.cc', 'url_request/url_request_job_manager.h', 'url_request/url_request_netlog_params.cc', @@ -1355,7 +1357,7 @@ 'url_request/url_request_context_builder_unittest.cc', 'url_request/url_request_filter_unittest.cc', 'url_request/url_request_ftp_job_unittest.cc', - 'url_request/url_request_job_factory_unittest.cc', + 'url_request/url_request_job_factory_impl_unittest.cc', 'url_request/url_request_job_unittest.cc', 'url_request/url_request_throttler_simulation_unittest.cc', 'url_request/url_request_throttler_test_support.cc', diff --git a/net/proxy/proxy_script_fetcher_impl_unittest.cc b/net/proxy/proxy_script_fetcher_impl_unittest.cc index 7ece88c..5fc8099 100644 --- a/net/proxy/proxy_script_fetcher_impl_unittest.cc +++ b/net/proxy/proxy_script_fetcher_impl_unittest.cc @@ -23,7 +23,7 @@ #include "net/test/test_server.h" #include "net/url_request/url_request_context_storage.h" #include "net/url_request/url_request_file_job.h" -#include "net/url_request/url_request_job_factory.h" +#include "net/url_request/url_request_job_factory_impl.h" #include "net/url_request/url_request_test_util.h" #include "testing/gtest/include/gtest/gtest.h" #include "testing/platform_test.h" @@ -90,7 +90,7 @@ class RequestContext : public URLRequestContext { storage_.set_http_transaction_factory(new HttpCache( network_session, HttpCache::DefaultBackend::InMemory(0))); - url_request_job_factory_.reset(new URLRequestJobFactory); + url_request_job_factory_.reset(new URLRequestJobFactoryImpl); set_job_factory(url_request_job_factory_.get()); url_request_job_factory_->AddInterceptor( new CheckNoRevocationFlagSetInterceptor); diff --git a/net/url_request/url_request_job_factory.cc b/net/url_request/url_request_job_factory.cc index 4961c03..e07152a 100644 --- a/net/url_request/url_request_job_factory.cc +++ b/net/url_request/url_request_job_factory.cc @@ -4,11 +4,6 @@ #include "net/url_request/url_request_job_factory.h" -#include "base/stl_util.h" -#include "googleurl/src/gurl.h" -#include "net/base/load_flags.h" -#include "net/url_request/url_request_job_manager.h" - namespace net { URLRequestJobFactory::ProtocolHandler::~ProtocolHandler() {} @@ -22,117 +17,6 @@ bool URLRequestJobFactory::Interceptor::WillHandleProtocol( URLRequestJobFactory::URLRequestJobFactory() {} -URLRequestJobFactory::~URLRequestJobFactory() { - STLDeleteValues(&protocol_handler_map_); - STLDeleteElements(&interceptors_); -} - -bool URLRequestJobFactory::SetProtocolHandler( - const std::string& scheme, - ProtocolHandler* protocol_handler) { - DCHECK(CalledOnValidThread()); - - if (!protocol_handler) { - ProtocolHandlerMap::iterator it = protocol_handler_map_.find(scheme); - if (it == protocol_handler_map_.end()) - return false; - - delete it->second; - protocol_handler_map_.erase(it); - return true; - } - - if (ContainsKey(protocol_handler_map_, scheme)) - return false; - protocol_handler_map_[scheme] = protocol_handler; - return true; -} - -void URLRequestJobFactory::AddInterceptor(Interceptor* interceptor) { - DCHECK(CalledOnValidThread()); - CHECK(interceptor); - - interceptors_.push_back(interceptor); -} - -URLRequestJob* URLRequestJobFactory::MaybeCreateJobWithInterceptor( - URLRequest* request, NetworkDelegate* network_delegate) const { - DCHECK(CalledOnValidThread()); - URLRequestJob* job = NULL; - - if (!(request->load_flags() & LOAD_DISABLE_INTERCEPT)) { - InterceptorList::const_iterator i; - for (i = interceptors_.begin(); i != interceptors_.end(); ++i) { - job = (*i)->MaybeIntercept(request, network_delegate); - if (job) - return job; - } - } - return NULL; -} - -URLRequestJob* URLRequestJobFactory::MaybeCreateJobWithProtocolHandler( - const std::string& scheme, - URLRequest* request, - NetworkDelegate* network_delegate) const { - DCHECK(CalledOnValidThread()); - ProtocolHandlerMap::const_iterator it = protocol_handler_map_.find(scheme); - if (it == protocol_handler_map_.end()) - return NULL; - return it->second->MaybeCreateJob(request, network_delegate); -} - -URLRequestJob* URLRequestJobFactory::MaybeInterceptRedirect( - const GURL& location, - URLRequest* request, - NetworkDelegate* network_delegate) const { - DCHECK(CalledOnValidThread()); - URLRequestJob* job = NULL; - - if (!(request->load_flags() & LOAD_DISABLE_INTERCEPT)) { - InterceptorList::const_iterator i; - for (i = interceptors_.begin(); i != interceptors_.end(); ++i) { - job = (*i)->MaybeInterceptRedirect(location, request, network_delegate); - if (job) - return job; - } - } - return NULL; -} - -URLRequestJob* URLRequestJobFactory::MaybeInterceptResponse( - URLRequest* request, NetworkDelegate* network_delegate) const { - DCHECK(CalledOnValidThread()); - URLRequestJob* job = NULL; - - if (!(request->load_flags() & LOAD_DISABLE_INTERCEPT)) { - InterceptorList::const_iterator i; - for (i = interceptors_.begin(); i != interceptors_.end(); ++i) { - job = (*i)->MaybeInterceptResponse(request, network_delegate); - if (job) - return job; - } - } - return NULL; -} - -bool URLRequestJobFactory::IsHandledProtocol(const std::string& scheme) const { - DCHECK(CalledOnValidThread()); - InterceptorList::const_iterator i; - for (i = interceptors_.begin(); i != interceptors_.end(); ++i) { - if ((*i)->WillHandleProtocol(scheme)) - return true; - } - return ContainsKey(protocol_handler_map_, scheme) || - URLRequestJobManager::GetInstance()->SupportsScheme(scheme); -} - -bool URLRequestJobFactory::IsHandledURL(const GURL& url) const { - if (!url.is_valid()) { - // We handle error cases. - return true; - } - return IsHandledProtocol(url.scheme()); -} +URLRequestJobFactory::~URLRequestJobFactory() {} } // namespace net diff --git a/net/url_request/url_request_job_factory.h b/net/url_request/url_request_job_factory.h index 5f4e1ae..adff7f1 100644 --- a/net/url_request/url_request_job_factory.h +++ b/net/url_request/url_request_job_factory.h @@ -5,10 +5,10 @@ #ifndef NET_URL_REQUEST_URL_REQUEST_JOB_FACTORY_H_ #define NET_URL_REQUEST_URL_REQUEST_JOB_FACTORY_H_ -#include <map> #include <string> -#include <vector> + #include "base/basictypes.h" +#include "base/compiler_specific.h" #include "base/threading/non_thread_safe.h" #include "net/base/net_export.h" @@ -23,6 +23,7 @@ class URLRequestJob; class NET_EXPORT URLRequestJobFactory : NON_EXPORTED_BASE(public base::NonThreadSafe) { public: + // TODO(shalev): Move this to URLRequestJobFactoryImpl. class NET_EXPORT ProtocolHandler { public: virtual ~ProtocolHandler(); @@ -31,6 +32,7 @@ class NET_EXPORT URLRequestJobFactory URLRequest* request, NetworkDelegate* network_delegate) const = 0; }; + // TODO(shalev): Move this to URLRequestJobFactoryImpl. class NET_EXPORT Interceptor { public: virtual ~Interceptor(); @@ -70,45 +72,43 @@ class NET_EXPORT URLRequestJobFactory }; URLRequestJobFactory(); - ~URLRequestJobFactory(); + virtual ~URLRequestJobFactory(); + // TODO(shalev): Remove this from the interface. // Sets the ProtocolHandler for a scheme. Returns true on success, false on // failure (a ProtocolHandler already exists for |scheme|). On success, // URLRequestJobFactory takes ownership of |protocol_handler|. - bool SetProtocolHandler(const std::string& scheme, - ProtocolHandler* protocol_handler); + virtual bool SetProtocolHandler(const std::string& scheme, + ProtocolHandler* protocol_handler) = 0; + // TODO(shalev): Remove this from the interface. // Takes ownership of |interceptor|. Adds it to the end of the Interceptor // list. - void AddInterceptor(Interceptor* interceptor); + virtual void AddInterceptor(Interceptor* interceptor) = 0; - URLRequestJob* MaybeCreateJobWithInterceptor( - URLRequest* request, NetworkDelegate* network_delegate) const; + // TODO(shalev): Consolidate MaybeCreateJobWithInterceptor and + // MaybeCreateJobWithProtocolHandler into a single method. + virtual URLRequestJob* MaybeCreateJobWithInterceptor( + URLRequest* request, NetworkDelegate* network_delegate) const = 0; - URLRequestJob* MaybeCreateJobWithProtocolHandler( + virtual URLRequestJob* MaybeCreateJobWithProtocolHandler( const std::string& scheme, URLRequest* request, - NetworkDelegate* network_delegate) const; + NetworkDelegate* network_delegate) const = 0; - URLRequestJob* MaybeInterceptRedirect( + virtual URLRequestJob* MaybeInterceptRedirect( const GURL& location, URLRequest* request, - NetworkDelegate* network_delegate) const; + NetworkDelegate* network_delegate) const = 0; - URLRequestJob* MaybeInterceptResponse( - URLRequest* request, NetworkDelegate* network_delegate) const; + virtual URLRequestJob* MaybeInterceptResponse( + URLRequest* request, NetworkDelegate* network_delegate) const = 0; - bool IsHandledProtocol(const std::string& scheme) const; + virtual bool IsHandledProtocol(const std::string& scheme) const = 0; - bool IsHandledURL(const GURL& url) const; + virtual bool IsHandledURL(const GURL& url) const = 0; private: - typedef std::map<std::string, ProtocolHandler*> ProtocolHandlerMap; - typedef std::vector<Interceptor*> InterceptorList; - - ProtocolHandlerMap protocol_handler_map_; - InterceptorList interceptors_; - DISALLOW_COPY_AND_ASSIGN(URLRequestJobFactory); }; diff --git a/net/url_request/url_request_job_factory_impl.cc b/net/url_request/url_request_job_factory_impl.cc new file mode 100644 index 0000000..aaeed79 --- /dev/null +++ b/net/url_request/url_request_job_factory_impl.cc @@ -0,0 +1,130 @@ +// Copyright (c) 2011 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "net/url_request/url_request_job_factory_impl.h" + +#include "base/stl_util.h" +#include "googleurl/src/gurl.h" +#include "net/base/load_flags.h" +#include "net/url_request/url_request_job_manager.h" + +namespace net { + +URLRequestJobFactoryImpl::URLRequestJobFactoryImpl() {} + +URLRequestJobFactoryImpl::~URLRequestJobFactoryImpl() { + STLDeleteValues(&protocol_handler_map_); + STLDeleteElements(&interceptors_); +} + +bool URLRequestJobFactoryImpl::SetProtocolHandler( + const std::string& scheme, + ProtocolHandler* protocol_handler) { + DCHECK(CalledOnValidThread()); + + if (!protocol_handler) { + ProtocolHandlerMap::iterator it = protocol_handler_map_.find(scheme); + if (it == protocol_handler_map_.end()) + return false; + + delete it->second; + protocol_handler_map_.erase(it); + return true; + } + + if (ContainsKey(protocol_handler_map_, scheme)) + return false; + protocol_handler_map_[scheme] = protocol_handler; + return true; +} + +void URLRequestJobFactoryImpl::AddInterceptor(Interceptor* interceptor) { + DCHECK(CalledOnValidThread()); + CHECK(interceptor); + + interceptors_.push_back(interceptor); +} + +URLRequestJob* URLRequestJobFactoryImpl::MaybeCreateJobWithInterceptor( + URLRequest* request, NetworkDelegate* network_delegate) const { + DCHECK(CalledOnValidThread()); + URLRequestJob* job = NULL; + + if (!(request->load_flags() & LOAD_DISABLE_INTERCEPT)) { + InterceptorList::const_iterator i; + for (i = interceptors_.begin(); i != interceptors_.end(); ++i) { + job = (*i)->MaybeIntercept(request, network_delegate); + if (job) + return job; + } + } + return NULL; +} + +URLRequestJob* URLRequestJobFactoryImpl::MaybeCreateJobWithProtocolHandler( + const std::string& scheme, + URLRequest* request, + NetworkDelegate* network_delegate) const { + DCHECK(CalledOnValidThread()); + ProtocolHandlerMap::const_iterator it = protocol_handler_map_.find(scheme); + if (it == protocol_handler_map_.end()) + return NULL; + return it->second->MaybeCreateJob(request, network_delegate); +} + +URLRequestJob* URLRequestJobFactoryImpl::MaybeInterceptRedirect( + const GURL& location, + URLRequest* request, + NetworkDelegate* network_delegate) const { + DCHECK(CalledOnValidThread()); + URLRequestJob* job = NULL; + + if (!(request->load_flags() & LOAD_DISABLE_INTERCEPT)) { + InterceptorList::const_iterator i; + for (i = interceptors_.begin(); i != interceptors_.end(); ++i) { + job = (*i)->MaybeInterceptRedirect(location, request, network_delegate); + if (job) + return job; + } + } + return NULL; +} + +URLRequestJob* URLRequestJobFactoryImpl::MaybeInterceptResponse( + URLRequest* request, NetworkDelegate* network_delegate) const { + DCHECK(CalledOnValidThread()); + URLRequestJob* job = NULL; + + if (!(request->load_flags() & LOAD_DISABLE_INTERCEPT)) { + InterceptorList::const_iterator i; + for (i = interceptors_.begin(); i != interceptors_.end(); ++i) { + job = (*i)->MaybeInterceptResponse(request, network_delegate); + if (job) + return job; + } + } + return NULL; +} + +bool URLRequestJobFactoryImpl::IsHandledProtocol( + const std::string& scheme) const { + DCHECK(CalledOnValidThread()); + InterceptorList::const_iterator i; + for (i = interceptors_.begin(); i != interceptors_.end(); ++i) { + if ((*i)->WillHandleProtocol(scheme)) + return true; + } + return ContainsKey(protocol_handler_map_, scheme) || + URLRequestJobManager::GetInstance()->SupportsScheme(scheme); +} + +bool URLRequestJobFactoryImpl::IsHandledURL(const GURL& url) const { + if (!url.is_valid()) { + // We handle error cases. + return true; + } + return IsHandledProtocol(url.scheme()); +} + +} // namespace net diff --git a/net/url_request/url_request_job_factory_impl.h b/net/url_request/url_request_job_factory_impl.h new file mode 100644 index 0000000..ff27185 --- /dev/null +++ b/net/url_request/url_request_job_factory_impl.h @@ -0,0 +1,52 @@ +// Copyright (c) 2011 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef NET_URL_REQUEST_URL_REQUEST_JOB_FACTORY_IMPL_H_ +#define NET_URL_REQUEST_URL_REQUEST_JOB_FACTORY_IMPL_H_ + +#include <map> +#include <vector> +#include "base/basictypes.h" +#include "net/base/net_export.h" +#include "net/url_request/url_request_job_factory.h" + +namespace net { + +class NET_EXPORT URLRequestJobFactoryImpl : public URLRequestJobFactory { + public: + URLRequestJobFactoryImpl(); + virtual ~URLRequestJobFactoryImpl(); + + // URLRequestJobFactory implementation + virtual bool SetProtocolHandler(const std::string& scheme, + ProtocolHandler* protocol_handler) OVERRIDE; + virtual void AddInterceptor(Interceptor* interceptor) OVERRIDE; + virtual URLRequestJob* MaybeCreateJobWithInterceptor( + URLRequest* request, NetworkDelegate* network_delegate) const OVERRIDE; + virtual URLRequestJob* MaybeCreateJobWithProtocolHandler( + const std::string& scheme, + URLRequest* request, + NetworkDelegate* network_delegate) const OVERRIDE; + virtual URLRequestJob* MaybeInterceptRedirect( + const GURL& location, + URLRequest* request, + NetworkDelegate* network_delegate) const OVERRIDE; + virtual URLRequestJob* MaybeInterceptResponse( + URLRequest* request, NetworkDelegate* network_delegate) const OVERRIDE; + virtual bool IsHandledProtocol(const std::string& scheme) const OVERRIDE; + virtual bool IsHandledURL(const GURL& url) const OVERRIDE; + + private: + typedef std::map<std::string, ProtocolHandler*> ProtocolHandlerMap; + typedef std::vector<Interceptor*> InterceptorList; + + ProtocolHandlerMap protocol_handler_map_; + InterceptorList interceptors_; + + DISALLOW_COPY_AND_ASSIGN(URLRequestJobFactoryImpl); +}; + +} // namespace net + +#endif // NET_URL_REQUEST_URL_REQUEST_JOB_FACTORY_IMPL_H_ diff --git a/net/url_request/url_request_job_factory_unittest.cc b/net/url_request/url_request_job_factory_impl_unittest.cc index 673e007..232b21a 100644 --- a/net/url_request/url_request_job_factory_unittest.cc +++ b/net/url_request/url_request_job_factory_impl_unittest.cc @@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "net/url_request/url_request_job_factory.h" +#include "net/url_request/url_request_job_factory_impl.h" #include "base/bind.h" #include "base/memory/weak_ptr.h" @@ -108,7 +108,7 @@ TEST(URLRequestJobFactoryTest, NoProtocolHandler) { TEST(URLRequestJobFactoryTest, BasicProtocolHandler) { TestDelegate delegate; - URLRequestJobFactory job_factory; + URLRequestJobFactoryImpl job_factory; TestURLRequestContext request_context; request_context.set_job_factory(&job_factory); job_factory.SetProtocolHandler("foo", new DummyProtocolHandler); @@ -121,7 +121,7 @@ TEST(URLRequestJobFactoryTest, BasicProtocolHandler) { } TEST(URLRequestJobFactoryTest, DeleteProtocolHandler) { - URLRequestJobFactory job_factory; + URLRequestJobFactoryImpl job_factory; TestURLRequestContext request_context; request_context.set_job_factory(&job_factory); job_factory.SetProtocolHandler("foo", new DummyProtocolHandler); @@ -130,7 +130,7 @@ TEST(URLRequestJobFactoryTest, DeleteProtocolHandler) { TEST(URLRequestJobFactoryTest, BasicInterceptor) { TestDelegate delegate; - URLRequestJobFactory job_factory; + URLRequestJobFactoryImpl job_factory; TestURLRequestContext request_context; request_context.set_job_factory(&job_factory); job_factory.AddInterceptor(new DummyInterceptor); @@ -144,7 +144,7 @@ TEST(URLRequestJobFactoryTest, BasicInterceptor) { TEST(URLRequestJobFactoryTest, InterceptorNeedsValidSchemeStill) { TestDelegate delegate; - URLRequestJobFactory job_factory; + URLRequestJobFactoryImpl job_factory; TestURLRequestContext request_context; request_context.set_job_factory(&job_factory); job_factory.AddInterceptor(new DummyInterceptor); @@ -158,7 +158,7 @@ TEST(URLRequestJobFactoryTest, InterceptorNeedsValidSchemeStill) { TEST(URLRequestJobFactoryTest, InterceptorOverridesProtocolHandler) { TestDelegate delegate; - URLRequestJobFactory job_factory; + URLRequestJobFactoryImpl job_factory; TestURLRequestContext request_context; request_context.set_job_factory(&job_factory); job_factory.SetProtocolHandler("foo", new DummyProtocolHandler); @@ -173,7 +173,7 @@ TEST(URLRequestJobFactoryTest, InterceptorOverridesProtocolHandler) { TEST(URLRequestJobFactoryTest, InterceptorDoesntInterceptUnknownProtocols) { TestDelegate delegate; - URLRequestJobFactory job_factory; + URLRequestJobFactoryImpl job_factory; TestURLRequestContext request_context; request_context.set_job_factory(&job_factory); DummyInterceptor* interceptor = new DummyInterceptor; @@ -187,7 +187,7 @@ TEST(URLRequestJobFactoryTest, InterceptorDoesntInterceptUnknownProtocols) { TEST(URLRequestJobFactoryTest, InterceptorInterceptsHandledUnknownProtocols) { TestDelegate delegate; - URLRequestJobFactory job_factory; + URLRequestJobFactoryImpl job_factory; TestURLRequestContext request_context; request_context.set_job_factory(&job_factory); DummyInterceptor* interceptor = new DummyInterceptor; @@ -204,7 +204,7 @@ TEST(URLRequestJobFactoryTest, InterceptorInterceptsHandledUnknownProtocols) { TEST(URLRequestJobFactoryTest, InterceptorAffectsIsHandledProtocol) { DummyInterceptor* interceptor = new DummyInterceptor; - URLRequestJobFactory job_factory; + URLRequestJobFactoryImpl job_factory; job_factory.AddInterceptor(interceptor); EXPECT_FALSE(interceptor->WillHandleProtocol("anything")); EXPECT_FALSE(job_factory.IsHandledProtocol("anything")); diff --git a/net/url_request/url_request_test_util.cc b/net/url_request/url_request_test_util.cc index 5e66c71..53574f7 100644 --- a/net/url_request/url_request_test_util.cc +++ b/net/url_request/url_request_test_util.cc @@ -16,7 +16,7 @@ #include "net/base/server_bound_cert_service.h" #include "net/http/http_network_session.h" #include "net/http/http_server_properties_impl.h" -#include "net/url_request/url_request_job_factory.h" +#include "net/url_request/url_request_job_factory_impl.h" #include "testing/gtest/include/gtest/gtest.h" namespace { @@ -109,7 +109,7 @@ void TestURLRequestContext::Init() { if (accept_charset().empty()) set_accept_charset("iso-8859-1,*,utf-8"); if (!job_factory()) - context_storage_.set_job_factory(new net::URLRequestJobFactory); + context_storage_.set_job_factory(new net::URLRequestJobFactoryImpl); } TestURLRequest::TestURLRequest(const GURL& url, diff --git a/net/url_request/url_request_unittest.cc b/net/url_request/url_request_unittest.cc index 325cdce..406dabf 100644 --- a/net/url_request/url_request_unittest.cc +++ b/net/url_request/url_request_unittest.cc @@ -56,7 +56,7 @@ #include "net/url_request/url_request.h" #include "net/url_request/url_request_file_dir_job.h" #include "net/url_request/url_request_http_job.h" -#include "net/url_request/url_request_job_factory.h" +#include "net/url_request/url_request_job_factory_impl.h" #include "net/url_request/url_request_redirect_job.h" #include "net/url_request/url_request_test_job.h" #include "net/url_request/url_request_test_util.h" @@ -438,7 +438,7 @@ class URLRequestTest : public PlatformTest { protected: TestNetworkDelegate default_network_delegate_; // must outlive URLRequest - URLRequestJobFactory job_factory_; + URLRequestJobFactoryImpl job_factory_; TestURLRequestContext default_context_; }; @@ -4168,7 +4168,7 @@ class URLRequestTestFTP : public URLRequestTest { TEST_F(URLRequestTestFTP, UnsafePort) { ASSERT_TRUE(test_server_.Start()); - URLRequestJobFactory job_factory; + URLRequestJobFactoryImpl job_factory; GURL url("ftp://127.0.0.1:7"); FtpProtocolHandler ftp_protocol_handler( diff --git a/webkit/appcache/appcache_update_job_unittest.cc b/webkit/appcache/appcache_update_job_unittest.cc index 73f8692..51e6331 100644 --- a/webkit/appcache/appcache_update_job_unittest.cc +++ b/webkit/appcache/appcache_update_job_unittest.cc @@ -12,7 +12,7 @@ #include "net/base/net_errors.h" #include "net/http/http_response_headers.h" #include "net/url_request/url_request_error_job.h" -#include "net/url_request/url_request_job_factory.h" +#include "net/url_request/url_request_job_factory_impl.h" #include "net/url_request/url_request_test_job.h" #include "net/url_request/url_request_test_util.h" #include "webkit/appcache/appcache_group.h" @@ -561,7 +561,7 @@ class IOThread : public base::Thread { } virtual void Init() { - job_factory_.reset(new net::URLRequestJobFactory); + job_factory_.reset(new net::URLRequestJobFactoryImpl); job_factory_->SetProtocolHandler("http", new MockHttpServerJobFactory); job_factory_->SetProtocolHandler("https", new MockHttpServerJobFactory); request_context_.reset(new TestURLRequestContext()); @@ -773,7 +773,7 @@ class AppCacheUpdateJobTest : public testing::Test, void ManifestRedirectTest() { ASSERT_EQ(MessageLoop::TYPE_IO, MessageLoop::current()->type()); - net::URLRequestJobFactory* new_factory(new net::URLRequestJobFactory); + net::URLRequestJobFactory* new_factory(new net::URLRequestJobFactoryImpl); new_factory->SetProtocolHandler("http", new RedirectFactory); io_thread_->SetNewJobFactory(new_factory); @@ -1636,7 +1636,7 @@ class AppCacheUpdateJobTest : public testing::Test, // Set some large number of times to return retry. // Expect 1 manifest fetch and 3 retries. RetryRequestTestJob::Initialize(5, RetryRequestTestJob::RETRY_AFTER_0, 4); - net::URLRequestJobFactory* new_factory(new net::URLRequestJobFactory); + net::URLRequestJobFactory* new_factory(new net::URLRequestJobFactoryImpl); new_factory->SetProtocolHandler("http", new RetryRequestTestJobFactory); io_thread_->SetNewJobFactory(new_factory); @@ -1667,7 +1667,7 @@ class AppCacheUpdateJobTest : public testing::Test, // Set some large number of times to return retry. // Expect 1 manifest fetch and 0 retries. RetryRequestTestJob::Initialize(5, RetryRequestTestJob::NO_RETRY_AFTER, 1); - net::URLRequestJobFactory* new_factory(new net::URLRequestJobFactory); + net::URLRequestJobFactory* new_factory(new net::URLRequestJobFactoryImpl); new_factory->SetProtocolHandler("http", new RetryRequestTestJobFactory); io_thread_->SetNewJobFactory(new_factory); @@ -1699,7 +1699,7 @@ class AppCacheUpdateJobTest : public testing::Test, // Expect 1 request and 0 retry attempts. RetryRequestTestJob::Initialize( 5, RetryRequestTestJob::NONZERO_RETRY_AFTER, 1); - net::URLRequestJobFactory* new_factory(new net::URLRequestJobFactory); + net::URLRequestJobFactory* new_factory(new net::URLRequestJobFactoryImpl); new_factory->SetProtocolHandler("http", new RetryRequestTestJobFactory); io_thread_->SetNewJobFactory(new_factory); @@ -1730,7 +1730,7 @@ class AppCacheUpdateJobTest : public testing::Test, // Set 2 as the retry limit (does not exceed the max). // Expect 1 manifest fetch, 2 retries, 1 url fetch, 1 manifest refetch. RetryRequestTestJob::Initialize(2, RetryRequestTestJob::RETRY_AFTER_0, 5); - net::URLRequestJobFactory* new_factory(new net::URLRequestJobFactory); + net::URLRequestJobFactory* new_factory(new net::URLRequestJobFactoryImpl); new_factory->SetProtocolHandler("http", new RetryRequestTestJobFactory); io_thread_->SetNewJobFactory(new_factory); @@ -1761,7 +1761,7 @@ class AppCacheUpdateJobTest : public testing::Test, // Set 1 as the retry limit (does not exceed the max). // Expect 1 manifest fetch, 1 url fetch, 1 url retry, 1 manifest refetch. RetryRequestTestJob::Initialize(1, RetryRequestTestJob::RETRY_AFTER_0, 4); - net::URLRequestJobFactory* new_factory(new net::URLRequestJobFactory); + net::URLRequestJobFactory* new_factory(new net::URLRequestJobFactoryImpl); new_factory->SetProtocolHandler("http", new RetryRequestTestJobFactory); io_thread_->SetNewJobFactory(new_factory); @@ -2603,7 +2603,7 @@ class AppCacheUpdateJobTest : public testing::Test, void IfModifiedSinceTest() { ASSERT_EQ(MessageLoop::TYPE_IO, MessageLoop::current()->type()); - net::URLRequestJobFactory* new_factory(new net::URLRequestJobFactory); + net::URLRequestJobFactory* new_factory(new net::URLRequestJobFactoryImpl); new_factory->SetProtocolHandler("http", new IfModifiedSinceJobFactory); io_thread_->SetNewJobFactory(new_factory); @@ -2669,7 +2669,7 @@ class AppCacheUpdateJobTest : public testing::Test, ASSERT_EQ(MessageLoop::TYPE_IO, MessageLoop::current()->type()); HttpHeadersRequestTestJob::Initialize("Sat, 29 Oct 1994 19:43:31 GMT", ""); - net::URLRequestJobFactory* new_factory(new net::URLRequestJobFactory); + net::URLRequestJobFactory* new_factory(new net::URLRequestJobFactoryImpl); new_factory->SetProtocolHandler("http", new IfModifiedSinceJobFactory); io_thread_->SetNewJobFactory(new_factory); @@ -2728,7 +2728,7 @@ class AppCacheUpdateJobTest : public testing::Test, ASSERT_EQ(MessageLoop::TYPE_IO, MessageLoop::current()->type()); HttpHeadersRequestTestJob::Initialize("", "\"LadeDade\""); - net::URLRequestJobFactory* new_factory(new net::URLRequestJobFactory); + net::URLRequestJobFactory* new_factory(new net::URLRequestJobFactoryImpl); new_factory->SetProtocolHandler("http", new IfModifiedSinceJobFactory); io_thread_->SetNewJobFactory(new_factory); @@ -2787,7 +2787,7 @@ class AppCacheUpdateJobTest : public testing::Test, ASSERT_EQ(MessageLoop::TYPE_IO, MessageLoop::current()->type()); HttpHeadersRequestTestJob::Initialize("", "\"LadeDade\""); - net::URLRequestJobFactory* new_factory(new net::URLRequestJobFactory); + net::URLRequestJobFactory* new_factory(new net::URLRequestJobFactoryImpl); new_factory->SetProtocolHandler("http", new IfModifiedSinceJobFactory); io_thread_->SetNewJobFactory(new_factory); @@ -2822,7 +2822,7 @@ class AppCacheUpdateJobTest : public testing::Test, // Verify that code is correct when building multiple extra headers. HttpHeadersRequestTestJob::Initialize( "Sat, 29 Oct 1994 19:43:31 GMT", "\"LadeDade\""); - net::URLRequestJobFactory* new_factory(new net::URLRequestJobFactory); + net::URLRequestJobFactory* new_factory(new net::URLRequestJobFactoryImpl); new_factory->SetProtocolHandler("http", new IfModifiedSinceJobFactory); io_thread_->SetNewJobFactory(new_factory); diff --git a/webkit/fileapi/local_file_system_operation_write_unittest.cc b/webkit/fileapi/local_file_system_operation_write_unittest.cc index cd1950a..04ac98f 100644 --- a/webkit/fileapi/local_file_system_operation_write_unittest.cc +++ b/webkit/fileapi/local_file_system_operation_write_unittest.cc @@ -13,7 +13,7 @@ #include "net/url_request/url_request.h" #include "net/url_request/url_request_context.h" #include "net/url_request/url_request_job.h" -#include "net/url_request/url_request_job_factory.h" +#include "net/url_request/url_request_job_factory_impl.h" #include "testing/gtest/include/gtest/gtest.h" #include "webkit/blob/blob_data.h" #include "webkit/blob/blob_storage_controller.h" @@ -192,7 +192,7 @@ class TestURLRequestContext : public net::URLRequestContext { } private: - net::URLRequestJobFactory job_factory_; + net::URLRequestJobFactoryImpl job_factory_; scoped_ptr<webkit_blob::BlobStorageController> blob_storage_controller_; DISALLOW_COPY_AND_ASSIGN(TestURLRequestContext); diff --git a/webkit/tools/test_shell/test_shell_request_context.cc b/webkit/tools/test_shell/test_shell_request_context.cc index 42d73c2..b5b8dd3 100644 --- a/webkit/tools/test_shell/test_shell_request_context.cc +++ b/webkit/tools/test_shell/test_shell_request_context.cc @@ -22,7 +22,7 @@ #include "net/proxy/proxy_config_service.h" #include "net/proxy/proxy_config_service_fixed.h" #include "net/proxy/proxy_service.h" -#include "net/url_request/url_request_job_factory.h" +#include "net/url_request/url_request_job_factory_impl.h" #include "third_party/WebKit/Source/WebKit/chromium/public/WebKit.h" #include "third_party/WebKit/Source/WebKit/chromium/public/platform/WebKitPlatformSupport.h" #include "webkit/blob/blob_storage_controller.h" @@ -120,7 +120,7 @@ void TestShellRequestContext::Init( file_system_context_ = static_cast<SimpleFileSystem*>( WebKit::webKitPlatformSupport()->fileSystem())->file_system_context(); - net::URLRequestJobFactory* job_factory = new net::URLRequestJobFactory; + net::URLRequestJobFactory* job_factory = new net::URLRequestJobFactoryImpl(); job_factory->SetProtocolHandler( "blob", new webkit_blob::BlobProtocolHandler( |