url_request_filter.h revision 21d179b334e59e9a3bfcaed4c4430bef1bc5759d
1c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Copyright (c) 2010 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//
521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen// A class to help filter net::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.
921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen// net::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;
33201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch}  // namespace net
34c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
35c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottclass URLRequestFilter {
36c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott public:
37c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // scheme,hostname -> ProtocolFactory
38c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  typedef std::map<std::pair<std::string, std::string>,
3921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen      net::URLRequest::ProtocolFactory*> HostnameHandlerMap;
4021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  typedef base::hash_map<std::string, net::URLRequest::ProtocolFactory*>
41c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott      UrlHandlerMap;
42c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
43c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Singleton instance for use.
44c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  static URLRequestFilter* GetInstance();
45c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
4621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  static net::URLRequest::ProtocolFactory Factory;
47c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
48731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  ~URLRequestFilter();
49731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
50c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  void AddHostnameHandler(const std::string& scheme,
51c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                          const std::string& hostname,
5221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen                          net::URLRequest::ProtocolFactory* factory);
53c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  void RemoveHostnameHandler(const std::string& scheme,
54c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                             const std::string& hostname);
55c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
56c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Returns true if we successfully added the URL handler.  This will replace
57c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // old handlers for the URL if one existed.
5821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  bool AddUrlHandler(const GURL& url,
5921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen                     net::URLRequest::ProtocolFactory* factory);
60c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
61c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  void RemoveUrlHandler(const GURL& url);
62c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
63c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Clear all the existing URL handlers and unregister with the
64c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // ProtocolFactory.  Resets the hit count.
65c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  void ClearHandlers();
66c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
67c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Returns the number of times a handler was used to service a request.
68c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  int hit_count() const { return hit_count_; }
69c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
70c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott protected:
71731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  URLRequestFilter();
72c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
73c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Helper method that looks up the request in the url_handler_map_.
7421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  net::URLRequestJob* FindRequestHandler(net::URLRequest* request,
75201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch                                         const std::string& scheme);
76c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
77c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Maps hostnames to factories.  Hostnames take priority over URLs.
78c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  HostnameHandlerMap hostname_handler_map_;
79c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
80c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Maps URLs to factories.
81c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  UrlHandlerMap url_handler_map_;
82c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
83c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  int hit_count_;
84c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
85c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott private:
86c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Singleton instance.
87c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  static URLRequestFilter* shared_instance_;
88c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
89c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  DISALLOW_COPY_AND_ASSIGN(URLRequestFilter);
90c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott};
91c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
92c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif  // NET_URL_REQUEST_URL_REQUEST_FILTER_H_
93