• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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.
4 //
5 // A class to help filter URLRequest jobs based on the URL of the request
6 // rather than just the scheme.  Example usage:
7 //
8 // // Use as an "http" handler.
9 // URLRequest::RegisterProtocolFactory("http", &URLRequestFilter::Factory);
10 // // Add special handling for the URL http://foo.com/
11 // URLRequestFilter::GetInstance()->AddUrlHandler(
12 //     GURL("http://foo.com/"),
13 //     &URLRequestCustomJob::Factory);
14 //
15 // If URLRequestFilter::Factory can't find a handle for the request, it passes
16 // it through to URLRequestInetJob::Factory and lets the default network stack
17 // handle it.
18 
19 #ifndef NET_URL_REQUEST_URL_REQUEST_FILTER_H_
20 #define NET_URL_REQUEST_URL_REQUEST_FILTER_H_
21 #pragma once
22 
23 #include <map>
24 #include <string>
25 
26 #include "base/hash_tables.h"
27 #include "net/url_request/url_request.h"
28 
29 class GURL;
30 
31 namespace net {
32 class URLRequestJob;
33 
34 class URLRequestFilter {
35  public:
36   // scheme,hostname -> ProtocolFactory
37   typedef std::map<std::pair<std::string, std::string>,
38       URLRequest::ProtocolFactory*> HostnameHandlerMap;
39   typedef base::hash_map<std::string, URLRequest::ProtocolFactory*>
40       UrlHandlerMap;
41 
42   ~URLRequestFilter();
43 
44   static URLRequest::ProtocolFactory Factory;
45 
46   // Singleton instance for use.
47   static URLRequestFilter* GetInstance();
48 
49   void AddHostnameHandler(const std::string& scheme,
50                           const std::string& hostname,
51                           URLRequest::ProtocolFactory* factory);
52   void RemoveHostnameHandler(const std::string& scheme,
53                              const std::string& hostname);
54 
55   // Returns true if we successfully added the URL handler.  This will replace
56   // old handlers for the URL if one existed.
57   bool AddUrlHandler(const GURL& url,
58                      URLRequest::ProtocolFactory* factory);
59 
60   void RemoveUrlHandler(const GURL& url);
61 
62   // Clear all the existing URL handlers and unregister with the
63   // ProtocolFactory.  Resets the hit count.
64   void ClearHandlers();
65 
66   // Returns the number of times a handler was used to service a request.
hit_count()67   int hit_count() const { return hit_count_; }
68 
69  protected:
70   URLRequestFilter();
71 
72   // Helper method that looks up the request in the url_handler_map_.
73   URLRequestJob* FindRequestHandler(URLRequest* request,
74                                     const std::string& scheme);
75 
76   // Maps hostnames to factories.  Hostnames take priority over URLs.
77   HostnameHandlerMap hostname_handler_map_;
78 
79   // Maps URLs to factories.
80   UrlHandlerMap url_handler_map_;
81 
82   int hit_count_;
83 
84  private:
85   // Singleton instance.
86   static URLRequestFilter* shared_instance_;
87 
88   DISALLOW_COPY_AND_ASSIGN(URLRequestFilter);
89 };
90 
91 }  // namespace net
92 
93 #endif  // NET_URL_REQUEST_URL_REQUEST_FILTER_H_
94