Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(636)

Side by Side Diff: net/quic/chromium/quic_chromium_client_stream.cc

Issue 2409273002: QuicChromiumClientStream handle Read() after trailers are received but not yet delivered (Closed)
Patch Set: Created 4 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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 #include "net/quic/chromium/quic_chromium_client_stream.h" 5 #include "net/quic/chromium/quic_chromium_client_stream.h"
6 6
7 #include <utility> 7 #include <utility>
8 8
9 #include "base/bind_helpers.h" 9 #include "base/bind_helpers.h"
10 #include "base/callback_helpers.h" 10 #include "base/callback_helpers.h"
(...skipping 231 matching lines...) Expand 10 before | Expand all | Expand 10 after
242 void QuicChromiumClientStream::OnError(int error) { 242 void QuicChromiumClientStream::OnError(int error) {
243 if (delegate_) { 243 if (delegate_) {
244 QuicChromiumClientStream::Delegate* delegate = delegate_; 244 QuicChromiumClientStream::Delegate* delegate = delegate_;
245 delegate_ = nullptr; 245 delegate_ = nullptr;
246 delegate_tasks_.clear(); 246 delegate_tasks_.clear();
247 delegate->OnError(error); 247 delegate->OnError(error);
248 } 248 }
249 } 249 }
250 250
251 int QuicChromiumClientStream::Read(IOBuffer* buf, int buf_len) { 251 int QuicChromiumClientStream::Read(IOBuffer* buf, int buf_len) {
252 if (sequencer()->IsClosed()) 252 if (IsDoneReading())
253 return 0; // EOF 253 return 0; // EOF
254 254
255 if (!HasBytesToRead()) 255 if (!HasBytesToRead())
256 return ERR_IO_PENDING; 256 return ERR_IO_PENDING;
257 257
258 iovec iov; 258 iovec iov;
259 iov.iov_base = buf->data(); 259 iov.iov_base = buf->data();
260 iov.iov_len = buf_len; 260 iov.iov_len = buf_len;
261 return Readv(&iov, 1); 261 size_t bytes_read = Readv(&iov, 1);
262 // If no more body bytes and trailers are to be delivered, return
263 // ERR_IO_PENDING now because onDataAvailable() will be called after trailers.
264 if (bytes_read == 0 && !FinishedReadingTrailers())
265 return ERR_IO_PENDING;
266 return bytes_read;
262 } 267 }
263 268
264 bool QuicChromiumClientStream::CanWrite(const CompletionCallback& callback) { 269 bool QuicChromiumClientStream::CanWrite(const CompletionCallback& callback) {
265 bool can_write = session()->connection()->CanWrite(HAS_RETRANSMITTABLE_DATA); 270 bool can_write = session()->connection()->CanWrite(HAS_RETRANSMITTABLE_DATA);
266 if (!can_write) { 271 if (!can_write) {
267 session()->MarkConnectionLevelWriteBlocked(id()); 272 session()->MarkConnectionLevelWriteBlocked(id());
268 DCHECK(callback_.is_null()); 273 DCHECK(callback_.is_null());
269 callback_ = callback; 274 callback_ = callback;
270 } 275 }
271 return can_write; 276 return can_write;
272 } 277 }
273 278
274 void QuicChromiumClientStream::NotifyDelegateOfHeadersCompleteLater( 279 void QuicChromiumClientStream::NotifyDelegateOfHeadersCompleteLater(
275 SpdyHeaderBlock headers, 280 SpdyHeaderBlock headers,
276 size_t frame_len) { 281 size_t frame_len) {
277 RunOrBuffer(base::Bind( 282 RunOrBuffer(base::Bind(
278 &QuicChromiumClientStream::NotifyDelegateOfHeadersComplete, 283 &QuicChromiumClientStream::NotifyDelegateOfHeadersComplete,
279 weak_factory_.GetWeakPtr(), base::Passed(std::move(headers)), frame_len)); 284 weak_factory_.GetWeakPtr(), base::Passed(std::move(headers)), frame_len));
280 } 285 }
281 286
282 void QuicChromiumClientStream::NotifyDelegateOfHeadersComplete( 287 void QuicChromiumClientStream::NotifyDelegateOfHeadersComplete(
283 SpdyHeaderBlock headers, 288 SpdyHeaderBlock headers,
284 size_t frame_len) { 289 size_t frame_len) {
285 if (!delegate_) 290 if (!delegate_)
286 return; 291 return;
287 // Only mark trailers consumed when we are about to notify delegate. 292 // Only mark trailers consumed when we are about to notify delegate.
288 if (headers_delivered_) { 293 if (headers_delivered_) {
289 MarkTrailersConsumed(decompressed_trailers().length()); 294 MarkTrailersConsumed(decompressed_trailers().length());
290 MarkTrailersConsumed(); 295 MarkTrailersConsumed();
296 // Post an async task to notify delegate of the FIN flag.
297 NotifyDelegateOfDataAvailableLater();
291 net_log_.AddEvent( 298 net_log_.AddEvent(
292 NetLogEventType::QUIC_CHROMIUM_CLIENT_STREAM_READ_RESPONSE_TRAILERS, 299 NetLogEventType::QUIC_CHROMIUM_CLIENT_STREAM_READ_RESPONSE_TRAILERS,
293 base::Bind(&SpdyHeaderBlockNetLogCallback, &headers)); 300 base::Bind(&SpdyHeaderBlockNetLogCallback, &headers));
294 } else { 301 } else {
295 headers_delivered_ = true; 302 headers_delivered_ = true;
296 net_log_.AddEvent( 303 net_log_.AddEvent(
297 NetLogEventType::QUIC_CHROMIUM_CLIENT_STREAM_READ_RESPONSE_HEADERS, 304 NetLogEventType::QUIC_CHROMIUM_CLIENT_STREAM_READ_RESPONSE_HEADERS,
298 base::Bind(&SpdyHeaderBlockNetLogCallback, &headers)); 305 base::Bind(&SpdyHeaderBlockNetLogCallback, &headers));
299 } 306 }
300 307
(...skipping 21 matching lines...) Expand all
322 329
323 void QuicChromiumClientStream::DisableConnectionMigration() { 330 void QuicChromiumClientStream::DisableConnectionMigration() {
324 can_migrate_ = false; 331 can_migrate_ = false;
325 } 332 }
326 333
327 bool QuicChromiumClientStream::IsFirstStream() { 334 bool QuicChromiumClientStream::IsFirstStream() {
328 return id() == kHeadersStreamId + 2; 335 return id() == kHeadersStreamId + 2;
329 } 336 }
330 337
331 } // namespace net 338 } // namespace net
OLDNEW
« no previous file with comments | « net/quic/chromium/bidirectional_stream_quic_impl_unittest.cc ('k') | net/quic/chromium/quic_chromium_client_stream_test.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698