summaryrefslogtreecommitdiffstats
path: root/net/flip
diff options
context:
space:
mode:
Diffstat (limited to 'net/flip')
-rw-r--r--net/flip/flip_network_transaction_unittest.cc51
-rw-r--r--net/flip/flip_session.cc8
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.