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.
5 #include "net/url_request/url_request_job_factory_impl.h"
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"
17 URLRequestInterceptor
* g_interceptor_for_testing
= NULL
;
21 URLRequestJobFactoryImpl::URLRequestJobFactoryImpl() {}
23 URLRequestJobFactoryImpl::~URLRequestJobFactoryImpl() {
24 STLDeleteValues(&protocol_handler_map_
);
27 bool URLRequestJobFactoryImpl::SetProtocolHandler(
28 const std::string
& scheme
,
29 scoped_ptr
<ProtocolHandler
> protocol_handler
) {
30 DCHECK(CalledOnValidThread());
32 if (!protocol_handler
) {
33 ProtocolHandlerMap::iterator it
= protocol_handler_map_
.find(scheme
);
34 if (it
== protocol_handler_map_
.end())
38 protocol_handler_map_
.erase(it
);
42 if (ContainsKey(protocol_handler_map_
, scheme
))
44 protocol_handler_map_
[scheme
] = protocol_handler
.release();
48 URLRequestJob
* URLRequestJobFactoryImpl::MaybeCreateJobWithProtocolHandler(
49 const std::string
& scheme
,
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
);
60 ProtocolHandlerMap::const_iterator it
= protocol_handler_map_
.find(scheme
);
61 if (it
== protocol_handler_map_
.end())
63 return it
->second
->MaybeCreateJob(request
, network_delegate
);
66 URLRequestJob
* URLRequestJobFactoryImpl::MaybeInterceptRedirect(
68 NetworkDelegate
* network_delegate
,
69 const GURL
& location
) const {
73 URLRequestJob
* URLRequestJobFactoryImpl::MaybeInterceptResponse(
75 NetworkDelegate
* network_delegate
) const {
79 bool URLRequestJobFactoryImpl::IsHandledProtocol(
80 const std::string
& scheme
) const {
81 DCHECK(CalledOnValidThread());
82 return ContainsKey(protocol_handler_map_
, scheme
) ||
83 URLRequestJobManager::GetInstance()->SupportsScheme(scheme
);
86 bool URLRequestJobFactoryImpl::IsHandledURL(const GURL
& url
) const {
87 if (!url
.is_valid()) {
88 // We handle error cases.
91 return IsHandledProtocol(url
.scheme());
94 bool URLRequestJobFactoryImpl::IsSafeRedirectTarget(
95 const GURL
& location
) const {
96 DCHECK(CalledOnValidThread());
97 if (!location
.is_valid()) {
98 // Error cases are safely handled.
101 ProtocolHandlerMap::const_iterator it
= protocol_handler_map_
.find(
103 if (it
== protocol_handler_map_
.end()) {
104 // Unhandled cases are safely handled.
107 return it
->second
->IsSafeRedirectTarget(location
);
111 void URLRequestJobFactoryImpl::SetInterceptorForTesting(
112 URLRequestInterceptor
* interceptor
) {
113 DCHECK(!interceptor
|| !g_interceptor_for_testing
);
115 g_interceptor_for_testing
= interceptor
;