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..9685afcf4afdae007af8a7d60b6f1353f2ccc161 100644 |
--- a/net/quic/chromium/quic_chromium_client_stream.cc |
+++ b/net/quic/chromium/quic_chromium_client_stream.cc |
@@ -58,7 +58,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 +107,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, |