Index: net/http/http_network_transaction_unittest.cc |
diff --git a/net/http/http_network_transaction_unittest.cc b/net/http/http_network_transaction_unittest.cc |
index 0a70755c9e0ac192d39df51910a8cffb689b01ef..a4b3592fff8152f6689d4c8836d1a0d5d424b323 100644 |
--- a/net/http/http_network_transaction_unittest.cc |
+++ b/net/http/http_network_transaction_unittest.cc |
@@ -285,6 +285,7 @@ class HttpNetworkTransactionTest |
old_max_pool_sockets_(ClientSocketPoolManager::max_sockets_per_pool( |
HttpNetworkSession::NORMAL_SOCKET_POOL)) { |
session_deps_.enable_priority_dependencies = GetDependenciesFromPriority(); |
+ session_deps_.enable_http2_alternative_service_with_different_host = true; |
} |
struct SimpleGetHelperResult { |
@@ -328,7 +329,7 @@ class HttpNetworkTransactionTest |
std::string GetAlternativeServiceHttpHeader() { |
return std::string("Alt-Svc: ") + GetAlternateProtocolFromParam() + |
- "=\"www.example.org:443\"\r\n"; |
+ "=\"mail.example.org:443\"\r\n"; |
} |
// Either |write_failure| specifies a write failure or |read_failure| |
@@ -4511,7 +4512,7 @@ TEST_P(HttpNetworkTransactionTest, HttpsProxySpdyGet) { |
// fetch http://www.example.org/ via SPDY |
std::unique_ptr<SpdySerializedFrame> req( |
- spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, false)); |
+ spdy_util_.ConstructSpdyGet("http://www.example.org/", 1, LOWEST)); |
MockWrite spdy_writes[] = {CreateMockWrite(*req, 0)}; |
std::unique_ptr<SpdySerializedFrame> resp( |
@@ -4573,7 +4574,7 @@ TEST_P(HttpNetworkTransactionTest, HttpsProxySpdyGetWithSessionRace) { |
// Fetch http://www.example.org/ through the SPDY proxy. |
std::unique_ptr<SpdySerializedFrame> req( |
- spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, false)); |
+ spdy_util_.ConstructSpdyGet("http://www.example.org/", 1, LOWEST)); |
MockWrite spdy_writes[] = {CreateMockWrite(*req, 0)}; |
std::unique_ptr<SpdySerializedFrame> resp( |
@@ -4644,6 +4645,7 @@ TEST_P(HttpNetworkTransactionTest, HttpsProxySpdyGetWithProxyAuth) { |
// The first request will be a bare GET, the second request will be a |
// GET with a Proxy-Authorization header. |
+ spdy_util_.set_default_url(request.url); |
std::unique_ptr<SpdySerializedFrame> req_get( |
spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, false)); |
spdy_util_.UpdateWithStreamDestruction(1); |
@@ -8013,7 +8015,7 @@ TEST_P(HttpNetworkTransactionTest, CrossOriginSPDYProxyPush) { |
std::unique_ptr<HttpNetworkSession> session(CreateSession(&session_deps_)); |
std::unique_ptr<SpdySerializedFrame> stream1_syn( |
- spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, false)); |
+ spdy_util_.ConstructSpdyGet("http://www.example.org/", 1, LOWEST)); |
MockWrite spdy_writes[] = { |
CreateMockWrite(*stream1_syn, 0, ASYNC), |
@@ -8126,7 +8128,7 @@ TEST_P(HttpNetworkTransactionTest, CrossOriginProxyPushCorrectness) { |
std::unique_ptr<HttpNetworkSession> session(CreateSession(&session_deps_)); |
std::unique_ptr<SpdySerializedFrame> stream1_syn( |
- spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, false)); |
+ spdy_util_.ConstructSpdyGet("http://www.example.org/", 1, LOWEST)); |
std::unique_ptr<SpdySerializedFrame> push_rst( |
spdy_util_.ConstructSpdyRstStream(2, RST_STREAM_REFUSED_STREAM)); |
@@ -8208,7 +8210,7 @@ TEST_P(HttpNetworkTransactionTest, SameOriginProxyPushCorrectness) { |
std::unique_ptr<HttpNetworkSession> session(CreateSession(&session_deps_)); |
std::unique_ptr<SpdySerializedFrame> stream1_syn( |
- spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, false)); |
+ spdy_util_.ConstructSpdyGet("http://www.example.org/", 1, LOWEST)); |
MockWrite spdy_writes[] = { |
CreateMockWrite(*stream1_syn, 0, ASYNC), |
@@ -9953,13 +9955,15 @@ TEST_P(HttpNetworkTransactionTest, HonorAlternativeServiceHeader) { |
HttpRequestInfo request; |
request.method = "GET"; |
- request.url = GURL("http://www.example.org/"); |
+ request.url = GURL("https://www.example.org/"); |
request.load_flags = 0; |
StaticSocketDataProvider data(data_reads, arraysize(data_reads), NULL, 0); |
- |
session_deps_.socket_factory->AddSocketDataProvider(&data); |
+ SSLSocketDataProvider ssl(ASYNC, OK); |
+ session_deps_.socket_factory->AddSSLSocketDataProvider(&ssl); |
+ |
TestCompletionCallback callback; |
std::unique_ptr<HttpNetworkSession> session(CreateSession(&session_deps_)); |
@@ -9969,7 +9973,7 @@ TEST_P(HttpNetworkTransactionTest, HonorAlternativeServiceHeader) { |
int rv = trans->Start(&request, callback.callback(), BoundNetLog()); |
EXPECT_EQ(ERR_IO_PENDING, rv); |
- url::SchemeHostPort test_server("http", "www.example.org", 80); |
+ url::SchemeHostPort test_server(request.url); |
HttpServerProperties* http_server_properties = |
session->http_server_properties(); |
AlternativeServiceVector alternative_service_vector = |
@@ -9994,15 +9998,13 @@ TEST_P(HttpNetworkTransactionTest, HonorAlternativeServiceHeader) { |
ASSERT_EQ(1u, alternative_service_vector.size()); |
EXPECT_EQ(AlternateProtocolFromNextProto(GetProtocol()), |
alternative_service_vector[0].protocol); |
- EXPECT_EQ("www.example.org", alternative_service_vector[0].host); |
+ EXPECT_EQ("mail.example.org", alternative_service_vector[0].host); |
EXPECT_EQ(443, alternative_service_vector[0].port); |
} |
// Regression test for https://crbug.com/615497. |
TEST_P(HttpNetworkTransactionTest, |
DoNotParseAlternativeServiceHeaderOnInsecureRequest) { |
- session_deps_.enable_alternative_service_for_insecure_origins = false; |
- |
std::string alternative_service_http_header = |
GetAlternativeServiceHttpHeader(); |
@@ -10060,15 +10062,20 @@ TEST_P(HttpNetworkTransactionTest, |
// TODO(bnc): Remove when https://crbug.com/615413 is fixed. |
TEST_P(HttpNetworkTransactionTest, |
DisableHTTP2AlternativeServicesWithDifferentHost) { |
+ session_deps_.enable_http2_alternative_service_with_different_host = false; |
+ |
HttpRequestInfo request; |
request.method = "GET"; |
- request.url = GURL("http://www.example.org/"); |
+ request.url = GURL("https://www.example.org/"); |
request.load_flags = 0; |
MockConnect mock_connect(ASYNC, ERR_CONNECTION_REFUSED); |
StaticSocketDataProvider first_data; |
first_data.set_connect_data(mock_connect); |
session_deps_.socket_factory->AddSocketDataProvider(&first_data); |
+ SSLSocketDataProvider ssl_http11(ASYNC, OK); |
+ ssl_http11.SetNextProto(kProtoHTTP11); |
+ session_deps_.socket_factory->AddSSLSocketDataProvider(&ssl_http11); |
MockRead data_reads[] = { |
MockRead("HTTP/1.1 200 OK\r\n\r\n"), MockRead("hello world"), |
@@ -10102,8 +10109,6 @@ TEST_P(HttpNetworkTransactionTest, |
// Alternative Services should be disabled for http origin. |
TEST_P(HttpNetworkTransactionTest, |
DisableAlternativeServicesForInsecureOrigin) { |
- session_deps_.enable_alternative_service_for_insecure_origins = false; |
- |
HttpRequestInfo request; |
request.method = "GET"; |
request.url = GURL("http://www.example.org/"); |
@@ -10146,7 +10151,7 @@ TEST_P(HttpNetworkTransactionTest, ClearAlternativeServices) { |
std::unique_ptr<HttpNetworkSession> session(CreateSession(&session_deps_)); |
HttpServerProperties* http_server_properties = |
session->http_server_properties(); |
- url::SchemeHostPort test_server("http", "www.example.org", 80); |
+ url::SchemeHostPort test_server("https", "www.example.org", 443); |
AlternativeService alternative_service(QUIC, "", 80); |
base::Time expiration = base::Time::Now() + base::TimeDelta::FromDays(1); |
http_server_properties->SetAlternativeService( |
@@ -10166,9 +10171,12 @@ TEST_P(HttpNetworkTransactionTest, ClearAlternativeServices) { |
StaticSocketDataProvider data(data_reads, arraysize(data_reads), nullptr, 0); |
session_deps_.socket_factory->AddSocketDataProvider(&data); |
+ SSLSocketDataProvider ssl(ASYNC, OK); |
+ session_deps_.socket_factory->AddSSLSocketDataProvider(&ssl); |
+ |
HttpRequestInfo request; |
request.method = "GET"; |
- request.url = GURL("http://www.example.org/"); |
+ request.url = GURL("https://www.example.org/"); |
request.load_flags = 0; |
TestCompletionCallback callback; |
@@ -10195,12 +10203,12 @@ TEST_P(HttpNetworkTransactionTest, ClearAlternativeServices) { |
EXPECT_TRUE(alternative_service_vector.empty()); |
} |
-TEST_P(HttpNetworkTransactionTest, HonorMultipleAlternativeServiceHeader) { |
+TEST_P(HttpNetworkTransactionTest, HonorMultipleAlternativeServiceHeaders) { |
MockRead data_reads[] = { |
MockRead("HTTP/1.1 200 OK\r\n"), |
MockRead("Alt-Svc: "), |
MockRead(GetAlternateProtocolFromParam()), |
- MockRead("=\"www.example.com:443\";p=\"1.0\","), |
+ MockRead("=\"www.example.com:443\","), |
MockRead(GetAlternateProtocolFromParam()), |
MockRead("=\":1234\"\r\n\r\n"), |
MockRead("hello world"), |
@@ -10209,13 +10217,15 @@ TEST_P(HttpNetworkTransactionTest, HonorMultipleAlternativeServiceHeader) { |
HttpRequestInfo request; |
request.method = "GET"; |
- request.url = GURL("http://www.example.org/"); |
+ request.url = GURL("https://www.example.org/"); |
request.load_flags = 0; |
StaticSocketDataProvider data(data_reads, arraysize(data_reads), NULL, 0); |
- |
session_deps_.socket_factory->AddSocketDataProvider(&data); |
+ SSLSocketDataProvider ssl(ASYNC, OK); |
+ session_deps_.socket_factory->AddSSLSocketDataProvider(&ssl); |
+ |
TestCompletionCallback callback; |
std::unique_ptr<HttpNetworkSession> session(CreateSession(&session_deps_)); |
@@ -10225,7 +10235,7 @@ TEST_P(HttpNetworkTransactionTest, HonorMultipleAlternativeServiceHeader) { |
int rv = trans->Start(&request, callback.callback(), BoundNetLog()); |
EXPECT_EQ(ERR_IO_PENDING, rv); |
- url::SchemeHostPort test_server("http", "www.example.org", 80); |
+ url::SchemeHostPort test_server("https", "www.example.org", 443); |
HttpServerProperties* http_server_properties = |
session->http_server_properties(); |
AlternativeServiceVector alternative_service_vector = |
@@ -10258,51 +10268,6 @@ TEST_P(HttpNetworkTransactionTest, HonorMultipleAlternativeServiceHeader) { |
EXPECT_EQ(1234, alternative_service_vector[1].port); |
} |
-// When |enable_http2_alternative_service_with_different_host| is false, do not |
-// observe alternative service entries that point to a different host. |
-TEST_P(HttpNetworkTransactionTest, DisableAlternativeServiceToDifferentHost) { |
Bence
2016/06/28 20:09:20
After changing to https, this is totally redundant
|
- session_deps_.enable_http2_alternative_service_with_different_host = false; |
- |
- HttpRequestInfo request; |
- request.method = "GET"; |
- request.url = GURL("http://www.example.org/"); |
- request.load_flags = 0; |
- |
- MockConnect mock_connect(ASYNC, ERR_CONNECTION_REFUSED); |
- StaticSocketDataProvider first_data; |
- first_data.set_connect_data(mock_connect); |
- session_deps_.socket_factory->AddSocketDataProvider(&first_data); |
- |
- MockRead data_reads[] = { |
- MockRead("HTTP/1.1 200 OK\r\n\r\n"), MockRead("hello world"), |
- MockRead(ASYNC, OK), |
- }; |
- StaticSocketDataProvider second_data(data_reads, arraysize(data_reads), |
- nullptr, 0); |
- session_deps_.socket_factory->AddSocketDataProvider(&second_data); |
- |
- std::unique_ptr<HttpNetworkSession> session = CreateSession(&session_deps_); |
- |
- HttpServerProperties* http_server_properties = |
- session->http_server_properties(); |
- AlternativeService alternative_service( |
- AlternateProtocolFromNextProto(GetProtocol()), "different.example.org", |
- 80); |
- base::Time expiration = base::Time::Now() + base::TimeDelta::FromDays(1); |
- http_server_properties->SetAlternativeService( |
- url::SchemeHostPort(request.url), alternative_service, expiration); |
- |
- std::unique_ptr<HttpTransaction> trans( |
- new HttpNetworkTransaction(DEFAULT_PRIORITY, session.get())); |
- TestCompletionCallback callback; |
- |
- int rv = trans->Start(&request, callback.callback(), BoundNetLog()); |
- // The connetion to origin was refused, and the alternative service should not |
- // be used (even though mock data are there), therefore the request should |
- // fail. |
- EXPECT_EQ(ERR_CONNECTION_REFUSED, callback.GetResult(rv)); |
-} |
- |
TEST_P(HttpNetworkTransactionTest, IdentifyQuicBroken) { |
url::SchemeHostPort server("https", "origin.example.org", 443); |
HostPortPair alternative("alternative.example.org", 443); |
@@ -10440,13 +10405,16 @@ TEST_P(HttpNetworkTransactionTest, |
MarkBrokenAlternateProtocolAndFallback) { |
HttpRequestInfo request; |
request.method = "GET"; |
- request.url = GURL("http://www.example.org/"); |
+ request.url = GURL("https://www.example.org/"); |
request.load_flags = 0; |
MockConnect mock_connect(ASYNC, ERR_CONNECTION_REFUSED); |
StaticSocketDataProvider first_data; |
first_data.set_connect_data(mock_connect); |
session_deps_.socket_factory->AddSocketDataProvider(&first_data); |
+ SSLSocketDataProvider ssl_http11(ASYNC, OK); |
+ ssl_http11.SetNextProto(kProtoHTTP11); |
+ session_deps_.socket_factory->AddSSLSocketDataProvider(&ssl_http11); |
MockRead data_reads[] = { |
MockRead("HTTP/1.1 200 OK\r\n\r\n"), |
@@ -10504,7 +10472,7 @@ TEST_P(HttpNetworkTransactionTest, |
AlternateProtocolPortRestrictedBlocked) { |
HttpRequestInfo restricted_port_request; |
restricted_port_request.method = "GET"; |
- restricted_port_request.url = GURL("http://www.example.org:1023/"); |
+ restricted_port_request.url = GURL("https://www.example.org:1023/"); |
restricted_port_request.load_flags = 0; |
MockConnect mock_connect(ASYNC, ERR_CONNECTION_REFUSED); |
@@ -10520,6 +10488,9 @@ TEST_P(HttpNetworkTransactionTest, |
StaticSocketDataProvider second_data( |
data_reads, arraysize(data_reads), NULL, 0); |
session_deps_.socket_factory->AddSocketDataProvider(&second_data); |
+ SSLSocketDataProvider ssl_http11(ASYNC, OK); |
+ ssl_http11.SetNextProto(kProtoHTTP11); |
+ session_deps_.socket_factory->AddSSLSocketDataProvider(&ssl_http11); |
std::unique_ptr<HttpNetworkSession> session(CreateSession(&session_deps_)); |
@@ -10555,7 +10526,7 @@ TEST_P(HttpNetworkTransactionTest, |
HttpRequestInfo restricted_port_request; |
restricted_port_request.method = "GET"; |
- restricted_port_request.url = GURL("http://www.example.org:1023/"); |
+ restricted_port_request.url = GURL("https://www.example.org:1023/"); |
restricted_port_request.load_flags = 0; |
MockConnect mock_connect(ASYNC, ERR_CONNECTION_REFUSED); |
@@ -10571,6 +10542,9 @@ TEST_P(HttpNetworkTransactionTest, |
StaticSocketDataProvider second_data( |
data_reads, arraysize(data_reads), NULL, 0); |
session_deps_.socket_factory->AddSocketDataProvider(&second_data); |
+ SSLSocketDataProvider ssl_http11(ASYNC, OK); |
+ ssl_http11.SetNextProto(kProtoHTTP11); |
+ session_deps_.socket_factory->AddSSLSocketDataProvider(&ssl_http11); |
std::unique_ptr<HttpNetworkSession> session(CreateSession(&session_deps_)); |
@@ -10604,7 +10578,7 @@ TEST_P(HttpNetworkTransactionTest, |
AlternateProtocolPortRestrictedAllowed) { |
HttpRequestInfo restricted_port_request; |
restricted_port_request.method = "GET"; |
- restricted_port_request.url = GURL("http://www.example.org:1023/"); |
+ restricted_port_request.url = GURL("https://www.example.org:1023/"); |
restricted_port_request.load_flags = 0; |
MockConnect mock_connect(ASYNC, ERR_CONNECTION_REFUSED); |
@@ -10621,6 +10595,9 @@ TEST_P(HttpNetworkTransactionTest, |
data_reads, arraysize(data_reads), NULL, 0); |
session_deps_.socket_factory->AddSocketDataProvider(&second_data); |
+ SSLSocketDataProvider ssl(ASYNC, OK); |
+ session_deps_.socket_factory->AddSSLSocketDataProvider(&ssl); |
+ |
std::unique_ptr<HttpNetworkSession> session(CreateSession(&session_deps_)); |
HttpServerProperties* http_server_properties = |
@@ -10654,7 +10631,7 @@ TEST_P(HttpNetworkTransactionTest, |
AlternateProtocolPortUnrestrictedAllowed1) { |
HttpRequestInfo unrestricted_port_request; |
unrestricted_port_request.method = "GET"; |
- unrestricted_port_request.url = GURL("http://www.example.org:1024/"); |
+ unrestricted_port_request.url = GURL("https://www.example.org:1024/"); |
unrestricted_port_request.load_flags = 0; |
MockConnect mock_connect(ASYNC, ERR_CONNECTION_REFUSED); |
@@ -10670,6 +10647,9 @@ TEST_P(HttpNetworkTransactionTest, |
StaticSocketDataProvider second_data( |
data_reads, arraysize(data_reads), NULL, 0); |
session_deps_.socket_factory->AddSocketDataProvider(&second_data); |
+ SSLSocketDataProvider ssl_http11(ASYNC, OK); |
+ ssl_http11.SetNextProto(kProtoHTTP11); |
+ session_deps_.socket_factory->AddSSLSocketDataProvider(&ssl_http11); |
std::unique_ptr<HttpNetworkSession> session(CreateSession(&session_deps_)); |
@@ -10703,7 +10683,7 @@ TEST_P(HttpNetworkTransactionTest, |
AlternateProtocolPortUnrestrictedAllowed2) { |
HttpRequestInfo unrestricted_port_request; |
unrestricted_port_request.method = "GET"; |
- unrestricted_port_request.url = GURL("http://www.example.org:1024/"); |
+ unrestricted_port_request.url = GURL("https://www.example.org:1024/"); |
unrestricted_port_request.load_flags = 0; |
MockConnect mock_connect(ASYNC, ERR_CONNECTION_REFUSED); |
@@ -10720,6 +10700,9 @@ TEST_P(HttpNetworkTransactionTest, |
data_reads, arraysize(data_reads), NULL, 0); |
session_deps_.socket_factory->AddSocketDataProvider(&second_data); |
+ SSLSocketDataProvider ssl(ASYNC, OK); |
+ session_deps_.socket_factory->AddSSLSocketDataProvider(&ssl); |
+ |
std::unique_ptr<HttpNetworkSession> session(CreateSession(&session_deps_)); |
HttpServerProperties* http_server_properties = |
@@ -10798,7 +10781,7 @@ TEST_P(HttpNetworkTransactionTest, AlternateProtocolUnsafeBlocked) { |
TEST_P(HttpNetworkTransactionTest, UseAlternateProtocolForNpnSpdy) { |
HttpRequestInfo request; |
request.method = "GET"; |
- request.url = GURL("http://www.example.org/"); |
+ request.url = GURL("https://www.example.org/"); |
request.load_flags = 0; |
std::string alternative_service_http_header = |
@@ -10815,15 +10798,19 @@ TEST_P(HttpNetworkTransactionTest, UseAlternateProtocolForNpnSpdy) { |
StaticSocketDataProvider first_transaction( |
data_reads, arraysize(data_reads), NULL, 0); |
session_deps_.socket_factory->AddSocketDataProvider(&first_transaction); |
+ SSLSocketDataProvider ssl_http11(ASYNC, OK); |
+ ssl_http11.SetNextProto(kProtoHTTP11); |
+ session_deps_.socket_factory->AddSSLSocketDataProvider(&ssl_http11); |
- SSLSocketDataProvider ssl(ASYNC, OK); |
- ssl.SetNextProto(GetProtocol()); |
- ssl.cert = ImportCertFromFile(GetTestCertsDirectory(), "spdy_pooling.pem"); |
- ASSERT_TRUE(ssl.cert.get()); |
- session_deps_.socket_factory->AddSSLSocketDataProvider(&ssl); |
+ SSLSocketDataProvider ssl_http2(ASYNC, OK); |
+ ssl_http2.SetNextProto(GetProtocol()); |
+ ssl_http2.cert = |
+ ImportCertFromFile(GetTestCertsDirectory(), "spdy_pooling.pem"); |
+ ASSERT_TRUE(ssl_http2.cert.get()); |
+ session_deps_.socket_factory->AddSSLSocketDataProvider(&ssl_http2); |
std::unique_ptr<SpdySerializedFrame> req( |
- spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); |
+ spdy_util_.ConstructSpdyGet("https://www.example.org/", 1, LOWEST)); |
MockWrite spdy_writes[] = {CreateMockWrite(*req, 0)}; |
std::unique_ptr<SpdySerializedFrame> resp( |
@@ -10885,9 +10872,10 @@ TEST_P(HttpNetworkTransactionTest, UseAlternateProtocolForNpnSpdy) { |
TEST_P(HttpNetworkTransactionTest, AlternateProtocolWithSpdyLateBinding) { |
HttpRequestInfo request; |
request.method = "GET"; |
- request.url = GURL("http://www.example.org/"); |
+ request.url = GURL("https://www.example.org/"); |
request.load_flags = 0; |
+ // First transaction receives Alt-Svc header over HTTP/1.1. |
std::string alternative_service_http_header = |
GetAlternativeServiceHttpHeader(); |
@@ -10900,32 +10888,31 @@ TEST_P(HttpNetworkTransactionTest, AlternateProtocolWithSpdyLateBinding) { |
MockRead(ASYNC, 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); |
+ StaticSocketDataProvider http11_data(data_reads, arraysize(data_reads), NULL, |
+ 0); |
+ session_deps_.socket_factory->AddSocketDataProvider(&http11_data); |
+ |
+ SSLSocketDataProvider ssl_http11(ASYNC, OK); |
+ session_deps_.socket_factory->AddSSLSocketDataProvider(&ssl_http11); |
+ // Second transaction starts an alternative and a non-alternative Job. |
+ // Both sockets hang. |
MockConnect never_finishing_connect(SYNCHRONOUS, ERR_IO_PENDING); |
StaticSocketDataProvider hanging_socket1(NULL, 0, NULL, 0); |
hanging_socket1.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_socket1); |
StaticSocketDataProvider hanging_socket2(NULL, 0, NULL, 0); |
hanging_socket2.set_connect_data(never_finishing_connect); |
session_deps_.socket_factory->AddSocketDataProvider(&hanging_socket2); |
- SSLSocketDataProvider ssl(ASYNC, OK); |
- ssl.SetNextProto(GetProtocol()); |
- ssl.cert = ImportCertFromFile(GetTestCertsDirectory(), "spdy_pooling.pem"); |
- ASSERT_TRUE(ssl.cert); |
- session_deps_.socket_factory->AddSSLSocketDataProvider(&ssl); |
- |
+ // Third transaction starts an alternative and a non-alternative job. |
+ // The non-alternative job hangs, but the alternative one succeeds. |
+ // The second transaction, still pending, binds to this socket. |
std::unique_ptr<SpdySerializedFrame> req1( |
- spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); |
+ spdy_util_.ConstructSpdyGet("https://www.example.org/", 1, LOWEST)); |
std::unique_ptr<SpdySerializedFrame> req2( |
- spdy_util_.ConstructSpdyGet(nullptr, 0, 3, LOWEST, true)); |
+ spdy_util_.ConstructSpdyGet("https://www.example.org/", 3, LOWEST)); |
MockWrite spdy_writes[] = { |
CreateMockWrite(*req1, 0), CreateMockWrite(*req2, 1), |
}; |
@@ -10947,10 +10934,15 @@ TEST_P(HttpNetworkTransactionTest, AlternateProtocolWithSpdyLateBinding) { |
SequencedSocketData spdy_data(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. |
+ SSLSocketDataProvider ssl_http2(ASYNC, OK); |
+ ssl_http2.SetNextProto(GetProtocol()); |
+ ssl_http2.cert = |
+ ImportCertFromFile(GetTestCertsDirectory(), "spdy_pooling.pem"); |
+ ASSERT_TRUE(ssl_http2.cert); |
+ session_deps_.socket_factory->AddSSLSocketDataProvider(&ssl_http2); |
+ |
StaticSocketDataProvider hanging_socket3(NULL, 0, NULL, 0); |
hanging_socket3.set_connect_data(never_finishing_connect); |
session_deps_.socket_factory->AddSocketDataProvider(&hanging_socket3); |
@@ -11007,7 +10999,7 @@ TEST_P(HttpNetworkTransactionTest, AlternateProtocolWithSpdyLateBinding) { |
TEST_P(HttpNetworkTransactionTest, StallAlternativeServiceForNpnSpdy) { |
HttpRequestInfo request; |
request.method = "GET"; |
- request.url = GURL("http://www.example.org/"); |
+ request.url = GURL("https://www.example.org/"); |
request.load_flags = 0; |
std::string alternative_service_http_header = |
@@ -11027,7 +11019,6 @@ TEST_P(HttpNetworkTransactionTest, StallAlternativeServiceForNpnSpdy) { |
session_deps_.socket_factory->AddSocketDataProvider(&first_transaction); |
SSLSocketDataProvider ssl(ASYNC, OK); |
- ssl.SetNextProto(GetProtocol()); |
session_deps_.socket_factory->AddSSLSocketDataProvider(&ssl); |
MockConnect never_finishing_connect(SYNCHRONOUS, ERR_IO_PENDING); |
@@ -11038,10 +11029,11 @@ TEST_P(HttpNetworkTransactionTest, StallAlternativeServiceForNpnSpdy) { |
session_deps_.socket_factory->AddSocketDataProvider( |
&hanging_alternate_protocol_socket); |
- // 2nd request is just a copy of the first one, over HTTP again. |
+ // 2nd request is just a copy of the first one, over HTTP/1.1 again. |
StaticSocketDataProvider second_transaction(data_reads, arraysize(data_reads), |
NULL, 0); |
session_deps_.socket_factory->AddSocketDataProvider(&second_transaction); |
+ session_deps_.socket_factory->AddSSLSocketDataProvider(&ssl); |
TestCompletionCallback callback; |
@@ -11145,7 +11137,7 @@ TEST_P(HttpNetworkTransactionTest, UseAlternativeServiceForTunneledNpnSpdy) { |
HttpRequestInfo request; |
request.method = "GET"; |
- request.url = GURL("http://www.example.org/"); |
+ request.url = GURL("https://www.example.org/"); |
request.load_flags = 0; |
std::string alternative_service_http_header = |
@@ -11163,15 +11155,19 @@ TEST_P(HttpNetworkTransactionTest, UseAlternativeServiceForTunneledNpnSpdy) { |
StaticSocketDataProvider first_transaction( |
data_reads, arraysize(data_reads), NULL, 0); |
session_deps_.socket_factory->AddSocketDataProvider(&first_transaction); |
+ SSLSocketDataProvider ssl_http11(ASYNC, OK); |
+ ssl_http11.SetNextProto(kProtoHTTP11); |
+ session_deps_.socket_factory->AddSSLSocketDataProvider(&ssl_http11); |
- SSLSocketDataProvider ssl(ASYNC, OK); |
- ssl.SetNextProto(GetProtocol()); |
- ssl.cert = ImportCertFromFile(GetTestCertsDirectory(), "spdy_pooling.pem"); |
- ASSERT_TRUE(ssl.cert); |
- session_deps_.socket_factory->AddSSLSocketDataProvider(&ssl); |
+ SSLSocketDataProvider ssl_http2(ASYNC, OK); |
+ ssl_http2.SetNextProto(GetProtocol()); |
+ ssl_http2.cert = |
+ ImportCertFromFile(GetTestCertsDirectory(), "spdy_pooling.pem"); |
+ ASSERT_TRUE(ssl_http2.cert); |
+ session_deps_.socket_factory->AddSSLSocketDataProvider(&ssl_http2); |
std::unique_ptr<SpdySerializedFrame> req( |
- spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); |
+ spdy_util_.ConstructSpdyGet("https://www.example.org/", 1, LOWEST)); |
MockWrite spdy_writes[] = { |
MockWrite(ASYNC, 0, |
"CONNECT www.example.org:443 HTTP/1.1\r\n" |
@@ -11216,9 +11212,9 @@ TEST_P(HttpNetworkTransactionTest, UseAlternativeServiceForTunneledNpnSpdy) { |
const HttpResponseInfo* response = trans->GetResponseInfo(); |
ASSERT_TRUE(response); |
ASSERT_TRUE(response->headers); |
- EXPECT_EQ("HTTP/1.1 200 OK", response->headers->GetStatusLine()); |
+ EXPECT_EQ("HTTP/0.9 200 OK", response->headers->GetStatusLine()); |
EXPECT_FALSE(response->was_fetched_via_spdy); |
- EXPECT_FALSE(response->was_npn_negotiated); |
+ EXPECT_TRUE(response->was_npn_negotiated); |
std::string response_data; |
ASSERT_EQ(OK, ReadTransaction(trans.get(), &response_data)); |
@@ -11239,8 +11235,8 @@ TEST_P(HttpNetworkTransactionTest, UseAlternativeServiceForTunneledNpnSpdy) { |
ASSERT_EQ(OK, ReadTransaction(trans.get(), &response_data)); |
EXPECT_EQ("hello!", response_data); |
- ASSERT_EQ(3u, capturing_proxy_resolver.resolved().size()); |
- EXPECT_EQ("http://www.example.org/", |
+ ASSERT_EQ(2u, capturing_proxy_resolver.resolved().size()); |
+ EXPECT_EQ("https://www.example.org/", |
capturing_proxy_resolver.resolved()[0].spec()); |
EXPECT_EQ("https://www.example.org/", |
capturing_proxy_resolver.resolved()[1].spec()); |
@@ -11255,7 +11251,7 @@ TEST_P(HttpNetworkTransactionTest, |
UseAlternativeServiceForNpnSpdyWithExistingSpdySession) { |
HttpRequestInfo request; |
request.method = "GET"; |
- request.url = GURL("http://www.example.org/"); |
+ request.url = GURL("https://www.example.org/"); |
request.load_flags = 0; |
std::string alternative_service_http_header = |
@@ -11272,15 +11268,19 @@ TEST_P(HttpNetworkTransactionTest, |
StaticSocketDataProvider first_transaction( |
data_reads, arraysize(data_reads), NULL, 0); |
session_deps_.socket_factory->AddSocketDataProvider(&first_transaction); |
+ SSLSocketDataProvider ssl_http11(ASYNC, OK); |
+ ssl_http11.SetNextProto(kProtoHTTP11); |
+ session_deps_.socket_factory->AddSSLSocketDataProvider(&ssl_http11); |
- SSLSocketDataProvider ssl(ASYNC, OK); |
- ssl.SetNextProto(GetProtocol()); |
- ssl.cert = ImportCertFromFile(GetTestCertsDirectory(), "spdy_pooling.pem"); |
- ASSERT_TRUE(ssl.cert); |
- session_deps_.socket_factory->AddSSLSocketDataProvider(&ssl); |
+ SSLSocketDataProvider ssl_http2(ASYNC, OK); |
+ ssl_http2.SetNextProto(GetProtocol()); |
+ ssl_http2.cert = |
+ ImportCertFromFile(GetTestCertsDirectory(), "spdy_pooling.pem"); |
+ ASSERT_TRUE(ssl_http2.cert); |
+ session_deps_.socket_factory->AddSSLSocketDataProvider(&ssl_http2); |
std::unique_ptr<SpdySerializedFrame> req( |
- spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); |
+ spdy_util_.ConstructSpdyGet("https://www.example.org/", 1, LOWEST)); |
MockWrite spdy_writes[] = {CreateMockWrite(*req, 0)}; |
std::unique_ptr<SpdySerializedFrame> resp( |
@@ -12068,166 +12068,6 @@ class UrlRecordingHttpAuthHandlerMock : public HttpAuthHandlerMock { |
GURL* url_; |
}; |
-// This test ensures that the URL passed into the proxy is upgraded to https |
-// when doing an Alternate Protocol upgrade. |
-TEST_P(HttpNetworkTransactionTest, SpdyAlternativeServiceThroughProxy) { |
Bence
2016/06/28 20:09:20
Alternative Service is not allowed for http scheme
|
- session_deps_.proxy_service = |
- ProxyService::CreateFixedFromPacResult("PROXY myproxy:70"); |
- TestNetLog net_log; |
- session_deps_.net_log = &net_log; |
- GURL request_url; |
- { |
- HttpAuthHandlerMock::Factory* auth_factory = |
- new HttpAuthHandlerMock::Factory(); |
- UrlRecordingHttpAuthHandlerMock* auth_handler = |
- new UrlRecordingHttpAuthHandlerMock(&request_url); |
- auth_factory->AddMockHandler(auth_handler, HttpAuth::AUTH_PROXY); |
- auth_factory->set_do_init_from_challenge(true); |
- session_deps_.http_auth_handler_factory.reset(auth_factory); |
- } |
- |
- HttpRequestInfo request; |
- request.method = "GET"; |
- request.url = GURL("http://www.example.org"); |
- request.load_flags = 0; |
- |
- // First round goes unauthenticated through the proxy. |
- MockWrite data_writes_1[] = { |
- MockWrite( |
- "GET http://www.example.org/ HTTP/1.1\r\n" |
- "Host: www.example.org\r\n" |
- "Proxy-Connection: keep-alive\r\n" |
- "\r\n"), |
- }; |
- MockRead data_reads_1[] = { |
- MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ), |
- MockRead("HTTP/1.1 200 OK\r\n"), |
- MockRead("Alt-Svc: "), |
- MockRead(GetAlternateProtocolFromParam()), |
- MockRead("=\":443\"\r\n"), |
- MockRead("Proxy-Connection: close\r\n"), |
- MockRead("\r\n"), |
- }; |
- StaticSocketDataProvider data_1(data_reads_1, arraysize(data_reads_1), |
- data_writes_1, arraysize(data_writes_1)); |
- |
- // Second round tries to tunnel to www.example.org due to the |
- // Alternate-Protocol announcement in the first round. It fails due |
- // to a proxy authentication challenge. |
- // After the failure, a tunnel is established to www.example.org using |
- // Proxy-Authorization headers. There is then a SPDY request round. |
- // |
- // NOTE: Despite the "Proxy-Connection: Close", these are done on the |
- // same MockTCPClientSocket since the underlying HttpNetworkClientSocket |
- // does a Disconnect and Connect on the same socket, rather than trying |
- // to obtain a new one. |
- // |
- // NOTE: Originally, the proxy response to the second CONNECT request |
- // simply returned another 407 so the unit test could skip the SSL connection |
- // establishment and SPDY framing issues. Alas, the |
- // retry-http-when-alternate-protocol fails logic kicks in, which was more |
- // complicated to set up expectations for than the SPDY session. |
- |
- std::unique_ptr<SpdySerializedFrame> req( |
- spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); |
- std::unique_ptr<SpdySerializedFrame> resp( |
- spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); |
- std::unique_ptr<SpdySerializedFrame> data( |
- spdy_util_.ConstructSpdyBodyFrame(1, true)); |
- |
- MockWrite data_writes_2[] = { |
- // First connection attempt without Proxy-Authorization. |
- MockWrite(ASYNC, 0, |
- "CONNECT www.example.org:443 HTTP/1.1\r\n" |
- "Host: www.example.org:443\r\n" |
- "Proxy-Connection: keep-alive\r\n" |
- "\r\n"), |
- |
- // Second connection attempt with Proxy-Authorization. |
- MockWrite(ASYNC, 2, |
- "CONNECT www.example.org:443 HTTP/1.1\r\n" |
- "Host: www.example.org:443\r\n" |
- "Proxy-Connection: keep-alive\r\n" |
- "Proxy-Authorization: auth_token\r\n" |
- "\r\n"), |
- |
- // SPDY request |
- CreateMockWrite(*req, 4), |
- }; |
- MockRead data_reads_2[] = { |
- // First connection attempt fails |
- MockRead(ASYNC, 1, |
- "HTTP/1.1 407 Unauthorized\r\n" |
- "Proxy-Authenticate: Mock\r\n" |
- "Content-Length: 0\r\n" |
- "Proxy-Connection: keep-alive\r\n" |
- "\r\n"), |
- |
- // Second connection attempt passes |
- MockRead(ASYNC, 3, "HTTP/1.1 200 Connected\r\n\r\n"), |
- |
- // SPDY response |
- CreateMockRead(*resp.get(), 5), CreateMockRead(*data.get(), 6), |
- MockRead(ASYNC, 0, 0, 7), |
- }; |
- SequencedSocketData data_2(data_reads_2, arraysize(data_reads_2), |
- data_writes_2, arraysize(data_writes_2)); |
- |
- SSLSocketDataProvider ssl(ASYNC, OK); |
- ssl.SetNextProto(GetProtocol()); |
- ssl.cert = ImportCertFromFile(GetTestCertsDirectory(), "spdy_pooling.pem"); |
- ASSERT_TRUE(ssl.cert); |
- |
- MockConnect never_finishing_connect(SYNCHRONOUS, 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); |
- session_deps_.socket_factory->AddSSLSocketDataProvider(&ssl); |
- session_deps_.socket_factory->AddSocketDataProvider( |
- &hanging_non_alternate_protocol_socket); |
- std::unique_ptr<HttpNetworkSession> session(CreateSession(&session_deps_)); |
- |
- // First round should work and provide the Alternate-Protocol state. |
- TestCompletionCallback callback_1; |
- std::unique_ptr<HttpTransaction> trans_1( |
- new HttpNetworkTransaction(DEFAULT_PRIORITY, session.get())); |
- int rv = trans_1->Start(&request, callback_1.callback(), BoundNetLog()); |
- EXPECT_EQ(ERR_IO_PENDING, rv); |
- EXPECT_EQ(OK, callback_1.WaitForResult()); |
- |
- // Second round should attempt a tunnel connect and get an auth challenge. |
- TestCompletionCallback callback_2; |
- std::unique_ptr<HttpTransaction> trans_2( |
- new HttpNetworkTransaction(DEFAULT_PRIORITY, session.get())); |
- rv = trans_2->Start(&request, callback_2.callback(), BoundNetLog()); |
- EXPECT_EQ(ERR_IO_PENDING, rv); |
- EXPECT_EQ(OK, callback_2.WaitForResult()); |
- const HttpResponseInfo* response = trans_2->GetResponseInfo(); |
- ASSERT_TRUE(response); |
- ASSERT_TRUE(response->auth_challenge); |
- |
- // Restart with auth. Tunnel should work and response received. |
- TestCompletionCallback callback_3; |
- rv = trans_2->RestartWithAuth( |
- AuthCredentials(kFoo, kBar), callback_3.callback()); |
- EXPECT_EQ(ERR_IO_PENDING, rv); |
- EXPECT_EQ(OK, callback_3.WaitForResult()); |
- |
- // After all that work, these two lines (or actually, just the scheme) are |
- // what this test is all about. Make sure it happens correctly. |
- EXPECT_EQ("https", request_url.scheme()); |
- EXPECT_EQ("www.example.org", request_url.host()); |
- |
- LoadTimingInfo load_timing_info; |
- EXPECT_TRUE(trans_2->GetLoadTimingInfo(&load_timing_info)); |
- TestLoadTimingNotReusedWithPac(load_timing_info, |
- CONNECT_TIMING_HAS_SSL_TIMES); |
-} |
- |
// Test that if we cancel the transaction as the connection is completing, that |
// everything tears down correctly. |
TEST_P(HttpNetworkTransactionTest, SimpleCancel) { |