summaryrefslogtreecommitdiffstats
path: root/net/http/http_network_transaction_unittest.cc
diff options
context:
space:
mode:
Diffstat (limited to 'net/http/http_network_transaction_unittest.cc')
-rw-r--r--net/http/http_network_transaction_unittest.cc282
1 files changed, 63 insertions, 219 deletions
diff --git a/net/http/http_network_transaction_unittest.cc b/net/http/http_network_transaction_unittest.cc
index b238f57..ecd6132 100644
--- a/net/http/http_network_transaction_unittest.cc
+++ b/net/http/http_network_transaction_unittest.cc
@@ -6437,6 +6437,7 @@ TEST_F(HttpNetworkTransactionTest, HonorAlternateProtocolHeader) {
EXPECT_EQ("HTTP/1.1 200 OK", response->headers->GetStatusLine());
EXPECT_FALSE(response->was_fetched_via_spdy);
EXPECT_FALSE(response->was_npn_negotiated);
+ EXPECT_FALSE(response->was_alternate_protocol_available);
std::string response_data;
ASSERT_EQ(OK, ReadTransaction(trans.get(), &response_data));
@@ -6477,6 +6478,11 @@ TEST_F(HttpNetworkTransactionTest, MarkBrokenAlternateProtocol) {
data_reads, arraysize(data_reads), NULL, 0);
session_deps.socket_factory.AddSocketDataProvider(&second_data);
+ // TODO(willchan): Delete this extra data provider. It's necessary due to a
+ // ClientSocketPoolBaseHelper bug that starts up too many ConnectJobs:
+ // http://crbug.com/37454.
+ session_deps.socket_factory.AddSocketDataProvider(&second_data);
+
TestCompletionCallback callback;
scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps));
@@ -6511,6 +6517,59 @@ TEST_F(HttpNetworkTransactionTest, MarkBrokenAlternateProtocol) {
HttpStreamFactory::set_use_alternate_protocols(false);
}
+// TODO(willchan): Redo this test to use TLS/NPN=>SPDY. Currently, the code
+// says that it does SPDY, but it just does the TLS handshake, but the NPN
+// response does not indicate SPDY, so we just do standard HTTPS over the port.
+// We should add code such that we don't fallback to HTTPS, but fallback to HTTP
+// on the original port.
+// TEST_F(HttpNetworkTransactionTest, UseAlternateProtocol) {
+// SessionDependencies session_deps;
+//
+// HttpRequestInfo request;
+// request.method = "GET";
+// request.url = GURL("http://www.google.com/");
+// request.load_flags = 0;
+//
+// MockRead data_reads[] = {
+// MockRead("HTTP/1.1 200 OK\r\n\r\n"),
+// MockRead("hello world"),
+// MockRead(true, OK),
+// };
+// StaticSocketDataProvider data(data_reads, arraysize(data_reads), NULL, 0);
+// session_deps.socket_factory.AddSocketDataProvider(&data);
+//
+// SSLSocketDataProvider ssl(true, OK);
+// session_deps.socket_factory.AddSSLSocketDataProvider(&ssl);
+//
+// TestCompletionCallback callback;
+//
+// scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps));
+//
+// HostPortPair http_host_port_pair;
+// http_host_port_pair.host = "www.google.com";
+// http_host_port_pair.port = 80;
+// HttpAlternateProtocols* alternate_protocols =
+// session->mutable_alternate_protocols();
+// alternate_protocols->SetAlternateProtocolFor(
+// http_host_port_pair, 1234 /* port is ignored */,
+// HttpAlternateProtocols::NPN_SPDY_1);
+//
+// scoped_ptr<HttpTransaction> trans(new HttpNetworkTransaction(session));
+//
+// int rv = trans->Start(&request, &callback, BoundNetLog());
+// EXPECT_EQ(ERR_IO_PENDING, rv);
+// EXPECT_EQ(OK, callback.WaitForResult());
+//
+// const HttpResponseInfo* response = trans->GetResponseInfo();
+// ASSERT_TRUE(response != NULL);
+// ASSERT_TRUE(response->headers != NULL);
+// EXPECT_EQ("HTTP/1.1 200 OK", response->headers->GetStatusLine());
+//
+// std::string response_data;
+// ASSERT_EQ(OK, ReadTransaction(trans.get(), &response_data));
+// EXPECT_EQ("hello world", response_data);
+// }
+
TEST_F(HttpNetworkTransactionTest, FailNpnSpdyAndFallback) {
HttpStreamFactory::set_use_alternate_protocols(true);
HttpStreamFactory::set_next_protos(kExpectedNPNString);
@@ -6610,14 +6669,6 @@ TEST_F(HttpNetworkTransactionTest, UseAlternateProtocolForNpnSpdy) {
spdy_writes, arraysize(spdy_writes)));
session_deps.socket_factory.AddSocketDataProvider(spdy_data);
- MockConnect never_finishing_connect(false, ERR_IO_PENDING);
- StaticSocketDataProvider hanging_non_alternate_protocol_socket(
- NULL, 0, NULL, 0);
- hanging_non_alternate_protocol_socket.set_connect_data(
- never_finishing_connect);
- session_deps.socket_factory.AddSocketDataProvider(
- &hanging_non_alternate_protocol_socket);
-
TestCompletionCallback callback;
scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps));
@@ -6648,6 +6699,7 @@ TEST_F(HttpNetworkTransactionTest, UseAlternateProtocolForNpnSpdy) {
EXPECT_EQ("HTTP/1.1 200 OK", response->headers->GetStatusLine());
EXPECT_TRUE(response->was_fetched_via_spdy);
EXPECT_TRUE(response->was_npn_negotiated);
+ EXPECT_TRUE(response->was_alternate_protocol_available);
ASSERT_EQ(OK, ReadTransaction(trans.get(), &response_data));
EXPECT_EQ("hello!", response_data);
@@ -6656,200 +6708,6 @@ TEST_F(HttpNetworkTransactionTest, UseAlternateProtocolForNpnSpdy) {
HttpStreamFactory::set_use_alternate_protocols(false);
}
-TEST_F(HttpNetworkTransactionTest, AlternateProtocolWithSpdyLateBinding) {
- HttpStreamFactory::set_use_alternate_protocols(true);
- HttpStreamFactory::set_next_protos(kExpectedNPNString);
- SessionDependencies session_deps;
-
- HttpRequestInfo request;
- request.method = "GET";
- request.url = GURL("http://www.google.com/");
- request.load_flags = 0;
-
- MockRead data_reads[] = {
- MockRead("HTTP/1.1 200 OK\r\n"),
- MockRead(kAlternateProtocolHttpHeader),
- MockRead("hello world"),
- MockRead(true, OK),
- };
-
- StaticSocketDataProvider first_transaction(
- data_reads, arraysize(data_reads), NULL, 0);
- // Socket 1 is the HTTP transaction with the Alternate-Protocol header.
- session_deps.socket_factory.AddSocketDataProvider(&first_transaction);
-
- MockConnect never_finishing_connect(false, ERR_IO_PENDING);
- StaticSocketDataProvider hanging_socket(
- NULL, 0, NULL, 0);
- hanging_socket.set_connect_data(never_finishing_connect);
- // Socket 2 and 3 are the hanging Alternate-Protocol and
- // non-Alternate-Protocol jobs from the 2nd transaction.
- session_deps.socket_factory.AddSocketDataProvider(&hanging_socket);
- session_deps.socket_factory.AddSocketDataProvider(&hanging_socket);
-
- SSLSocketDataProvider ssl(true, OK);
- ssl.next_proto_status = SSLClientSocket::kNextProtoNegotiated;
- ssl.next_proto = "spdy/2";
- ssl.was_npn_negotiated = true;
- session_deps.socket_factory.AddSSLSocketDataProvider(&ssl);
-
- scoped_ptr<spdy::SpdyFrame> req1(ConstructSpdyGet(NULL, 0, false, 1, LOWEST));
- scoped_ptr<spdy::SpdyFrame> req2(ConstructSpdyGet(NULL, 0, false, 3, LOWEST));
- MockWrite spdy_writes[] = {
- CreateMockWrite(*req1),
- CreateMockWrite(*req2),
- };
- scoped_ptr<spdy::SpdyFrame> resp1(ConstructSpdyGetSynReply(NULL, 0, 1));
- scoped_ptr<spdy::SpdyFrame> data1(ConstructSpdyBodyFrame(1, true));
- scoped_ptr<spdy::SpdyFrame> resp2(ConstructSpdyGetSynReply(NULL, 0, 3));
- scoped_ptr<spdy::SpdyFrame> data2(ConstructSpdyBodyFrame(3, true));
- MockRead spdy_reads[] = {
- CreateMockRead(*resp1),
- CreateMockRead(*data1),
- CreateMockRead(*resp2),
- CreateMockRead(*data2),
- MockRead(true, 0, 0),
- };
-
- scoped_refptr<DelayedSocketData> spdy_data(
- new DelayedSocketData(
- 2, // wait for writes to finish before reading.
- spdy_reads, arraysize(spdy_reads),
- spdy_writes, arraysize(spdy_writes)));
- // Socket 4 is the successful Alternate-Protocol for transaction 3.
- session_deps.socket_factory.AddSocketDataProvider(spdy_data);
-
- // Socket 5 is the unsuccessful non-Alternate-Protocol for transaction 3.
- session_deps.socket_factory.AddSocketDataProvider(&hanging_socket);
-
- scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps));
- TestCompletionCallback callback1;
- HttpNetworkTransaction trans1(session);
-
- int rv = trans1.Start(&request, &callback1, BoundNetLog());
- EXPECT_EQ(ERR_IO_PENDING, rv);
- EXPECT_EQ(OK, callback1.WaitForResult());
-
- const HttpResponseInfo* response = trans1.GetResponseInfo();
- ASSERT_TRUE(response != NULL);
- ASSERT_TRUE(response->headers != NULL);
- EXPECT_EQ("HTTP/1.1 200 OK", response->headers->GetStatusLine());
-
- std::string response_data;
- ASSERT_EQ(OK, ReadTransaction(&trans1, &response_data));
- EXPECT_EQ("hello world", response_data);
-
- TestCompletionCallback callback2;
- HttpNetworkTransaction trans2(session);
- rv = trans2.Start(&request, &callback2, BoundNetLog());
- EXPECT_EQ(ERR_IO_PENDING, rv);
-
- TestCompletionCallback callback3;
- HttpNetworkTransaction trans3(session);
- rv = trans3.Start(&request, &callback3, BoundNetLog());
- EXPECT_EQ(ERR_IO_PENDING, rv);
-
- EXPECT_EQ(OK, callback2.WaitForResult());
- EXPECT_EQ(OK, callback3.WaitForResult());
-
- response = trans2.GetResponseInfo();
- ASSERT_TRUE(response != NULL);
- ASSERT_TRUE(response->headers != NULL);
- EXPECT_EQ("HTTP/1.1 200 OK", response->headers->GetStatusLine());
- EXPECT_TRUE(response->was_fetched_via_spdy);
- EXPECT_TRUE(response->was_npn_negotiated);
- ASSERT_EQ(OK, ReadTransaction(&trans2, &response_data));
- EXPECT_EQ("hello!", response_data);
-
- response = trans3.GetResponseInfo();
- ASSERT_TRUE(response != NULL);
- ASSERT_TRUE(response->headers != NULL);
- EXPECT_EQ("HTTP/1.1 200 OK", response->headers->GetStatusLine());
- EXPECT_TRUE(response->was_fetched_via_spdy);
- EXPECT_TRUE(response->was_npn_negotiated);
- ASSERT_EQ(OK, ReadTransaction(&trans3, &response_data));
- EXPECT_EQ("hello!", response_data);
-
- HttpStreamFactory::set_next_protos("");
- HttpStreamFactory::set_use_alternate_protocols(false);
-}
-
-TEST_F(HttpNetworkTransactionTest, StallAlternateProtocolForNpnSpdy) {
- HttpStreamFactory::set_use_alternate_protocols(true);
- HttpStreamFactory::set_next_protos(kExpectedNPNString);
- SessionDependencies session_deps;
-
- HttpRequestInfo request;
- request.method = "GET";
- request.url = GURL("http://www.google.com/");
- request.load_flags = 0;
-
- MockRead data_reads[] = {
- MockRead("HTTP/1.1 200 OK\r\n"),
- MockRead(kAlternateProtocolHttpHeader),
- MockRead("hello world"),
- MockRead(true, OK),
- };
-
- StaticSocketDataProvider first_transaction(
- data_reads, arraysize(data_reads), NULL, 0);
- session_deps.socket_factory.AddSocketDataProvider(&first_transaction);
-
- SSLSocketDataProvider ssl(true, OK);
- ssl.next_proto_status = SSLClientSocket::kNextProtoNegotiated;
- ssl.next_proto = "spdy/2";
- ssl.was_npn_negotiated = true;
- session_deps.socket_factory.AddSSLSocketDataProvider(&ssl);
-
- MockConnect never_finishing_connect(false, ERR_IO_PENDING);
- StaticSocketDataProvider hanging_alternate_protocol_socket(
- NULL, 0, NULL, 0);
- hanging_alternate_protocol_socket.set_connect_data(
- never_finishing_connect);
- session_deps.socket_factory.AddSocketDataProvider(
- &hanging_alternate_protocol_socket);
-
- // 2nd request is just a copy of the first one, over HTTP again.
- session_deps.socket_factory.AddSocketDataProvider(&first_transaction);
-
- TestCompletionCallback callback;
-
- scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps));
- scoped_ptr<HttpNetworkTransaction> trans(new HttpNetworkTransaction(session));
-
- int rv = trans->Start(&request, &callback, BoundNetLog());
- EXPECT_EQ(ERR_IO_PENDING, rv);
- EXPECT_EQ(OK, callback.WaitForResult());
-
- const HttpResponseInfo* response = trans->GetResponseInfo();
- ASSERT_TRUE(response != NULL);
- ASSERT_TRUE(response->headers != NULL);
- EXPECT_EQ("HTTP/1.1 200 OK", response->headers->GetStatusLine());
-
- std::string response_data;
- ASSERT_EQ(OK, ReadTransaction(trans.get(), &response_data));
- EXPECT_EQ("hello world", response_data);
-
- trans.reset(new HttpNetworkTransaction(session));
-
- rv = trans->Start(&request, &callback, BoundNetLog());
- EXPECT_EQ(ERR_IO_PENDING, rv);
- EXPECT_EQ(OK, callback.WaitForResult());
-
- response = trans->GetResponseInfo();
- ASSERT_TRUE(response != NULL);
- ASSERT_TRUE(response->headers != NULL);
- EXPECT_EQ("HTTP/1.1 200 OK", response->headers->GetStatusLine());
- EXPECT_FALSE(response->was_fetched_via_spdy);
- EXPECT_FALSE(response->was_npn_negotiated);
-
- ASSERT_EQ(OK, ReadTransaction(trans.get(), &response_data));
- EXPECT_EQ("hello world", response_data);
-
- HttpStreamFactory::set_next_protos("");
- HttpStreamFactory::set_use_alternate_protocols(false);
-}
-
class CapturingProxyResolver : public ProxyResolver {
public:
CapturingProxyResolver() : ProxyResolver(false /* expects_pac_bytes */) {}
@@ -6949,14 +6807,6 @@ TEST_F(HttpNetworkTransactionTest, UseAlternateProtocolForTunneledNpnSpdy) {
spdy_writes, arraysize(spdy_writes)));
session_deps.socket_factory.AddSocketDataProvider(spdy_data);
- MockConnect never_finishing_connect(false, ERR_IO_PENDING);
- StaticSocketDataProvider hanging_non_alternate_protocol_socket(
- NULL, 0, NULL, 0);
- hanging_non_alternate_protocol_socket.set_connect_data(
- never_finishing_connect);
- session_deps.socket_factory.AddSocketDataProvider(
- &hanging_non_alternate_protocol_socket);
-
TestCompletionCallback callback;
scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps));
@@ -6992,7 +6842,7 @@ TEST_F(HttpNetworkTransactionTest, UseAlternateProtocolForTunneledNpnSpdy) {
ASSERT_EQ(OK, ReadTransaction(trans.get(), &response_data));
EXPECT_EQ("hello!", response_data);
- ASSERT_EQ(3u, capturing_proxy_resolver->resolved().size());
+ ASSERT_EQ(2u, capturing_proxy_resolver->resolved().size());
EXPECT_EQ("http://www.google.com/",
capturing_proxy_resolver->resolved()[0].spec());
EXPECT_EQ("https://www.google.com/",
@@ -7108,6 +6958,7 @@ TEST_F(HttpNetworkTransactionTest,
EXPECT_EQ("HTTP/1.1 200 OK", response->headers->GetStatusLine());
EXPECT_TRUE(response->was_fetched_via_spdy);
EXPECT_TRUE(response->was_npn_negotiated);
+ EXPECT_TRUE(response->was_alternate_protocol_available);
ASSERT_EQ(OK, ReadTransaction(trans.get(), &response_data));
EXPECT_EQ("hello!", response_data);
@@ -7878,6 +7729,7 @@ TEST_F(HttpNetworkTransactionTest, NpnWithHttpOverSSL) {
EXPECT_FALSE(response->was_fetched_via_spdy);
EXPECT_TRUE(response->was_npn_negotiated);
+ EXPECT_FALSE(response->was_alternate_protocol_available);
HttpStreamFactory::set_next_protos("");
HttpStreamFactory::set_use_alternate_protocols(false);
@@ -8033,17 +7885,9 @@ TEST_F(HttpNetworkTransactionTest, SpdyAlternateProtocolThroughProxy) {
ssl.next_proto = "spdy/2";
ssl.was_npn_negotiated = true;
- MockConnect never_finishing_connect(false, ERR_IO_PENDING);
- StaticSocketDataProvider hanging_non_alternate_protocol_socket(
- NULL, 0, NULL, 0);
- hanging_non_alternate_protocol_socket.set_connect_data(
- never_finishing_connect);
-
session_deps.socket_factory.AddSocketDataProvider(&data_1);
session_deps.socket_factory.AddSocketDataProvider(data_2.get());
session_deps.socket_factory.AddSSLSocketDataProvider(&ssl);
- session_deps.socket_factory.AddSocketDataProvider(
- &hanging_non_alternate_protocol_socket);
scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps));
// First round should work and provide the Alternate-Protocol state.