OLD | NEW |
---|---|
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 // | 4 // |
5 // NOTE: This code is not shared between Google and Chrome. | 5 // NOTE: This code is not shared between Google and Chrome. |
6 | 6 |
7 #ifndef NET_QUIC_CHROMIUM_QUIC_CHROMIUM_CLIENT_STREAM_H_ | 7 #ifndef NET_QUIC_CHROMIUM_QUIC_CHROMIUM_CLIENT_STREAM_H_ |
8 #define NET_QUIC_CHROMIUM_QUIC_CHROMIUM_CLIENT_STREAM_H_ | 8 #define NET_QUIC_CHROMIUM_QUIC_CHROMIUM_CLIENT_STREAM_H_ |
9 | 9 |
10 #include <stddef.h> | 10 #include <stddef.h> |
(...skipping 14 matching lines...) Expand all Loading... | |
25 #include "net/quic/platform/api/quic_string_piece.h" | 25 #include "net/quic/platform/api/quic_string_piece.h" |
26 | 26 |
27 namespace net { | 27 namespace net { |
28 | 28 |
29 class QuicClientSessionBase; | 29 class QuicClientSessionBase; |
30 | 30 |
31 // A client-initiated ReliableQuicStream. Instances of this class | 31 // A client-initiated ReliableQuicStream. Instances of this class |
32 // are owned by the QuicClientSession which created them. | 32 // are owned by the QuicClientSession which created them. |
33 class NET_EXPORT_PRIVATE QuicChromiumClientStream : public QuicSpdyStream { | 33 class NET_EXPORT_PRIVATE QuicChromiumClientStream : public QuicSpdyStream { |
34 public: | 34 public: |
35 // TODO(rch): Remove this class completely in favor of async methods | |
36 // on the Handle. | |
35 // Delegate handles protocol specific behavior of a quic stream. | 37 // Delegate handles protocol specific behavior of a quic stream. |
36 class NET_EXPORT_PRIVATE Delegate { | 38 class NET_EXPORT_PRIVATE Delegate { |
37 public: | 39 public: |
38 Delegate() {} | 40 Delegate() {} |
39 | 41 |
40 // Called when initial headers are available. | 42 // Called when initial headers are available. |
41 virtual void OnInitialHeadersAvailable(const SpdyHeaderBlock& headers, | 43 virtual void OnInitialHeadersAvailable(const SpdyHeaderBlock& headers, |
42 size_t frame_len) = 0; | 44 size_t frame_len) = 0; |
43 | 45 |
44 // Called when trailing headers are available. | 46 // Called when trailing headers are available. |
45 virtual void OnTrailingHeadersAvailable(const SpdyHeaderBlock& headers, | 47 virtual void OnTrailingHeadersAvailable(const SpdyHeaderBlock& headers, |
46 size_t frame_len) = 0; | 48 size_t frame_len) = 0; |
47 | 49 |
48 // Called when data is available to be read. | 50 // Called when data is available to be read. |
49 virtual void OnDataAvailable() = 0; | 51 virtual void OnDataAvailable() = 0; |
50 | 52 |
51 // Called when the stream is closed by the peer. | 53 // Called when the stream is closed by the peer. |
52 virtual void OnClose() = 0; | 54 virtual void OnClose() = 0; |
53 | 55 |
54 // Called when the stream is closed because of an error. | 56 // Called when the stream is closed because of an error. |
55 virtual void OnError(int error) = 0; | 57 virtual void OnError(int error) = 0; |
56 | 58 |
57 protected: | 59 protected: |
58 virtual ~Delegate() {} | 60 virtual ~Delegate() {} |
59 | 61 |
60 private: | 62 private: |
61 DISALLOW_COPY_AND_ASSIGN(Delegate); | 63 DISALLOW_COPY_AND_ASSIGN(Delegate); |
62 }; | 64 }; |
63 | 65 |
66 // Wrapper for interacting with the session in a restricted fashion. | |
67 class NET_EXPORT_PRIVATE Handle { | |
68 public: | |
69 ~Handle(); | |
70 | |
71 // Returns true if the stream is still connected. | |
72 bool IsOpen() { return stream_ != nullptr; } | |
73 | |
74 // Writes |header_block| to the peer. Closes the write side if |fin| is | |
75 // true. If non-null, |ack_notifier_delegate| will be notified when the | |
76 // headers are ACK'd by the peer. | |
77 size_t WriteHeaders(SpdyHeaderBlock header_block, | |
78 bool fin, | |
79 QuicReferenceCountedPointer<QuicAckListenerInterface> | |
80 ack_notifier_delegate); | |
81 | |
82 // Writes |data| to the peer. Closes the write side if |fin| is true. | |
83 // If the data could not be written immediately, returns ERR_IO_PENDING | |
84 // and invokes |callback| asynchronously when the write completes. | |
85 int WriteStreamData(base::StringPiece data, | |
86 bool fin, | |
87 const CompletionCallback& callback); | |
88 | |
89 // Same as WriteStreamData except it writes data from a vector of IOBuffers, | |
90 // with the length of each buffer at the corresponding index in |lengths|. | |
91 int WritevStreamData(const std::vector<scoped_refptr<IOBuffer>>& buffers, | |
92 const std::vector<int>& lengths, | |
93 bool fin, | |
94 const CompletionCallback& callback); | |
95 | |
96 // Reads at most |buf_len| bytes into |buf|. Returns the number of bytes | |
97 // read. | |
98 int Read(IOBuffer* buf, int buf_len); | |
99 | |
100 // Called to notify the stream when the final incoming data is read. | |
101 void OnFinRead(); | |
102 | |
103 // Prevents the connection from migrating to a new network while this | |
104 // stream is open. | |
105 void DisableConnectionMigration(); | |
106 | |
107 // Sets the priority of the stream to |priority|. | |
108 void SetPriority(SpdyPriority priority); | |
109 | |
110 // Sends a RST_STREAM frame to the peer and closes the streams. | |
111 void Reset(QuicRstStreamErrorCode error_code); | |
112 | |
113 // Clears |delegate_| from this Handle, but does not disconnect the Handle | |
114 // from |stream_|. | |
115 void ClearDelegate(); | |
116 | |
117 QuicStreamId id() const; | |
118 QuicErrorCode connection_error() const; | |
119 QuicRstStreamErrorCode stream_error() const; | |
120 bool fin_sent() const; | |
121 bool fin_received() const; | |
122 uint64_t stream_bytes_read() const; | |
123 uint64_t stream_bytes_written() const; | |
124 size_t NumBytesConsumed() const; | |
125 bool IsDoneReading() const; | |
126 bool IsFirstStream() const; | |
127 | |
128 // TODO(rch): Move these test-only methods to a peer, or else remove. | |
129 SpdyPriority priority() const; | |
130 bool can_migrate(); | |
131 void OnPromiseHeaderList(QuicStreamId promised_id, | |
xunjieli
2017/05/08 19:51:00
This one doesn't seem to be test-only.
Ryan Hamilton
2017/05/08 20:58:06
I made it private, and the only error is from quic
xunjieli
2017/05/09 15:03:46
Acknowledged. I think I mistakenly assumed that th
Ryan Hamilton
2017/05/09 16:48:19
I so know the feeling! I keep going back and forth
| |
132 size_t frame_len, | |
133 const QuicHeaderList& header_list); | |
134 Delegate* GetDelegate(); | |
135 | |
136 private: | |
137 friend class QuicChromiumClientStream; | |
138 | |
139 // Constucts a new Handle for |stream| with |delegate| set to receive | |
140 // up calls on various events. | |
141 Handle(QuicChromiumClientStream* stream, Delegate* delegate); | |
142 | |
143 // Methods invoked by the stream. | |
144 void OnInitialHeadersAvailable(const SpdyHeaderBlock& headers, | |
145 size_t frame_len); | |
146 void OnTrailingHeadersAvailable(const SpdyHeaderBlock& headers, | |
147 size_t frame_len); | |
148 void OnDataAvailable(); | |
149 void OnClose(); | |
150 void OnError(int error); | |
151 | |
152 // Saves various fields from the stream before the stream goes away. | |
153 void SaveState(); | |
154 | |
155 QuicChromiumClientStream* stream_; // Unowned. | |
156 Delegate* delegate_; // Owns this. | |
xunjieli
2017/05/08 19:51:00
optional: I only see this commenting style in QUIC
Ryan Hamilton
2017/05/08 20:58:05
It appears to be used in other places in net too.
xunjieli
2017/05/09 15:03:46
Acknowledged. Good point.
| |
157 | |
158 QuicStreamId id_; | |
159 QuicErrorCode connection_error_; | |
160 QuicRstStreamErrorCode stream_error_; | |
161 bool fin_sent_; | |
162 bool fin_received_; | |
163 uint64_t stream_bytes_read_; | |
164 uint64_t stream_bytes_written_; | |
165 bool is_done_reading_; | |
166 bool is_first_stream_; | |
167 size_t num_bytes_consumed_; | |
168 | |
169 DISALLOW_COPY_AND_ASSIGN(Handle); | |
170 }; | |
171 | |
64 QuicChromiumClientStream(QuicStreamId id, | 172 QuicChromiumClientStream(QuicStreamId id, |
65 QuicClientSessionBase* session, | 173 QuicClientSessionBase* session, |
66 const NetLogWithSource& net_log); | 174 const NetLogWithSource& net_log); |
67 | 175 |
68 ~QuicChromiumClientStream() override; | 176 ~QuicChromiumClientStream() override; |
69 | 177 |
70 // QuicSpdyStream | 178 // QuicSpdyStream |
71 void OnInitialHeadersComplete(bool fin, | 179 void OnInitialHeadersComplete(bool fin, |
72 size_t frame_len, | 180 size_t frame_len, |
73 const QuicHeaderList& header_list) override; | 181 const QuicHeaderList& header_list) override; |
(...skipping 18 matching lines...) Expand all Loading... | |
92 | 200 |
93 int WriteStreamData(QuicStringPiece data, | 201 int WriteStreamData(QuicStringPiece data, |
94 bool fin, | 202 bool fin, |
95 const CompletionCallback& callback); | 203 const CompletionCallback& callback); |
96 // Same as WriteStreamData except it writes data from a vector of IOBuffers, | 204 // Same as WriteStreamData except it writes data from a vector of IOBuffers, |
97 // with the length of each buffer at the corresponding index in |lengths|. | 205 // with the length of each buffer at the corresponding index in |lengths|. |
98 int WritevStreamData(const std::vector<scoped_refptr<IOBuffer>>& buffers, | 206 int WritevStreamData(const std::vector<scoped_refptr<IOBuffer>>& buffers, |
99 const std::vector<int>& lengths, | 207 const std::vector<int>& lengths, |
100 bool fin, | 208 bool fin, |
101 const CompletionCallback& callback); | 209 const CompletionCallback& callback); |
102 // Set new |delegate|. |delegate| must not be NULL. | 210 |
103 // If this stream has already received data, OnDataReceived() will be | 211 // Creates a new Handle for this stream and sets |delegate| on the handle. |
104 // called on the delegate. | 212 // Must only be called once. |
105 void SetDelegate(Delegate* delegate); | 213 std::unique_ptr<QuicChromiumClientStream::Handle> CreateHandle( |
106 Delegate* GetDelegate() { return delegate_; } | 214 QuicChromiumClientStream::Delegate* delegate); |
215 | |
216 // Clears |handle_| from this stream. | |
217 void ClearHandle(); | |
218 | |
107 void OnError(int error); | 219 void OnError(int error); |
108 | 220 |
109 // Reads at most |buf_len| bytes into |buf|. Returns the number of bytes read. | 221 // Reads at most |buf_len| bytes into |buf|. Returns the number of bytes read. |
110 int Read(IOBuffer* buf, int buf_len); | 222 int Read(IOBuffer* buf, int buf_len); |
111 | 223 |
112 const NetLogWithSource& net_log() const { return net_log_; } | 224 const NetLogWithSource& net_log() const { return net_log_; } |
113 | 225 |
114 // Prevents this stream from migrating to a new network. May cause other | 226 // Prevents this stream from migrating to a new network. May cause other |
115 // concurrent streams within the session to also not migrate. | 227 // concurrent streams within the session to also not migrate. |
116 void DisableConnectionMigration(); | 228 void DisableConnectionMigration(); |
117 | 229 |
118 bool can_migrate() { return can_migrate_; } | 230 bool can_migrate() { return can_migrate_; } |
119 | 231 |
120 // True if this stream is the first data stream created on this session. | 232 // True if this stream is the first data stream created on this session. |
121 bool IsFirstStream(); | 233 bool IsFirstStream(); |
122 | 234 |
123 using QuicSpdyStream::HasBufferedData; | 235 using QuicSpdyStream::HasBufferedData; |
124 using QuicStream::sequencer; | 236 using QuicStream::sequencer; |
125 | 237 |
126 private: | 238 private: |
127 void NotifyDelegateOfInitialHeadersAvailableLater(SpdyHeaderBlock headers, | 239 void NotifyHandleOfInitialHeadersAvailableLater(SpdyHeaderBlock headers, |
128 size_t frame_len); | 240 size_t frame_len); |
129 void NotifyDelegateOfInitialHeadersAvailable(SpdyHeaderBlock headers, | 241 void NotifyHandleOfInitialHeadersAvailable(SpdyHeaderBlock headers, |
130 size_t frame_len); | 242 size_t frame_len); |
131 void NotifyDelegateOfTrailingHeadersAvailableLater(SpdyHeaderBlock headers, | 243 void NotifyHandleOfTrailingHeadersAvailableLater(SpdyHeaderBlock headers, |
132 size_t frame_len); | 244 size_t frame_len); |
133 void NotifyDelegateOfTrailingHeadersAvailable(SpdyHeaderBlock headers, | 245 void NotifyHandleOfTrailingHeadersAvailable(SpdyHeaderBlock headers, |
134 size_t frame_len); | 246 size_t frame_len); |
135 void NotifyDelegateOfDataAvailableLater(); | 247 void NotifyHandleOfDataAvailableLater(); |
136 void NotifyDelegateOfDataAvailable(); | 248 void NotifyHandleOfDataAvailable(); |
137 | 249 |
138 NetLogWithSource net_log_; | 250 NetLogWithSource net_log_; |
139 Delegate* delegate_; | 251 Handle* handle_; |
140 | 252 |
141 bool headers_delivered_; | 253 bool headers_delivered_; |
142 | 254 |
143 // True when initial headers have been sent. | 255 // True when initial headers have been sent. |
144 bool initial_headers_sent_; | 256 bool initial_headers_sent_; |
145 | 257 |
146 // Callback to be invoked when WriteStreamData or WritevStreamData completes | 258 // Callback to be invoked when WriteStreamData or WritevStreamData completes |
147 // asynchronously. | 259 // asynchronously. |
148 CompletionCallback write_callback_; | 260 CompletionCallback write_callback_; |
149 | 261 |
150 QuicClientSessionBase* session_; | 262 QuicClientSessionBase* session_; |
151 | 263 |
152 // Set to false if this stream to not be migrated during connection migration. | 264 // Set to false if this stream to not be migrated during connection migration. |
153 bool can_migrate_; | 265 bool can_migrate_; |
154 | 266 |
155 // Stores the initial header if they arrive before the delegate. | 267 // Stores the initial header if they arrive before the delegate. |
156 SpdyHeaderBlock initial_headers_; | 268 SpdyHeaderBlock initial_headers_; |
157 // Length of the HEADERS frame containing initial headers. | 269 // Length of the HEADERS frame containing initial headers. |
158 size_t initial_headers_frame_len_; | 270 size_t initial_headers_frame_len_; |
159 | 271 |
160 base::WeakPtrFactory<QuicChromiumClientStream> weak_factory_; | 272 base::WeakPtrFactory<QuicChromiumClientStream> weak_factory_; |
161 | 273 |
162 DISALLOW_COPY_AND_ASSIGN(QuicChromiumClientStream); | 274 DISALLOW_COPY_AND_ASSIGN(QuicChromiumClientStream); |
163 }; | 275 }; |
164 | 276 |
165 } // namespace net | 277 } // namespace net |
166 | 278 |
167 #endif // NET_QUIC_CHROMIUM_QUIC_CHROMIUM_CLIENT_STREAM_H_ | 279 #endif // NET_QUIC_CHROMIUM_QUIC_CHROMIUM_CLIENT_STREAM_H_ |
OLD | NEW |