| Index: net/quic/chromium/quic_chromium_client_stream.cc
|
| diff --git a/net/quic/chromium/quic_chromium_client_stream.cc b/net/quic/chromium/quic_chromium_client_stream.cc
|
| index ad706a56e1bc34b45fc0729cf17df94c09a6339d..1b1c90ec9207f7dc122c591fa392c10995b806fe 100644
|
| --- a/net/quic/chromium/quic_chromium_client_stream.cc
|
| +++ b/net/quic/chromium/quic_chromium_client_stream.cc
|
| @@ -23,7 +23,10 @@ namespace net {
|
|
|
| QuicChromiumClientStream::Handle::Handle(QuicChromiumClientStream* stream,
|
| Delegate* delegate)
|
| - : stream_(stream), delegate_(delegate), read_headers_buffer_(nullptr) {
|
| + : stream_(stream),
|
| + delegate_(delegate),
|
| + read_headers_buffer_(nullptr),
|
| + read_body_buffer_len_(0) {
|
| SaveState();
|
| }
|
|
|
| @@ -58,7 +61,16 @@ void QuicChromiumClientStream::Handle::OnTrailingHeadersAvailable(
|
| }
|
|
|
| void QuicChromiumClientStream::Handle::OnDataAvailable() {
|
| - delegate_->OnDataAvailable();
|
| + if (!read_body_callback_)
|
| + return; // Wait for ReadBody to be called.
|
| +
|
| + int rv = stream_->Read(read_body_buffer_, read_body_buffer_len_);
|
| + if (rv == ERR_IO_PENDING)
|
| + return; // Spurrious, likely because of trailers?
|
| +
|
| + read_body_buffer_ = nullptr;
|
| + read_body_buffer_len_ = 0;
|
| + ResetAndReturn(&read_body_callback_).Run(rv);
|
| }
|
|
|
| void QuicChromiumClientStream::Handle::OnClose() {
|
| @@ -98,6 +110,23 @@ int QuicChromiumClientStream::Handle::ReadInitialHeaders(
|
| return ERR_IO_PENDING;
|
| }
|
|
|
| +int QuicChromiumClientStream::Handle::ReadBody(
|
| + IOBuffer* buffer,
|
| + int buffer_len,
|
| + const CompletionCallback& callback) {
|
| + if (!stream_)
|
| + return ERR_CONNECTION_CLOSED;
|
| +
|
| + int rv = stream_->Read(buffer, buffer_len);
|
| + if (rv != ERR_IO_PENDING)
|
| + return rv;
|
| +
|
| + read_body_callback_ = callback;
|
| + read_body_buffer_ = buffer;
|
| + read_body_buffer_len_ = buffer_len;
|
| + return ERR_IO_PENDING;
|
| +}
|
| +
|
| size_t QuicChromiumClientStream::Handle::WriteHeaders(
|
| SpdyHeaderBlock header_block,
|
| bool fin,
|
|
|