1 // Copyright (c) 2011 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_job_factory_impl.h"
6
7 #include "base/stl_util.h"
8 #include "net/base/load_flags.h"
9 #include "net/url_request/url_request_interceptor.h"
10 #include "net/url_request/url_request_job_manager.h"
11 #include "url/gurl.h"
12
13 namespace net {
14
15 namespace {
16
17 URLRequestInterceptor* g_interceptor_for_testing = NULL;
18
19 } // namespace
20
URLRequestJobFactoryImpl()21 URLRequestJobFactoryImpl::URLRequestJobFactoryImpl() {}
22
~URLRequestJobFactoryImpl()23 URLRequestJobFactoryImpl::~URLRequestJobFactoryImpl() {
24 STLDeleteValues(&protocol_handler_map_);
25 }
26
SetProtocolHandler(const std::string & scheme,ProtocolHandler * protocol_handler)27 bool URLRequestJobFactoryImpl::SetProtocolHandler(
28 const std::string& scheme,
29 ProtocolHandler* protocol_handler) {
30 DCHECK(CalledOnValidThread());
31
32 if (!protocol_handler) {
33 ProtocolHandlerMap::iterator it = protocol_handler_map_.find(scheme);
34 if (it == protocol_handler_map_.end())
35 return false;
36
37 delete it->second;
38 protocol_handler_map_.erase(it);
39 return true;
40 }
41
42 if (ContainsKey(protocol_handler_map_, scheme))
43 return false;
44 protocol_handler_map_[scheme] = protocol_handler;
45 return true;
46 }
47
MaybeCreateJobWithProtocolHandler(const std::string & scheme,URLRequest * request,NetworkDelegate * network_delegate) const48 URLRequestJob* URLRequestJobFactoryImpl::MaybeCreateJobWithProtocolHandler(
49 const std::string& scheme,
50 URLRequest* request,
51 NetworkDelegate* network_delegate) const {
52 DCHECK(CalledOnValidThread());
53 if (g_interceptor_for_testing) {
54 URLRequestJob* job = g_interceptor_for_testing->MaybeInterceptRequest(
55 request, network_delegate);
56 if (job)
57 return job;
58 }
59
60 ProtocolHandlerMap::const_iterator it = protocol_handler_map_.find(scheme);
61 if (it == protocol_handler_map_.end())
62 return NULL;
63 return it->second->MaybeCreateJob(request, network_delegate);
64 }
65
IsHandledProtocol(const std::string & scheme) const66 bool URLRequestJobFactoryImpl::IsHandledProtocol(
67 const std::string& scheme) const {
68 DCHECK(CalledOnValidThread());
69 return ContainsKey(protocol_handler_map_, scheme) ||
70 URLRequestJobManager::GetInstance()->SupportsScheme(scheme);
71 }
72
IsHandledURL(const GURL & url) const73 bool URLRequestJobFactoryImpl::IsHandledURL(const GURL& url) const {
74 if (!url.is_valid()) {
75 // We handle error cases.
76 return true;
77 }
78 return IsHandledProtocol(url.scheme());
79 }
80
IsSafeRedirectTarget(const GURL & location) const81 bool URLRequestJobFactoryImpl::IsSafeRedirectTarget(
82 const GURL& location) const {
83 DCHECK(CalledOnValidThread());
84 if (!location.is_valid()) {
85 // Error cases are safely handled.
86 return true;
87 }
88 ProtocolHandlerMap::const_iterator it = protocol_handler_map_.find(
89 location.scheme());
90 if (it == protocol_handler_map_.end()) {
91 // Unhandled cases are safely handled.
92 return true;
93 }
94 return it->second->IsSafeRedirectTarget(location);
95 }
96
97 // static
SetInterceptorForTesting(URLRequestInterceptor * interceptor)98 void URLRequestJobFactoryImpl::SetInterceptorForTesting(
99 URLRequestInterceptor* interceptor) {
100 DCHECK(!interceptor || !g_interceptor_for_testing);
101
102 g_interceptor_for_testing = interceptor;
103 }
104
105 } // namespace net
106