diff options
author | mbelshe@chromium.org <mbelshe@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-08-25 21:46:13 +0000 |
---|---|---|
committer | mbelshe@chromium.org <mbelshe@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-08-25 21:46:13 +0000 |
commit | 3d2315b49da77d975f832019e729b4d7fc6d8cfa (patch) | |
tree | 497960ac2acc590a7f973e43ce16534bdf731f91 /net/spdy | |
parent | 424d0f73c86b63c583cf1f27b067bb39ebac5b9f (diff) | |
download | chromium_src-3d2315b49da77d975f832019e729b4d7fc6d8cfa.zip chromium_src-3d2315b49da77d975f832019e729b4d7fc6d8cfa.tar.gz chromium_src-3d2315b49da77d975f832019e729b4d7fc6d8cfa.tar.bz2 |
Keep push streams open until they are claimed. The previous change I did
changed this (so that streams are closed when they get EOF, even though
the unclaimed stream is active), but it breaks the invariants for
spdy_http_stream and checking when a stream is closed. Both models have
advantages, going back to the original mechanism.
BUG=none
TEST=Working on the unittest
Review URL: http://codereview.chromium.org/3198012
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@57398 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'net/spdy')
-rw-r--r-- | net/spdy/spdy_stream.cc | 22 |
1 files changed, 14 insertions, 8 deletions
diff --git a/net/spdy/spdy_stream.cc b/net/spdy/spdy_stream.cc index f7a1676..95e8496 100644 --- a/net/spdy/spdy_stream.cc +++ b/net/spdy/spdy_stream.cc @@ -52,7 +52,7 @@ void SpdyStream::SetDelegate(Delegate* delegate) { } void SpdyStream::PushedStreamReplayData() { - if (cancelled_ || delegate_ == NULL) + if (cancelled_ || !delegate_) return; delegate_->OnResponseReceived(*response_, response_time_, OK); @@ -61,11 +61,17 @@ void SpdyStream::PushedStreamReplayData() { std::vector<scoped_refptr<IOBufferWithSize> > buffers; buffers.swap(pending_buffers_); for (size_t i = 0; i < buffers.size(); ++i) { - if (delegate_){ - if (buffers[i]) - delegate_->OnDataReceived(buffers[i]->data(), buffers[i]->size()); - else - delegate_->OnDataReceived(NULL, 0); + // It is always possible that a callback to the delegate results in + // the delegate no longer being available. + if (!delegate_) + break; + if (buffers[i]) { + delegate_->OnDataReceived(buffers[i]->data(), buffers[i]->size()); + } else { + delegate_->OnDataReceived(NULL, 0); + session_->CloseStream(stream_id_, net::OK); + // Note: |this| may be deleted after calling CloseStream. + DCHECK_EQ(buffers.size() - 1, i); } } } @@ -187,8 +193,8 @@ void SpdyStream::OnDataReceived(const char* data, int length) { } else { pending_buffers_.push_back(NULL); metrics_.StopStream(); - session_->CloseStream(stream_id_, net::OK); - // Note: |this| may be deleted after calling CloseStream. + // Note: we leave the stream open in the session until the stream + // is claimed. } return; } |