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