diff options
author | mbelshe@google.com <mbelshe@google.com@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-12-04 05:13:12 +0000 |
---|---|---|
committer | mbelshe@google.com <mbelshe@google.com@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-12-04 05:13:12 +0000 |
commit | 6371bf471df4ae89446c22b924909f09ad034fae (patch) | |
tree | 4df5ca128ebd401fe297cd1980ed6e5ed5308d72 /net/flip | |
parent | dd1e41a83fc1e11227caffcde580122588c203d2 (diff) | |
download | chromium_src-6371bf471df4ae89446c22b924909f09ad034fae.zip chromium_src-6371bf471df4ae89446c22b924909f09ad034fae.tar.gz chromium_src-6371bf471df4ae89446c22b924909f09ad034fae.tar.bz2 |
Fix bug where FLIP sessions can crash if the connect fails.
Update the mocksocket so that we can test connection statuses.
Verified that the test case crashes without the flip_session.cc fix.
BUG=none
TEST=FlipNetworkTransaction.ConnectFailure
Review URL: http://codereview.chromium.org/462023
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@33792 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'net/flip')
-rw-r--r-- | net/flip/flip_network_transaction_unittest.cc | 51 | ||||
-rw-r--r-- | net/flip/flip_session.cc | 8 |
2 files changed, 57 insertions, 2 deletions
diff --git a/net/flip/flip_network_transaction_unittest.cc b/net/flip/flip_network_transaction_unittest.cc index 0629a73..be0172f 100644 --- a/net/flip/flip_network_transaction_unittest.cc +++ b/net/flip/flip_network_transaction_unittest.cc @@ -189,6 +189,23 @@ class DelayedSocketData : public StaticSocketDataProvider, DCHECK_GE(write_delay_, 0); } + // |connect| the result for the connect phase. + // |reads| the list of MockRead completions. + // |write_delay| the number of MockWrites to complete before allowing + // a MockRead to complete. + // |writes| the list of MockWrite completions. + // Note: All MockReads and MockWrites must be async. + // Note: The MockRead and MockWrite lists musts end with a EOF + // e.g. a MockRead(true, 0, 0); + DelayedSocketData(const MockConnect& connect, MockRead* reads, + int write_delay, MockWrite* writes) + : StaticSocketDataProvider(reads, writes), + write_delay_(write_delay), + ALLOW_THIS_IN_INITIALIZER_LIST(factory_(this)) { + DCHECK_GE(write_delay_, 0); + set_connect_data(connect); + } + virtual MockRead GetNextRead() { if (write_delay_) return MockRead(true, ERR_IO_PENDING); @@ -863,4 +880,38 @@ TEST_F(FlipNetworkTransactionTest, PartialWrite) { EXPECT_EQ("hello!", out.response_data); } +TEST_F(FlipNetworkTransactionTest, ConnectFailure) { + MockConnect connects[] = { + MockConnect(true, ERR_NAME_NOT_RESOLVED), + MockConnect(false, ERR_NAME_NOT_RESOLVED), + MockConnect(true, ERR_INTERNET_DISCONNECTED), + MockConnect(false, ERR_INTERNET_DISCONNECTED) + }; + + for (size_t index = 0; index < arraysize(connects); ++index) { + MockWrite writes[] = { + MockWrite(true, reinterpret_cast<const char*>(kGetSyn), + arraysize(kGetSyn)), + MockWrite(true, 0, 0) // EOF + }; + + MockRead reads[] = { + MockRead(true, reinterpret_cast<const char*>(kGetSynReply), + arraysize(kGetSynReply)), + MockRead(true, reinterpret_cast<const char*>(kGetBodyFrame), + arraysize(kGetBodyFrame)), + MockRead(true, 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(connects[index], reads, 1, writes)); + TransactionHelperResult out = TransactionHelper(request, data.get()); + EXPECT_EQ(connects[index].result, out.rv); + } +} + } // namespace net diff --git a/net/flip/flip_session.cc b/net/flip/flip_session.cc index f501b58..b3b4069 100644 --- a/net/flip/flip_session.cc +++ b/net/flip/flip_session.cc @@ -136,6 +136,9 @@ void CreateFlipHeadersFromHttpRequest( } } + // TODO(mbelshe): Add Proxy headers here. (See http_network_transaction.cc) + // TODO(mbelshe): Add authentication headers here. + (*headers)["method"] = info.method; (*headers)["url"] = info.url.spec(); (*headers)["version"] = kHttpProtocolVersion; @@ -552,8 +555,9 @@ void FlipSession::WriteSocket() { delayed_write_pending_ = false; // If the socket isn't connected yet, just wait; we'll get called - // again when the socket connection completes. - if (state_ < CONNECTED) + // again when the socket connection completes. If the socket is + // closed, just return. + if (state_ < CONNECTED || state_ == CLOSED) return; if (write_pending_) // Another write is in progress still. |