diff options
author | mbelshe@chromium.org <mbelshe@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-05-04 18:39:54 +0000 |
---|---|---|
committer | mbelshe@chromium.org <mbelshe@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-05-04 18:39:54 +0000 |
commit | f5ed21559387149aa986b5857942b4fa1e7df1b8 (patch) | |
tree | c0c19a5457de82c1006b08c9e2d37fb537d0daa4 /net | |
parent | ef2a4600bb3ce96ab703922b6a40a69b51dccfaf (diff) | |
download | chromium_src-f5ed21559387149aa986b5857942b4fa1e7df1b8.zip chromium_src-f5ed21559387149aa986b5857942b4fa1e7df1b8.tar.gz chromium_src-f5ed21559387149aa986b5857942b4fa1e7df1b8.tar.bz2 |
Fix a hang on SPDY session teardown when streams are still active.
BUG=43134
TEST=SpdyNetworkTransactionTest.CloseWithActiveStream
Review URL: http://codereview.chromium.org/1937005
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@46373 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'net')
-rw-r--r-- | net/spdy/spdy_network_transaction_unittest.cc | 50 | ||||
-rw-r--r-- | net/spdy/spdy_session.cc | 3 |
2 files changed, 51 insertions, 2 deletions
diff --git a/net/spdy/spdy_network_transaction_unittest.cc b/net/spdy/spdy_network_transaction_unittest.cc index b36a04e..a025ce9 100644 --- a/net/spdy/spdy_network_transaction_unittest.cc +++ b/net/spdy/spdy_network_transaction_unittest.cc @@ -2371,4 +2371,54 @@ TEST_F(SpdyNetworkTransactionTest, GoAwayWithActiveStream) { EXPECT_EQ(ERR_CONNECTION_CLOSED, out.rv); } +TEST_F(SpdyNetworkTransactionTest, CloseWithActiveStream) { + MockWrite writes[] = { + MockWrite(true, reinterpret_cast<const char*>(kGetSyn), + arraysize(kGetSyn)), + }; + + MockRead reads[] = { + MockRead(true, reinterpret_cast<const char*>(kGetSynReply), + arraysize(kGetSynReply)), + MockRead(false, 0, 0) // EOF + }; + + HttpRequestInfo request; + request.method = "GET"; + request.url = GURL("http://www.google.com/"); + request.load_flags = 0; + scoped_refptr<DelayedSocketData> data( + new DelayedSocketData(1, reads, arraysize(reads), + writes, arraysize(writes))); + TransactionHelperResult out; + + // We disable SSL for this test. + SpdySession::SetSSLMode(false); + + BoundNetLog log; + SessionDependencies session_deps; + HttpNetworkSession* session = CreateSession(&session_deps); + scoped_ptr<SpdyNetworkTransaction> trans( + new SpdyNetworkTransaction(session)); + + session_deps.socket_factory.AddSocketDataProvider(data); + + TestCompletionCallback callback; + + out.rv = trans->Start(&request, &callback, log); + EXPECT_EQ(out.rv, ERR_IO_PENDING); + out.rv = callback.WaitForResult(); + EXPECT_EQ(out.rv, OK); + + const HttpResponseInfo* response = trans->GetResponseInfo(); + EXPECT_TRUE(response->headers != NULL); + EXPECT_TRUE(response->was_fetched_via_spdy); + out.rv = ReadTransaction(trans.get(), &out.response_data); + EXPECT_EQ(ERR_CONNECTION_CLOSED, out.rv); + + // Verify that we consumed all test data. + EXPECT_TRUE(data->at_read_eof()); + EXPECT_TRUE(data->at_write_eof()); +} + } // namespace net diff --git a/net/spdy/spdy_session.cc b/net/spdy/spdy_session.cc index fe55454..12b3d42 100644 --- a/net/spdy/spdy_session.cc +++ b/net/spdy/spdy_session.cc @@ -629,8 +629,7 @@ void SpdySession::ReadSocket() { switch (bytes_read) { case 0: // Socket is closed! - // TODO(mbelshe): Need to abort any active streams here. - DCHECK(!active_streams_.size()); + CloseAllStreams(ERR_CONNECTION_CLOSED); return; case net::ERR_IO_PENDING: // Waiting for data. Nothing to do now. |