summaryrefslogtreecommitdiff
path: root/chromium/net/url_request/url_request_filter.h
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/net/url_request/url_request_filter.h')
-rw-r--r--chromium/net/url_request/url_request_filter.h105
1 files changed, 105 insertions, 0 deletions
diff --git a/chromium/net/url_request/url_request_filter.h b/chromium/net/url_request/url_request_filter.h
new file mode 100644
index 00000000000..2859c98c1d8
--- /dev/null
+++ b/chromium/net/url_request/url_request_filter.h
@@ -0,0 +1,105 @@
+// 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.
+//
+// A class to help filter URLRequest jobs based on the URL of the request
+// rather than just the scheme. Example usage:
+//
+// // Use as an "http" handler.
+// URLRequest::RegisterProtocolFactory("http", &URLRequestFilter::Factory);
+// // Add special handling for the URL http://foo.com/
+// URLRequestFilter::GetInstance()->AddUrlHandler(
+// GURL("http://foo.com/"),
+// &URLRequestCustomJob::Factory);
+//
+// If URLRequestFilter::Factory can't find a handle for the request, it passes
+// it through to URLRequestInetJob::Factory and lets the default network stack
+// handle it.
+
+#ifndef NET_URL_REQUEST_URL_REQUEST_FILTER_H_
+#define NET_URL_REQUEST_URL_REQUEST_FILTER_H_
+
+#include <map>
+#include <string>
+
+#include "base/callback.h"
+#include "base/containers/hash_tables.h"
+#include "base/memory/scoped_ptr.h"
+#include "net/base/net_export.h"
+#include "net/url_request/url_request.h"
+#include "net/url_request/url_request_job_factory.h"
+
+class GURL;
+
+namespace net {
+class URLRequestJob;
+
+class NET_EXPORT URLRequestFilter {
+ public:
+ // scheme,hostname -> ProtocolHandler
+ typedef std::map<std::pair<std::string, std::string>,
+ URLRequestJobFactory::ProtocolHandler* > HostnameHandlerMap;
+ // URL -> ProtocolHandler
+ typedef base::hash_map<std::string, URLRequestJobFactory::ProtocolHandler*>
+ UrlHandlerMap;
+
+ ~URLRequestFilter();
+
+ static URLRequest::ProtocolFactory Factory;
+
+ // Singleton instance for use.
+ static URLRequestFilter* GetInstance();
+
+ void AddHostnameHandler(const std::string& scheme,
+ const std::string& hostname,
+ URLRequest::ProtocolFactory* factory);
+ void AddHostnameProtocolHandler(
+ const std::string& scheme,
+ const std::string& hostname,
+ scoped_ptr<URLRequestJobFactory::ProtocolHandler> protocol_handler);
+ void RemoveHostnameHandler(const std::string& scheme,
+ const std::string& hostname);
+
+ // Returns true if we successfully added the URL handler. This will replace
+ // old handlers for the URL if one existed.
+ bool AddUrlHandler(const GURL& url,
+ URLRequest::ProtocolFactory* factory);
+ bool AddUrlProtocolHandler(
+ const GURL& url,
+ scoped_ptr<URLRequestJobFactory::ProtocolHandler> protocol_handler);
+
+ void RemoveUrlHandler(const GURL& url);
+
+ // Clear all the existing URL handlers and unregister with the
+ // ProtocolFactory. Resets the hit count.
+ void ClearHandlers();
+
+ // Returns the number of times a handler was used to service a request.
+ int hit_count() const { return hit_count_; }
+
+ protected:
+ URLRequestFilter();
+
+ // Helper method that looks up the request in the url_handler_map_.
+ URLRequestJob* FindRequestHandler(URLRequest* request,
+ NetworkDelegate* network_delegate,
+ const std::string& scheme);
+
+ // Maps hostnames to factories. Hostnames take priority over URLs.
+ HostnameHandlerMap hostname_handler_map_;
+
+ // Maps URLs to factories.
+ UrlHandlerMap url_handler_map_;
+
+ int hit_count_;
+
+ private:
+ // Singleton instance.
+ static URLRequestFilter* shared_instance_;
+
+ DISALLOW_COPY_AND_ASSIGN(URLRequestFilter);
+};
+
+} // namespace net
+
+#endif // NET_URL_REQUEST_URL_REQUEST_FILTER_H_