|  | // 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 "net/base/load_flags.h" | 
|  | #include "net/url_request/url_request_interceptor.h" | 
|  | #include "net/url_request/url_request_job_manager.h" | 
|  | #include "url/gurl.h" | 
|  |  | 
|  | namespace net { | 
|  |  | 
|  | namespace { | 
|  |  | 
|  | URLRequestInterceptor* g_interceptor_for_testing = NULL; | 
|  |  | 
|  | }  // namespace | 
|  |  | 
|  | URLRequestJobFactoryImpl::URLRequestJobFactoryImpl() {} | 
|  |  | 
|  | URLRequestJobFactoryImpl::~URLRequestJobFactoryImpl() { | 
|  | STLDeleteValues(&protocol_handler_map_); | 
|  | } | 
|  |  | 
|  | 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; | 
|  | } | 
|  |  | 
|  | URLRequestJob* URLRequestJobFactoryImpl::MaybeCreateJobWithProtocolHandler( | 
|  | const std::string& scheme, | 
|  | URLRequest* request, | 
|  | NetworkDelegate* network_delegate) const { | 
|  | DCHECK(CalledOnValidThread()); | 
|  | if (g_interceptor_for_testing) { | 
|  | URLRequestJob* job = g_interceptor_for_testing->MaybeInterceptRequest( | 
|  | request, network_delegate); | 
|  | if (job) | 
|  | return job; | 
|  | } | 
|  |  | 
|  | 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( | 
|  | URLRequest* request, | 
|  | NetworkDelegate* network_delegate, | 
|  | const GURL& location) const { | 
|  | return nullptr; | 
|  | } | 
|  |  | 
|  | URLRequestJob* URLRequestJobFactoryImpl::MaybeInterceptResponse( | 
|  | URLRequest* request, | 
|  | NetworkDelegate* network_delegate) const { | 
|  | return nullptr; | 
|  | } | 
|  |  | 
|  | bool URLRequestJobFactoryImpl::IsHandledProtocol( | 
|  | const std::string& scheme) const { | 
|  | DCHECK(CalledOnValidThread()); | 
|  | 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()); | 
|  | } | 
|  |  | 
|  | bool URLRequestJobFactoryImpl::IsSafeRedirectTarget( | 
|  | const GURL& location) const { | 
|  | DCHECK(CalledOnValidThread()); | 
|  | if (!location.is_valid()) { | 
|  | // Error cases are safely handled. | 
|  | return true; | 
|  | } | 
|  | ProtocolHandlerMap::const_iterator it = protocol_handler_map_.find( | 
|  | location.scheme()); | 
|  | if (it == protocol_handler_map_.end()) { | 
|  | // Unhandled cases are safely handled. | 
|  | return true; | 
|  | } | 
|  | return it->second->IsSafeRedirectTarget(location); | 
|  | } | 
|  |  | 
|  | // static | 
|  | void URLRequestJobFactoryImpl::SetInterceptorForTesting( | 
|  | URLRequestInterceptor* interceptor) { | 
|  | DCHECK(!interceptor || !g_interceptor_for_testing); | 
|  |  | 
|  | g_interceptor_for_testing = interceptor; | 
|  | } | 
|  |  | 
|  | }  // namespace net |