// Copyright 2014 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef CONTENT_PUBLIC_RENDERER_REQUEST_PEER_H_
#define CONTENT_PUBLIC_RENDERER_REQUEST_PEER_H_

#include <stdint.h>

#include <memory>
#include <string>

#include "base/task_runner.h"
#include "content/common/content_export.h"
#include "mojo/public/cpp/system/data_pipe.h"

namespace net {
struct RedirectInfo;
}

namespace network {
struct ResourceResponseInfo;
struct URLLoaderCompletionStatus;
}

namespace content {

// This is implemented by our custom resource loader within content. The Peer
// and it's bridge should have identical lifetimes as they represent each end of
// a communication channel.
//
// These callbacks mirror net::URLRequest::Delegate and the order and
// conditions in which they will be called are identical. See url_request.h
// for more information.
class CONTENT_EXPORT RequestPeer {
 public:
  // This class represents data gotten from the Browser process. Each data
  // consists of |payload|, |length|, |encoded_data_length| and
  // |encoded_body_length|. The payload is valid only when the data instance is
  // valid.
  // In order to work with Chrome resource loading IPC, it is desirable to
  // reclaim data in FIFO order in a RequestPeer in terms of performance.
  // |payload|, |length|, |encoded_data_length| and |encoded_body_length|
  // functions are thread-safe, but the data object itself must be destroyed on
  // the original thread.
  class CONTENT_EXPORT ReceivedData {
   public:
    virtual ~ReceivedData() {}
    virtual const char* payload() = 0;
    virtual int length() = 0;
  };

  // A ThreadSafeReceivedData can be deleted on ANY thread.
  class CONTENT_EXPORT ThreadSafeReceivedData : public ReceivedData {};

  // Called as upload progress is made.
  // note: only for requests with upload progress enabled.
  virtual void OnUploadProgress(uint64_t position, uint64_t size) = 0;

  // Called when a redirect occurs.  The implementation may return false to
  // suppress the redirect.  The ResourceResponseInfo provides information about
  // the redirect response and the RedirectInfo includes information about the
  // request to be made if the method returns true.
  virtual bool OnReceivedRedirect(
      const net::RedirectInfo& redirect_info,
      const network::ResourceResponseInfo& info) = 0;

  // Called when response headers are available (after all redirects have
  // been followed).
  virtual void OnReceivedResponse(
      const network::ResourceResponseInfo& info) = 0;

  // Called when the response body becomes available. This method is only called
  // if |pass_response_pipe_to_peer| was set to true when calling StartAsync.
  // TODO(mek): Deprecate OnReceivedData in favor of this method, and always use
  // this codepath.
  virtual void OnStartLoadingResponseBody(
      mojo::ScopedDataPipeConsumerHandle body) = 0;

  // Called when a chunk of response data is available. This method may
  // be called multiple times or not at all if an error occurs.
  virtual void OnReceivedData(std::unique_ptr<ReceivedData> data) = 0;

  // Called when the transfer size is updated. This method may be called
  // multiple times or not at all. The transfer size is the length of the
  // response (including both headers and the body) over the network.
  // |transfer_size_diff| is the difference from the value previously reported
  // one (including the one in OnReceivedResponse). It must be positive.
  virtual void OnTransferSizeUpdated(int transfer_size_diff) = 0;

  // Called when metadata generated by the renderer is retrieved from the
  // cache. This method may be called zero or one times.
  virtual void OnReceivedCachedMetadata(const char* data, int len) {}

  // Called when the response is complete.  This method signals completion of
  // the resource load.
  virtual void OnCompletedRequest(
      const network::URLLoaderCompletionStatus& status) = 0;

  // Returns the task runner on which this request peer is running.
  virtual scoped_refptr<base::TaskRunner> GetTaskRunner() = 0;

  virtual ~RequestPeer() {}
};

}  // namespace content

#endif  // CONTENT_PUBLIC_RENDERER_REQUEST_PEER_H_
