Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(47)

Side by Side Diff: net/http/http_network_transaction_unittest.cc

Issue 2109803002: Change a number of SPDY unittests from http to https. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Rebase. Created 4 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « net/http/http_network_transaction.cc ('k') | net/http/http_stream_factory_impl_job.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2013 The Chromium Authors. All rights reserved. 1 // Copyright 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "net/http/http_network_transaction.h" 5 #include "net/http/http_network_transaction.h"
6 6
7 #include <math.h> // ceil 7 #include <math.h> // ceil
8 #include <stdarg.h> 8 #include <stdarg.h>
9 #include <stdint.h> 9 #include <stdint.h>
10 10
(...skipping 267 matching lines...) Expand 10 before | Expand all | Expand 10 after
278 278
279 protected: 279 protected:
280 HttpNetworkTransactionTest() 280 HttpNetworkTransactionTest()
281 : spdy_util_(GetProtocol(), GetDependenciesFromPriority()), 281 : spdy_util_(GetProtocol(), GetDependenciesFromPriority()),
282 session_deps_(GetProtocol()), 282 session_deps_(GetProtocol()),
283 old_max_group_sockets_(ClientSocketPoolManager::max_sockets_per_group( 283 old_max_group_sockets_(ClientSocketPoolManager::max_sockets_per_group(
284 HttpNetworkSession::NORMAL_SOCKET_POOL)), 284 HttpNetworkSession::NORMAL_SOCKET_POOL)),
285 old_max_pool_sockets_(ClientSocketPoolManager::max_sockets_per_pool( 285 old_max_pool_sockets_(ClientSocketPoolManager::max_sockets_per_pool(
286 HttpNetworkSession::NORMAL_SOCKET_POOL)) { 286 HttpNetworkSession::NORMAL_SOCKET_POOL)) {
287 session_deps_.enable_priority_dependencies = GetDependenciesFromPriority(); 287 session_deps_.enable_priority_dependencies = GetDependenciesFromPriority();
288 session_deps_.enable_http2_alternative_service_with_different_host = true;
288 } 289 }
289 290
290 struct SimpleGetHelperResult { 291 struct SimpleGetHelperResult {
291 int rv; 292 int rv;
292 std::string status_line; 293 std::string status_line;
293 std::string response_data; 294 std::string response_data;
294 int64_t total_received_bytes; 295 int64_t total_received_bytes;
295 int64_t total_sent_bytes; 296 int64_t total_sent_bytes;
296 LoadTimingInfo load_timing_info; 297 LoadTimingInfo load_timing_info;
297 ConnectionAttempts connection_attempts; 298 ConnectionAttempts connection_attempts;
(...skipping 23 matching lines...) Expand all
321 return GetParam() == kTestCaseHTTP2PriorityDependencies; 322 return GetParam() == kTestCaseHTTP2PriorityDependencies;
322 } 323 }
323 324
324 const char* GetAlternateProtocolFromParam() { 325 const char* GetAlternateProtocolFromParam() {
325 return AlternateProtocolToString( 326 return AlternateProtocolToString(
326 AlternateProtocolFromNextProto(GetProtocol())); 327 AlternateProtocolFromNextProto(GetProtocol()));
327 } 328 }
328 329
329 std::string GetAlternativeServiceHttpHeader() { 330 std::string GetAlternativeServiceHttpHeader() {
330 return std::string("Alt-Svc: ") + GetAlternateProtocolFromParam() + 331 return std::string("Alt-Svc: ") + GetAlternateProtocolFromParam() +
331 "=\"www.example.org:443\"\r\n"; 332 "=\"mail.example.org:443\"\r\n";
332 } 333 }
333 334
334 // Either |write_failure| specifies a write failure or |read_failure| 335 // Either |write_failure| specifies a write failure or |read_failure|
335 // specifies a read failure when using a reused socket. In either case, the 336 // specifies a read failure when using a reused socket. In either case, the
336 // failure should cause the network transaction to resend the request, and the 337 // failure should cause the network transaction to resend the request, and the
337 // other argument should be NULL. 338 // other argument should be NULL.
338 void KeepAliveConnectionResendRequestTest(const MockWrite* write_failure, 339 void KeepAliveConnectionResendRequestTest(const MockWrite* write_failure,
339 const MockRead* read_failure); 340 const MockRead* read_failure);
340 341
341 // Either |write_failure| specifies a write failure or |read_failure| 342 // Either |write_failure| specifies a write failure or |read_failure|
(...skipping 4162 matching lines...) Expand 10 before | Expand all | Expand 10 after
4504 request.load_flags = 0; 4505 request.load_flags = 0;
4505 4506
4506 // Configure against https proxy server "proxy:70". 4507 // Configure against https proxy server "proxy:70".
4507 session_deps_.proxy_service = ProxyService::CreateFixed("https://proxy:70"); 4508 session_deps_.proxy_service = ProxyService::CreateFixed("https://proxy:70");
4508 BoundTestNetLog log; 4509 BoundTestNetLog log;
4509 session_deps_.net_log = log.bound().net_log(); 4510 session_deps_.net_log = log.bound().net_log();
4510 std::unique_ptr<HttpNetworkSession> session(CreateSession(&session_deps_)); 4511 std::unique_ptr<HttpNetworkSession> session(CreateSession(&session_deps_));
4511 4512
4512 // fetch http://www.example.org/ via SPDY 4513 // fetch http://www.example.org/ via SPDY
4513 std::unique_ptr<SpdySerializedFrame> req( 4514 std::unique_ptr<SpdySerializedFrame> req(
4514 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, false)); 4515 spdy_util_.ConstructSpdyGet("http://www.example.org/", 1, LOWEST));
4515 MockWrite spdy_writes[] = {CreateMockWrite(*req, 0)}; 4516 MockWrite spdy_writes[] = {CreateMockWrite(*req, 0)};
4516 4517
4517 std::unique_ptr<SpdySerializedFrame> resp( 4518 std::unique_ptr<SpdySerializedFrame> resp(
4518 spdy_util_.ConstructSpdyGetSynReply(nullptr, 0, 1)); 4519 spdy_util_.ConstructSpdyGetSynReply(nullptr, 0, 1));
4519 std::unique_ptr<SpdySerializedFrame> data( 4520 std::unique_ptr<SpdySerializedFrame> data(
4520 spdy_util_.ConstructSpdyBodyFrame(1, true)); 4521 spdy_util_.ConstructSpdyBodyFrame(1, true));
4521 MockRead spdy_reads[] = { 4522 MockRead spdy_reads[] = {
4522 CreateMockRead(*resp, 1), CreateMockRead(*data, 2), MockRead(ASYNC, 0, 3), 4523 CreateMockRead(*resp, 1), CreateMockRead(*data, 2), MockRead(ASYNC, 0, 3),
4523 }; 4524 };
4524 4525
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
4566 request.load_flags = 0; 4567 request.load_flags = 0;
4567 4568
4568 // Configure SPDY proxy server "proxy:70". 4569 // Configure SPDY proxy server "proxy:70".
4569 session_deps_.proxy_service = ProxyService::CreateFixed("https://proxy:70"); 4570 session_deps_.proxy_service = ProxyService::CreateFixed("https://proxy:70");
4570 BoundTestNetLog log; 4571 BoundTestNetLog log;
4571 session_deps_.net_log = log.bound().net_log(); 4572 session_deps_.net_log = log.bound().net_log();
4572 std::unique_ptr<HttpNetworkSession> session(CreateSession(&session_deps_)); 4573 std::unique_ptr<HttpNetworkSession> session(CreateSession(&session_deps_));
4573 4574
4574 // Fetch http://www.example.org/ through the SPDY proxy. 4575 // Fetch http://www.example.org/ through the SPDY proxy.
4575 std::unique_ptr<SpdySerializedFrame> req( 4576 std::unique_ptr<SpdySerializedFrame> req(
4576 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, false)); 4577 spdy_util_.ConstructSpdyGet("http://www.example.org/", 1, LOWEST));
4577 MockWrite spdy_writes[] = {CreateMockWrite(*req, 0)}; 4578 MockWrite spdy_writes[] = {CreateMockWrite(*req, 0)};
4578 4579
4579 std::unique_ptr<SpdySerializedFrame> resp( 4580 std::unique_ptr<SpdySerializedFrame> resp(
4580 spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); 4581 spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1));
4581 std::unique_ptr<SpdySerializedFrame> data( 4582 std::unique_ptr<SpdySerializedFrame> data(
4582 spdy_util_.ConstructSpdyBodyFrame(1, true)); 4583 spdy_util_.ConstructSpdyBodyFrame(1, true));
4583 MockRead spdy_reads[] = { 4584 MockRead spdy_reads[] = {
4584 CreateMockRead(*resp, 1), CreateMockRead(*data, 2), MockRead(ASYNC, 0, 3), 4585 CreateMockRead(*resp, 1), CreateMockRead(*data, 2), MockRead(ASYNC, 0, 3),
4585 }; 4586 };
4586 4587
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
4637 request.load_flags = 0; 4638 request.load_flags = 0;
4638 4639
4639 // Configure against https proxy server "myproxy:70". 4640 // Configure against https proxy server "myproxy:70".
4640 session_deps_.proxy_service = ProxyService::CreateFixed("https://myproxy:70"); 4641 session_deps_.proxy_service = ProxyService::CreateFixed("https://myproxy:70");
4641 BoundTestNetLog log; 4642 BoundTestNetLog log;
4642 session_deps_.net_log = log.bound().net_log(); 4643 session_deps_.net_log = log.bound().net_log();
4643 std::unique_ptr<HttpNetworkSession> session(CreateSession(&session_deps_)); 4644 std::unique_ptr<HttpNetworkSession> session(CreateSession(&session_deps_));
4644 4645
4645 // The first request will be a bare GET, the second request will be a 4646 // The first request will be a bare GET, the second request will be a
4646 // GET with a Proxy-Authorization header. 4647 // GET with a Proxy-Authorization header.
4648 spdy_util_.set_default_url(request.url);
4647 std::unique_ptr<SpdySerializedFrame> req_get( 4649 std::unique_ptr<SpdySerializedFrame> req_get(
4648 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, false)); 4650 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, false));
4649 spdy_util_.UpdateWithStreamDestruction(1); 4651 spdy_util_.UpdateWithStreamDestruction(1);
4650 const char* const kExtraAuthorizationHeaders[] = { 4652 const char* const kExtraAuthorizationHeaders[] = {
4651 "proxy-authorization", "Basic Zm9vOmJhcg==" 4653 "proxy-authorization", "Basic Zm9vOmJhcg=="
4652 }; 4654 };
4653 std::unique_ptr<SpdySerializedFrame> req_get_authorization( 4655 std::unique_ptr<SpdySerializedFrame> req_get_authorization(
4654 spdy_util_.ConstructSpdyGet(kExtraAuthorizationHeaders, 4656 spdy_util_.ConstructSpdyGet(kExtraAuthorizationHeaders,
4655 arraysize(kExtraAuthorizationHeaders) / 2, 3, 4657 arraysize(kExtraAuthorizationHeaders) / 2, 3,
4656 LOWEST, false)); 4658 LOWEST, false));
(...skipping 3349 matching lines...) Expand 10 before | Expand all | Expand 10 after
8006 session_deps_.proxy_service = 8008 session_deps_.proxy_service =
8007 ProxyService::CreateFixedFromPacResult("HTTPS myproxy:443"); 8009 ProxyService::CreateFixedFromPacResult("HTTPS myproxy:443");
8008 BoundTestNetLog log; 8010 BoundTestNetLog log;
8009 session_deps_.net_log = log.bound().net_log(); 8011 session_deps_.net_log = log.bound().net_log();
8010 8012
8011 session_deps_.proxy_delegate.reset(proxy_delegate.release()); 8013 session_deps_.proxy_delegate.reset(proxy_delegate.release());
8012 8014
8013 std::unique_ptr<HttpNetworkSession> session(CreateSession(&session_deps_)); 8015 std::unique_ptr<HttpNetworkSession> session(CreateSession(&session_deps_));
8014 8016
8015 std::unique_ptr<SpdySerializedFrame> stream1_syn( 8017 std::unique_ptr<SpdySerializedFrame> stream1_syn(
8016 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, false)); 8018 spdy_util_.ConstructSpdyGet("http://www.example.org/", 1, LOWEST));
8017 8019
8018 MockWrite spdy_writes[] = { 8020 MockWrite spdy_writes[] = {
8019 CreateMockWrite(*stream1_syn, 0, ASYNC), 8021 CreateMockWrite(*stream1_syn, 0, ASYNC),
8020 }; 8022 };
8021 8023
8022 std::unique_ptr<SpdySerializedFrame> stream1_reply( 8024 std::unique_ptr<SpdySerializedFrame> stream1_reply(
8023 spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); 8025 spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1));
8024 8026
8025 std::unique_ptr<SpdySerializedFrame> stream1_body( 8027 std::unique_ptr<SpdySerializedFrame> stream1_body(
8026 spdy_util_.ConstructSpdyBodyFrame(1, true)); 8028 spdy_util_.ConstructSpdyBodyFrame(1, true));
(...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after
8119 ProxyService::CreateFixed("https://myproxy:443"); 8121 ProxyService::CreateFixed("https://myproxy:443");
8120 BoundTestNetLog log; 8122 BoundTestNetLog log;
8121 session_deps_.net_log = log.bound().net_log(); 8123 session_deps_.net_log = log.bound().net_log();
8122 8124
8123 // Enable cross-origin push. 8125 // Enable cross-origin push.
8124 session_deps_.proxy_delegate.reset(proxy_delegate.release()); 8126 session_deps_.proxy_delegate.reset(proxy_delegate.release());
8125 8127
8126 std::unique_ptr<HttpNetworkSession> session(CreateSession(&session_deps_)); 8128 std::unique_ptr<HttpNetworkSession> session(CreateSession(&session_deps_));
8127 8129
8128 std::unique_ptr<SpdySerializedFrame> stream1_syn( 8130 std::unique_ptr<SpdySerializedFrame> stream1_syn(
8129 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, false)); 8131 spdy_util_.ConstructSpdyGet("http://www.example.org/", 1, LOWEST));
8130 8132
8131 std::unique_ptr<SpdySerializedFrame> push_rst( 8133 std::unique_ptr<SpdySerializedFrame> push_rst(
8132 spdy_util_.ConstructSpdyRstStream(2, RST_STREAM_REFUSED_STREAM)); 8134 spdy_util_.ConstructSpdyRstStream(2, RST_STREAM_REFUSED_STREAM));
8133 8135
8134 MockWrite spdy_writes[] = { 8136 MockWrite spdy_writes[] = {
8135 CreateMockWrite(*stream1_syn, 0, ASYNC), CreateMockWrite(*push_rst, 3), 8137 CreateMockWrite(*stream1_syn, 0, ASYNC), CreateMockWrite(*push_rst, 3),
8136 }; 8138 };
8137 8139
8138 std::unique_ptr<SpdySerializedFrame> stream1_reply( 8140 std::unique_ptr<SpdySerializedFrame> stream1_reply(
8139 spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); 8141 spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1));
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after
8201 session_deps_.proxy_service = ProxyService::CreateFixed("https://myproxy:70"); 8203 session_deps_.proxy_service = ProxyService::CreateFixed("https://myproxy:70");
8202 BoundTestNetLog log; 8204 BoundTestNetLog log;
8203 session_deps_.net_log = log.bound().net_log(); 8205 session_deps_.net_log = log.bound().net_log();
8204 8206
8205 // Enable cross-origin push. 8207 // Enable cross-origin push.
8206 session_deps_.proxy_delegate.reset(proxy_delegate.release()); 8208 session_deps_.proxy_delegate.reset(proxy_delegate.release());
8207 8209
8208 std::unique_ptr<HttpNetworkSession> session(CreateSession(&session_deps_)); 8210 std::unique_ptr<HttpNetworkSession> session(CreateSession(&session_deps_));
8209 8211
8210 std::unique_ptr<SpdySerializedFrame> stream1_syn( 8212 std::unique_ptr<SpdySerializedFrame> stream1_syn(
8211 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, false)); 8213 spdy_util_.ConstructSpdyGet("http://www.example.org/", 1, LOWEST));
8212 8214
8213 MockWrite spdy_writes[] = { 8215 MockWrite spdy_writes[] = {
8214 CreateMockWrite(*stream1_syn, 0, ASYNC), 8216 CreateMockWrite(*stream1_syn, 0, ASYNC),
8215 }; 8217 };
8216 8218
8217 std::unique_ptr<SpdySerializedFrame> stream1_reply( 8219 std::unique_ptr<SpdySerializedFrame> stream1_reply(
8218 spdy_util_.ConstructSpdyGetSynReply(nullptr, 0, 1)); 8220 spdy_util_.ConstructSpdyGetSynReply(nullptr, 0, 1));
8219 8221
8220 std::unique_ptr<SpdySerializedFrame> stream2_syn(spdy_util_.ConstructSpdyPush( 8222 std::unique_ptr<SpdySerializedFrame> stream2_syn(spdy_util_.ConstructSpdyPush(
8221 nullptr, 0, 2, 1, "https://myproxy:70/foo.dat")); 8223 nullptr, 0, 2, 1, "https://myproxy:70/foo.dat"));
(...skipping 1724 matching lines...) Expand 10 before | Expand all | Expand 10 after
9946 MockRead data_reads[] = { 9948 MockRead data_reads[] = {
9947 MockRead("HTTP/1.1 200 OK\r\n"), 9949 MockRead("HTTP/1.1 200 OK\r\n"),
9948 MockRead(alternative_service_http_header.c_str()), 9950 MockRead(alternative_service_http_header.c_str()),
9949 MockRead("\r\n"), 9951 MockRead("\r\n"),
9950 MockRead("hello world"), 9952 MockRead("hello world"),
9951 MockRead(SYNCHRONOUS, OK), 9953 MockRead(SYNCHRONOUS, OK),
9952 }; 9954 };
9953 9955
9954 HttpRequestInfo request; 9956 HttpRequestInfo request;
9955 request.method = "GET"; 9957 request.method = "GET";
9956 request.url = GURL("http://www.example.org/"); 9958 request.url = GURL("https://www.example.org/");
9957 request.load_flags = 0; 9959 request.load_flags = 0;
9958 9960
9959 StaticSocketDataProvider data(data_reads, arraysize(data_reads), NULL, 0); 9961 StaticSocketDataProvider data(data_reads, arraysize(data_reads), NULL, 0);
9962 session_deps_.socket_factory->AddSocketDataProvider(&data);
9960 9963
9961 session_deps_.socket_factory->AddSocketDataProvider(&data); 9964 SSLSocketDataProvider ssl(ASYNC, OK);
9965 session_deps_.socket_factory->AddSSLSocketDataProvider(&ssl);
9962 9966
9963 TestCompletionCallback callback; 9967 TestCompletionCallback callback;
9964 9968
9965 std::unique_ptr<HttpNetworkSession> session(CreateSession(&session_deps_)); 9969 std::unique_ptr<HttpNetworkSession> session(CreateSession(&session_deps_));
9966 std::unique_ptr<HttpTransaction> trans( 9970 std::unique_ptr<HttpTransaction> trans(
9967 new HttpNetworkTransaction(DEFAULT_PRIORITY, session.get())); 9971 new HttpNetworkTransaction(DEFAULT_PRIORITY, session.get()));
9968 9972
9969 int rv = trans->Start(&request, callback.callback(), BoundNetLog()); 9973 int rv = trans->Start(&request, callback.callback(), BoundNetLog());
9970 EXPECT_EQ(ERR_IO_PENDING, rv); 9974 EXPECT_EQ(ERR_IO_PENDING, rv);
9971 9975
9972 url::SchemeHostPort test_server("http", "www.example.org", 80); 9976 url::SchemeHostPort test_server(request.url);
9973 HttpServerProperties* http_server_properties = 9977 HttpServerProperties* http_server_properties =
9974 session->http_server_properties(); 9978 session->http_server_properties();
9975 AlternativeServiceVector alternative_service_vector = 9979 AlternativeServiceVector alternative_service_vector =
9976 http_server_properties->GetAlternativeServices(test_server); 9980 http_server_properties->GetAlternativeServices(test_server);
9977 EXPECT_TRUE(alternative_service_vector.empty()); 9981 EXPECT_TRUE(alternative_service_vector.empty());
9978 9982
9979 EXPECT_EQ(OK, callback.WaitForResult()); 9983 EXPECT_EQ(OK, callback.WaitForResult());
9980 9984
9981 const HttpResponseInfo* response = trans->GetResponseInfo(); 9985 const HttpResponseInfo* response = trans->GetResponseInfo();
9982 ASSERT_TRUE(response); 9986 ASSERT_TRUE(response);
9983 ASSERT_TRUE(response->headers); 9987 ASSERT_TRUE(response->headers);
9984 EXPECT_EQ("HTTP/1.1 200 OK", response->headers->GetStatusLine()); 9988 EXPECT_EQ("HTTP/1.1 200 OK", response->headers->GetStatusLine());
9985 EXPECT_FALSE(response->was_fetched_via_spdy); 9989 EXPECT_FALSE(response->was_fetched_via_spdy);
9986 EXPECT_FALSE(response->was_npn_negotiated); 9990 EXPECT_FALSE(response->was_npn_negotiated);
9987 9991
9988 std::string response_data; 9992 std::string response_data;
9989 ASSERT_EQ(OK, ReadTransaction(trans.get(), &response_data)); 9993 ASSERT_EQ(OK, ReadTransaction(trans.get(), &response_data));
9990 EXPECT_EQ("hello world", response_data); 9994 EXPECT_EQ("hello world", response_data);
9991 9995
9992 alternative_service_vector = 9996 alternative_service_vector =
9993 http_server_properties->GetAlternativeServices(test_server); 9997 http_server_properties->GetAlternativeServices(test_server);
9994 ASSERT_EQ(1u, alternative_service_vector.size()); 9998 ASSERT_EQ(1u, alternative_service_vector.size());
9995 EXPECT_EQ(AlternateProtocolFromNextProto(GetProtocol()), 9999 EXPECT_EQ(AlternateProtocolFromNextProto(GetProtocol()),
9996 alternative_service_vector[0].protocol); 10000 alternative_service_vector[0].protocol);
9997 EXPECT_EQ("www.example.org", alternative_service_vector[0].host); 10001 EXPECT_EQ("mail.example.org", alternative_service_vector[0].host);
9998 EXPECT_EQ(443, alternative_service_vector[0].port); 10002 EXPECT_EQ(443, alternative_service_vector[0].port);
9999 } 10003 }
10000 10004
10001 // Regression test for https://crbug.com/615497. 10005 // Regression test for https://crbug.com/615497.
10002 TEST_P(HttpNetworkTransactionTest, 10006 TEST_P(HttpNetworkTransactionTest,
10003 DoNotParseAlternativeServiceHeaderOnInsecureRequest) { 10007 DoNotParseAlternativeServiceHeaderOnInsecureRequest) {
10004 session_deps_.enable_alternative_service_for_insecure_origins = false;
10005
10006 std::string alternative_service_http_header = 10008 std::string alternative_service_http_header =
10007 GetAlternativeServiceHttpHeader(); 10009 GetAlternativeServiceHttpHeader();
10008 10010
10009 MockRead data_reads[] = { 10011 MockRead data_reads[] = {
10010 MockRead("HTTP/1.1 200 OK\r\n"), 10012 MockRead("HTTP/1.1 200 OK\r\n"),
10011 MockRead(alternative_service_http_header.c_str()), 10013 MockRead(alternative_service_http_header.c_str()),
10012 MockRead("\r\n"), 10014 MockRead("\r\n"),
10013 MockRead("hello world"), 10015 MockRead("hello world"),
10014 MockRead(SYNCHRONOUS, OK), 10016 MockRead(SYNCHRONOUS, OK),
10015 }; 10017 };
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
10053 alternative_service_vector = 10055 alternative_service_vector =
10054 http_server_properties->GetAlternativeServices(test_server); 10056 http_server_properties->GetAlternativeServices(test_server);
10055 EXPECT_TRUE(alternative_service_vector.empty()); 10057 EXPECT_TRUE(alternative_service_vector.empty());
10056 } 10058 }
10057 10059
10058 // HTTP/2 Alternative Services should be disabled if alternative service 10060 // HTTP/2 Alternative Services should be disabled if alternative service
10059 // hostname is different from that of origin. 10061 // hostname is different from that of origin.
10060 // TODO(bnc): Remove when https://crbug.com/615413 is fixed. 10062 // TODO(bnc): Remove when https://crbug.com/615413 is fixed.
10061 TEST_P(HttpNetworkTransactionTest, 10063 TEST_P(HttpNetworkTransactionTest,
10062 DisableHTTP2AlternativeServicesWithDifferentHost) { 10064 DisableHTTP2AlternativeServicesWithDifferentHost) {
10065 session_deps_.enable_http2_alternative_service_with_different_host = false;
10066
10063 HttpRequestInfo request; 10067 HttpRequestInfo request;
10064 request.method = "GET"; 10068 request.method = "GET";
10065 request.url = GURL("http://www.example.org/"); 10069 request.url = GURL("https://www.example.org/");
10066 request.load_flags = 0; 10070 request.load_flags = 0;
10067 10071
10068 MockConnect mock_connect(ASYNC, ERR_CONNECTION_REFUSED); 10072 MockConnect mock_connect(ASYNC, ERR_CONNECTION_REFUSED);
10069 StaticSocketDataProvider first_data; 10073 StaticSocketDataProvider first_data;
10070 first_data.set_connect_data(mock_connect); 10074 first_data.set_connect_data(mock_connect);
10071 session_deps_.socket_factory->AddSocketDataProvider(&first_data); 10075 session_deps_.socket_factory->AddSocketDataProvider(&first_data);
10076 SSLSocketDataProvider ssl_http11(ASYNC, OK);
10077 ssl_http11.SetNextProto(kProtoHTTP11);
10078 session_deps_.socket_factory->AddSSLSocketDataProvider(&ssl_http11);
10072 10079
10073 MockRead data_reads[] = { 10080 MockRead data_reads[] = {
10074 MockRead("HTTP/1.1 200 OK\r\n\r\n"), MockRead("hello world"), 10081 MockRead("HTTP/1.1 200 OK\r\n\r\n"), MockRead("hello world"),
10075 MockRead(ASYNC, OK), 10082 MockRead(ASYNC, OK),
10076 }; 10083 };
10077 StaticSocketDataProvider second_data(data_reads, arraysize(data_reads), NULL, 10084 StaticSocketDataProvider second_data(data_reads, arraysize(data_reads), NULL,
10078 0); 10085 0);
10079 session_deps_.socket_factory->AddSocketDataProvider(&second_data); 10086 session_deps_.socket_factory->AddSocketDataProvider(&second_data);
10080 10087
10081 std::unique_ptr<HttpNetworkSession> session(CreateSession(&session_deps_)); 10088 std::unique_ptr<HttpNetworkSession> session(CreateSession(&session_deps_));
(...skipping 13 matching lines...) Expand all
10095 10102
10096 int rv = trans->Start(&request, callback.callback(), BoundNetLog()); 10103 int rv = trans->Start(&request, callback.callback(), BoundNetLog());
10097 // Alternative service is not used, request fails. 10104 // Alternative service is not used, request fails.
10098 EXPECT_EQ(ERR_CONNECTION_REFUSED, callback.GetResult(rv)); 10105 EXPECT_EQ(ERR_CONNECTION_REFUSED, callback.GetResult(rv));
10099 } 10106 }
10100 10107
10101 // Regression test for https://crbug.com/615497: 10108 // Regression test for https://crbug.com/615497:
10102 // Alternative Services should be disabled for http origin. 10109 // Alternative Services should be disabled for http origin.
10103 TEST_P(HttpNetworkTransactionTest, 10110 TEST_P(HttpNetworkTransactionTest,
10104 DisableAlternativeServicesForInsecureOrigin) { 10111 DisableAlternativeServicesForInsecureOrigin) {
10105 session_deps_.enable_alternative_service_for_insecure_origins = false;
10106
10107 HttpRequestInfo request; 10112 HttpRequestInfo request;
10108 request.method = "GET"; 10113 request.method = "GET";
10109 request.url = GURL("http://www.example.org/"); 10114 request.url = GURL("http://www.example.org/");
10110 request.load_flags = 0; 10115 request.load_flags = 0;
10111 10116
10112 MockConnect mock_connect(ASYNC, ERR_CONNECTION_REFUSED); 10117 MockConnect mock_connect(ASYNC, ERR_CONNECTION_REFUSED);
10113 StaticSocketDataProvider first_data; 10118 StaticSocketDataProvider first_data;
10114 first_data.set_connect_data(mock_connect); 10119 first_data.set_connect_data(mock_connect);
10115 session_deps_.socket_factory->AddSocketDataProvider(&first_data); 10120 session_deps_.socket_factory->AddSocketDataProvider(&first_data);
10116 10121
(...skipping 22 matching lines...) Expand all
10139 int rv = trans->Start(&request, callback.callback(), BoundNetLog()); 10144 int rv = trans->Start(&request, callback.callback(), BoundNetLog());
10140 // Alternative service is not used, request fails. 10145 // Alternative service is not used, request fails.
10141 EXPECT_EQ(ERR_CONNECTION_REFUSED, callback.GetResult(rv)); 10146 EXPECT_EQ(ERR_CONNECTION_REFUSED, callback.GetResult(rv));
10142 } 10147 }
10143 10148
10144 TEST_P(HttpNetworkTransactionTest, ClearAlternativeServices) { 10149 TEST_P(HttpNetworkTransactionTest, ClearAlternativeServices) {
10145 // Set an alternative service for origin. 10150 // Set an alternative service for origin.
10146 std::unique_ptr<HttpNetworkSession> session(CreateSession(&session_deps_)); 10151 std::unique_ptr<HttpNetworkSession> session(CreateSession(&session_deps_));
10147 HttpServerProperties* http_server_properties = 10152 HttpServerProperties* http_server_properties =
10148 session->http_server_properties(); 10153 session->http_server_properties();
10149 url::SchemeHostPort test_server("http", "www.example.org", 80); 10154 url::SchemeHostPort test_server("https", "www.example.org", 443);
10150 AlternativeService alternative_service(QUIC, "", 80); 10155 AlternativeService alternative_service(QUIC, "", 80);
10151 base::Time expiration = base::Time::Now() + base::TimeDelta::FromDays(1); 10156 base::Time expiration = base::Time::Now() + base::TimeDelta::FromDays(1);
10152 http_server_properties->SetAlternativeService( 10157 http_server_properties->SetAlternativeService(
10153 test_server, alternative_service, expiration); 10158 test_server, alternative_service, expiration);
10154 AlternativeServiceVector alternative_service_vector = 10159 AlternativeServiceVector alternative_service_vector =
10155 http_server_properties->GetAlternativeServices(test_server); 10160 http_server_properties->GetAlternativeServices(test_server);
10156 EXPECT_EQ(1u, alternative_service_vector.size()); 10161 EXPECT_EQ(1u, alternative_service_vector.size());
10157 10162
10158 // Send a clear header. 10163 // Send a clear header.
10159 MockRead data_reads[] = { 10164 MockRead data_reads[] = {
10160 MockRead("HTTP/1.1 200 OK\r\n"), 10165 MockRead("HTTP/1.1 200 OK\r\n"),
10161 MockRead("Alt-Svc: clear\r\n"), 10166 MockRead("Alt-Svc: clear\r\n"),
10162 MockRead("\r\n"), 10167 MockRead("\r\n"),
10163 MockRead("hello world"), 10168 MockRead("hello world"),
10164 MockRead(SYNCHRONOUS, OK), 10169 MockRead(SYNCHRONOUS, OK),
10165 }; 10170 };
10166 StaticSocketDataProvider data(data_reads, arraysize(data_reads), nullptr, 0); 10171 StaticSocketDataProvider data(data_reads, arraysize(data_reads), nullptr, 0);
10167 session_deps_.socket_factory->AddSocketDataProvider(&data); 10172 session_deps_.socket_factory->AddSocketDataProvider(&data);
10168 10173
10174 SSLSocketDataProvider ssl(ASYNC, OK);
10175 session_deps_.socket_factory->AddSSLSocketDataProvider(&ssl);
10176
10169 HttpRequestInfo request; 10177 HttpRequestInfo request;
10170 request.method = "GET"; 10178 request.method = "GET";
10171 request.url = GURL("http://www.example.org/"); 10179 request.url = GURL("https://www.example.org/");
10172 request.load_flags = 0; 10180 request.load_flags = 0;
10173 10181
10174 TestCompletionCallback callback; 10182 TestCompletionCallback callback;
10175 10183
10176 std::unique_ptr<HttpTransaction> trans( 10184 std::unique_ptr<HttpTransaction> trans(
10177 new HttpNetworkTransaction(DEFAULT_PRIORITY, session.get())); 10185 new HttpNetworkTransaction(DEFAULT_PRIORITY, session.get()));
10178 10186
10179 int rv = trans->Start(&request, callback.callback(), BoundNetLog()); 10187 int rv = trans->Start(&request, callback.callback(), BoundNetLog());
10180 EXPECT_EQ(OK, callback.GetResult(rv)); 10188 EXPECT_EQ(OK, callback.GetResult(rv));
10181 10189
10182 const HttpResponseInfo* response = trans->GetResponseInfo(); 10190 const HttpResponseInfo* response = trans->GetResponseInfo();
10183 ASSERT_TRUE(response); 10191 ASSERT_TRUE(response);
10184 ASSERT_TRUE(response->headers); 10192 ASSERT_TRUE(response->headers);
10185 EXPECT_EQ("HTTP/1.1 200 OK", response->headers->GetStatusLine()); 10193 EXPECT_EQ("HTTP/1.1 200 OK", response->headers->GetStatusLine());
10186 EXPECT_FALSE(response->was_fetched_via_spdy); 10194 EXPECT_FALSE(response->was_fetched_via_spdy);
10187 EXPECT_FALSE(response->was_npn_negotiated); 10195 EXPECT_FALSE(response->was_npn_negotiated);
10188 10196
10189 std::string response_data; 10197 std::string response_data;
10190 ASSERT_EQ(OK, ReadTransaction(trans.get(), &response_data)); 10198 ASSERT_EQ(OK, ReadTransaction(trans.get(), &response_data));
10191 EXPECT_EQ("hello world", response_data); 10199 EXPECT_EQ("hello world", response_data);
10192 10200
10193 alternative_service_vector = 10201 alternative_service_vector =
10194 http_server_properties->GetAlternativeServices(test_server); 10202 http_server_properties->GetAlternativeServices(test_server);
10195 EXPECT_TRUE(alternative_service_vector.empty()); 10203 EXPECT_TRUE(alternative_service_vector.empty());
10196 } 10204 }
10197 10205
10198 TEST_P(HttpNetworkTransactionTest, HonorMultipleAlternativeServiceHeader) { 10206 TEST_P(HttpNetworkTransactionTest, HonorMultipleAlternativeServiceHeaders) {
10199 MockRead data_reads[] = { 10207 MockRead data_reads[] = {
10200 MockRead("HTTP/1.1 200 OK\r\n"), 10208 MockRead("HTTP/1.1 200 OK\r\n"),
10201 MockRead("Alt-Svc: "), 10209 MockRead("Alt-Svc: "),
10202 MockRead(GetAlternateProtocolFromParam()), 10210 MockRead(GetAlternateProtocolFromParam()),
10203 MockRead("=\"www.example.com:443\";p=\"1.0\","), 10211 MockRead("=\"www.example.com:443\","),
10204 MockRead(GetAlternateProtocolFromParam()), 10212 MockRead(GetAlternateProtocolFromParam()),
10205 MockRead("=\":1234\"\r\n\r\n"), 10213 MockRead("=\":1234\"\r\n\r\n"),
10206 MockRead("hello world"), 10214 MockRead("hello world"),
10207 MockRead(SYNCHRONOUS, OK), 10215 MockRead(SYNCHRONOUS, OK),
10208 }; 10216 };
10209 10217
10210 HttpRequestInfo request; 10218 HttpRequestInfo request;
10211 request.method = "GET"; 10219 request.method = "GET";
10212 request.url = GURL("http://www.example.org/"); 10220 request.url = GURL("https://www.example.org/");
10213 request.load_flags = 0; 10221 request.load_flags = 0;
10214 10222
10215 StaticSocketDataProvider data(data_reads, arraysize(data_reads), NULL, 0); 10223 StaticSocketDataProvider data(data_reads, arraysize(data_reads), NULL, 0);
10224 session_deps_.socket_factory->AddSocketDataProvider(&data);
10216 10225
10217 session_deps_.socket_factory->AddSocketDataProvider(&data); 10226 SSLSocketDataProvider ssl(ASYNC, OK);
10227 session_deps_.socket_factory->AddSSLSocketDataProvider(&ssl);
10218 10228
10219 TestCompletionCallback callback; 10229 TestCompletionCallback callback;
10220 10230
10221 std::unique_ptr<HttpNetworkSession> session(CreateSession(&session_deps_)); 10231 std::unique_ptr<HttpNetworkSession> session(CreateSession(&session_deps_));
10222 std::unique_ptr<HttpTransaction> trans( 10232 std::unique_ptr<HttpTransaction> trans(
10223 new HttpNetworkTransaction(DEFAULT_PRIORITY, session.get())); 10233 new HttpNetworkTransaction(DEFAULT_PRIORITY, session.get()));
10224 10234
10225 int rv = trans->Start(&request, callback.callback(), BoundNetLog()); 10235 int rv = trans->Start(&request, callback.callback(), BoundNetLog());
10226 EXPECT_EQ(ERR_IO_PENDING, rv); 10236 EXPECT_EQ(ERR_IO_PENDING, rv);
10227 10237
10228 url::SchemeHostPort test_server("http", "www.example.org", 80); 10238 url::SchemeHostPort test_server("https", "www.example.org", 443);
10229 HttpServerProperties* http_server_properties = 10239 HttpServerProperties* http_server_properties =
10230 session->http_server_properties(); 10240 session->http_server_properties();
10231 AlternativeServiceVector alternative_service_vector = 10241 AlternativeServiceVector alternative_service_vector =
10232 http_server_properties->GetAlternativeServices(test_server); 10242 http_server_properties->GetAlternativeServices(test_server);
10233 EXPECT_TRUE(alternative_service_vector.empty()); 10243 EXPECT_TRUE(alternative_service_vector.empty());
10234 10244
10235 EXPECT_EQ(OK, callback.WaitForResult()); 10245 EXPECT_EQ(OK, callback.WaitForResult());
10236 10246
10237 const HttpResponseInfo* response = trans->GetResponseInfo(); 10247 const HttpResponseInfo* response = trans->GetResponseInfo();
10238 ASSERT_TRUE(response); 10248 ASSERT_TRUE(response);
(...skipping 12 matching lines...) Expand all
10251 EXPECT_EQ(AlternateProtocolFromNextProto(GetProtocol()), 10261 EXPECT_EQ(AlternateProtocolFromNextProto(GetProtocol()),
10252 alternative_service_vector[0].protocol); 10262 alternative_service_vector[0].protocol);
10253 EXPECT_EQ("www.example.com", alternative_service_vector[0].host); 10263 EXPECT_EQ("www.example.com", alternative_service_vector[0].host);
10254 EXPECT_EQ(443, alternative_service_vector[0].port); 10264 EXPECT_EQ(443, alternative_service_vector[0].port);
10255 EXPECT_EQ(AlternateProtocolFromNextProto(GetProtocol()), 10265 EXPECT_EQ(AlternateProtocolFromNextProto(GetProtocol()),
10256 alternative_service_vector[1].protocol); 10266 alternative_service_vector[1].protocol);
10257 EXPECT_EQ("www.example.org", alternative_service_vector[1].host); 10267 EXPECT_EQ("www.example.org", alternative_service_vector[1].host);
10258 EXPECT_EQ(1234, alternative_service_vector[1].port); 10268 EXPECT_EQ(1234, alternative_service_vector[1].port);
10259 } 10269 }
10260 10270
10261 // When |enable_http2_alternative_service_with_different_host| is false, do not
10262 // observe alternative service entries that point to a different host.
10263 TEST_P(HttpNetworkTransactionTest, DisableAlternativeServiceToDifferentHost) {
10264 session_deps_.enable_http2_alternative_service_with_different_host = false;
10265
10266 HttpRequestInfo request;
10267 request.method = "GET";
10268 request.url = GURL("http://www.example.org/");
10269 request.load_flags = 0;
10270
10271 MockConnect mock_connect(ASYNC, ERR_CONNECTION_REFUSED);
10272 StaticSocketDataProvider first_data;
10273 first_data.set_connect_data(mock_connect);
10274 session_deps_.socket_factory->AddSocketDataProvider(&first_data);
10275
10276 MockRead data_reads[] = {
10277 MockRead("HTTP/1.1 200 OK\r\n\r\n"), MockRead("hello world"),
10278 MockRead(ASYNC, OK),
10279 };
10280 StaticSocketDataProvider second_data(data_reads, arraysize(data_reads),
10281 nullptr, 0);
10282 session_deps_.socket_factory->AddSocketDataProvider(&second_data);
10283
10284 std::unique_ptr<HttpNetworkSession> session = CreateSession(&session_deps_);
10285
10286 HttpServerProperties* http_server_properties =
10287 session->http_server_properties();
10288 AlternativeService alternative_service(
10289 AlternateProtocolFromNextProto(GetProtocol()), "different.example.org",
10290 80);
10291 base::Time expiration = base::Time::Now() + base::TimeDelta::FromDays(1);
10292 http_server_properties->SetAlternativeService(
10293 url::SchemeHostPort(request.url), alternative_service, expiration);
10294
10295 std::unique_ptr<HttpTransaction> trans(
10296 new HttpNetworkTransaction(DEFAULT_PRIORITY, session.get()));
10297 TestCompletionCallback callback;
10298
10299 int rv = trans->Start(&request, callback.callback(), BoundNetLog());
10300 // The connetion to origin was refused, and the alternative service should not
10301 // be used (even though mock data are there), therefore the request should
10302 // fail.
10303 EXPECT_EQ(ERR_CONNECTION_REFUSED, callback.GetResult(rv));
10304 }
10305
10306 TEST_P(HttpNetworkTransactionTest, IdentifyQuicBroken) { 10271 TEST_P(HttpNetworkTransactionTest, IdentifyQuicBroken) {
10307 url::SchemeHostPort server("https", "origin.example.org", 443); 10272 url::SchemeHostPort server("https", "origin.example.org", 443);
10308 HostPortPair alternative("alternative.example.org", 443); 10273 HostPortPair alternative("alternative.example.org", 443);
10309 std::string origin_url = "https://origin.example.org:443"; 10274 std::string origin_url = "https://origin.example.org:443";
10310 std::string alternative_url = "https://alternative.example.org:443"; 10275 std::string alternative_url = "https://alternative.example.org:443";
10311 10276
10312 // Negotiate HTTP/1.1 with alternative.example.org. 10277 // Negotiate HTTP/1.1 with alternative.example.org.
10313 SSLSocketDataProvider ssl(ASYNC, OK); 10278 SSLSocketDataProvider ssl(ASYNC, OK);
10314 ssl.SetNextProto(kProtoHTTP11); 10279 ssl.SetNextProto(kProtoHTTP11);
10315 session_deps_.socket_factory->AddSSLSocketDataProvider(&ssl); 10280 session_deps_.socket_factory->AddSSLSocketDataProvider(&ssl);
(...skipping 117 matching lines...) Expand 10 before | Expand all | Expand 10 after
10433 10398
10434 trans->Start(&request, callback.callback(), BoundNetLog()); 10399 trans->Start(&request, callback.callback(), BoundNetLog());
10435 trans->PopulateNetErrorDetails(&details); 10400 trans->PopulateNetErrorDetails(&details);
10436 EXPECT_FALSE(details.quic_broken); 10401 EXPECT_FALSE(details.quic_broken);
10437 } 10402 }
10438 10403
10439 TEST_P(HttpNetworkTransactionTest, 10404 TEST_P(HttpNetworkTransactionTest,
10440 MarkBrokenAlternateProtocolAndFallback) { 10405 MarkBrokenAlternateProtocolAndFallback) {
10441 HttpRequestInfo request; 10406 HttpRequestInfo request;
10442 request.method = "GET"; 10407 request.method = "GET";
10443 request.url = GURL("http://www.example.org/"); 10408 request.url = GURL("https://www.example.org/");
10444 request.load_flags = 0; 10409 request.load_flags = 0;
10445 10410
10446 MockConnect mock_connect(ASYNC, ERR_CONNECTION_REFUSED); 10411 MockConnect mock_connect(ASYNC, ERR_CONNECTION_REFUSED);
10447 StaticSocketDataProvider first_data; 10412 StaticSocketDataProvider first_data;
10448 first_data.set_connect_data(mock_connect); 10413 first_data.set_connect_data(mock_connect);
10449 session_deps_.socket_factory->AddSocketDataProvider(&first_data); 10414 session_deps_.socket_factory->AddSocketDataProvider(&first_data);
10415 SSLSocketDataProvider ssl_http11(ASYNC, OK);
10416 ssl_http11.SetNextProto(kProtoHTTP11);
10417 session_deps_.socket_factory->AddSSLSocketDataProvider(&ssl_http11);
10450 10418
10451 MockRead data_reads[] = { 10419 MockRead data_reads[] = {
10452 MockRead("HTTP/1.1 200 OK\r\n\r\n"), 10420 MockRead("HTTP/1.1 200 OK\r\n\r\n"),
10453 MockRead("hello world"), 10421 MockRead("hello world"),
10454 MockRead(ASYNC, OK), 10422 MockRead(ASYNC, OK),
10455 }; 10423 };
10456 StaticSocketDataProvider second_data( 10424 StaticSocketDataProvider second_data(
10457 data_reads, arraysize(data_reads), NULL, 0); 10425 data_reads, arraysize(data_reads), NULL, 0);
10458 session_deps_.socket_factory->AddSocketDataProvider(&second_data); 10426 session_deps_.socket_factory->AddSocketDataProvider(&second_data);
10459 10427
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
10497 } 10465 }
10498 10466
10499 // Ensure that we are not allowed to redirect traffic via an alternate protocol 10467 // Ensure that we are not allowed to redirect traffic via an alternate protocol
10500 // to an unrestricted (port >= 1024) when the original traffic was on a 10468 // to an unrestricted (port >= 1024) when the original traffic was on a
10501 // restricted port (port < 1024). Ensure that we can redirect in all other 10469 // restricted port (port < 1024). Ensure that we can redirect in all other
10502 // cases. 10470 // cases.
10503 TEST_P(HttpNetworkTransactionTest, 10471 TEST_P(HttpNetworkTransactionTest,
10504 AlternateProtocolPortRestrictedBlocked) { 10472 AlternateProtocolPortRestrictedBlocked) {
10505 HttpRequestInfo restricted_port_request; 10473 HttpRequestInfo restricted_port_request;
10506 restricted_port_request.method = "GET"; 10474 restricted_port_request.method = "GET";
10507 restricted_port_request.url = GURL("http://www.example.org:1023/"); 10475 restricted_port_request.url = GURL("https://www.example.org:1023/");
10508 restricted_port_request.load_flags = 0; 10476 restricted_port_request.load_flags = 0;
10509 10477
10510 MockConnect mock_connect(ASYNC, ERR_CONNECTION_REFUSED); 10478 MockConnect mock_connect(ASYNC, ERR_CONNECTION_REFUSED);
10511 StaticSocketDataProvider first_data; 10479 StaticSocketDataProvider first_data;
10512 first_data.set_connect_data(mock_connect); 10480 first_data.set_connect_data(mock_connect);
10513 session_deps_.socket_factory->AddSocketDataProvider(&first_data); 10481 session_deps_.socket_factory->AddSocketDataProvider(&first_data);
10514 10482
10515 MockRead data_reads[] = { 10483 MockRead data_reads[] = {
10516 MockRead("HTTP/1.1 200 OK\r\n\r\n"), 10484 MockRead("HTTP/1.1 200 OK\r\n\r\n"),
10517 MockRead("hello world"), 10485 MockRead("hello world"),
10518 MockRead(ASYNC, OK), 10486 MockRead(ASYNC, OK),
10519 }; 10487 };
10520 StaticSocketDataProvider second_data( 10488 StaticSocketDataProvider second_data(
10521 data_reads, arraysize(data_reads), NULL, 0); 10489 data_reads, arraysize(data_reads), NULL, 0);
10522 session_deps_.socket_factory->AddSocketDataProvider(&second_data); 10490 session_deps_.socket_factory->AddSocketDataProvider(&second_data);
10491 SSLSocketDataProvider ssl_http11(ASYNC, OK);
10492 ssl_http11.SetNextProto(kProtoHTTP11);
10493 session_deps_.socket_factory->AddSSLSocketDataProvider(&ssl_http11);
10523 10494
10524 std::unique_ptr<HttpNetworkSession> session(CreateSession(&session_deps_)); 10495 std::unique_ptr<HttpNetworkSession> session(CreateSession(&session_deps_));
10525 10496
10526 HttpServerProperties* http_server_properties = 10497 HttpServerProperties* http_server_properties =
10527 session->http_server_properties(); 10498 session->http_server_properties();
10528 const int kUnrestrictedAlternatePort = 1024; 10499 const int kUnrestrictedAlternatePort = 1024;
10529 AlternativeService alternative_service( 10500 AlternativeService alternative_service(
10530 AlternateProtocolFromNextProto(GetProtocol()), "www.example.org", 10501 AlternateProtocolFromNextProto(GetProtocol()), "www.example.org",
10531 kUnrestrictedAlternatePort); 10502 kUnrestrictedAlternatePort);
10532 base::Time expiration = base::Time::Now() + base::TimeDelta::FromDays(1); 10503 base::Time expiration = base::Time::Now() + base::TimeDelta::FromDays(1);
(...skipping 15 matching lines...) Expand all
10548 10519
10549 // Ensure that we are allowed to redirect traffic via an alternate protocol to 10520 // Ensure that we are allowed to redirect traffic via an alternate protocol to
10550 // an unrestricted (port >= 1024) when the original traffic was on a restricted 10521 // an unrestricted (port >= 1024) when the original traffic was on a restricted
10551 // port (port < 1024) if we set |enable_user_alternate_protocol_ports|. 10522 // port (port < 1024) if we set |enable_user_alternate_protocol_ports|.
10552 TEST_P(HttpNetworkTransactionTest, 10523 TEST_P(HttpNetworkTransactionTest,
10553 AlternateProtocolPortRestrictedPermitted) { 10524 AlternateProtocolPortRestrictedPermitted) {
10554 session_deps_.enable_user_alternate_protocol_ports = true; 10525 session_deps_.enable_user_alternate_protocol_ports = true;
10555 10526
10556 HttpRequestInfo restricted_port_request; 10527 HttpRequestInfo restricted_port_request;
10557 restricted_port_request.method = "GET"; 10528 restricted_port_request.method = "GET";
10558 restricted_port_request.url = GURL("http://www.example.org:1023/"); 10529 restricted_port_request.url = GURL("https://www.example.org:1023/");
10559 restricted_port_request.load_flags = 0; 10530 restricted_port_request.load_flags = 0;
10560 10531
10561 MockConnect mock_connect(ASYNC, ERR_CONNECTION_REFUSED); 10532 MockConnect mock_connect(ASYNC, ERR_CONNECTION_REFUSED);
10562 StaticSocketDataProvider first_data; 10533 StaticSocketDataProvider first_data;
10563 first_data.set_connect_data(mock_connect); 10534 first_data.set_connect_data(mock_connect);
10564 session_deps_.socket_factory->AddSocketDataProvider(&first_data); 10535 session_deps_.socket_factory->AddSocketDataProvider(&first_data);
10565 10536
10566 MockRead data_reads[] = { 10537 MockRead data_reads[] = {
10567 MockRead("HTTP/1.1 200 OK\r\n\r\n"), 10538 MockRead("HTTP/1.1 200 OK\r\n\r\n"),
10568 MockRead("hello world"), 10539 MockRead("hello world"),
10569 MockRead(ASYNC, OK), 10540 MockRead(ASYNC, OK),
10570 }; 10541 };
10571 StaticSocketDataProvider second_data( 10542 StaticSocketDataProvider second_data(
10572 data_reads, arraysize(data_reads), NULL, 0); 10543 data_reads, arraysize(data_reads), NULL, 0);
10573 session_deps_.socket_factory->AddSocketDataProvider(&second_data); 10544 session_deps_.socket_factory->AddSocketDataProvider(&second_data);
10545 SSLSocketDataProvider ssl_http11(ASYNC, OK);
10546 ssl_http11.SetNextProto(kProtoHTTP11);
10547 session_deps_.socket_factory->AddSSLSocketDataProvider(&ssl_http11);
10574 10548
10575 std::unique_ptr<HttpNetworkSession> session(CreateSession(&session_deps_)); 10549 std::unique_ptr<HttpNetworkSession> session(CreateSession(&session_deps_));
10576 10550
10577 HttpServerProperties* http_server_properties = 10551 HttpServerProperties* http_server_properties =
10578 session->http_server_properties(); 10552 session->http_server_properties();
10579 const int kUnrestrictedAlternatePort = 1024; 10553 const int kUnrestrictedAlternatePort = 1024;
10580 AlternativeService alternative_service( 10554 AlternativeService alternative_service(
10581 AlternateProtocolFromNextProto(GetProtocol()), "www.example.org", 10555 AlternateProtocolFromNextProto(GetProtocol()), "www.example.org",
10582 kUnrestrictedAlternatePort); 10556 kUnrestrictedAlternatePort);
10583 base::Time expiration = base::Time::Now() + base::TimeDelta::FromDays(1); 10557 base::Time expiration = base::Time::Now() + base::TimeDelta::FromDays(1);
(...skipping 13 matching lines...) Expand all
10597 } 10571 }
10598 10572
10599 // Ensure that we are not allowed to redirect traffic via an alternate protocol 10573 // Ensure that we are not allowed to redirect traffic via an alternate protocol
10600 // to an unrestricted (port >= 1024) when the original traffic was on a 10574 // to an unrestricted (port >= 1024) when the original traffic was on a
10601 // restricted port (port < 1024). Ensure that we can redirect in all other 10575 // restricted port (port < 1024). Ensure that we can redirect in all other
10602 // cases. 10576 // cases.
10603 TEST_P(HttpNetworkTransactionTest, 10577 TEST_P(HttpNetworkTransactionTest,
10604 AlternateProtocolPortRestrictedAllowed) { 10578 AlternateProtocolPortRestrictedAllowed) {
10605 HttpRequestInfo restricted_port_request; 10579 HttpRequestInfo restricted_port_request;
10606 restricted_port_request.method = "GET"; 10580 restricted_port_request.method = "GET";
10607 restricted_port_request.url = GURL("http://www.example.org:1023/"); 10581 restricted_port_request.url = GURL("https://www.example.org:1023/");
10608 restricted_port_request.load_flags = 0; 10582 restricted_port_request.load_flags = 0;
10609 10583
10610 MockConnect mock_connect(ASYNC, ERR_CONNECTION_REFUSED); 10584 MockConnect mock_connect(ASYNC, ERR_CONNECTION_REFUSED);
10611 StaticSocketDataProvider first_data; 10585 StaticSocketDataProvider first_data;
10612 first_data.set_connect_data(mock_connect); 10586 first_data.set_connect_data(mock_connect);
10613 session_deps_.socket_factory->AddSocketDataProvider(&first_data); 10587 session_deps_.socket_factory->AddSocketDataProvider(&first_data);
10614 10588
10615 MockRead data_reads[] = { 10589 MockRead data_reads[] = {
10616 MockRead("HTTP/1.1 200 OK\r\n\r\n"), 10590 MockRead("HTTP/1.1 200 OK\r\n\r\n"),
10617 MockRead("hello world"), 10591 MockRead("hello world"),
10618 MockRead(ASYNC, OK), 10592 MockRead(ASYNC, OK),
10619 }; 10593 };
10620 StaticSocketDataProvider second_data( 10594 StaticSocketDataProvider second_data(
10621 data_reads, arraysize(data_reads), NULL, 0); 10595 data_reads, arraysize(data_reads), NULL, 0);
10622 session_deps_.socket_factory->AddSocketDataProvider(&second_data); 10596 session_deps_.socket_factory->AddSocketDataProvider(&second_data);
10623 10597
10598 SSLSocketDataProvider ssl(ASYNC, OK);
10599 session_deps_.socket_factory->AddSSLSocketDataProvider(&ssl);
10600
10624 std::unique_ptr<HttpNetworkSession> session(CreateSession(&session_deps_)); 10601 std::unique_ptr<HttpNetworkSession> session(CreateSession(&session_deps_));
10625 10602
10626 HttpServerProperties* http_server_properties = 10603 HttpServerProperties* http_server_properties =
10627 session->http_server_properties(); 10604 session->http_server_properties();
10628 const int kRestrictedAlternatePort = 80; 10605 const int kRestrictedAlternatePort = 80;
10629 AlternativeService alternative_service( 10606 AlternativeService alternative_service(
10630 AlternateProtocolFromNextProto(GetProtocol()), "www.example.org", 10607 AlternateProtocolFromNextProto(GetProtocol()), "www.example.org",
10631 kRestrictedAlternatePort); 10608 kRestrictedAlternatePort);
10632 base::Time expiration = base::Time::Now() + base::TimeDelta::FromDays(1); 10609 base::Time expiration = base::Time::Now() + base::TimeDelta::FromDays(1);
10633 http_server_properties->SetAlternativeService( 10610 http_server_properties->SetAlternativeService(
(...skipping 13 matching lines...) Expand all
10647 } 10624 }
10648 10625
10649 // Ensure that we are not allowed to redirect traffic via an alternate protocol 10626 // Ensure that we are not allowed to redirect traffic via an alternate protocol
10650 // to an unrestricted (port >= 1024) when the original traffic was on a 10627 // to an unrestricted (port >= 1024) when the original traffic was on a
10651 // restricted port (port < 1024). Ensure that we can redirect in all other 10628 // restricted port (port < 1024). Ensure that we can redirect in all other
10652 // cases. 10629 // cases.
10653 TEST_P(HttpNetworkTransactionTest, 10630 TEST_P(HttpNetworkTransactionTest,
10654 AlternateProtocolPortUnrestrictedAllowed1) { 10631 AlternateProtocolPortUnrestrictedAllowed1) {
10655 HttpRequestInfo unrestricted_port_request; 10632 HttpRequestInfo unrestricted_port_request;
10656 unrestricted_port_request.method = "GET"; 10633 unrestricted_port_request.method = "GET";
10657 unrestricted_port_request.url = GURL("http://www.example.org:1024/"); 10634 unrestricted_port_request.url = GURL("https://www.example.org:1024/");
10658 unrestricted_port_request.load_flags = 0; 10635 unrestricted_port_request.load_flags = 0;
10659 10636
10660 MockConnect mock_connect(ASYNC, ERR_CONNECTION_REFUSED); 10637 MockConnect mock_connect(ASYNC, ERR_CONNECTION_REFUSED);
10661 StaticSocketDataProvider first_data; 10638 StaticSocketDataProvider first_data;
10662 first_data.set_connect_data(mock_connect); 10639 first_data.set_connect_data(mock_connect);
10663 session_deps_.socket_factory->AddSocketDataProvider(&first_data); 10640 session_deps_.socket_factory->AddSocketDataProvider(&first_data);
10664 10641
10665 MockRead data_reads[] = { 10642 MockRead data_reads[] = {
10666 MockRead("HTTP/1.1 200 OK\r\n\r\n"), 10643 MockRead("HTTP/1.1 200 OK\r\n\r\n"),
10667 MockRead("hello world"), 10644 MockRead("hello world"),
10668 MockRead(ASYNC, OK), 10645 MockRead(ASYNC, OK),
10669 }; 10646 };
10670 StaticSocketDataProvider second_data( 10647 StaticSocketDataProvider second_data(
10671 data_reads, arraysize(data_reads), NULL, 0); 10648 data_reads, arraysize(data_reads), NULL, 0);
10672 session_deps_.socket_factory->AddSocketDataProvider(&second_data); 10649 session_deps_.socket_factory->AddSocketDataProvider(&second_data);
10650 SSLSocketDataProvider ssl_http11(ASYNC, OK);
10651 ssl_http11.SetNextProto(kProtoHTTP11);
10652 session_deps_.socket_factory->AddSSLSocketDataProvider(&ssl_http11);
10673 10653
10674 std::unique_ptr<HttpNetworkSession> session(CreateSession(&session_deps_)); 10654 std::unique_ptr<HttpNetworkSession> session(CreateSession(&session_deps_));
10675 10655
10676 HttpServerProperties* http_server_properties = 10656 HttpServerProperties* http_server_properties =
10677 session->http_server_properties(); 10657 session->http_server_properties();
10678 const int kRestrictedAlternatePort = 80; 10658 const int kRestrictedAlternatePort = 80;
10679 AlternativeService alternative_service( 10659 AlternativeService alternative_service(
10680 AlternateProtocolFromNextProto(GetProtocol()), "www.example.org", 10660 AlternateProtocolFromNextProto(GetProtocol()), "www.example.org",
10681 kRestrictedAlternatePort); 10661 kRestrictedAlternatePort);
10682 base::Time expiration = base::Time::Now() + base::TimeDelta::FromDays(1); 10662 base::Time expiration = base::Time::Now() + base::TimeDelta::FromDays(1);
(...skipping 13 matching lines...) Expand all
10696 } 10676 }
10697 10677
10698 // Ensure that we are not allowed to redirect traffic via an alternate protocol 10678 // Ensure that we are not allowed to redirect traffic via an alternate protocol
10699 // to an unrestricted (port >= 1024) when the original traffic was on a 10679 // to an unrestricted (port >= 1024) when the original traffic was on a
10700 // restricted port (port < 1024). Ensure that we can redirect in all other 10680 // restricted port (port < 1024). Ensure that we can redirect in all other
10701 // cases. 10681 // cases.
10702 TEST_P(HttpNetworkTransactionTest, 10682 TEST_P(HttpNetworkTransactionTest,
10703 AlternateProtocolPortUnrestrictedAllowed2) { 10683 AlternateProtocolPortUnrestrictedAllowed2) {
10704 HttpRequestInfo unrestricted_port_request; 10684 HttpRequestInfo unrestricted_port_request;
10705 unrestricted_port_request.method = "GET"; 10685 unrestricted_port_request.method = "GET";
10706 unrestricted_port_request.url = GURL("http://www.example.org:1024/"); 10686 unrestricted_port_request.url = GURL("https://www.example.org:1024/");
10707 unrestricted_port_request.load_flags = 0; 10687 unrestricted_port_request.load_flags = 0;
10708 10688
10709 MockConnect mock_connect(ASYNC, ERR_CONNECTION_REFUSED); 10689 MockConnect mock_connect(ASYNC, ERR_CONNECTION_REFUSED);
10710 StaticSocketDataProvider first_data; 10690 StaticSocketDataProvider first_data;
10711 first_data.set_connect_data(mock_connect); 10691 first_data.set_connect_data(mock_connect);
10712 session_deps_.socket_factory->AddSocketDataProvider(&first_data); 10692 session_deps_.socket_factory->AddSocketDataProvider(&first_data);
10713 10693
10714 MockRead data_reads[] = { 10694 MockRead data_reads[] = {
10715 MockRead("HTTP/1.1 200 OK\r\n\r\n"), 10695 MockRead("HTTP/1.1 200 OK\r\n\r\n"),
10716 MockRead("hello world"), 10696 MockRead("hello world"),
10717 MockRead(ASYNC, OK), 10697 MockRead(ASYNC, OK),
10718 }; 10698 };
10719 StaticSocketDataProvider second_data( 10699 StaticSocketDataProvider second_data(
10720 data_reads, arraysize(data_reads), NULL, 0); 10700 data_reads, arraysize(data_reads), NULL, 0);
10721 session_deps_.socket_factory->AddSocketDataProvider(&second_data); 10701 session_deps_.socket_factory->AddSocketDataProvider(&second_data);
10722 10702
10703 SSLSocketDataProvider ssl(ASYNC, OK);
10704 session_deps_.socket_factory->AddSSLSocketDataProvider(&ssl);
10705
10723 std::unique_ptr<HttpNetworkSession> session(CreateSession(&session_deps_)); 10706 std::unique_ptr<HttpNetworkSession> session(CreateSession(&session_deps_));
10724 10707
10725 HttpServerProperties* http_server_properties = 10708 HttpServerProperties* http_server_properties =
10726 session->http_server_properties(); 10709 session->http_server_properties();
10727 const int kUnrestrictedAlternatePort = 1025; 10710 const int kUnrestrictedAlternatePort = 1025;
10728 AlternativeService alternative_service( 10711 AlternativeService alternative_service(
10729 AlternateProtocolFromNextProto(GetProtocol()), "www.example.org", 10712 AlternateProtocolFromNextProto(GetProtocol()), "www.example.org",
10730 kUnrestrictedAlternatePort); 10713 kUnrestrictedAlternatePort);
10731 base::Time expiration = base::Time::Now() + base::TimeDelta::FromDays(1); 10714 base::Time expiration = base::Time::Now() + base::TimeDelta::FromDays(1);
10732 http_server_properties->SetAlternativeService( 10715 http_server_properties->SetAlternativeService(
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after
10791 EXPECT_EQ("HTTP/1.1 200 OK", response->headers->GetStatusLine()); 10774 EXPECT_EQ("HTTP/1.1 200 OK", response->headers->GetStatusLine());
10792 10775
10793 std::string response_data; 10776 std::string response_data;
10794 ASSERT_EQ(OK, ReadTransaction(trans.get(), &response_data)); 10777 ASSERT_EQ(OK, ReadTransaction(trans.get(), &response_data));
10795 EXPECT_EQ("hello world", response_data); 10778 EXPECT_EQ("hello world", response_data);
10796 } 10779 }
10797 10780
10798 TEST_P(HttpNetworkTransactionTest, UseAlternateProtocolForNpnSpdy) { 10781 TEST_P(HttpNetworkTransactionTest, UseAlternateProtocolForNpnSpdy) {
10799 HttpRequestInfo request; 10782 HttpRequestInfo request;
10800 request.method = "GET"; 10783 request.method = "GET";
10801 request.url = GURL("http://www.example.org/"); 10784 request.url = GURL("https://www.example.org/");
10802 request.load_flags = 0; 10785 request.load_flags = 0;
10803 10786
10804 std::string alternative_service_http_header = 10787 std::string alternative_service_http_header =
10805 GetAlternativeServiceHttpHeader(); 10788 GetAlternativeServiceHttpHeader();
10806 10789
10807 MockRead data_reads[] = { 10790 MockRead data_reads[] = {
10808 MockRead("HTTP/1.1 200 OK\r\n"), 10791 MockRead("HTTP/1.1 200 OK\r\n"),
10809 MockRead(alternative_service_http_header.c_str()), 10792 MockRead(alternative_service_http_header.c_str()),
10810 MockRead("\r\n"), 10793 MockRead("\r\n"),
10811 MockRead("hello world"), 10794 MockRead("hello world"),
10812 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ), 10795 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
10813 MockRead(ASYNC, OK)}; 10796 MockRead(ASYNC, OK)};
10814 10797
10815 StaticSocketDataProvider first_transaction( 10798 StaticSocketDataProvider first_transaction(
10816 data_reads, arraysize(data_reads), NULL, 0); 10799 data_reads, arraysize(data_reads), NULL, 0);
10817 session_deps_.socket_factory->AddSocketDataProvider(&first_transaction); 10800 session_deps_.socket_factory->AddSocketDataProvider(&first_transaction);
10801 SSLSocketDataProvider ssl_http11(ASYNC, OK);
10802 ssl_http11.SetNextProto(kProtoHTTP11);
10803 session_deps_.socket_factory->AddSSLSocketDataProvider(&ssl_http11);
10818 10804
10819 SSLSocketDataProvider ssl(ASYNC, OK); 10805 SSLSocketDataProvider ssl_http2(ASYNC, OK);
10820 ssl.SetNextProto(GetProtocol()); 10806 ssl_http2.SetNextProto(GetProtocol());
10821 ssl.cert = ImportCertFromFile(GetTestCertsDirectory(), "spdy_pooling.pem"); 10807 ssl_http2.cert =
10822 ASSERT_TRUE(ssl.cert.get()); 10808 ImportCertFromFile(GetTestCertsDirectory(), "spdy_pooling.pem");
10823 session_deps_.socket_factory->AddSSLSocketDataProvider(&ssl); 10809 ASSERT_TRUE(ssl_http2.cert.get());
10810 session_deps_.socket_factory->AddSSLSocketDataProvider(&ssl_http2);
10824 10811
10825 std::unique_ptr<SpdySerializedFrame> req( 10812 std::unique_ptr<SpdySerializedFrame> req(
10826 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); 10813 spdy_util_.ConstructSpdyGet("https://www.example.org/", 1, LOWEST));
10827 MockWrite spdy_writes[] = {CreateMockWrite(*req, 0)}; 10814 MockWrite spdy_writes[] = {CreateMockWrite(*req, 0)};
10828 10815
10829 std::unique_ptr<SpdySerializedFrame> resp( 10816 std::unique_ptr<SpdySerializedFrame> resp(
10830 spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); 10817 spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1));
10831 std::unique_ptr<SpdySerializedFrame> data( 10818 std::unique_ptr<SpdySerializedFrame> data(
10832 spdy_util_.ConstructSpdyBodyFrame(1, true)); 10819 spdy_util_.ConstructSpdyBodyFrame(1, true));
10833 MockRead spdy_reads[] = { 10820 MockRead spdy_reads[] = {
10834 CreateMockRead(*resp, 1), CreateMockRead(*data, 2), MockRead(ASYNC, 0, 3), 10821 CreateMockRead(*resp, 1), CreateMockRead(*data, 2), MockRead(ASYNC, 0, 3),
10835 }; 10822 };
10836 10823
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
10878 EXPECT_TRUE(response->was_fetched_via_spdy); 10865 EXPECT_TRUE(response->was_fetched_via_spdy);
10879 EXPECT_TRUE(response->was_npn_negotiated); 10866 EXPECT_TRUE(response->was_npn_negotiated);
10880 10867
10881 ASSERT_EQ(OK, ReadTransaction(trans.get(), &response_data)); 10868 ASSERT_EQ(OK, ReadTransaction(trans.get(), &response_data));
10882 EXPECT_EQ("hello!", response_data); 10869 EXPECT_EQ("hello!", response_data);
10883 } 10870 }
10884 10871
10885 TEST_P(HttpNetworkTransactionTest, AlternateProtocolWithSpdyLateBinding) { 10872 TEST_P(HttpNetworkTransactionTest, AlternateProtocolWithSpdyLateBinding) {
10886 HttpRequestInfo request; 10873 HttpRequestInfo request;
10887 request.method = "GET"; 10874 request.method = "GET";
10888 request.url = GURL("http://www.example.org/"); 10875 request.url = GURL("https://www.example.org/");
10889 request.load_flags = 0; 10876 request.load_flags = 0;
10890 10877
10878 // First transaction receives Alt-Svc header over HTTP/1.1.
10891 std::string alternative_service_http_header = 10879 std::string alternative_service_http_header =
10892 GetAlternativeServiceHttpHeader(); 10880 GetAlternativeServiceHttpHeader();
10893 10881
10894 MockRead data_reads[] = { 10882 MockRead data_reads[] = {
10895 MockRead("HTTP/1.1 200 OK\r\n"), 10883 MockRead("HTTP/1.1 200 OK\r\n"),
10896 MockRead(alternative_service_http_header.c_str()), 10884 MockRead(alternative_service_http_header.c_str()),
10897 MockRead("\r\n"), 10885 MockRead("\r\n"),
10898 MockRead("hello world"), 10886 MockRead("hello world"),
10899 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ), 10887 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
10900 MockRead(ASYNC, OK), 10888 MockRead(ASYNC, OK),
10901 }; 10889 };
10902 10890
10903 StaticSocketDataProvider first_transaction( 10891 StaticSocketDataProvider http11_data(data_reads, arraysize(data_reads), NULL,
10904 data_reads, arraysize(data_reads), NULL, 0); 10892 0);
10905 // Socket 1 is the HTTP transaction with the Alternate-Protocol header. 10893 session_deps_.socket_factory->AddSocketDataProvider(&http11_data);
10906 session_deps_.socket_factory->AddSocketDataProvider(&first_transaction);
10907 10894
10895 SSLSocketDataProvider ssl_http11(ASYNC, OK);
10896 session_deps_.socket_factory->AddSSLSocketDataProvider(&ssl_http11);
10897
10898 // Second transaction starts an alternative and a non-alternative Job.
10899 // Both sockets hang.
10908 MockConnect never_finishing_connect(SYNCHRONOUS, ERR_IO_PENDING); 10900 MockConnect never_finishing_connect(SYNCHRONOUS, ERR_IO_PENDING);
10909 StaticSocketDataProvider hanging_socket1(NULL, 0, NULL, 0); 10901 StaticSocketDataProvider hanging_socket1(NULL, 0, NULL, 0);
10910 hanging_socket1.set_connect_data(never_finishing_connect); 10902 hanging_socket1.set_connect_data(never_finishing_connect);
10911 // Socket 2 and 3 are the hanging Alternate-Protocol and
10912 // non-Alternate-Protocol jobs from the 2nd transaction.
10913 session_deps_.socket_factory->AddSocketDataProvider(&hanging_socket1); 10903 session_deps_.socket_factory->AddSocketDataProvider(&hanging_socket1);
10914 10904
10915 StaticSocketDataProvider hanging_socket2(NULL, 0, NULL, 0); 10905 StaticSocketDataProvider hanging_socket2(NULL, 0, NULL, 0);
10916 hanging_socket2.set_connect_data(never_finishing_connect); 10906 hanging_socket2.set_connect_data(never_finishing_connect);
10917 session_deps_.socket_factory->AddSocketDataProvider(&hanging_socket2); 10907 session_deps_.socket_factory->AddSocketDataProvider(&hanging_socket2);
10918 10908
10919 SSLSocketDataProvider ssl(ASYNC, OK); 10909 // Third transaction starts an alternative and a non-alternative job.
10920 ssl.SetNextProto(GetProtocol()); 10910 // The non-alternative job hangs, but the alternative one succeeds.
10921 ssl.cert = ImportCertFromFile(GetTestCertsDirectory(), "spdy_pooling.pem"); 10911 // The second transaction, still pending, binds to this socket.
10922 ASSERT_TRUE(ssl.cert);
10923 session_deps_.socket_factory->AddSSLSocketDataProvider(&ssl);
10924
10925 std::unique_ptr<SpdySerializedFrame> req1( 10912 std::unique_ptr<SpdySerializedFrame> req1(
10926 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); 10913 spdy_util_.ConstructSpdyGet("https://www.example.org/", 1, LOWEST));
10927 std::unique_ptr<SpdySerializedFrame> req2( 10914 std::unique_ptr<SpdySerializedFrame> req2(
10928 spdy_util_.ConstructSpdyGet(nullptr, 0, 3, LOWEST, true)); 10915 spdy_util_.ConstructSpdyGet("https://www.example.org/", 3, LOWEST));
10929 MockWrite spdy_writes[] = { 10916 MockWrite spdy_writes[] = {
10930 CreateMockWrite(*req1, 0), CreateMockWrite(*req2, 1), 10917 CreateMockWrite(*req1, 0), CreateMockWrite(*req2, 1),
10931 }; 10918 };
10932 std::unique_ptr<SpdySerializedFrame> resp1( 10919 std::unique_ptr<SpdySerializedFrame> resp1(
10933 spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); 10920 spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1));
10934 std::unique_ptr<SpdySerializedFrame> data1( 10921 std::unique_ptr<SpdySerializedFrame> data1(
10935 spdy_util_.ConstructSpdyBodyFrame(1, true)); 10922 spdy_util_.ConstructSpdyBodyFrame(1, true));
10936 std::unique_ptr<SpdySerializedFrame> resp2( 10923 std::unique_ptr<SpdySerializedFrame> resp2(
10937 spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 3)); 10924 spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 3));
10938 std::unique_ptr<SpdySerializedFrame> data2( 10925 std::unique_ptr<SpdySerializedFrame> data2(
10939 spdy_util_.ConstructSpdyBodyFrame(3, true)); 10926 spdy_util_.ConstructSpdyBodyFrame(3, true));
10940 MockRead spdy_reads[] = { 10927 MockRead spdy_reads[] = {
10941 CreateMockRead(*resp1, 2), 10928 CreateMockRead(*resp1, 2),
10942 CreateMockRead(*data1, 3), 10929 CreateMockRead(*data1, 3),
10943 CreateMockRead(*resp2, 4), 10930 CreateMockRead(*resp2, 4),
10944 CreateMockRead(*data2, 5), 10931 CreateMockRead(*data2, 5),
10945 MockRead(ASYNC, 0, 6), 10932 MockRead(ASYNC, 0, 6),
10946 }; 10933 };
10947 10934
10948 SequencedSocketData spdy_data(spdy_reads, arraysize(spdy_reads), spdy_writes, 10935 SequencedSocketData spdy_data(spdy_reads, arraysize(spdy_reads), spdy_writes,
10949 arraysize(spdy_writes)); 10936 arraysize(spdy_writes));
10950 // Socket 4 is the successful Alternate-Protocol for transaction 3.
10951 session_deps_.socket_factory->AddSocketDataProvider(&spdy_data); 10937 session_deps_.socket_factory->AddSocketDataProvider(&spdy_data);
10952 10938
10953 // Socket 5 is the unsuccessful non-Alternate-Protocol for transaction 3. 10939 SSLSocketDataProvider ssl_http2(ASYNC, OK);
10940 ssl_http2.SetNextProto(GetProtocol());
10941 ssl_http2.cert =
10942 ImportCertFromFile(GetTestCertsDirectory(), "spdy_pooling.pem");
10943 ASSERT_TRUE(ssl_http2.cert);
10944 session_deps_.socket_factory->AddSSLSocketDataProvider(&ssl_http2);
10945
10954 StaticSocketDataProvider hanging_socket3(NULL, 0, NULL, 0); 10946 StaticSocketDataProvider hanging_socket3(NULL, 0, NULL, 0);
10955 hanging_socket3.set_connect_data(never_finishing_connect); 10947 hanging_socket3.set_connect_data(never_finishing_connect);
10956 session_deps_.socket_factory->AddSocketDataProvider(&hanging_socket3); 10948 session_deps_.socket_factory->AddSocketDataProvider(&hanging_socket3);
10957 10949
10958 std::unique_ptr<HttpNetworkSession> session(CreateSession(&session_deps_)); 10950 std::unique_ptr<HttpNetworkSession> session(CreateSession(&session_deps_));
10959 TestCompletionCallback callback1; 10951 TestCompletionCallback callback1;
10960 HttpNetworkTransaction trans1(DEFAULT_PRIORITY, session.get()); 10952 HttpNetworkTransaction trans1(DEFAULT_PRIORITY, session.get());
10961 10953
10962 int rv = trans1.Start(&request, callback1.callback(), BoundNetLog()); 10954 int rv = trans1.Start(&request, callback1.callback(), BoundNetLog());
10963 EXPECT_EQ(ERR_IO_PENDING, rv); 10955 EXPECT_EQ(ERR_IO_PENDING, rv);
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
11000 EXPECT_EQ("HTTP/1.1 200", response->headers->GetStatusLine()); 10992 EXPECT_EQ("HTTP/1.1 200", response->headers->GetStatusLine());
11001 EXPECT_TRUE(response->was_fetched_via_spdy); 10993 EXPECT_TRUE(response->was_fetched_via_spdy);
11002 EXPECT_TRUE(response->was_npn_negotiated); 10994 EXPECT_TRUE(response->was_npn_negotiated);
11003 ASSERT_EQ(OK, ReadTransaction(&trans3, &response_data)); 10995 ASSERT_EQ(OK, ReadTransaction(&trans3, &response_data));
11004 EXPECT_EQ("hello!", response_data); 10996 EXPECT_EQ("hello!", response_data);
11005 } 10997 }
11006 10998
11007 TEST_P(HttpNetworkTransactionTest, StallAlternativeServiceForNpnSpdy) { 10999 TEST_P(HttpNetworkTransactionTest, StallAlternativeServiceForNpnSpdy) {
11008 HttpRequestInfo request; 11000 HttpRequestInfo request;
11009 request.method = "GET"; 11001 request.method = "GET";
11010 request.url = GURL("http://www.example.org/"); 11002 request.url = GURL("https://www.example.org/");
11011 request.load_flags = 0; 11003 request.load_flags = 0;
11012 11004
11013 std::string alternative_service_http_header = 11005 std::string alternative_service_http_header =
11014 GetAlternativeServiceHttpHeader(); 11006 GetAlternativeServiceHttpHeader();
11015 11007
11016 MockRead data_reads[] = { 11008 MockRead data_reads[] = {
11017 MockRead("HTTP/1.1 200 OK\r\n"), 11009 MockRead("HTTP/1.1 200 OK\r\n"),
11018 MockRead(alternative_service_http_header.c_str()), 11010 MockRead(alternative_service_http_header.c_str()),
11019 MockRead("\r\n"), 11011 MockRead("\r\n"),
11020 MockRead("hello world"), 11012 MockRead("hello world"),
11021 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ), 11013 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
11022 MockRead(ASYNC, OK), 11014 MockRead(ASYNC, OK),
11023 }; 11015 };
11024 11016
11025 StaticSocketDataProvider first_transaction( 11017 StaticSocketDataProvider first_transaction(
11026 data_reads, arraysize(data_reads), NULL, 0); 11018 data_reads, arraysize(data_reads), NULL, 0);
11027 session_deps_.socket_factory->AddSocketDataProvider(&first_transaction); 11019 session_deps_.socket_factory->AddSocketDataProvider(&first_transaction);
11028 11020
11029 SSLSocketDataProvider ssl(ASYNC, OK); 11021 SSLSocketDataProvider ssl(ASYNC, OK);
11030 ssl.SetNextProto(GetProtocol());
11031 session_deps_.socket_factory->AddSSLSocketDataProvider(&ssl); 11022 session_deps_.socket_factory->AddSSLSocketDataProvider(&ssl);
11032 11023
11033 MockConnect never_finishing_connect(SYNCHRONOUS, ERR_IO_PENDING); 11024 MockConnect never_finishing_connect(SYNCHRONOUS, ERR_IO_PENDING);
11034 StaticSocketDataProvider hanging_alternate_protocol_socket( 11025 StaticSocketDataProvider hanging_alternate_protocol_socket(
11035 NULL, 0, NULL, 0); 11026 NULL, 0, NULL, 0);
11036 hanging_alternate_protocol_socket.set_connect_data( 11027 hanging_alternate_protocol_socket.set_connect_data(
11037 never_finishing_connect); 11028 never_finishing_connect);
11038 session_deps_.socket_factory->AddSocketDataProvider( 11029 session_deps_.socket_factory->AddSocketDataProvider(
11039 &hanging_alternate_protocol_socket); 11030 &hanging_alternate_protocol_socket);
11040 11031
11041 // 2nd request is just a copy of the first one, over HTTP again. 11032 // 2nd request is just a copy of the first one, over HTTP/1.1 again.
11042 StaticSocketDataProvider second_transaction(data_reads, arraysize(data_reads), 11033 StaticSocketDataProvider second_transaction(data_reads, arraysize(data_reads),
11043 NULL, 0); 11034 NULL, 0);
11044 session_deps_.socket_factory->AddSocketDataProvider(&second_transaction); 11035 session_deps_.socket_factory->AddSocketDataProvider(&second_transaction);
11036 session_deps_.socket_factory->AddSSLSocketDataProvider(&ssl);
11045 11037
11046 TestCompletionCallback callback; 11038 TestCompletionCallback callback;
11047 11039
11048 std::unique_ptr<HttpNetworkSession> session(CreateSession(&session_deps_)); 11040 std::unique_ptr<HttpNetworkSession> session(CreateSession(&session_deps_));
11049 std::unique_ptr<HttpTransaction> trans( 11041 std::unique_ptr<HttpTransaction> trans(
11050 new HttpNetworkTransaction(DEFAULT_PRIORITY, session.get())); 11042 new HttpNetworkTransaction(DEFAULT_PRIORITY, session.get()));
11051 11043
11052 int rv = trans->Start(&request, callback.callback(), BoundNetLog()); 11044 int rv = trans->Start(&request, callback.callback(), BoundNetLog());
11053 EXPECT_EQ(ERR_IO_PENDING, rv); 11045 EXPECT_EQ(ERR_IO_PENDING, rv);
11054 EXPECT_EQ(OK, callback.WaitForResult()); 11046 EXPECT_EQ(OK, callback.WaitForResult());
(...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after
11138 session_deps_.proxy_service.reset(new ProxyService( 11130 session_deps_.proxy_service.reset(new ProxyService(
11139 base::WrapUnique(new ProxyConfigServiceFixed(proxy_config)), 11131 base::WrapUnique(new ProxyConfigServiceFixed(proxy_config)),
11140 base::WrapUnique( 11132 base::WrapUnique(
11141 new CapturingProxyResolverFactory(&capturing_proxy_resolver)), 11133 new CapturingProxyResolverFactory(&capturing_proxy_resolver)),
11142 NULL)); 11134 NULL));
11143 TestNetLog net_log; 11135 TestNetLog net_log;
11144 session_deps_.net_log = &net_log; 11136 session_deps_.net_log = &net_log;
11145 11137
11146 HttpRequestInfo request; 11138 HttpRequestInfo request;
11147 request.method = "GET"; 11139 request.method = "GET";
11148 request.url = GURL("http://www.example.org/"); 11140 request.url = GURL("https://www.example.org/");
11149 request.load_flags = 0; 11141 request.load_flags = 0;
11150 11142
11151 std::string alternative_service_http_header = 11143 std::string alternative_service_http_header =
11152 GetAlternativeServiceHttpHeader(); 11144 GetAlternativeServiceHttpHeader();
11153 11145
11154 MockRead data_reads[] = { 11146 MockRead data_reads[] = {
11155 MockRead("HTTP/1.1 200 OK\r\n"), 11147 MockRead("HTTP/1.1 200 OK\r\n"),
11156 MockRead(alternative_service_http_header.c_str()), 11148 MockRead(alternative_service_http_header.c_str()),
11157 MockRead("\r\n"), 11149 MockRead("\r\n"),
11158 MockRead("hello world"), 11150 MockRead("hello world"),
11159 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ), 11151 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
11160 MockRead(ASYNC, OK), 11152 MockRead(ASYNC, OK),
11161 }; 11153 };
11162 11154
11163 StaticSocketDataProvider first_transaction( 11155 StaticSocketDataProvider first_transaction(
11164 data_reads, arraysize(data_reads), NULL, 0); 11156 data_reads, arraysize(data_reads), NULL, 0);
11165 session_deps_.socket_factory->AddSocketDataProvider(&first_transaction); 11157 session_deps_.socket_factory->AddSocketDataProvider(&first_transaction);
11158 SSLSocketDataProvider ssl_http11(ASYNC, OK);
11159 ssl_http11.SetNextProto(kProtoHTTP11);
11160 session_deps_.socket_factory->AddSSLSocketDataProvider(&ssl_http11);
11166 11161
11167 SSLSocketDataProvider ssl(ASYNC, OK); 11162 SSLSocketDataProvider ssl_http2(ASYNC, OK);
11168 ssl.SetNextProto(GetProtocol()); 11163 ssl_http2.SetNextProto(GetProtocol());
11169 ssl.cert = ImportCertFromFile(GetTestCertsDirectory(), "spdy_pooling.pem"); 11164 ssl_http2.cert =
11170 ASSERT_TRUE(ssl.cert); 11165 ImportCertFromFile(GetTestCertsDirectory(), "spdy_pooling.pem");
11171 session_deps_.socket_factory->AddSSLSocketDataProvider(&ssl); 11166 ASSERT_TRUE(ssl_http2.cert);
11167 session_deps_.socket_factory->AddSSLSocketDataProvider(&ssl_http2);
11172 11168
11173 std::unique_ptr<SpdySerializedFrame> req( 11169 std::unique_ptr<SpdySerializedFrame> req(
11174 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); 11170 spdy_util_.ConstructSpdyGet("https://www.example.org/", 1, LOWEST));
11175 MockWrite spdy_writes[] = { 11171 MockWrite spdy_writes[] = {
11176 MockWrite(ASYNC, 0, 11172 MockWrite(ASYNC, 0,
11177 "CONNECT www.example.org:443 HTTP/1.1\r\n" 11173 "CONNECT www.example.org:443 HTTP/1.1\r\n"
11178 "Host: www.example.org:443\r\n" 11174 "Host: www.example.org:443\r\n"
11179 "Proxy-Connection: keep-alive\r\n\r\n"), 11175 "Proxy-Connection: keep-alive\r\n\r\n"),
11180 CreateMockWrite(*req, 2), 11176 CreateMockWrite(*req, 2),
11181 }; 11177 };
11182 11178
11183 const char kCONNECTResponse[] = "HTTP/1.1 200 Connected\r\n\r\n"; 11179 const char kCONNECTResponse[] = "HTTP/1.1 200 Connected\r\n\r\n";
11184 11180
(...skipping 24 matching lines...) Expand all
11209 std::unique_ptr<HttpTransaction> trans( 11205 std::unique_ptr<HttpTransaction> trans(
11210 new HttpNetworkTransaction(DEFAULT_PRIORITY, session.get())); 11206 new HttpNetworkTransaction(DEFAULT_PRIORITY, session.get()));
11211 11207
11212 int rv = trans->Start(&request, callback.callback(), BoundNetLog()); 11208 int rv = trans->Start(&request, callback.callback(), BoundNetLog());
11213 EXPECT_EQ(ERR_IO_PENDING, rv); 11209 EXPECT_EQ(ERR_IO_PENDING, rv);
11214 EXPECT_EQ(OK, callback.WaitForResult()); 11210 EXPECT_EQ(OK, callback.WaitForResult());
11215 11211
11216 const HttpResponseInfo* response = trans->GetResponseInfo(); 11212 const HttpResponseInfo* response = trans->GetResponseInfo();
11217 ASSERT_TRUE(response); 11213 ASSERT_TRUE(response);
11218 ASSERT_TRUE(response->headers); 11214 ASSERT_TRUE(response->headers);
11219 EXPECT_EQ("HTTP/1.1 200 OK", response->headers->GetStatusLine()); 11215 EXPECT_EQ("HTTP/0.9 200 OK", response->headers->GetStatusLine());
11220 EXPECT_FALSE(response->was_fetched_via_spdy); 11216 EXPECT_FALSE(response->was_fetched_via_spdy);
11221 EXPECT_FALSE(response->was_npn_negotiated); 11217 EXPECT_TRUE(response->was_npn_negotiated);
11222 11218
11223 std::string response_data; 11219 std::string response_data;
11224 ASSERT_EQ(OK, ReadTransaction(trans.get(), &response_data)); 11220 ASSERT_EQ(OK, ReadTransaction(trans.get(), &response_data));
11225 EXPECT_EQ("hello world", response_data); 11221 EXPECT_EQ("hello world", response_data);
11226 11222
11227 trans.reset(new HttpNetworkTransaction(DEFAULT_PRIORITY, session.get())); 11223 trans.reset(new HttpNetworkTransaction(DEFAULT_PRIORITY, session.get()));
11228 11224
11229 rv = trans->Start(&request, callback.callback(), BoundNetLog()); 11225 rv = trans->Start(&request, callback.callback(), BoundNetLog());
11230 EXPECT_EQ(ERR_IO_PENDING, rv); 11226 EXPECT_EQ(ERR_IO_PENDING, rv);
11231 EXPECT_EQ(OK, callback.WaitForResult()); 11227 EXPECT_EQ(OK, callback.WaitForResult());
11232 11228
11233 response = trans->GetResponseInfo(); 11229 response = trans->GetResponseInfo();
11234 ASSERT_TRUE(response); 11230 ASSERT_TRUE(response);
11235 ASSERT_TRUE(response->headers); 11231 ASSERT_TRUE(response->headers);
11236 EXPECT_EQ("HTTP/1.1 200", response->headers->GetStatusLine()); 11232 EXPECT_EQ("HTTP/1.1 200", response->headers->GetStatusLine());
11237 EXPECT_TRUE(response->was_fetched_via_spdy); 11233 EXPECT_TRUE(response->was_fetched_via_spdy);
11238 EXPECT_TRUE(response->was_npn_negotiated); 11234 EXPECT_TRUE(response->was_npn_negotiated);
11239 11235
11240 ASSERT_EQ(OK, ReadTransaction(trans.get(), &response_data)); 11236 ASSERT_EQ(OK, ReadTransaction(trans.get(), &response_data));
11241 EXPECT_EQ("hello!", response_data); 11237 EXPECT_EQ("hello!", response_data);
11242 ASSERT_EQ(3u, capturing_proxy_resolver.resolved().size()); 11238 ASSERT_EQ(2u, capturing_proxy_resolver.resolved().size());
11243 EXPECT_EQ("http://www.example.org/", 11239 EXPECT_EQ("https://www.example.org/",
11244 capturing_proxy_resolver.resolved()[0].spec()); 11240 capturing_proxy_resolver.resolved()[0].spec());
11245 EXPECT_EQ("https://www.example.org/", 11241 EXPECT_EQ("https://www.example.org/",
11246 capturing_proxy_resolver.resolved()[1].spec()); 11242 capturing_proxy_resolver.resolved()[1].spec());
11247 11243
11248 LoadTimingInfo load_timing_info; 11244 LoadTimingInfo load_timing_info;
11249 EXPECT_TRUE(trans->GetLoadTimingInfo(&load_timing_info)); 11245 EXPECT_TRUE(trans->GetLoadTimingInfo(&load_timing_info));
11250 TestLoadTimingNotReusedWithPac(load_timing_info, 11246 TestLoadTimingNotReusedWithPac(load_timing_info,
11251 CONNECT_TIMING_HAS_SSL_TIMES); 11247 CONNECT_TIMING_HAS_SSL_TIMES);
11252 } 11248 }
11253 11249
11254 TEST_P(HttpNetworkTransactionTest, 11250 TEST_P(HttpNetworkTransactionTest,
11255 UseAlternativeServiceForNpnSpdyWithExistingSpdySession) { 11251 UseAlternativeServiceForNpnSpdyWithExistingSpdySession) {
11256 HttpRequestInfo request; 11252 HttpRequestInfo request;
11257 request.method = "GET"; 11253 request.method = "GET";
11258 request.url = GURL("http://www.example.org/"); 11254 request.url = GURL("https://www.example.org/");
11259 request.load_flags = 0; 11255 request.load_flags = 0;
11260 11256
11261 std::string alternative_service_http_header = 11257 std::string alternative_service_http_header =
11262 GetAlternativeServiceHttpHeader(); 11258 GetAlternativeServiceHttpHeader();
11263 11259
11264 MockRead data_reads[] = { 11260 MockRead data_reads[] = {
11265 MockRead("HTTP/1.1 200 OK\r\n"), 11261 MockRead("HTTP/1.1 200 OK\r\n"),
11266 MockRead(alternative_service_http_header.c_str()), 11262 MockRead(alternative_service_http_header.c_str()),
11267 MockRead("\r\n"), 11263 MockRead("\r\n"),
11268 MockRead("hello world"), 11264 MockRead("hello world"),
11269 MockRead(ASYNC, OK), 11265 MockRead(ASYNC, OK),
11270 }; 11266 };
11271 11267
11272 StaticSocketDataProvider first_transaction( 11268 StaticSocketDataProvider first_transaction(
11273 data_reads, arraysize(data_reads), NULL, 0); 11269 data_reads, arraysize(data_reads), NULL, 0);
11274 session_deps_.socket_factory->AddSocketDataProvider(&first_transaction); 11270 session_deps_.socket_factory->AddSocketDataProvider(&first_transaction);
11271 SSLSocketDataProvider ssl_http11(ASYNC, OK);
11272 ssl_http11.SetNextProto(kProtoHTTP11);
11273 session_deps_.socket_factory->AddSSLSocketDataProvider(&ssl_http11);
11275 11274
11276 SSLSocketDataProvider ssl(ASYNC, OK); 11275 SSLSocketDataProvider ssl_http2(ASYNC, OK);
11277 ssl.SetNextProto(GetProtocol()); 11276 ssl_http2.SetNextProto(GetProtocol());
11278 ssl.cert = ImportCertFromFile(GetTestCertsDirectory(), "spdy_pooling.pem"); 11277 ssl_http2.cert =
11279 ASSERT_TRUE(ssl.cert); 11278 ImportCertFromFile(GetTestCertsDirectory(), "spdy_pooling.pem");
11280 session_deps_.socket_factory->AddSSLSocketDataProvider(&ssl); 11279 ASSERT_TRUE(ssl_http2.cert);
11280 session_deps_.socket_factory->AddSSLSocketDataProvider(&ssl_http2);
11281 11281
11282 std::unique_ptr<SpdySerializedFrame> req( 11282 std::unique_ptr<SpdySerializedFrame> req(
11283 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); 11283 spdy_util_.ConstructSpdyGet("https://www.example.org/", 1, LOWEST));
11284 MockWrite spdy_writes[] = {CreateMockWrite(*req, 0)}; 11284 MockWrite spdy_writes[] = {CreateMockWrite(*req, 0)};
11285 11285
11286 std::unique_ptr<SpdySerializedFrame> resp( 11286 std::unique_ptr<SpdySerializedFrame> resp(
11287 spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); 11287 spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1));
11288 std::unique_ptr<SpdySerializedFrame> data( 11288 std::unique_ptr<SpdySerializedFrame> data(
11289 spdy_util_.ConstructSpdyBodyFrame(1, true)); 11289 spdy_util_.ConstructSpdyBodyFrame(1, true));
11290 MockRead spdy_reads[] = { 11290 MockRead spdy_reads[] = {
11291 CreateMockRead(*resp, 1), CreateMockRead(*data, 2), MockRead(ASYNC, 0, 3), 11291 CreateMockRead(*resp, 1), CreateMockRead(*data, 2), MockRead(ASYNC, 0, 3),
11292 }; 11292 };
11293 11293
(...skipping 767 matching lines...) Expand 10 before | Expand all | Expand 10 after
12061 std::string* auth_token) override { 12061 std::string* auth_token) override {
12062 *url_ = request->url; 12062 *url_ = request->url;
12063 return HttpAuthHandlerMock::GenerateAuthTokenImpl( 12063 return HttpAuthHandlerMock::GenerateAuthTokenImpl(
12064 credentials, request, callback, auth_token); 12064 credentials, request, callback, auth_token);
12065 } 12065 }
12066 12066
12067 private: 12067 private:
12068 GURL* url_; 12068 GURL* url_;
12069 }; 12069 };
12070 12070
12071 // This test ensures that the URL passed into the proxy is upgraded to https
12072 // when doing an Alternate Protocol upgrade.
12073 TEST_P(HttpNetworkTransactionTest, SpdyAlternativeServiceThroughProxy) {
12074 session_deps_.proxy_service =
12075 ProxyService::CreateFixedFromPacResult("PROXY myproxy:70");
12076 TestNetLog net_log;
12077 session_deps_.net_log = &net_log;
12078 GURL request_url;
12079 {
12080 HttpAuthHandlerMock::Factory* auth_factory =
12081 new HttpAuthHandlerMock::Factory();
12082 UrlRecordingHttpAuthHandlerMock* auth_handler =
12083 new UrlRecordingHttpAuthHandlerMock(&request_url);
12084 auth_factory->AddMockHandler(auth_handler, HttpAuth::AUTH_PROXY);
12085 auth_factory->set_do_init_from_challenge(true);
12086 session_deps_.http_auth_handler_factory.reset(auth_factory);
12087 }
12088
12089 HttpRequestInfo request;
12090 request.method = "GET";
12091 request.url = GURL("http://www.example.org");
12092 request.load_flags = 0;
12093
12094 // First round goes unauthenticated through the proxy.
12095 MockWrite data_writes_1[] = {
12096 MockWrite(
12097 "GET http://www.example.org/ HTTP/1.1\r\n"
12098 "Host: www.example.org\r\n"
12099 "Proxy-Connection: keep-alive\r\n"
12100 "\r\n"),
12101 };
12102 MockRead data_reads_1[] = {
12103 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
12104 MockRead("HTTP/1.1 200 OK\r\n"),
12105 MockRead("Alt-Svc: "),
12106 MockRead(GetAlternateProtocolFromParam()),
12107 MockRead("=\":443\"\r\n"),
12108 MockRead("Proxy-Connection: close\r\n"),
12109 MockRead("\r\n"),
12110 };
12111 StaticSocketDataProvider data_1(data_reads_1, arraysize(data_reads_1),
12112 data_writes_1, arraysize(data_writes_1));
12113
12114 // Second round tries to tunnel to www.example.org due to the
12115 // Alternate-Protocol announcement in the first round. It fails due
12116 // to a proxy authentication challenge.
12117 // After the failure, a tunnel is established to www.example.org using
12118 // Proxy-Authorization headers. There is then a SPDY request round.
12119 //
12120 // NOTE: Despite the "Proxy-Connection: Close", these are done on the
12121 // same MockTCPClientSocket since the underlying HttpNetworkClientSocket
12122 // does a Disconnect and Connect on the same socket, rather than trying
12123 // to obtain a new one.
12124 //
12125 // NOTE: Originally, the proxy response to the second CONNECT request
12126 // simply returned another 407 so the unit test could skip the SSL connection
12127 // establishment and SPDY framing issues. Alas, the
12128 // retry-http-when-alternate-protocol fails logic kicks in, which was more
12129 // complicated to set up expectations for than the SPDY session.
12130
12131 std::unique_ptr<SpdySerializedFrame> req(
12132 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true));
12133 std::unique_ptr<SpdySerializedFrame> resp(
12134 spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1));
12135 std::unique_ptr<SpdySerializedFrame> data(
12136 spdy_util_.ConstructSpdyBodyFrame(1, true));
12137
12138 MockWrite data_writes_2[] = {
12139 // First connection attempt without Proxy-Authorization.
12140 MockWrite(ASYNC, 0,
12141 "CONNECT www.example.org:443 HTTP/1.1\r\n"
12142 "Host: www.example.org:443\r\n"
12143 "Proxy-Connection: keep-alive\r\n"
12144 "\r\n"),
12145
12146 // Second connection attempt with Proxy-Authorization.
12147 MockWrite(ASYNC, 2,
12148 "CONNECT www.example.org:443 HTTP/1.1\r\n"
12149 "Host: www.example.org:443\r\n"
12150 "Proxy-Connection: keep-alive\r\n"
12151 "Proxy-Authorization: auth_token\r\n"
12152 "\r\n"),
12153
12154 // SPDY request
12155 CreateMockWrite(*req, 4),
12156 };
12157 MockRead data_reads_2[] = {
12158 // First connection attempt fails
12159 MockRead(ASYNC, 1,
12160 "HTTP/1.1 407 Unauthorized\r\n"
12161 "Proxy-Authenticate: Mock\r\n"
12162 "Content-Length: 0\r\n"
12163 "Proxy-Connection: keep-alive\r\n"
12164 "\r\n"),
12165
12166 // Second connection attempt passes
12167 MockRead(ASYNC, 3, "HTTP/1.1 200 Connected\r\n\r\n"),
12168
12169 // SPDY response
12170 CreateMockRead(*resp.get(), 5), CreateMockRead(*data.get(), 6),
12171 MockRead(ASYNC, 0, 0, 7),
12172 };
12173 SequencedSocketData data_2(data_reads_2, arraysize(data_reads_2),
12174 data_writes_2, arraysize(data_writes_2));
12175
12176 SSLSocketDataProvider ssl(ASYNC, OK);
12177 ssl.SetNextProto(GetProtocol());
12178 ssl.cert = ImportCertFromFile(GetTestCertsDirectory(), "spdy_pooling.pem");
12179 ASSERT_TRUE(ssl.cert);
12180
12181 MockConnect never_finishing_connect(SYNCHRONOUS, ERR_IO_PENDING);
12182 StaticSocketDataProvider hanging_non_alternate_protocol_socket(
12183 NULL, 0, NULL, 0);
12184 hanging_non_alternate_protocol_socket.set_connect_data(
12185 never_finishing_connect);
12186
12187 session_deps_.socket_factory->AddSocketDataProvider(&data_1);
12188 session_deps_.socket_factory->AddSocketDataProvider(&data_2);
12189 session_deps_.socket_factory->AddSSLSocketDataProvider(&ssl);
12190 session_deps_.socket_factory->AddSocketDataProvider(
12191 &hanging_non_alternate_protocol_socket);
12192 std::unique_ptr<HttpNetworkSession> session(CreateSession(&session_deps_));
12193
12194 // First round should work and provide the Alternate-Protocol state.
12195 TestCompletionCallback callback_1;
12196 std::unique_ptr<HttpTransaction> trans_1(
12197 new HttpNetworkTransaction(DEFAULT_PRIORITY, session.get()));
12198 int rv = trans_1->Start(&request, callback_1.callback(), BoundNetLog());
12199 EXPECT_EQ(ERR_IO_PENDING, rv);
12200 EXPECT_EQ(OK, callback_1.WaitForResult());
12201
12202 // Second round should attempt a tunnel connect and get an auth challenge.
12203 TestCompletionCallback callback_2;
12204 std::unique_ptr<HttpTransaction> trans_2(
12205 new HttpNetworkTransaction(DEFAULT_PRIORITY, session.get()));
12206 rv = trans_2->Start(&request, callback_2.callback(), BoundNetLog());
12207 EXPECT_EQ(ERR_IO_PENDING, rv);
12208 EXPECT_EQ(OK, callback_2.WaitForResult());
12209 const HttpResponseInfo* response = trans_2->GetResponseInfo();
12210 ASSERT_TRUE(response);
12211 ASSERT_TRUE(response->auth_challenge);
12212
12213 // Restart with auth. Tunnel should work and response received.
12214 TestCompletionCallback callback_3;
12215 rv = trans_2->RestartWithAuth(
12216 AuthCredentials(kFoo, kBar), callback_3.callback());
12217 EXPECT_EQ(ERR_IO_PENDING, rv);
12218 EXPECT_EQ(OK, callback_3.WaitForResult());
12219
12220 // After all that work, these two lines (or actually, just the scheme) are
12221 // what this test is all about. Make sure it happens correctly.
12222 EXPECT_EQ("https", request_url.scheme());
12223 EXPECT_EQ("www.example.org", request_url.host());
12224
12225 LoadTimingInfo load_timing_info;
12226 EXPECT_TRUE(trans_2->GetLoadTimingInfo(&load_timing_info));
12227 TestLoadTimingNotReusedWithPac(load_timing_info,
12228 CONNECT_TIMING_HAS_SSL_TIMES);
12229 }
12230
12231 // Test that if we cancel the transaction as the connection is completing, that 12071 // Test that if we cancel the transaction as the connection is completing, that
12232 // everything tears down correctly. 12072 // everything tears down correctly.
12233 TEST_P(HttpNetworkTransactionTest, SimpleCancel) { 12073 TEST_P(HttpNetworkTransactionTest, SimpleCancel) {
12234 // Setup everything about the connection to complete synchronously, so that 12074 // Setup everything about the connection to complete synchronously, so that
12235 // after calling HttpNetworkTransaction::Start, the only thing we're waiting 12075 // after calling HttpNetworkTransaction::Start, the only thing we're waiting
12236 // for is the callback from the HttpStreamRequest. 12076 // for is the callback from the HttpStreamRequest.
12237 // Then cancel the transaction. 12077 // Then cancel the transaction.
12238 // Verify that we don't crash. 12078 // Verify that we don't crash.
12239 MockConnect mock_connect(SYNCHRONOUS, OK); 12079 MockConnect mock_connect(SYNCHRONOUS, OK);
12240 MockRead data_reads[] = { 12080 MockRead data_reads[] = {
(...skipping 3842 matching lines...) Expand 10 before | Expand all | Expand 10 after
16083 base::RunLoop().RunUntilIdle(); 15923 base::RunLoop().RunUntilIdle();
16084 15924
16085 EXPECT_TRUE(trans.GetResponseInfo()->was_fetched_via_spdy); 15925 EXPECT_TRUE(trans.GetResponseInfo()->was_fetched_via_spdy);
16086 HttpRequestHeaders headers; 15926 HttpRequestHeaders headers;
16087 ASSERT_TRUE(trans.GetFullRequestHeaders(&headers)); 15927 ASSERT_TRUE(trans.GetFullRequestHeaders(&headers));
16088 EXPECT_TRUE(headers.HasHeader(HttpRequestHeaders::kTokenBinding)); 15928 EXPECT_TRUE(headers.HasHeader(HttpRequestHeaders::kTokenBinding));
16089 } 15929 }
16090 #endif // !defined(OS_IOS) 15930 #endif // !defined(OS_IOS)
16091 15931
16092 } // namespace net 15932 } // namespace net
OLDNEW
« no previous file with comments | « net/http/http_network_transaction.cc ('k') | net/http/http_stream_factory_impl_job.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698