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