summaryrefslogtreecommitdiff
path: root/chromium/net/url_request/url_request_job_factory_impl.cc
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/net/url_request/url_request_job_factory_impl.cc')
-rw-r--r--chromium/net/url_request/url_request_job_factory_impl.cc83
1 files changed, 83 insertions, 0 deletions
diff --git a/chromium/net/url_request/url_request_job_factory_impl.cc b/chromium/net/url_request/url_request_job_factory_impl.cc
new file mode 100644
index 00000000000..f456da2798f
--- /dev/null
+++ b/chromium/net/url_request/url_request_job_factory_impl.cc
@@ -0,0 +1,83 @@
+// 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_job_manager.h"
+#include "url/gurl.h"
+
+namespace net {
+
+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());
+ ProtocolHandlerMap::const_iterator it = protocol_handler_map_.find(scheme);
+ if (it == protocol_handler_map_.end())
+ return NULL;
+ return it->second->MaybeCreateJob(request, network_delegate);
+}
+
+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);
+}
+
+} // namespace net