| 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);
|
| +}
|
|
|