OLD | NEW |
---|---|
1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 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 #include "net/quic/bidirectional_stream_quic_impl.h" | 5 #include "net/quic/bidirectional_stream_quic_impl.h" |
6 | 6 |
7 #include "base/bind.h" | 7 #include "base/bind.h" |
8 #include "base/location.h" | 8 #include "base/location.h" |
9 #include "base/logging.h" | 9 #include "base/logging.h" |
10 #include "base/timer/timer.h" | 10 #include "base/timer/timer.h" |
(...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
112 // Read will complete asynchronously and Delegate::OnReadCompleted will be | 112 // Read will complete asynchronously and Delegate::OnReadCompleted will be |
113 // called upon completion. | 113 // called upon completion. |
114 read_buffer_ = buffer; | 114 read_buffer_ = buffer; |
115 read_buffer_len_ = buffer_len; | 115 read_buffer_len_ = buffer_len; |
116 return ERR_IO_PENDING; | 116 return ERR_IO_PENDING; |
117 } | 117 } |
118 | 118 |
119 void BidirectionalStreamQuicImpl::SendData(const scoped_refptr<IOBuffer>& data, | 119 void BidirectionalStreamQuicImpl::SendData(const scoped_refptr<IOBuffer>& data, |
120 int length, | 120 int length, |
121 bool end_stream) { | 121 bool end_stream) { |
122 DCHECK(stream_); | |
123 DCHECK(length > 0 || (length == 0 && end_stream)); | 122 DCHECK(length > 0 || (length == 0 && end_stream)); |
124 | 123 |
124 if (!stream_) { | |
125 LOG(ERROR) << "Trying to send data when stream has been destroyed."; | |
mef
2016/06/01 21:53:15
when -> after
xunjieli
2016/06/01 23:08:22
Done.
| |
126 base::ThreadTaskRunnerHandle::Get()->PostTask( | |
127 FROM_HERE, base::Bind(&BidirectionalStreamQuicImpl::NotifyError, | |
128 weak_factory_.GetWeakPtr(), ERR_UNEXPECTED)); | |
mef
2016/06/01 21:53:15
nit: Should say ERR_UNEXPECTED in CL description.
xunjieli
2016/06/01 23:08:22
Done.
| |
129 return; | |
130 } | |
131 | |
125 std::unique_ptr<QuicConnection::ScopedPacketBundler> bundler; | 132 std::unique_ptr<QuicConnection::ScopedPacketBundler> bundler; |
126 if (!has_sent_headers_) { | 133 if (!has_sent_headers_) { |
127 DCHECK(!send_request_headers_automatically_); | 134 DCHECK(!send_request_headers_automatically_); |
128 // Creates a bundler only if there are headers to be sent along with the | 135 // Creates a bundler only if there are headers to be sent along with the |
129 // single data buffer. | 136 // single data buffer. |
130 bundler.reset(new QuicConnection::ScopedPacketBundler( | 137 bundler.reset(new QuicConnection::ScopedPacketBundler( |
131 session_->connection(), QuicConnection::SEND_ACK_IF_PENDING)); | 138 session_->connection(), QuicConnection::SEND_ACK_IF_PENDING)); |
132 SendRequestHeaders(); | 139 SendRequestHeaders(); |
133 } | 140 } |
134 | 141 |
135 base::StringPiece string_data(data->data(), length); | 142 base::StringPiece string_data(data->data(), length); |
136 int rv = stream_->WriteStreamData( | 143 int rv = stream_->WriteStreamData( |
137 string_data, end_stream, | 144 string_data, end_stream, |
138 base::Bind(&BidirectionalStreamQuicImpl::OnSendDataComplete, | 145 base::Bind(&BidirectionalStreamQuicImpl::OnSendDataComplete, |
139 weak_factory_.GetWeakPtr())); | 146 weak_factory_.GetWeakPtr())); |
140 DCHECK(rv == OK || rv == ERR_IO_PENDING); | 147 DCHECK(rv == OK || rv == ERR_IO_PENDING); |
141 if (rv == OK) { | 148 if (rv == OK) { |
142 base::ThreadTaskRunnerHandle::Get()->PostTask( | 149 base::ThreadTaskRunnerHandle::Get()->PostTask( |
143 FROM_HERE, base::Bind(&BidirectionalStreamQuicImpl::OnSendDataComplete, | 150 FROM_HERE, base::Bind(&BidirectionalStreamQuicImpl::OnSendDataComplete, |
144 weak_factory_.GetWeakPtr(), OK)); | 151 weak_factory_.GetWeakPtr(), OK)); |
145 } | 152 } |
146 } | 153 } |
147 | 154 |
148 void BidirectionalStreamQuicImpl::SendvData( | 155 void BidirectionalStreamQuicImpl::SendvData( |
149 const std::vector<scoped_refptr<IOBuffer>>& buffers, | 156 const std::vector<scoped_refptr<IOBuffer>>& buffers, |
150 const std::vector<int>& lengths, | 157 const std::vector<int>& lengths, |
151 bool end_stream) { | 158 bool end_stream) { |
152 DCHECK(stream_); | |
153 DCHECK_EQ(buffers.size(), lengths.size()); | 159 DCHECK_EQ(buffers.size(), lengths.size()); |
154 | 160 |
161 if (!stream_) { | |
162 LOG(ERROR) << "Trying to send data when stream has been destroyed."; | |
mef
2016/06/01 21:53:15
when -> after
xunjieli
2016/06/01 23:08:22
Done.
| |
163 base::ThreadTaskRunnerHandle::Get()->PostTask( | |
164 FROM_HERE, base::Bind(&BidirectionalStreamQuicImpl::NotifyError, | |
165 weak_factory_.GetWeakPtr(), ERR_UNEXPECTED)); | |
166 return; | |
167 } | |
168 | |
155 QuicConnection::ScopedPacketBundler bundler( | 169 QuicConnection::ScopedPacketBundler bundler( |
156 session_->connection(), QuicConnection::SEND_ACK_IF_PENDING); | 170 session_->connection(), QuicConnection::SEND_ACK_IF_PENDING); |
157 if (!has_sent_headers_) { | 171 if (!has_sent_headers_) { |
158 DCHECK(!send_request_headers_automatically_); | 172 DCHECK(!send_request_headers_automatically_); |
159 SendRequestHeaders(); | 173 SendRequestHeaders(); |
160 } | 174 } |
161 | 175 |
162 int rv = stream_->WritevStreamData( | 176 int rv = stream_->WritevStreamData( |
163 buffers, lengths, end_stream, | 177 buffers, lengths, end_stream, |
164 base::Bind(&BidirectionalStreamQuicImpl::OnSendDataComplete, | 178 base::Bind(&BidirectionalStreamQuicImpl::OnSendDataComplete, |
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
226 // Spurrious notification. Wait for the next one. | 240 // Spurrious notification. Wait for the next one. |
227 return; | 241 return; |
228 } | 242 } |
229 read_buffer_ = nullptr; | 243 read_buffer_ = nullptr; |
230 read_buffer_len_ = 0; | 244 read_buffer_len_ = 0; |
231 delegate_->OnDataRead(rv); | 245 delegate_->OnDataRead(rv); |
232 } | 246 } |
233 | 247 |
234 void BidirectionalStreamQuicImpl::OnClose(QuicErrorCode error) { | 248 void BidirectionalStreamQuicImpl::OnClose(QuicErrorCode error) { |
235 DCHECK(stream_); | 249 DCHECK(stream_); |
250 | |
236 if (error == QUIC_NO_ERROR && | 251 if (error == QUIC_NO_ERROR && |
237 stream_->stream_error() == QUIC_STREAM_NO_ERROR) { | 252 stream_->stream_error() == QUIC_STREAM_NO_ERROR) { |
238 ResetStream(); | 253 ResetStream(); |
239 return; | 254 return; |
240 } | 255 } |
241 ResetStream(); | |
mef
2016/06/01 21:53:15
Why no longer ResetStream() here?
xunjieli
2016/06/01 23:08:22
It is redundant. NotifyError will call ResetStream
| |
242 NotifyError(was_handshake_confirmed_ ? ERR_QUIC_PROTOCOL_ERROR | 256 NotifyError(was_handshake_confirmed_ ? ERR_QUIC_PROTOCOL_ERROR |
243 : ERR_QUIC_HANDSHAKE_FAILED); | 257 : ERR_QUIC_HANDSHAKE_FAILED); |
244 } | 258 } |
245 | 259 |
246 void BidirectionalStreamQuicImpl::OnError(int error) { | 260 void BidirectionalStreamQuicImpl::OnError(int error) { |
247 NotifyError(error); | 261 NotifyError(error); |
248 } | 262 } |
249 | 263 |
250 bool BidirectionalStreamQuicImpl::HasSendHeadersComplete() { | 264 bool BidirectionalStreamQuicImpl::HasSendHeadersComplete() { |
251 return has_sent_headers_; | 265 return has_sent_headers_; |
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
298 void BidirectionalStreamQuicImpl::ResetStream() { | 312 void BidirectionalStreamQuicImpl::ResetStream() { |
299 if (!stream_) | 313 if (!stream_) |
300 return; | 314 return; |
301 closed_stream_received_bytes_ = stream_->stream_bytes_read(); | 315 closed_stream_received_bytes_ = stream_->stream_bytes_read(); |
302 closed_stream_sent_bytes_ = stream_->stream_bytes_written(); | 316 closed_stream_sent_bytes_ = stream_->stream_bytes_written(); |
303 stream_->SetDelegate(nullptr); | 317 stream_->SetDelegate(nullptr); |
304 stream_ = nullptr; | 318 stream_ = nullptr; |
305 } | 319 } |
306 | 320 |
307 } // namespace net | 321 } // namespace net |
OLD | NEW |