summaryrefslogtreecommitdiffstats
path: root/net
diff options
context:
space:
mode:
authormbelshe@chromium.org <mbelshe@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-05-04 18:39:54 +0000
committermbelshe@chromium.org <mbelshe@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-05-04 18:39:54 +0000
commitf5ed21559387149aa986b5857942b4fa1e7df1b8 (patch)
treec0c19a5457de82c1006b08c9e2d37fb537d0daa4 /net
parentef2a4600bb3ce96ab703922b6a40a69b51dccfaf (diff)
downloadchromium_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.cc50
-rw-r--r--net/spdy/spdy_session.cc3
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.