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

Unified Diff: net/quic/quic_chromium_client_stream.cc

Issue 1692253004: QUIC - chromium server push support. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Initial for-review version Created 4 years, 10 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 side-by-side diff with in-line comments
Download patch
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() {

Powered by Google App Engine
This is Rietveld 408576698