summaryrefslogtreecommitdiffstats
path: root/net/http/bidirectional_stream_job.h
blob: 7b36da9c35386316c0b74b148f3fbbd8904b57d2 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
// Copyright 2015 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 NET_HTTP_BIDIRECTIONAL_STREAM_JOB_H_
#define NET_HTTP_BIDIRECTIONAL_STREAM_JOB_H_

#include <stdint.h>

#include "base/macros.h"
#include "base/memory/scoped_ptr.h"
#include "net/base/net_export.h"
#include "net/socket/next_proto.h"

namespace base {
class Timer;
}  // namespace base

namespace net {

class BoundNetLog;
class IOBuffer;
class SpdyHeaderBlock;
struct BidirectionalStreamRequestInfo;

// Exposes an interface to do HTTP/2 bidirectional streaming.
// Note that only one ReadData or SendData should be in flight until the
// operation completes synchronously or asynchronously.
// BidirectionalStreamJob once created by HttpStreamFactoryImpl should be owned
// by BidirectionalStream.
class NET_EXPORT_PRIVATE BidirectionalStreamJob {
 public:
  // Delegate to handle BidirectionalStreamJob events.
  class NET_EXPORT_PRIVATE Delegate {
   public:
    Delegate();

    // Called when the request headers have been sent.
    // The delegate may call BidirectionalStreamJob::ReadData to start reading,
    // call BidirectionalStreamJob::SendData to send data,
    // or call BidirectionalStreamJob::Cancel to cancel the stream.
    // The delegate should not call BidirectionalStreamJob::Cancel
    // during this callback.
    virtual void OnHeadersSent() = 0;

    // Called when response headers are received.
    // This is called at most once for the lifetime of a stream.
    // The delegate may call BidirectionalStreamJob::ReadData to start
    // reading, call BidirectionalStreamJob::SendData to send data,
    // or call BidirectionalStreamJob::Cancel to cancel the stream.
    virtual void OnHeadersReceived(const SpdyHeaderBlock& response_headers) = 0;

    // Called when read is completed asynchronously. |bytes_read| specifies how
    // much data is available.
    // The delegate may call BidirectionalStreamJob::ReadData to continue
    // reading, call BidirectionalStreamJob::SendData to send data,
    // or call BidirectionalStreamJob::Cancel to cancel the stream.
    virtual void OnDataRead(int bytes_read) = 0;

    // Called when the entire buffer passed through SendData is sent.
    // The delegate may call BidirectionalStreamJob::ReadData to continue
    // reading, or call BidirectionalStreamJob::SendData to send data.
    // The delegate should not call BidirectionalStreamJob::Cancel
    // during this callback.
    virtual void OnDataSent() = 0;

    // Called when trailers are received. This is called as soon as trailers
    // are received, which can happen before a read completes.
    // The delegate is able to continue reading if there is no pending read and
    // EOF has not been received, or to send data if there is no pending send.
    virtual void OnTrailersReceived(const SpdyHeaderBlock& trailers) = 0;

    // Called when an error occurred.
    // No other delegate functions will be called after this.
    virtual void OnFailed(int status) = 0;

   protected:
    virtual ~Delegate();

   private:
    DISALLOW_COPY_AND_ASSIGN(Delegate);
  };

  BidirectionalStreamJob();

  // |this| should not be destroyed during Delegate::OnHeadersSent or
  // Delegate::OnDataSent.
  virtual ~BidirectionalStreamJob();

  // Starts the BidirectionalStreamJob and sends request headers.
  virtual void Start(const BidirectionalStreamRequestInfo* request_info,
                     const BoundNetLog& net_log,
                     BidirectionalStreamJob::Delegate* delegate,
                     scoped_ptr<base::Timer> timer) = 0;

  // Reads at most |buf_len| bytes into |buf|. Returns the number of bytes read,
  // ERR_IO_PENDING if the read is to be completed asynchronously, or an error
  // code if any error occurred. If returns 0, there is no more data to read.
  // This should not be called before Delegate::OnHeadersReceived is invoked,
  // and should not be called again unless it returns with number greater than
  // 0 or until Delegate::OnDataRead is invoked.
  virtual int ReadData(IOBuffer* buf, int buf_len) = 0;

  // Sends data. This should not be called be called before
  // Delegate::OnHeadersSent is invoked, and should not be called again until
  // Delegate::OnDataSent is invoked. If |end_stream| is true, the DATA frame
  // will have an END_STREAM flag.
  virtual void SendData(IOBuffer* data, int length, bool end_stream) = 0;

  // Cancels the stream. No Delegate method will be called. Any pending
  // operations may or may not succeed.
  virtual void Cancel() = 0;

  // Returns the protocol used by this stream. If stream has not been
  // established, return kProtoUnknown.
  virtual NextProto GetProtocol() const = 0;

  // Total number of bytes received over the network of SPDY data, headers, and
  // push_promise frames associated with this stream, including the size of
  // frame headers, after SSL decryption and not including proxy overhead.
  virtual int64_t GetTotalReceivedBytes() const = 0;

  // Total number of bytes sent over the network of SPDY frames associated with
  // this stream, including the size of frame headers, before SSL encryption and
  // not including proxy overhead. Note that some SPDY frames such as pings are
  // not associated with any stream, and are not included in this value.
  virtual int64_t GetTotalSentBytes() const = 0;

 private:
  DISALLOW_COPY_AND_ASSIGN(BidirectionalStreamJob);
};

}  // namespace net

#endif  // NET_HTTP_BIDIRECTIONAL_STREAM_JOB_H_