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