15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2011 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef CHROME_RENDERER_SECURITY_FILTER_PEER_H_ 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CHROME_RENDERER_SECURITY_FILTER_PEER_H_ 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "content/public/child/request_peer.h" 9cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "content/public/common/resource_response_info.h" 10116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "content/public/common/resource_type.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The SecurityFilterPeer is a proxy to a 13c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// content::RequestPeer instance. It is used to pre-process 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// unsafe resources (such as mixed-content resource). 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Call the factory method CreateSecurityFilterPeer() to obtain an instance of 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// SecurityFilterPeer based on the original Peer. 176e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)// NOTE: subclasses should ensure they delete themselves at the end of the 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// OnReceiveComplete call. 19c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochclass SecurityFilterPeer : public content::RequestPeer { 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~SecurityFilterPeer(); 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static SecurityFilterPeer* CreateSecurityFilterPeerForDeniedRequest( 245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) content::ResourceType resource_type, 25c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch content::RequestPeer* peer, 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int os_error); 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static SecurityFilterPeer* CreateSecurityFilterPeerForFrame( 29c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch content::RequestPeer* peer, 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int os_error); 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 32c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // content::RequestPeer methods. 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnUploadProgress(uint64 position, uint64 size) OVERRIDE; 34cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) virtual bool OnReceivedRedirect( 356e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) const net::RedirectInfo& redirect_info, 36cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const content::ResourceResponseInfo& info) OVERRIDE; 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnReceivedResponse( 38cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const content::ResourceResponseInfo& info) OVERRIDE; 3958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) virtual void OnDownloadedData(int len, int encoded_data_length) OVERRIDE {} 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnReceivedData(const char* data, 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int data_length, 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int encoded_data_length) OVERRIDE; 43c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch virtual void OnCompletedRequest(int error_code, 44c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch bool was_ignored_by_handler, 45c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch bool stale_copy_in_cache, 46c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch const std::string& security_info, 47c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch const base::TimeTicks& completion_time, 48c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch int64 total_transfer_size) OVERRIDE; 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 51010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) explicit SecurityFilterPeer(content::RequestPeer* peer); 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 53c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch content::RequestPeer* original_peer_; 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(SecurityFilterPeer); 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The BufferedPeer reads all the data of the request into an internal buffer. 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Subclasses should implement DataReady() to process the data as necessary. 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class BufferedPeer : public SecurityFilterPeer { 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 63010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) BufferedPeer(content::RequestPeer* peer, const std::string& mime_type); 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~BufferedPeer(); 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 66c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // content::RequestPeer Implementation. 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnReceivedResponse( 68cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const content::ResourceResponseInfo& info) OVERRIDE; 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnReceivedData(const char* data, 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int data_length, 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int encoded_data_length) OVERRIDE; 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnCompletedRequest( 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int error_code, 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool was_ignored_by_handler, 755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bool stale_copy_in_cache, 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& security_info, 775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const base::TimeTicks& completion_time, 785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int64 total_transfer_size) OVERRIDE; 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Invoked when the entire request has been processed before the data is sent 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // to the original peer, giving an opportunity to subclasses to process the 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // data in data_. If this method returns true, the data is fed to the 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // original peer, if it returns false, an error is sent instead. 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool DataReady() = 0; 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 87cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) content::ResourceResponseInfo response_info_; 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string data_; 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string mime_type_; 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(BufferedPeer); 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The ReplaceContentPeer cancels the request and serves the provided data as 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// content instead. 98010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// TODO(jcampan): For now the resource is still being fetched, but ignored, as 99010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// once we have provided the replacement content, the associated pending request 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// in ResourceDispatcher is removed and further OnReceived* notifications are 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// ignored. 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ReplaceContentPeer : public SecurityFilterPeer { 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 104010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) ReplaceContentPeer(content::RequestPeer* peer, 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& mime_type, 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& data); 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~ReplaceContentPeer(); 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 109c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // content::RequestPeer Implementation. 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnReceivedResponse( 111cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const content::ResourceResponseInfo& info) OVERRIDE; 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnReceivedData(const char* data, 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int data_length, 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int encoded_data_length) OVERRIDE; 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnCompletedRequest( 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int error_code, 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool was_ignored_by_handler, 1185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bool stale_copy_in_cache, 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& security_info, 1205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const base::TimeTicks& completion_time, 1215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int64 total_transfer_size) OVERRIDE; 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 124cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) content::ResourceResponseInfo response_info_; 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string mime_type_; 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string data_; 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(ReplaceContentPeer); 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // CHROME_RENDERER_SECURITY_FILTER_PEER_H_ 132