diff options
author | erikchen@google.com <erikchen@google.com@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-06-24 17:59:46 +0000 |
---|---|---|
committer | erikchen@google.com <erikchen@google.com@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-06-24 17:59:46 +0000 |
commit | 9be804c808196ed8ae63b4b78b743b212aa993f0 (patch) | |
tree | 1338a7874917e7e24159171b2f68c5b3d6f85d45 /net/spdy/spdy_network_transaction.cc | |
parent | 5beca81467eb19e2b7c24ee25d61aae9d294b967 (diff) | |
download | chromium_src-9be804c808196ed8ae63b4b78b743b212aa993f0.zip chromium_src-9be804c808196ed8ae63b4b78b743b212aa993f0.tar.gz chromium_src-9be804c808196ed8ae63b4b78b743b212aa993f0.tar.bz2 |
Fixed bug where streams do not shutdown properly after the user callback deletes the stream.
Added a unit test.
TEST=net_unittests
BUG=46925
Merge branch 'trunk' of http://src.chromium.org/git/chromium into ukai_delegate_fix
Revert "Revert 50215 because of crashes - Refactor SpdyStream to get HTTP specific out of the interface and members."
This reverts commit 8f9bf3b9ba6663aeef7fbdab3edf16aeaa510f84.
Review URL: http://codereview.chromium.org/2810022
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@50739 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'net/spdy/spdy_network_transaction.cc')
-rw-r--r-- | net/spdy/spdy_network_transaction.cc | 26 |
1 files changed, 21 insertions, 5 deletions
diff --git a/net/spdy/spdy_network_transaction.cc b/net/spdy/spdy_network_transaction.cc index e79d889..5872a38 100644 --- a/net/spdy/spdy_network_transaction.cc +++ b/net/spdy/spdy_network_transaction.cc @@ -256,15 +256,31 @@ int SpdyNetworkTransaction::DoSendRequest() { if (!upload_data) return error_code; } - stream_ = spdy_->GetOrCreateStream(*request_, upload_data, net_log_); - // Release the reference to |spdy_| since we don't need it anymore. + scoped_refptr<SpdyStream> spdy_stream; + if (request_->method == "GET") + spdy_stream = spdy_->GetPushStream(request_->url, net_log_); + if (spdy_stream.get()) { + DCHECK(spdy_stream->pushed()); + CHECK(spdy_stream->GetDelegate() == NULL); + stream_.reset(new SpdyHttpStream(spdy_stream)); + stream_->InitializeRequest(*request_, base::Time::Now(), NULL); + // "vary" field? + } else { + spdy_stream = spdy_->CreateStream(request_->url, + request_->priority, + net_log_); + DCHECK(!spdy_stream->pushed()); + CHECK(spdy_stream->GetDelegate() == NULL); + stream_.reset(new SpdyHttpStream(spdy_stream)); + stream_->InitializeRequest(*request_, base::Time::Now(), upload_data); + } spdy_ = NULL; - return stream_->SendRequest(upload_data, &response_, &io_callback_); + return stream_->SendRequest(&response_, &io_callback_); } int SpdyNetworkTransaction::DoSendRequestComplete(int result) { if (result < 0) { - stream_ = NULL; + stream_.reset() ; return result; } @@ -294,7 +310,7 @@ int SpdyNetworkTransaction::DoReadBodyComplete(int result) { user_buffer_len_ = 0; if (result <= 0) - stream_ = NULL; + stream_.reset(); return result; } |