Index: net/http/http_network_transaction_unittest.cc |
=================================================================== |
--- net/http/http_network_transaction_unittest.cc (revision 2613) |
+++ net/http/http_network_transaction_unittest.cc (working copy) |
@@ -169,6 +169,9 @@ |
mock_sockets[0] = NULL; |
mock_sockets_index = 0; |
} |
+ |
+ protected: |
+ void KeepAliveConnectionResendRequestTest(const MockRead& read_failure); |
}; |
struct SimpleGetHelperResult { |
@@ -278,8 +281,8 @@ |
{ false, net::OK, NULL, 0 }, |
}; |
SimpleGetHelperResult out = SimpleGetHelper(data_reads); |
- EXPECT_TRUE(out.status_line == "HTTP/0.9 200 OK"); |
- EXPECT_TRUE(out.response_data == "xxxxxHTTP/1.1 404 Not Found\nServer: blah"); |
+ EXPECT_EQ("HTTP/0.9 200 OK", out.status_line); |
+ EXPECT_EQ("xxxxxHTTP/1.1 404 Not Found\nServer: blah", out.response_data); |
} |
// Same as StatusLineJunk4Bytes, except the read chunks are smaller. |
@@ -364,12 +367,12 @@ |
EXPECT_TRUE(response != NULL); |
EXPECT_TRUE(response->headers != NULL); |
- EXPECT_TRUE(response->headers->GetStatusLine() == "HTTP/1.1 200 OK"); |
+ EXPECT_EQ("HTTP/1.1 200 OK", response->headers->GetStatusLine()); |
std::string response_data; |
rv = ReadTransaction(trans, &response_data); |
EXPECT_EQ(net::OK, rv); |
- EXPECT_TRUE(response_data == kExpectedResponseData[i]); |
+ EXPECT_EQ(kExpectedResponseData[i], response_data); |
trans->Destroy(); |
@@ -414,12 +417,12 @@ |
EXPECT_TRUE(response != NULL); |
EXPECT_TRUE(response->headers != NULL); |
- EXPECT_TRUE(response->headers->GetStatusLine() == "HTTP/1.0 200 OK"); |
+ EXPECT_EQ("HTTP/1.0 200 OK", response->headers->GetStatusLine()); |
std::string response_data; |
rv = ReadTransaction(trans, &response_data); |
EXPECT_EQ(net::OK, rv); |
- EXPECT_TRUE(response_data == "hello world"); |
+ EXPECT_EQ("hello world", response_data); |
trans->Destroy(); |
@@ -427,7 +430,10 @@ |
MessageLoop::current()->RunAllPending(); |
} |
-TEST_F(HttpNetworkTransactionTest, KeepAliveConnectionReset) { |
+// read_failure specifies a read failure that should cause the network |
+// transaction to resend the request. |
+void HttpNetworkTransactionTest::KeepAliveConnectionResendRequestTest( |
+ const MockRead& read_failure) { |
scoped_refptr<net::HttpNetworkSession> session = CreateSession(); |
net::HttpRequestInfo request; |
@@ -438,7 +444,7 @@ |
MockRead data1_reads[] = { |
{ true, 0, "HTTP/1.1 200 OK\r\nContent-Length: 5\r\n\r\n", -1 }, |
{ true, 0, "hello", -1 }, |
- { true, net::ERR_CONNECTION_RESET, NULL, 0 }, |
+ read_failure, // Now, we reuse the connection and fail the first read. |
}; |
MockSocket data1; |
data1.connect.async = true; |
@@ -477,12 +483,12 @@ |
EXPECT_TRUE(response != NULL); |
EXPECT_TRUE(response->headers != NULL); |
- EXPECT_TRUE(response->headers->GetStatusLine() == "HTTP/1.1 200 OK"); |
+ EXPECT_EQ("HTTP/1.1 200 OK", response->headers->GetStatusLine()); |
std::string response_data; |
rv = ReadTransaction(trans, &response_data); |
EXPECT_EQ(net::OK, rv); |
- EXPECT_TRUE(response_data == kExpectedResponseData[i]); |
+ EXPECT_EQ(kExpectedResponseData[i], response_data); |
trans->Destroy(); |
@@ -490,3 +496,73 @@ |
MessageLoop::current()->RunAllPending(); |
} |
} |
+ |
+TEST_F(HttpNetworkTransactionTest, KeepAliveConnectionReset) { |
+ MockRead read_failure = { true, net::ERR_CONNECTION_RESET, NULL, 0 }; |
+ KeepAliveConnectionResendRequestTest(read_failure); |
+} |
+ |
+TEST_F(HttpNetworkTransactionTest, KeepAliveConnectionEOF) { |
+ MockRead read_failure = { false, net::OK, NULL, 0 }; // EOF |
+ KeepAliveConnectionResendRequestTest(read_failure); |
+} |
+ |
+TEST_F(HttpNetworkTransactionTest, NonKeepAliveConnectionReset) { |
+ net::HttpTransaction* trans = new net::HttpNetworkTransaction( |
+ CreateSession(), &mock_socket_factory); |
+ |
+ net::HttpRequestInfo request; |
+ request.method = "GET"; |
+ request.url = GURL("http://www.google.com/"); |
+ request.load_flags = 0; |
+ |
+ MockRead data_reads[] = { |
+ { true, net::ERR_CONNECTION_RESET, NULL, 0 }, |
+ { true, 0, "HTTP/1.0 200 OK\r\n\r\n", -1 }, // Should not be used |
+ { true, 0, "hello world", -1 }, |
+ { false, net::OK, NULL, 0 }, |
+ }; |
+ MockSocket data; |
+ data.connect.async = true; |
+ data.connect.result = net::OK; |
+ data.reads = data_reads; |
+ mock_sockets[0] = &data; |
+ mock_sockets[1] = NULL; |
+ |
+ TestCompletionCallback callback; |
+ |
+ int rv = trans->Start(&request, &callback); |
+ EXPECT_EQ(net::ERR_IO_PENDING, rv); |
+ |
+ rv = callback.WaitForResult(); |
+ EXPECT_EQ(net::ERR_CONNECTION_RESET, rv); |
+ |
+ const net::HttpResponseInfo* response = trans->GetResponseInfo(); |
+ EXPECT_TRUE(response == NULL); |
+ |
+ trans->Destroy(); |
+ |
+ // Empty the current queue. |
+ MessageLoop::current()->RunAllPending(); |
+} |
+ |
+// What do various browsers do when the server closes a non-keepalive |
+// connection without sending any response header or body? |
+// |
+// IE7: error page |
+// Safari 3.1.2 (Windows): error page |
+// Firefox 3.0.1: blank page |
+// Opera 9.52: after five attempts, blank page |
+// Us with WinHTTP: error page (net::ERR_INVALID_RESPONSE) |
+// Us: blank page |
+TEST_F(HttpNetworkTransactionTest, NonKeepAliveConnectionEOF) { |
+ MockRead data_reads[] = { |
+ { false, net::OK, NULL, 0 }, // EOF |
+ { true, 0, "HTTP/1.0 200 OK\r\n\r\n", -1 }, // Should not be used |
+ { true, 0, "hello world", -1 }, |
+ { false, net::OK, NULL, 0 }, |
+ }; |
+ SimpleGetHelperResult out = SimpleGetHelper(data_reads); |
+ EXPECT_EQ("HTTP/0.9 200 OK", out.status_line); |
+ EXPECT_EQ("", out.response_data); |
+} |