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" 10effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "webkit/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. 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// NOTE: subclasses should insure 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( 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ResourceType::Type 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( 35cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const GURL& new_url, 36cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const GURL& new_first_party_for_cookies, 37cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const content::ResourceResponseInfo& info) OVERRIDE; 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnReceivedResponse( 39cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const content::ResourceResponseInfo& info) OVERRIDE; 4058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) virtual void OnDownloadedData(int len, int encoded_data_length) OVERRIDE {} 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnReceivedData(const char* data, 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int data_length, 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int encoded_data_length) OVERRIDE; 44c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch virtual void OnCompletedRequest(int error_code, 45c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch bool was_ignored_by_handler, 46c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch bool stale_copy_in_cache, 47c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch const std::string& security_info, 48c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch const base::TimeTicks& completion_time, 49c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch int64 total_transfer_size) OVERRIDE; 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 52010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) explicit SecurityFilterPeer(content::RequestPeer* peer); 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 54c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch content::RequestPeer* original_peer_; 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(SecurityFilterPeer); 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The BufferedPeer reads all the data of the request into an internal buffer. 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Subclasses should implement DataReady() to process the data as necessary. 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class BufferedPeer : public SecurityFilterPeer { 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 64010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) BufferedPeer(content::RequestPeer* peer, const std::string& mime_type); 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~BufferedPeer(); 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 67c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // content::RequestPeer Implementation. 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnReceivedResponse( 69cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const content::ResourceResponseInfo& info) OVERRIDE; 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnReceivedData(const char* data, 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int data_length, 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int encoded_data_length) OVERRIDE; 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnCompletedRequest( 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int error_code, 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool was_ignored_by_handler, 765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bool stale_copy_in_cache, 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& security_info, 785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const base::TimeTicks& completion_time, 795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int64 total_transfer_size) OVERRIDE; 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Invoked when the entire request has been processed before the data is sent 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // to the original peer, giving an opportunity to subclasses to process the 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // data in data_. If this method returns true, the data is fed to the 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // original peer, if it returns false, an error is sent instead. 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool DataReady() = 0; 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 88cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) content::ResourceResponseInfo response_info_; 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string data_; 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string mime_type_; 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(BufferedPeer); 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The ReplaceContentPeer cancels the request and serves the provided data as 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// content instead. 99010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// TODO(jcampan): For now the resource is still being fetched, but ignored, as 100010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// once we have provided the replacement content, the associated pending request 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// in ResourceDispatcher is removed and further OnReceived* notifications are 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// ignored. 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ReplaceContentPeer : public SecurityFilterPeer { 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 105010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) ReplaceContentPeer(content::RequestPeer* peer, 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& mime_type, 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& data); 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~ReplaceContentPeer(); 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 110c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // content::RequestPeer Implementation. 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnReceivedResponse( 112cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const content::ResourceResponseInfo& info) OVERRIDE; 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnReceivedData(const char* data, 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int data_length, 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int encoded_data_length) OVERRIDE; 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnCompletedRequest( 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int error_code, 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool was_ignored_by_handler, 1195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bool stale_copy_in_cache, 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& security_info, 1215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const base::TimeTicks& completion_time, 1225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int64 total_transfer_size) OVERRIDE; 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 125cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) content::ResourceResponseInfo response_info_; 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string mime_type_; 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string data_; 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(ReplaceContentPeer); 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // CHROME_RENDERER_SECURITY_FILTER_PEER_H_ 133