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

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

Issue 2877063002: Add an async ReadBody method to QuicChromiumClientStream::Handle (Closed)
Patch Set: Created 3 years, 7 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_http_stream.h" 5 #include "net/quic/chromium/quic_http_stream.h"
6 6
7 #include <utility> 7 #include <utility>
8 8
9 #include "base/auto_reset.h" 9 #include "base/auto_reset.h"
10 #include "base/callback_helpers.h" 10 #include "base/callback_helpers.h"
(...skipping 339 matching lines...) Expand 10 before | Expand all | Expand 10 after
350 // stream to outlive the request_info_'s owner. 350 // stream to outlive the request_info_'s owner.
351 // Only allowed when Read state machine starts. It is safe to reset it at 351 // Only allowed when Read state machine starts. It is safe to reset it at
352 // this point since request_info_->upload_data_stream is also not needed 352 // this point since request_info_->upload_data_stream is also not needed
353 // anymore. 353 // anymore.
354 request_info_ = nullptr; 354 request_info_ = nullptr;
355 355
356 // If the stream is already closed, there is no body to read. 356 // If the stream is already closed, there is no body to read.
357 if (!stream_) 357 if (!stream_)
358 return GetResponseStatus(); 358 return GetResponseStatus();
359 359
360 int rv = ReadAvailableData(buf, buf_len); 360 int rv = stream_->ReadBody(buf, buf_len,
361 if (rv != ERR_IO_PENDING) 361 base::Bind(&QuicHttpStream::OnReadBodyComplete,
362 weak_factory_.GetWeakPtr()));
363 if (rv == ERR_IO_PENDING) {
364 callback_ = callback;
365 user_buffer_ = buf;
366 user_buffer_len_ = buf_len;
367 return ERR_IO_PENDING;
368 }
369
370 if (rv < 0)
362 return rv; 371 return rv;
363 372
364 callback_ = callback; 373 return HandleReadComplete(rv);
365 user_buffer_ = buf;
366 user_buffer_len_ = buf_len;
367 return ERR_IO_PENDING;
368 } 374 }
369 375
370 void QuicHttpStream::Close(bool /*not_reusable*/) { 376 void QuicHttpStream::Close(bool /*not_reusable*/) {
371 session_error_ = ERR_ABORTED; 377 session_error_ = ERR_ABORTED;
372 SaveResponseStatus(); 378 SaveResponseStatus();
373 // Note: the not_reusable flag has no meaning for QUIC streams. 379 // Note: the not_reusable flag has no meaning for QUIC streams.
374 if (stream_) { 380 if (stream_) {
375 stream_->ClearDelegate(); 381 stream_->ClearDelegate();
376 stream_->Reset(QUIC_STREAM_CANCELLED); 382 stream_->Reset(QUIC_STREAM_CANCELLED);
377 } 383 }
(...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after
465 471
466 // QuicHttpStream ignores trailers. 472 // QuicHttpStream ignores trailers.
467 if (stream_->IsDoneReading()) { 473 if (stream_->IsDoneReading()) {
468 // Close the read side. If the write side has been closed, this will 474 // Close the read side. If the write side has been closed, this will
469 // invoke QuicHttpStream::OnClose to reset the stream. 475 // invoke QuicHttpStream::OnClose to reset the stream.
470 stream_->OnFinRead(); 476 stream_->OnFinRead();
471 SetResponseStatus(OK); 477 SetResponseStatus(OK);
472 } 478 }
473 } 479 }
474 480
475 void QuicHttpStream::OnDataAvailable() {
476 if (callback_.is_null()) {
477 // Data is available, but can't be delivered
478 return;
479 }
480
481 CHECK(user_buffer_.get());
482 CHECK_NE(0, user_buffer_len_);
483 int rv = ReadAvailableData(user_buffer_.get(), user_buffer_len_);
484 if (rv == ERR_IO_PENDING) {
485 // This was a spurrious notification. Wait for the next one.
486 return;
487 }
488
489 CHECK(!callback_.is_null());
490 user_buffer_ = nullptr;
491 user_buffer_len_ = 0;
492 DoCallback(rv);
493 }
494
495 void QuicHttpStream::OnClose() { 481 void QuicHttpStream::OnClose() {
496 quic_connection_error_ = stream_->connection_error(); 482 quic_connection_error_ = stream_->connection_error();
497 quic_stream_error_ = stream_->stream_error(); 483 quic_stream_error_ = stream_->stream_error();
498 SaveResponseStatus(); 484 SaveResponseStatus();
499 485
500 ResetStream(); 486 ResetStream();
501 // If already in DoLoop(), |callback_| will be handled when DoLoop() exits. 487 // If already in DoLoop(), |callback_| will be handled when DoLoop() exits.
502 if (in_loop_) 488 if (in_loop_)
503 return; 489 return;
504 490
(...skipping 256 matching lines...) Expand 10 before | Expand all | Expand 10 after
761 response_info_->response_time = base::Time::Now(); 747 response_info_->response_time = base::Time::Now();
762 response_info_->request_time = request_time_; 748 response_info_->request_time = request_time_;
763 response_headers_received_ = true; 749 response_headers_received_ = true;
764 750
765 // Populate |connect_timing_| when response headers are received. This should 751 // Populate |connect_timing_| when response headers are received. This should
766 // take care of 0-RTT where request is sent before handshake is confirmed. 752 // take care of 0-RTT where request is sent before handshake is confirmed.
767 connect_timing_ = quic_session()->GetConnectTiming(); 753 connect_timing_ = quic_session()->GetConnectTiming();
768 return OK; 754 return OK;
769 } 755 }
770 756
771 int QuicHttpStream::ReadAvailableData(IOBuffer* buf, int buf_len) { 757 void QuicHttpStream::OnReadBodyComplete(int rv) {
772 int rv = stream_->Read(buf, buf_len); 758 CHECK(callback_);
773 // TODO(rtenneti): Temporary fix for crbug.com/585591. Added a check for null 759 user_buffer_ = nullptr;
774 // |stream_| to fix crash bug. Delete |stream_| check and histogram after fix 760 user_buffer_len_ = 0;
775 // is merged. 761 rv = HandleReadComplete(rv);
776 bool null_stream = stream_ == nullptr; 762 DoCallback(rv);
777 UMA_HISTOGRAM_BOOLEAN("Net.QuicReadAvailableData.NullStream", null_stream); 763 }
xunjieli 2017/05/12 15:22:22 Could you mark this histogram as deprecated in his
778 if (null_stream) 764
779 return rv; 765 int QuicHttpStream::HandleReadComplete(int rv) {
780 if (stream_->IsDoneReading()) { 766 if (stream_->IsDoneReading()) {
781 stream_->ClearDelegate(); 767 stream_->ClearDelegate();
782 stream_->OnFinRead(); 768 stream_->OnFinRead();
783 SetResponseStatus(OK); 769 SetResponseStatus(OK);
784 ResetStream(); 770 ResetStream();
785 } 771 }
786 return rv; 772 return rv;
787 } 773 }
788 774
789 void QuicHttpStream::ResetStream() { 775 void QuicHttpStream::ResetStream() {
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after
845 quic_stream_error_ != QUIC_STREAM_CONNECTION_ERROR) { 831 quic_stream_error_ != QUIC_STREAM_CONNECTION_ERROR) {
846 return ERR_QUIC_PROTOCOL_ERROR; 832 return ERR_QUIC_PROTOCOL_ERROR;
847 } 833 }
848 834
849 DCHECK_NE(QUIC_HANDSHAKE_TIMEOUT, quic_connection_error_); 835 DCHECK_NE(QUIC_HANDSHAKE_TIMEOUT, quic_connection_error_);
850 836
851 return ERR_QUIC_PROTOCOL_ERROR; 837 return ERR_QUIC_PROTOCOL_ERROR;
852 } 838 }
853 839
854 } // namespace net 840 } // namespace net
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698