summaryrefslogtreecommitdiffstats
path: root/net/spdy
diff options
context:
space:
mode:
authormbelshe@chromium.org <mbelshe@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-08-25 21:46:13 +0000
committermbelshe@chromium.org <mbelshe@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-08-25 21:46:13 +0000
commit3d2315b49da77d975f832019e729b4d7fc6d8cfa (patch)
tree497960ac2acc590a7f973e43ce16534bdf731f91 /net/spdy
parent424d0f73c86b63c583cf1f27b067bb39ebac5b9f (diff)
downloadchromium_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.cc22
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;
}