1ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved.
2c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Use of this source code is governed by a BSD-style license that can be
3c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// found in the LICENSE file.
4c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott//
5ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// A class to help filter URLRequest jobs based on the URL of the request
6c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// rather than just the scheme.  Example usage:
7c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott//
8c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// // Use as an "http" handler.
9ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// URLRequest::RegisterProtocolFactory("http", &URLRequestFilter::Factory);
10c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// // Add special handling for the URL http://foo.com/
11c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// URLRequestFilter::GetInstance()->AddUrlHandler(
12c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott//     GURL("http://foo.com/"),
13c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott//     &URLRequestCustomJob::Factory);
14c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott//
15c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// If URLRequestFilter::Factory can't find a handle for the request, it passes
16c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// it through to URLRequestInetJob::Factory and lets the default network stack
17c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// handle it.
18c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
19c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifndef NET_URL_REQUEST_URL_REQUEST_FILTER_H_
20c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define NET_URL_REQUEST_URL_REQUEST_FILTER_H_
213345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#pragma once
22c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
23c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include <map>
24c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include <string>
25c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
26c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "base/hash_tables.h"
27c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "net/url_request/url_request.h"
28c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
29c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottclass GURL;
30201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
31201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdochnamespace net {
32c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottclass URLRequestJob;
33c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
34c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottclass URLRequestFilter {
35c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott public:
36c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // scheme,hostname -> ProtocolFactory
37c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  typedef std::map<std::pair<std::string, std::string>,
38ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      URLRequest::ProtocolFactory*> HostnameHandlerMap;
39ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  typedef base::hash_map<std::string, URLRequest::ProtocolFactory*>
40c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott      UrlHandlerMap;
41c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
4272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  ~URLRequestFilter();
43c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
44ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  static URLRequest::ProtocolFactory Factory;
45c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
4672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // Singleton instance for use.
4772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  static URLRequestFilter* GetInstance();
48731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
49c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  void AddHostnameHandler(const std::string& scheme,
50c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                          const std::string& hostname,
51ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                          URLRequest::ProtocolFactory* factory);
52c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  void RemoveHostnameHandler(const std::string& scheme,
53c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                             const std::string& hostname);
54c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
55c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Returns true if we successfully added the URL handler.  This will replace
56c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // old handlers for the URL if one existed.
5721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  bool AddUrlHandler(const GURL& url,
58ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                     URLRequest::ProtocolFactory* factory);
59c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
60c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  void RemoveUrlHandler(const GURL& url);
61c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
62c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Clear all the existing URL handlers and unregister with the
63c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // ProtocolFactory.  Resets the hit count.
64c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  void ClearHandlers();
65c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
66c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Returns the number of times a handler was used to service a request.
67c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  int hit_count() const { return hit_count_; }
68c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
69c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott protected:
70731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  URLRequestFilter();
71c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
72c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Helper method that looks up the request in the url_handler_map_.
73ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  URLRequestJob* FindRequestHandler(URLRequest* request,
74ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                    const std::string& scheme);
75c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
76c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Maps hostnames to factories.  Hostnames take priority over URLs.
77c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  HostnameHandlerMap hostname_handler_map_;
78c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
79c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Maps URLs to factories.
80c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  UrlHandlerMap url_handler_map_;
81c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
82c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  int hit_count_;
83c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
84c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott private:
85c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Singleton instance.
86c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  static URLRequestFilter* shared_instance_;
87c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
88c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  DISALLOW_COPY_AND_ASSIGN(URLRequestFilter);
89c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott};
90c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
913f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen}  // namespace net
923f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen
93c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif  // NET_URL_REQUEST_URL_REQUEST_FILTER_H_
94