| Index: net/quic/quic_chromium_client_stream.cc
|
| diff --git a/net/quic/quic_chromium_client_stream.cc b/net/quic/quic_chromium_client_stream.cc
|
| index c789c46aadc46d0d03583a38b749da033f99ad6c..66479e629be93de2ea28b2c515c9b8fefe8aa6f2 100644
|
| --- a/net/quic/quic_chromium_client_stream.cc
|
| +++ b/net/quic/quic_chromium_client_stream.cc
|
| @@ -35,8 +35,19 @@ QuicChromiumClientStream::~QuicChromiumClientStream() {
|
| void QuicChromiumClientStream::OnStreamHeadersComplete(bool fin,
|
| size_t frame_len) {
|
| QuicSpdyStream::OnStreamHeadersComplete(fin, frame_len);
|
| + size_t headers_len = decompressed_headers().length();
|
| + SpdyHeaderBlock headers;
|
| + SpdyFramer framer(HTTP2);
|
| + if (!framer.ParseHeaderBlockInBuffer(decompressed_headers().data(),
|
| + headers_len, &headers)) {
|
| + DLOG(WARNING) << "Invalid headers";
|
| + Reset(QUIC_BAD_APPLICATION_PAYLOAD);
|
| + return;
|
| + }
|
| + MarkHeadersConsumed(headers_len);
|
| + session_->OnInitialHeadersComplete(id(), headers);
|
| // The delegate will read the headers via a posted task.
|
| - NotifyDelegateOfHeadersCompleteLater(frame_len);
|
| + NotifyDelegateOfHeadersCompleteLater(headers, frame_len);
|
| }
|
|
|
| void QuicChromiumClientStream::OnPromiseHeadersComplete(
|
| @@ -57,13 +68,6 @@ void QuicChromiumClientStream::OnPromiseHeadersComplete(
|
| }
|
|
|
| void QuicChromiumClientStream::OnDataAvailable() {
|
| - // TODO(rch): buffer data if we don't have a delegate.
|
| - if (!delegate_) {
|
| - DLOG(ERROR) << "Missing delegate";
|
| - Reset(QUIC_STREAM_CANCELLED);
|
| - return;
|
| - }
|
| -
|
| if (!FinishedReadingHeaders() || !headers_delivered_) {
|
| // Buffer the data in the sequencer until the headers have been read.
|
| return;
|
| @@ -117,6 +121,11 @@ void QuicChromiumClientStream::SetDelegate(
|
| QuicChromiumClientStream::Delegate* delegate) {
|
| DCHECK(!(delegate_ && delegate));
|
| delegate_ = delegate;
|
| + while (!delegate_tasks_.empty()) {
|
| + base::Closure closure = delegate_tasks_.front();
|
| + delegate_tasks_.pop_front();
|
| + closure.Run();
|
| + }
|
| if (delegate == nullptr && sequencer()->IsClosed()) {
|
| OnFinRead();
|
| }
|
| @@ -154,42 +163,37 @@ bool QuicChromiumClientStream::CanWrite(const CompletionCallback& callback) {
|
| }
|
|
|
| void QuicChromiumClientStream::NotifyDelegateOfHeadersCompleteLater(
|
| + const SpdyHeaderBlock& headers,
|
| size_t frame_len) {
|
| - DCHECK(delegate_);
|
| - base::ThreadTaskRunnerHandle::Get()->PostTask(
|
| - FROM_HERE,
|
| + base::Closure closure(
|
| base::Bind(&QuicChromiumClientStream::NotifyDelegateOfHeadersComplete,
|
| - weak_factory_.GetWeakPtr(), frame_len));
|
| + weak_factory_.GetWeakPtr(), headers, frame_len));
|
| + if (delegate_) {
|
| + base::ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE, closure);
|
| + } else {
|
| + delegate_tasks_.push_back(closure);
|
| + }
|
| }
|
|
|
| void QuicChromiumClientStream::NotifyDelegateOfHeadersComplete(
|
| + SpdyHeaderBlock headers,
|
| size_t frame_len) {
|
| if (!delegate_)
|
| return;
|
|
|
| - size_t headers_len = decompressed_headers().length();
|
| - SpdyHeaderBlock headers;
|
| - SpdyFramer framer(HTTP2);
|
| - if (!framer.ParseHeaderBlockInBuffer(decompressed_headers().data(),
|
| - headers_len, &headers)) {
|
| - DLOG(WARNING) << "Invalid headers";
|
| - Reset(QUIC_BAD_APPLICATION_PAYLOAD);
|
| - return;
|
| - }
|
| - MarkHeadersConsumed(headers_len);
|
| headers_delivered_ = true;
|
| -
|
| - session_->OnInitialHeadersComplete(id(), headers);
|
| -
|
| delegate_->OnHeadersAvailable(headers, frame_len);
|
| }
|
|
|
| void QuicChromiumClientStream::NotifyDelegateOfDataAvailableLater() {
|
| - DCHECK(delegate_);
|
| - base::ThreadTaskRunnerHandle::Get()->PostTask(
|
| - FROM_HERE,
|
| + base::Closure closure(
|
| base::Bind(&QuicChromiumClientStream::NotifyDelegateOfDataAvailable,
|
| weak_factory_.GetWeakPtr()));
|
| + if (delegate_) {
|
| + base::ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE, closure);
|
| + } else {
|
| + delegate_tasks_.push_back(closure);
|
| + }
|
| }
|
|
|
| void QuicChromiumClientStream::NotifyDelegateOfDataAvailable() {
|
|
|