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() { |