summaryrefslogtreecommitdiffstats
path: root/net/spdy/spdy_network_transaction.cc
diff options
context:
space:
mode:
authorerikchen@google.com <erikchen@google.com@0039d316-1c4b-4281-b951-d872f2087c98>2010-06-24 17:59:46 +0000
committererikchen@google.com <erikchen@google.com@0039d316-1c4b-4281-b951-d872f2087c98>2010-06-24 17:59:46 +0000
commit9be804c808196ed8ae63b4b78b743b212aa993f0 (patch)
tree1338a7874917e7e24159171b2f68c5b3d6f85d45 /net/spdy/spdy_network_transaction.cc
parent5beca81467eb19e2b7c24ee25d61aae9d294b967 (diff)
downloadchromium_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.cc26
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;
}