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