| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 <string> | 5 #include <string> |
| 6 #include <utility> |
| 6 #include <vector> | 7 #include <vector> |
| 7 | 8 |
| 8 #include "base/bind.h" | 9 #include "base/bind.h" |
| 9 #include "base/bind_helpers.h" | 10 #include "base/bind_helpers.h" |
| 10 #include "base/files/file_util.h" | 11 #include "base/files/file_util.h" |
| 11 #include "base/files/scoped_temp_dir.h" | 12 #include "base/files/scoped_temp_dir.h" |
| 12 #include "base/memory/scoped_ptr.h" | 13 #include "base/memory/scoped_ptr.h" |
| 13 #include "base/run_loop.h" | 14 #include "base/run_loop.h" |
| 14 #include "base/strings/string_piece.h" | 15 #include "base/strings/string_piece.h" |
| 15 #include "base/test/test_file_util.h" | 16 #include "base/test/test_file_util.h" |
| (...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 116 SpdyNetworkTransactionTestParams test_params) { | 117 SpdyNetworkTransactionTestParams test_params) { |
| 117 scoped_ptr<SpdySessionDependencies> session_deps( | 118 scoped_ptr<SpdySessionDependencies> session_deps( |
| 118 new SpdySessionDependencies(test_params.protocol)); | 119 new SpdySessionDependencies(test_params.protocol)); |
| 119 UpdateSpdySessionDependencies(test_params, session_deps.get()); | 120 UpdateSpdySessionDependencies(test_params, session_deps.get()); |
| 120 return session_deps; | 121 return session_deps; |
| 121 } | 122 } |
| 122 | 123 |
| 123 scoped_ptr<SpdySessionDependencies> CreateSpdySessionDependencies( | 124 scoped_ptr<SpdySessionDependencies> CreateSpdySessionDependencies( |
| 124 SpdyNetworkTransactionTestParams test_params, | 125 SpdyNetworkTransactionTestParams test_params, |
| 125 scoped_ptr<ProxyService> proxy_service) { | 126 scoped_ptr<ProxyService> proxy_service) { |
| 126 scoped_ptr<SpdySessionDependencies> session_deps( | 127 scoped_ptr<SpdySessionDependencies> session_deps(new SpdySessionDependencies( |
| 127 new SpdySessionDependencies(test_params.protocol, proxy_service.Pass())); | 128 test_params.protocol, std::move(proxy_service))); |
| 128 UpdateSpdySessionDependencies(test_params, session_deps.get()); | 129 UpdateSpdySessionDependencies(test_params, session_deps.get()); |
| 129 return session_deps; | 130 return session_deps; |
| 130 } | 131 } |
| 131 | 132 |
| 132 } // namespace | 133 } // namespace |
| 133 | 134 |
| 134 class SpdyNetworkTransactionTest | 135 class SpdyNetworkTransactionTest |
| 135 : public ::testing::TestWithParam<SpdyNetworkTransactionTestParams> { | 136 : public ::testing::TestWithParam<SpdyNetworkTransactionTestParams> { |
| 136 protected: | 137 protected: |
| 137 SpdyNetworkTransactionTest() | 138 SpdyNetworkTransactionTest() |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 169 NormalSpdyTransactionHelper( | 170 NormalSpdyTransactionHelper( |
| 170 const HttpRequestInfo& request, | 171 const HttpRequestInfo& request, |
| 171 RequestPriority priority, | 172 RequestPriority priority, |
| 172 const BoundNetLog& log, | 173 const BoundNetLog& log, |
| 173 SpdyNetworkTransactionTestParams test_params, | 174 SpdyNetworkTransactionTestParams test_params, |
| 174 scoped_ptr<SpdySessionDependencies> session_deps) | 175 scoped_ptr<SpdySessionDependencies> session_deps) |
| 175 : request_(request), | 176 : request_(request), |
| 176 priority_(priority), | 177 priority_(priority), |
| 177 session_deps_(session_deps.get() == NULL | 178 session_deps_(session_deps.get() == NULL |
| 178 ? CreateSpdySessionDependencies(test_params) | 179 ? CreateSpdySessionDependencies(test_params) |
| 179 : session_deps.Pass()), | 180 : std::move(session_deps)), |
| 180 session_( | 181 session_( |
| 181 SpdySessionDependencies::SpdyCreateSession(session_deps_.get())), | 182 SpdySessionDependencies::SpdyCreateSession(session_deps_.get())), |
| 182 log_(log), | 183 log_(log), |
| 183 test_params_(test_params), | 184 test_params_(test_params), |
| 184 port_(443), | 185 port_(443), |
| 185 spdy_enabled_(true) {} | 186 spdy_enabled_(true) {} |
| 186 | 187 |
| 187 ~NormalSpdyTransactionHelper() { | 188 ~NormalSpdyTransactionHelper() { |
| 188 // Any test which doesn't close the socket by sending it an EOF will | 189 // Any test which doesn't close the socket by sending it an EOF will |
| 189 // have a valid session left open, which leaks the entire session pool. | 190 // have a valid session left open, which leaks the entire session pool. |
| (...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 299 RunPreTestSetup(); | 300 RunPreTestSetup(); |
| 300 AddData(data); | 301 AddData(data); |
| 301 RunDefaultTest(); | 302 RunDefaultTest(); |
| 302 VerifyDataConsumed(); | 303 VerifyDataConsumed(); |
| 303 } | 304 } |
| 304 | 305 |
| 305 void RunToCompletionWithSSLData( | 306 void RunToCompletionWithSSLData( |
| 306 SocketDataProvider* data, | 307 SocketDataProvider* data, |
| 307 scoped_ptr<SSLSocketDataProvider> ssl_provider) { | 308 scoped_ptr<SSLSocketDataProvider> ssl_provider) { |
| 308 RunPreTestSetup(); | 309 RunPreTestSetup(); |
| 309 AddDataWithSSLSocketDataProvider(data, ssl_provider.Pass()); | 310 AddDataWithSSLSocketDataProvider(data, std::move(ssl_provider)); |
| 310 RunDefaultTest(); | 311 RunDefaultTest(); |
| 311 VerifyDataConsumed(); | 312 VerifyDataConsumed(); |
| 312 } | 313 } |
| 313 | 314 |
| 314 void AddData(SocketDataProvider* data) { | 315 void AddData(SocketDataProvider* data) { |
| 315 scoped_ptr<SSLSocketDataProvider> ssl_provider( | 316 scoped_ptr<SSLSocketDataProvider> ssl_provider( |
| 316 new SSLSocketDataProvider(ASYNC, OK)); | 317 new SSLSocketDataProvider(ASYNC, OK)); |
| 317 ssl_provider->cert = | 318 ssl_provider->cert = |
| 318 ImportCertFromFile(GetTestCertsDirectory(), "spdy_pooling.pem"); | 319 ImportCertFromFile(GetTestCertsDirectory(), "spdy_pooling.pem"); |
| 319 AddDataWithSSLSocketDataProvider(data, ssl_provider.Pass()); | 320 AddDataWithSSLSocketDataProvider(data, std::move(ssl_provider)); |
| 320 } | 321 } |
| 321 | 322 |
| 322 void AddDataWithSSLSocketDataProvider( | 323 void AddDataWithSSLSocketDataProvider( |
| 323 SocketDataProvider* data, | 324 SocketDataProvider* data, |
| 324 scoped_ptr<SSLSocketDataProvider> ssl_provider) { | 325 scoped_ptr<SSLSocketDataProvider> ssl_provider) { |
| 325 data_vector_.push_back(data); | 326 data_vector_.push_back(data); |
| 326 if (ssl_provider->next_proto_status == | 327 if (ssl_provider->next_proto_status == |
| 327 SSLClientSocket::kNextProtoUnsupported) { | 328 SSLClientSocket::kNextProtoUnsupported) { |
| 328 ssl_provider->SetNextProto(test_params_.protocol); | 329 ssl_provider->SetNextProto(test_params_.protocol); |
| 329 } | 330 } |
| 330 | 331 |
| 331 session_deps_->socket_factory->AddSSLSocketDataProvider( | 332 session_deps_->socket_factory->AddSSLSocketDataProvider( |
| 332 ssl_provider.get()); | 333 ssl_provider.get()); |
| 333 ssl_vector_.push_back(std::move(ssl_provider)); | 334 ssl_vector_.push_back(std::move(ssl_provider)); |
| 334 | 335 |
| 335 session_deps_->socket_factory->AddSocketDataProvider(data); | 336 session_deps_->socket_factory->AddSocketDataProvider(data); |
| 336 if (test_params_.ssl_type == HTTP_SPDY_VIA_ALT_SVC) { | 337 if (test_params_.ssl_type == HTTP_SPDY_VIA_ALT_SVC) { |
| 337 MockConnect hanging_connect(SYNCHRONOUS, ERR_IO_PENDING); | 338 MockConnect hanging_connect(SYNCHRONOUS, ERR_IO_PENDING); |
| 338 scoped_ptr<StaticSocketDataProvider> hanging_non_alt_svc_socket( | 339 scoped_ptr<StaticSocketDataProvider> hanging_non_alt_svc_socket( |
| 339 make_scoped_ptr(new StaticSocketDataProvider(NULL, 0, NULL, 0))); | 340 make_scoped_ptr(new StaticSocketDataProvider(NULL, 0, NULL, 0))); |
| 340 hanging_non_alt_svc_socket->set_connect_data(hanging_connect); | 341 hanging_non_alt_svc_socket->set_connect_data(hanging_connect); |
| 341 session_deps_->socket_factory->AddSocketDataProvider( | 342 session_deps_->socket_factory->AddSocketDataProvider( |
| 342 hanging_non_alt_svc_socket.get()); | 343 hanging_non_alt_svc_socket.get()); |
| 343 alternate_vector_.push_back(std::move(hanging_non_alt_svc_socket)); | 344 alternate_vector_.push_back(std::move(hanging_non_alt_svc_socket)); |
| 344 } | 345 } |
| 345 } | 346 } |
| 346 | 347 |
| 347 void SetSession(scoped_ptr<HttpNetworkSession> session) { | 348 void SetSession(scoped_ptr<HttpNetworkSession> session) { |
| 348 session_ = session.Pass(); | 349 session_ = std::move(session); |
| 349 } | 350 } |
| 350 HttpNetworkTransaction* trans() { return trans_.get(); } | 351 HttpNetworkTransaction* trans() { return trans_.get(); } |
| 351 void ResetTrans() { trans_.reset(); } | 352 void ResetTrans() { trans_.reset(); } |
| 352 TransactionHelperResult& output() { return output_; } | 353 TransactionHelperResult& output() { return output_; } |
| 353 const HttpRequestInfo& request() const { return request_; } | 354 const HttpRequestInfo& request() const { return request_; } |
| 354 HttpNetworkSession* session() const { return session_.get(); } | 355 HttpNetworkSession* session() const { return session_.get(); } |
| 355 scoped_ptr<SpdySessionDependencies>& session_deps() { | 356 scoped_ptr<SpdySessionDependencies>& session_deps() { |
| 356 return session_deps_; | 357 return session_deps_; |
| 357 } | 358 } |
| 358 int port() const { return port_; } | 359 int port() const { return port_; } |
| (...skipping 2610 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2969 CreateMockWrite(*stream1_syn, 0), CreateMockWrite(*stream2_rst, 3), | 2970 CreateMockWrite(*stream1_syn, 0), CreateMockWrite(*stream2_rst, 3), |
| 2970 }; | 2971 }; |
| 2971 | 2972 |
| 2972 scoped_ptr<SpdyFrame> | 2973 scoped_ptr<SpdyFrame> |
| 2973 stream1_reply(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); | 2974 stream1_reply(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); |
| 2974 scoped_ptr<SpdyHeaderBlock> incomplete_headers(new SpdyHeaderBlock()); | 2975 scoped_ptr<SpdyHeaderBlock> incomplete_headers(new SpdyHeaderBlock()); |
| 2975 (*incomplete_headers)[spdy_util_.GetStatusKey()] = "200 OK"; | 2976 (*incomplete_headers)[spdy_util_.GetStatusKey()] = "200 OK"; |
| 2976 (*incomplete_headers)[spdy_util_.GetVersionKey()] = "HTTP/1.1"; | 2977 (*incomplete_headers)[spdy_util_.GetVersionKey()] = "HTTP/1.1"; |
| 2977 (*incomplete_headers)["hello"] = "bye"; | 2978 (*incomplete_headers)["hello"] = "bye"; |
| 2978 scoped_ptr<SpdyFrame> stream2_syn(spdy_util_.ConstructInitialSpdyPushFrame( | 2979 scoped_ptr<SpdyFrame> stream2_syn(spdy_util_.ConstructInitialSpdyPushFrame( |
| 2979 incomplete_headers.Pass(), 2, 1)); | 2980 std::move(incomplete_headers), 2, 1)); |
| 2980 MockRead reads[] = { | 2981 MockRead reads[] = { |
| 2981 CreateMockRead(*stream1_reply, 1), | 2982 CreateMockRead(*stream1_reply, 1), |
| 2982 CreateMockRead(*stream2_syn, 2), | 2983 CreateMockRead(*stream2_syn, 2), |
| 2983 CreateMockRead(*stream1_body, 4), | 2984 CreateMockRead(*stream1_body, 4), |
| 2984 MockRead(SYNCHRONOUS, ERR_IO_PENDING, 5) // Force a pause | 2985 MockRead(SYNCHRONOUS, ERR_IO_PENDING, 5) // Force a pause |
| 2985 }; | 2986 }; |
| 2986 | 2987 |
| 2987 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); | 2988 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); |
| 2988 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY, | 2989 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY, |
| 2989 BoundNetLog(), GetParam(), NULL); | 2990 BoundNetLog(), GetParam(), NULL); |
| (...skipping 490 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3480 MockRead reads[] = { | 3481 MockRead reads[] = { |
| 3481 CreateMockRead(*resp, 1), | 3482 CreateMockRead(*resp, 1), |
| 3482 }; | 3483 }; |
| 3483 | 3484 |
| 3484 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); | 3485 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); |
| 3485 scoped_ptr<SpdySessionDependencies> session_deps = | 3486 scoped_ptr<SpdySessionDependencies> session_deps = |
| 3486 CreateSpdySessionDependencies(GetParam()); | 3487 CreateSpdySessionDependencies(GetParam()); |
| 3487 session_deps->enable_compression = true; | 3488 session_deps->enable_compression = true; |
| 3488 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY, | 3489 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY, |
| 3489 BoundNetLog(), GetParam(), | 3490 BoundNetLog(), GetParam(), |
| 3490 session_deps.Pass()); | 3491 std::move(session_deps)); |
| 3491 helper.RunToCompletion(&data); | 3492 helper.RunToCompletion(&data); |
| 3492 TransactionHelperResult out = helper.output(); | 3493 TransactionHelperResult out = helper.output(); |
| 3493 EXPECT_EQ(ERR_SPDY_COMPRESSION_ERROR, out.rv); | 3494 EXPECT_EQ(ERR_SPDY_COMPRESSION_ERROR, out.rv); |
| 3494 } | 3495 } |
| 3495 | 3496 |
| 3496 // Test that the NetLog contains good data for a simple GET request. | 3497 // Test that the NetLog contains good data for a simple GET request. |
| 3497 TEST_P(SpdyNetworkTransactionTest, NetLog) { | 3498 TEST_P(SpdyNetworkTransactionTest, NetLog) { |
| 3498 static const char* const kExtraHeaders[] = { | 3499 static const char* const kExtraHeaders[] = { |
| 3499 "user-agent", "Chrome", | 3500 "user-agent", "Chrome", |
| 3500 }; | 3501 }; |
| (...skipping 548 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4049 // Construct the request. | 4050 // Construct the request. |
| 4050 scoped_ptr<SpdyFrame> req( | 4051 scoped_ptr<SpdyFrame> req( |
| 4051 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true)); | 4052 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true)); |
| 4052 MockWrite writes[] = {CreateMockWrite(*req, 0)}; | 4053 MockWrite writes[] = {CreateMockWrite(*req, 0)}; |
| 4053 | 4054 |
| 4054 // Construct the reply. | 4055 // Construct the reply. |
| 4055 scoped_ptr<SpdyHeaderBlock> reply_headers(new SpdyHeaderBlock()); | 4056 scoped_ptr<SpdyHeaderBlock> reply_headers(new SpdyHeaderBlock()); |
| 4056 (*reply_headers)[spdy_util_.GetStatusKey()] = "200"; | 4057 (*reply_headers)[spdy_util_.GetStatusKey()] = "200"; |
| 4057 (*reply_headers)[spdy_util_.GetVersionKey()] = "HTTP/1.1"; | 4058 (*reply_headers)[spdy_util_.GetVersionKey()] = "HTTP/1.1"; |
| 4058 scoped_ptr<SpdyFrame> reply( | 4059 scoped_ptr<SpdyFrame> reply( |
| 4059 spdy_util_.ConstructSpdyFrame(kSynReplyInfo, reply_headers.Pass())); | 4060 spdy_util_.ConstructSpdyFrame(kSynReplyInfo, std::move(reply_headers))); |
| 4060 | 4061 |
| 4061 const SpdySettingsIds kSampleId1 = SETTINGS_UPLOAD_BANDWIDTH; | 4062 const SpdySettingsIds kSampleId1 = SETTINGS_UPLOAD_BANDWIDTH; |
| 4062 unsigned int kSampleValue1 = 0x0a0a0a0a; | 4063 unsigned int kSampleValue1 = 0x0a0a0a0a; |
| 4063 const SpdySettingsIds kSampleId2 = SETTINGS_DOWNLOAD_BANDWIDTH; | 4064 const SpdySettingsIds kSampleId2 = SETTINGS_DOWNLOAD_BANDWIDTH; |
| 4064 unsigned int kSampleValue2 = 0x0b0b0b0b; | 4065 unsigned int kSampleValue2 = 0x0b0b0b0b; |
| 4065 const SpdySettingsIds kSampleId3 = SETTINGS_ROUND_TRIP_TIME; | 4066 const SpdySettingsIds kSampleId3 = SETTINGS_ROUND_TRIP_TIME; |
| 4066 unsigned int kSampleValue3 = 0x0c0c0c0c; | 4067 unsigned int kSampleValue3 = 0x0c0c0c0c; |
| 4067 scoped_ptr<SpdyFrame> settings_frame; | 4068 scoped_ptr<SpdyFrame> settings_frame; |
| 4068 { | 4069 { |
| 4069 // Construct the SETTINGS frame. | 4070 // Construct the SETTINGS frame. |
| (...skipping 130 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4200 CreateMockWrite(*initial_settings_frame, 0), | 4201 CreateMockWrite(*initial_settings_frame, 0), |
| 4201 CreateMockWrite(*settings_frame, 1), | 4202 CreateMockWrite(*settings_frame, 1), |
| 4202 CreateMockWrite(*req, 2), | 4203 CreateMockWrite(*req, 2), |
| 4203 }; | 4204 }; |
| 4204 | 4205 |
| 4205 // Construct the reply. | 4206 // Construct the reply. |
| 4206 scoped_ptr<SpdyHeaderBlock> reply_headers(new SpdyHeaderBlock()); | 4207 scoped_ptr<SpdyHeaderBlock> reply_headers(new SpdyHeaderBlock()); |
| 4207 (*reply_headers)[spdy_util_.GetStatusKey()] = "200"; | 4208 (*reply_headers)[spdy_util_.GetStatusKey()] = "200"; |
| 4208 (*reply_headers)[spdy_util_.GetVersionKey()] = "HTTP/1.1"; | 4209 (*reply_headers)[spdy_util_.GetVersionKey()] = "HTTP/1.1"; |
| 4209 scoped_ptr<SpdyFrame> reply( | 4210 scoped_ptr<SpdyFrame> reply( |
| 4210 spdy_util_.ConstructSpdyFrame(kSynReplyInfo, reply_headers.Pass())); | 4211 spdy_util_.ConstructSpdyFrame(kSynReplyInfo, std::move(reply_headers))); |
| 4211 | 4212 |
| 4212 scoped_ptr<SpdyFrame> body(spdy_util_.ConstructSpdyBodyFrame(1, true)); | 4213 scoped_ptr<SpdyFrame> body(spdy_util_.ConstructSpdyBodyFrame(1, true)); |
| 4213 MockRead reads[] = { | 4214 MockRead reads[] = { |
| 4214 CreateMockRead(*reply, 3), | 4215 CreateMockRead(*reply, 3), |
| 4215 CreateMockRead(*body, 4), | 4216 CreateMockRead(*body, 4), |
| 4216 MockRead(ASYNC, 0, 5) // EOF | 4217 MockRead(ASYNC, 0, 5) // EOF |
| 4217 }; | 4218 }; |
| 4218 | 4219 |
| 4219 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); | 4220 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); |
| 4220 helper.AddData(&data); | 4221 helper.AddData(&data); |
| (...skipping 116 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4337 return; | 4338 return; |
| 4338 | 4339 |
| 4339 HttpRequestInfo request; | 4340 HttpRequestInfo request; |
| 4340 request.method = "GET"; | 4341 request.method = "GET"; |
| 4341 request.url = GURL("https://www.example.org/"); | 4342 request.url = GURL("https://www.example.org/"); |
| 4342 scoped_ptr<SpdySessionDependencies> session_deps( | 4343 scoped_ptr<SpdySessionDependencies> session_deps( |
| 4343 CreateSpdySessionDependencies(GetParam())); | 4344 CreateSpdySessionDependencies(GetParam())); |
| 4344 // Do not force SPDY so that second socket can negotiate HTTP/1.1. | 4345 // Do not force SPDY so that second socket can negotiate HTTP/1.1. |
| 4345 session_deps->next_protos = SpdyNextProtos(); | 4346 session_deps->next_protos = SpdyNextProtos(); |
| 4346 NormalSpdyTransactionHelper helper(request, DEFAULT_PRIORITY, BoundNetLog(), | 4347 NormalSpdyTransactionHelper helper(request, DEFAULT_PRIORITY, BoundNetLog(), |
| 4347 GetParam(), session_deps.Pass()); | 4348 GetParam(), std::move(session_deps)); |
| 4348 | 4349 |
| 4349 // First socket: HTTP/2 request rejected with HTTP_1_1_REQUIRED. | 4350 // First socket: HTTP/2 request rejected with HTTP_1_1_REQUIRED. |
| 4350 const char* url = request.url.spec().c_str(); | 4351 const char* url = request.url.spec().c_str(); |
| 4351 scoped_ptr<SpdyHeaderBlock> headers(spdy_util_.ConstructGetHeaderBlock(url)); | 4352 scoped_ptr<SpdyHeaderBlock> headers(spdy_util_.ConstructGetHeaderBlock(url)); |
| 4352 scoped_ptr<SpdyFrame> req( | 4353 scoped_ptr<SpdyFrame> req( |
| 4353 spdy_util_.ConstructSpdySyn(1, *headers, LOWEST, false, true)); | 4354 spdy_util_.ConstructSpdySyn(1, *headers, LOWEST, false, true)); |
| 4354 MockWrite writes0[] = {CreateMockWrite(*req, 0)}; | 4355 MockWrite writes0[] = {CreateMockWrite(*req, 0)}; |
| 4355 scoped_ptr<SpdyFrame> go_away(spdy_util_.ConstructSpdyGoAway( | 4356 scoped_ptr<SpdyFrame> go_away(spdy_util_.ConstructSpdyGoAway( |
| 4356 0, GOAWAY_HTTP_1_1_REQUIRED, "Try again using HTTP/1.1 please.")); | 4357 0, GOAWAY_HTTP_1_1_REQUIRED, "Try again using HTTP/1.1 please.")); |
| 4357 MockRead reads0[] = {CreateMockRead(*go_away, 1)}; | 4358 MockRead reads0[] = {CreateMockRead(*go_away, 1)}; |
| 4358 SequencedSocketData data0(reads0, arraysize(reads0), writes0, | 4359 SequencedSocketData data0(reads0, arraysize(reads0), writes0, |
| 4359 arraysize(writes0)); | 4360 arraysize(writes0)); |
| 4360 | 4361 |
| 4361 scoped_ptr<SSLSocketDataProvider> ssl_provider0( | 4362 scoped_ptr<SSLSocketDataProvider> ssl_provider0( |
| 4362 new SSLSocketDataProvider(ASYNC, OK)); | 4363 new SSLSocketDataProvider(ASYNC, OK)); |
| 4363 // Expect HTTP/2 protocols too in SSLConfig. | 4364 // Expect HTTP/2 protocols too in SSLConfig. |
| 4364 ssl_provider0->next_protos_expected_in_ssl_config.push_back(kProtoHTTP11); | 4365 ssl_provider0->next_protos_expected_in_ssl_config.push_back(kProtoHTTP11); |
| 4365 ssl_provider0->next_protos_expected_in_ssl_config.push_back(kProtoSPDY31); | 4366 ssl_provider0->next_protos_expected_in_ssl_config.push_back(kProtoSPDY31); |
| 4366 ssl_provider0->next_protos_expected_in_ssl_config.push_back(kProtoHTTP2); | 4367 ssl_provider0->next_protos_expected_in_ssl_config.push_back(kProtoHTTP2); |
| 4367 // Force SPDY. | 4368 // Force SPDY. |
| 4368 ssl_provider0->SetNextProto(GetParam().protocol); | 4369 ssl_provider0->SetNextProto(GetParam().protocol); |
| 4369 helper.AddDataWithSSLSocketDataProvider(&data0, ssl_provider0.Pass()); | 4370 helper.AddDataWithSSLSocketDataProvider(&data0, std::move(ssl_provider0)); |
| 4370 | 4371 |
| 4371 // Second socket: falling back to HTTP/1.1. | 4372 // Second socket: falling back to HTTP/1.1. |
| 4372 MockWrite writes1[] = {MockWrite(ASYNC, 0, | 4373 MockWrite writes1[] = {MockWrite(ASYNC, 0, |
| 4373 "GET / HTTP/1.1\r\n" | 4374 "GET / HTTP/1.1\r\n" |
| 4374 "Host: www.example.org\r\n" | 4375 "Host: www.example.org\r\n" |
| 4375 "Connection: keep-alive\r\n\r\n")}; | 4376 "Connection: keep-alive\r\n\r\n")}; |
| 4376 MockRead reads1[] = {MockRead(ASYNC, 1, | 4377 MockRead reads1[] = {MockRead(ASYNC, 1, |
| 4377 "HTTP/1.1 200 OK\r\n" | 4378 "HTTP/1.1 200 OK\r\n" |
| 4378 "Content-Length: 5\r\n\r\n" | 4379 "Content-Length: 5\r\n\r\n" |
| 4379 "hello")}; | 4380 "hello")}; |
| 4380 SequencedSocketData data1(reads1, arraysize(reads1), writes1, | 4381 SequencedSocketData data1(reads1, arraysize(reads1), writes1, |
| 4381 arraysize(writes1)); | 4382 arraysize(writes1)); |
| 4382 | 4383 |
| 4383 scoped_ptr<SSLSocketDataProvider> ssl_provider1( | 4384 scoped_ptr<SSLSocketDataProvider> ssl_provider1( |
| 4384 new SSLSocketDataProvider(ASYNC, OK)); | 4385 new SSLSocketDataProvider(ASYNC, OK)); |
| 4385 // Expect only HTTP/1.1 protocol in SSLConfig. | 4386 // Expect only HTTP/1.1 protocol in SSLConfig. |
| 4386 ssl_provider1->next_protos_expected_in_ssl_config.push_back(kProtoHTTP11); | 4387 ssl_provider1->next_protos_expected_in_ssl_config.push_back(kProtoHTTP11); |
| 4387 // Force HTTP/1.1. | 4388 // Force HTTP/1.1. |
| 4388 ssl_provider1->SetNextProto(kProtoHTTP11); | 4389 ssl_provider1->SetNextProto(kProtoHTTP11); |
| 4389 helper.AddDataWithSSLSocketDataProvider(&data1, ssl_provider1.Pass()); | 4390 helper.AddDataWithSSLSocketDataProvider(&data1, std::move(ssl_provider1)); |
| 4390 | 4391 |
| 4391 base::WeakPtr<HttpServerProperties> http_server_properties = | 4392 base::WeakPtr<HttpServerProperties> http_server_properties = |
| 4392 helper.session()->spdy_session_pool()->http_server_properties(); | 4393 helper.session()->spdy_session_pool()->http_server_properties(); |
| 4393 const HostPortPair host_port_pair = HostPortPair::FromURL(GURL(url)); | 4394 const HostPortPair host_port_pair = HostPortPair::FromURL(GURL(url)); |
| 4394 EXPECT_FALSE(http_server_properties->RequiresHTTP11(host_port_pair)); | 4395 EXPECT_FALSE(http_server_properties->RequiresHTTP11(host_port_pair)); |
| 4395 | 4396 |
| 4396 helper.RunPreTestSetup(); | 4397 helper.RunPreTestSetup(); |
| 4397 helper.StartDefaultTest(); | 4398 helper.StartDefaultTest(); |
| 4398 helper.FinishDefaultTestWithoutVerification(); | 4399 helper.FinishDefaultTestWithoutVerification(); |
| 4399 helper.VerifyDataConsumed(); | 4400 helper.VerifyDataConsumed(); |
| (...skipping 29 matching lines...) Expand all Loading... |
| 4429 HttpRequestInfo request; | 4430 HttpRequestInfo request; |
| 4430 request.method = "GET"; | 4431 request.method = "GET"; |
| 4431 request.url = GURL("https://www.example.org/"); | 4432 request.url = GURL("https://www.example.org/"); |
| 4432 scoped_ptr<SpdySessionDependencies> session_deps( | 4433 scoped_ptr<SpdySessionDependencies> session_deps( |
| 4433 CreateSpdySessionDependencies( | 4434 CreateSpdySessionDependencies( |
| 4434 GetParam(), | 4435 GetParam(), |
| 4435 ProxyService::CreateFixedFromPacResult("HTTPS myproxy:70"))); | 4436 ProxyService::CreateFixedFromPacResult("HTTPS myproxy:70"))); |
| 4436 // Do not force SPDY so that second socket can negotiate HTTP/1.1. | 4437 // Do not force SPDY so that second socket can negotiate HTTP/1.1. |
| 4437 session_deps->next_protos = SpdyNextProtos(); | 4438 session_deps->next_protos = SpdyNextProtos(); |
| 4438 NormalSpdyTransactionHelper helper(request, DEFAULT_PRIORITY, BoundNetLog(), | 4439 NormalSpdyTransactionHelper helper(request, DEFAULT_PRIORITY, BoundNetLog(), |
| 4439 GetParam(), session_deps.Pass()); | 4440 GetParam(), std::move(session_deps)); |
| 4440 | 4441 |
| 4441 // First socket: HTTP/2 CONNECT rejected with HTTP_1_1_REQUIRED. | 4442 // First socket: HTTP/2 CONNECT rejected with HTTP_1_1_REQUIRED. |
| 4442 scoped_ptr<SpdyFrame> req(spdy_util_.ConstructSpdyConnect( | 4443 scoped_ptr<SpdyFrame> req(spdy_util_.ConstructSpdyConnect( |
| 4443 nullptr, 0, 1, LOWEST, HostPortPair("www.example.org", 443))); | 4444 nullptr, 0, 1, LOWEST, HostPortPair("www.example.org", 443))); |
| 4444 MockWrite writes0[] = {CreateMockWrite(*req, 0)}; | 4445 MockWrite writes0[] = {CreateMockWrite(*req, 0)}; |
| 4445 scoped_ptr<SpdyFrame> go_away(spdy_util_.ConstructSpdyGoAway( | 4446 scoped_ptr<SpdyFrame> go_away(spdy_util_.ConstructSpdyGoAway( |
| 4446 0, GOAWAY_HTTP_1_1_REQUIRED, "Try again using HTTP/1.1 please.")); | 4447 0, GOAWAY_HTTP_1_1_REQUIRED, "Try again using HTTP/1.1 please.")); |
| 4447 MockRead reads0[] = {CreateMockRead(*go_away, 1)}; | 4448 MockRead reads0[] = {CreateMockRead(*go_away, 1)}; |
| 4448 SequencedSocketData data0(reads0, arraysize(reads0), writes0, | 4449 SequencedSocketData data0(reads0, arraysize(reads0), writes0, |
| 4449 arraysize(writes0)); | 4450 arraysize(writes0)); |
| 4450 | 4451 |
| 4451 scoped_ptr<SSLSocketDataProvider> ssl_provider0( | 4452 scoped_ptr<SSLSocketDataProvider> ssl_provider0( |
| 4452 new SSLSocketDataProvider(ASYNC, OK)); | 4453 new SSLSocketDataProvider(ASYNC, OK)); |
| 4453 // Expect HTTP/2 protocols too in SSLConfig. | 4454 // Expect HTTP/2 protocols too in SSLConfig. |
| 4454 ssl_provider0->next_protos_expected_in_ssl_config.push_back(kProtoHTTP11); | 4455 ssl_provider0->next_protos_expected_in_ssl_config.push_back(kProtoHTTP11); |
| 4455 ssl_provider0->next_protos_expected_in_ssl_config.push_back(kProtoSPDY31); | 4456 ssl_provider0->next_protos_expected_in_ssl_config.push_back(kProtoSPDY31); |
| 4456 ssl_provider0->next_protos_expected_in_ssl_config.push_back(kProtoHTTP2); | 4457 ssl_provider0->next_protos_expected_in_ssl_config.push_back(kProtoHTTP2); |
| 4457 // Force SPDY. | 4458 // Force SPDY. |
| 4458 ssl_provider0->SetNextProto(GetParam().protocol); | 4459 ssl_provider0->SetNextProto(GetParam().protocol); |
| 4459 helper.AddDataWithSSLSocketDataProvider(&data0, ssl_provider0.Pass()); | 4460 helper.AddDataWithSSLSocketDataProvider(&data0, std::move(ssl_provider0)); |
| 4460 | 4461 |
| 4461 // Second socket: retry using HTTP/1.1. | 4462 // Second socket: retry using HTTP/1.1. |
| 4462 MockWrite writes1[] = { | 4463 MockWrite writes1[] = { |
| 4463 MockWrite(ASYNC, 0, | 4464 MockWrite(ASYNC, 0, |
| 4464 "CONNECT www.example.org:443 HTTP/1.1\r\n" | 4465 "CONNECT www.example.org:443 HTTP/1.1\r\n" |
| 4465 "Host: www.example.org:443\r\n" | 4466 "Host: www.example.org:443\r\n" |
| 4466 "Proxy-Connection: keep-alive\r\n\r\n"), | 4467 "Proxy-Connection: keep-alive\r\n\r\n"), |
| 4467 MockWrite(ASYNC, 2, | 4468 MockWrite(ASYNC, 2, |
| 4468 "GET / HTTP/1.1\r\n" | 4469 "GET / HTTP/1.1\r\n" |
| 4469 "Host: www.example.org\r\n" | 4470 "Host: www.example.org\r\n" |
| 4470 "Connection: keep-alive\r\n\r\n"), | 4471 "Connection: keep-alive\r\n\r\n"), |
| 4471 }; | 4472 }; |
| 4472 | 4473 |
| 4473 MockRead reads1[] = { | 4474 MockRead reads1[] = { |
| 4474 MockRead(ASYNC, 1, "HTTP/1.1 200 OK\r\n\r\n"), | 4475 MockRead(ASYNC, 1, "HTTP/1.1 200 OK\r\n\r\n"), |
| 4475 MockRead(ASYNC, 3, | 4476 MockRead(ASYNC, 3, |
| 4476 "HTTP/1.1 200 OK\r\n" | 4477 "HTTP/1.1 200 OK\r\n" |
| 4477 "Content-Length: 5\r\n\r\n" | 4478 "Content-Length: 5\r\n\r\n" |
| 4478 "hello"), | 4479 "hello"), |
| 4479 }; | 4480 }; |
| 4480 SequencedSocketData data1(reads1, arraysize(reads1), writes1, | 4481 SequencedSocketData data1(reads1, arraysize(reads1), writes1, |
| 4481 arraysize(writes1)); | 4482 arraysize(writes1)); |
| 4482 | 4483 |
| 4483 scoped_ptr<SSLSocketDataProvider> ssl_provider1( | 4484 scoped_ptr<SSLSocketDataProvider> ssl_provider1( |
| 4484 new SSLSocketDataProvider(ASYNC, OK)); | 4485 new SSLSocketDataProvider(ASYNC, OK)); |
| 4485 // Expect only HTTP/1.1 protocol in SSLConfig. | 4486 // Expect only HTTP/1.1 protocol in SSLConfig. |
| 4486 ssl_provider1->next_protos_expected_in_ssl_config.push_back(kProtoHTTP11); | 4487 ssl_provider1->next_protos_expected_in_ssl_config.push_back(kProtoHTTP11); |
| 4487 // Force HTTP/1.1. | 4488 // Force HTTP/1.1. |
| 4488 ssl_provider1->SetNextProto(kProtoHTTP11); | 4489 ssl_provider1->SetNextProto(kProtoHTTP11); |
| 4489 helper.AddDataWithSSLSocketDataProvider(&data1, ssl_provider1.Pass()); | 4490 helper.AddDataWithSSLSocketDataProvider(&data1, std::move(ssl_provider1)); |
| 4490 | 4491 |
| 4491 // A third socket is needed for the tunnelled connection. | 4492 // A third socket is needed for the tunnelled connection. |
| 4492 scoped_ptr<SSLSocketDataProvider> ssl_provider2( | 4493 scoped_ptr<SSLSocketDataProvider> ssl_provider2( |
| 4493 new SSLSocketDataProvider(ASYNC, OK)); | 4494 new SSLSocketDataProvider(ASYNC, OK)); |
| 4494 helper.session_deps()->socket_factory->AddSSLSocketDataProvider( | 4495 helper.session_deps()->socket_factory->AddSSLSocketDataProvider( |
| 4495 ssl_provider2.get()); | 4496 ssl_provider2.get()); |
| 4496 | 4497 |
| 4497 base::WeakPtr<HttpServerProperties> http_server_properties = | 4498 base::WeakPtr<HttpServerProperties> http_server_properties = |
| 4498 helper.session()->spdy_session_pool()->http_server_properties(); | 4499 helper.session()->spdy_session_pool()->http_server_properties(); |
| 4499 const HostPortPair proxy_host_port_pair = HostPortPair("myproxy", 70); | 4500 const HostPortPair proxy_host_port_pair = HostPortPair("myproxy", 70); |
| (...skipping 184 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4684 // Ensure that this transaction uses the same SpdySessionPool. | 4685 // Ensure that this transaction uses the same SpdySessionPool. |
| 4685 scoped_ptr<HttpNetworkSession> session_proxy( | 4686 scoped_ptr<HttpNetworkSession> session_proxy( |
| 4686 SpdySessionDependencies::SpdyCreateSession(ssd_proxy.get())); | 4687 SpdySessionDependencies::SpdyCreateSession(ssd_proxy.get())); |
| 4687 NormalSpdyTransactionHelper helper_proxy(request_proxy, DEFAULT_PRIORITY, | 4688 NormalSpdyTransactionHelper helper_proxy(request_proxy, DEFAULT_PRIORITY, |
| 4688 BoundNetLog(), GetParam(), NULL); | 4689 BoundNetLog(), GetParam(), NULL); |
| 4689 HttpNetworkSessionPeer session_peer(session_proxy.get()); | 4690 HttpNetworkSessionPeer session_peer(session_proxy.get()); |
| 4690 scoped_ptr<ProxyService> proxy_service( | 4691 scoped_ptr<ProxyService> proxy_service( |
| 4691 ProxyService::CreateFixedFromPacResult("PROXY myproxy:70")); | 4692 ProxyService::CreateFixedFromPacResult("PROXY myproxy:70")); |
| 4692 session_peer.SetProxyService(proxy_service.get()); | 4693 session_peer.SetProxyService(proxy_service.get()); |
| 4693 helper_proxy.session_deps().swap(ssd_proxy); | 4694 helper_proxy.session_deps().swap(ssd_proxy); |
| 4694 helper_proxy.SetSession(session_proxy.Pass()); | 4695 helper_proxy.SetSession(std::move(session_proxy)); |
| 4695 helper_proxy.RunPreTestSetup(); | 4696 helper_proxy.RunPreTestSetup(); |
| 4696 helper_proxy.AddData(data_proxy.get()); | 4697 helper_proxy.AddData(data_proxy.get()); |
| 4697 | 4698 |
| 4698 HttpNetworkTransaction* trans_proxy = helper_proxy.trans(); | 4699 HttpNetworkTransaction* trans_proxy = helper_proxy.trans(); |
| 4699 TestCompletionCallback callback_proxy; | 4700 TestCompletionCallback callback_proxy; |
| 4700 int rv = trans_proxy->Start( | 4701 int rv = trans_proxy->Start( |
| 4701 &request_proxy, callback_proxy.callback(), BoundNetLog()); | 4702 &request_proxy, callback_proxy.callback(), BoundNetLog()); |
| 4702 EXPECT_EQ(ERR_IO_PENDING, rv); | 4703 EXPECT_EQ(ERR_IO_PENDING, rv); |
| 4703 rv = callback_proxy.WaitForResult(); | 4704 rv = callback_proxy.WaitForResult(); |
| 4704 EXPECT_EQ(0, rv); | 4705 EXPECT_EQ(0, rv); |
| (...skipping 251 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4956 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true)); | 4957 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true)); |
| 4957 scoped_ptr<SpdyFrame> stream1_body( | 4958 scoped_ptr<SpdyFrame> stream1_body( |
| 4958 spdy_util_.ConstructSpdyBodyFrame(1, true)); | 4959 spdy_util_.ConstructSpdyBodyFrame(1, true)); |
| 4959 MockWrite writes[] = { | 4960 MockWrite writes[] = { |
| 4960 CreateMockWrite(*stream1_syn, 0), | 4961 CreateMockWrite(*stream1_syn, 0), |
| 4961 }; | 4962 }; |
| 4962 | 4963 |
| 4963 scoped_ptr<SpdyHeaderBlock> initial_headers(new SpdyHeaderBlock()); | 4964 scoped_ptr<SpdyHeaderBlock> initial_headers(new SpdyHeaderBlock()); |
| 4964 spdy_util_.AddUrlToHeaderBlock(GetDefaultUrlWithPath("/foo.dat"), | 4965 spdy_util_.AddUrlToHeaderBlock(GetDefaultUrlWithPath("/foo.dat"), |
| 4965 initial_headers.get()); | 4966 initial_headers.get()); |
| 4966 scoped_ptr<SpdyFrame> stream2_syn( | 4967 scoped_ptr<SpdyFrame> stream2_syn(spdy_util_.ConstructInitialSpdyPushFrame( |
| 4967 spdy_util_.ConstructInitialSpdyPushFrame(initial_headers.Pass(), 2, 1)); | 4968 std::move(initial_headers), 2, 1)); |
| 4968 | 4969 |
| 4969 scoped_ptr<SpdyHeaderBlock> late_headers(new SpdyHeaderBlock()); | 4970 scoped_ptr<SpdyHeaderBlock> late_headers(new SpdyHeaderBlock()); |
| 4970 (*late_headers)[spdy_util_.GetStatusKey()] = "200"; | 4971 (*late_headers)[spdy_util_.GetStatusKey()] = "200"; |
| 4971 (*late_headers)[spdy_util_.GetVersionKey()] = "HTTP/1.1"; | 4972 (*late_headers)[spdy_util_.GetVersionKey()] = "HTTP/1.1"; |
| 4972 (*late_headers)["hello"] = "bye"; | 4973 (*late_headers)["hello"] = "bye"; |
| 4973 scoped_ptr<SpdyFrame> stream2_headers( | 4974 scoped_ptr<SpdyFrame> stream2_headers(spdy_util_.ConstructSpdyControlFrame( |
| 4974 spdy_util_.ConstructSpdyControlFrame(late_headers.Pass(), | 4975 std::move(late_headers), false, 2, LOWEST, HEADERS, CONTROL_FLAG_NONE, |
| 4975 false, | 4976 0)); |
| 4976 2, | |
| 4977 LOWEST, | |
| 4978 HEADERS, | |
| 4979 CONTROL_FLAG_NONE, | |
| 4980 0)); | |
| 4981 | 4977 |
| 4982 scoped_ptr<SpdyFrame> | 4978 scoped_ptr<SpdyFrame> |
| 4983 stream1_reply(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); | 4979 stream1_reply(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); |
| 4984 const char kPushedData[] = "pushed"; | 4980 const char kPushedData[] = "pushed"; |
| 4985 scoped_ptr<SpdyFrame> stream2_body( | 4981 scoped_ptr<SpdyFrame> stream2_body( |
| 4986 spdy_util_.ConstructSpdyBodyFrame( | 4982 spdy_util_.ConstructSpdyBodyFrame( |
| 4987 2, kPushedData, strlen(kPushedData), true)); | 4983 2, kPushedData, strlen(kPushedData), true)); |
| 4988 MockRead reads[] = { | 4984 MockRead reads[] = { |
| 4989 CreateMockRead(*stream1_reply, 1), | 4985 CreateMockRead(*stream1_reply, 1), |
| 4990 CreateMockRead(*stream2_syn, 2), | 4986 CreateMockRead(*stream2_syn, 2), |
| (...skipping 27 matching lines...) Expand all Loading... |
| 5018 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true)); | 5014 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true)); |
| 5019 scoped_ptr<SpdyFrame> stream1_body( | 5015 scoped_ptr<SpdyFrame> stream1_body( |
| 5020 spdy_util_.ConstructSpdyBodyFrame(1, true)); | 5016 spdy_util_.ConstructSpdyBodyFrame(1, true)); |
| 5021 MockWrite writes[] = { | 5017 MockWrite writes[] = { |
| 5022 CreateMockWrite(*stream1_syn, 0, SYNCHRONOUS), | 5018 CreateMockWrite(*stream1_syn, 0, SYNCHRONOUS), |
| 5023 }; | 5019 }; |
| 5024 | 5020 |
| 5025 scoped_ptr<SpdyHeaderBlock> initial_headers(new SpdyHeaderBlock()); | 5021 scoped_ptr<SpdyHeaderBlock> initial_headers(new SpdyHeaderBlock()); |
| 5026 spdy_util_.AddUrlToHeaderBlock(GetDefaultUrlWithPath("/foo.dat"), | 5022 spdy_util_.AddUrlToHeaderBlock(GetDefaultUrlWithPath("/foo.dat"), |
| 5027 initial_headers.get()); | 5023 initial_headers.get()); |
| 5028 scoped_ptr<SpdyFrame> stream2_syn( | 5024 scoped_ptr<SpdyFrame> stream2_syn(spdy_util_.ConstructInitialSpdyPushFrame( |
| 5029 spdy_util_.ConstructInitialSpdyPushFrame(initial_headers.Pass(), 2, 1)); | 5025 std::move(initial_headers), 2, 1)); |
| 5030 | 5026 |
| 5031 scoped_ptr<SpdyHeaderBlock> late_headers(new SpdyHeaderBlock()); | 5027 scoped_ptr<SpdyHeaderBlock> late_headers(new SpdyHeaderBlock()); |
| 5032 (*late_headers)[spdy_util_.GetStatusKey()] = "200"; | 5028 (*late_headers)[spdy_util_.GetStatusKey()] = "200"; |
| 5033 (*late_headers)[spdy_util_.GetVersionKey()] = "HTTP/1.1"; | 5029 (*late_headers)[spdy_util_.GetVersionKey()] = "HTTP/1.1"; |
| 5034 (*late_headers)["hello"] = "bye"; | 5030 (*late_headers)["hello"] = "bye"; |
| 5035 scoped_ptr<SpdyFrame> stream2_headers( | 5031 scoped_ptr<SpdyFrame> stream2_headers(spdy_util_.ConstructSpdyControlFrame( |
| 5036 spdy_util_.ConstructSpdyControlFrame(late_headers.Pass(), | 5032 std::move(late_headers), false, 2, LOWEST, HEADERS, CONTROL_FLAG_NONE, |
| 5037 false, | 5033 0)); |
| 5038 2, | |
| 5039 LOWEST, | |
| 5040 HEADERS, | |
| 5041 CONTROL_FLAG_NONE, | |
| 5042 0)); | |
| 5043 | 5034 |
| 5044 scoped_ptr<SpdyFrame> | 5035 scoped_ptr<SpdyFrame> |
| 5045 stream1_reply(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); | 5036 stream1_reply(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); |
| 5046 const char kPushedData[] = "pushed"; | 5037 const char kPushedData[] = "pushed"; |
| 5047 scoped_ptr<SpdyFrame> stream2_body( | 5038 scoped_ptr<SpdyFrame> stream2_body( |
| 5048 spdy_util_.ConstructSpdyBodyFrame( | 5039 spdy_util_.ConstructSpdyBodyFrame( |
| 5049 2, kPushedData, strlen(kPushedData), true)); | 5040 2, kPushedData, strlen(kPushedData), true)); |
| 5050 MockRead reads[] = { | 5041 MockRead reads[] = { |
| 5051 CreateMockRead(*stream1_reply, 1), CreateMockRead(*stream2_syn, 2), | 5042 CreateMockRead(*stream1_reply, 1), CreateMockRead(*stream2_syn, 2), |
| 5052 CreateMockRead(*stream1_body, 3), MockRead(ASYNC, ERR_IO_PENDING, 4), | 5043 CreateMockRead(*stream1_body, 3), MockRead(ASYNC, ERR_IO_PENDING, 4), |
| (...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5137 CreateMockWrite(*stream1_syn, 0, SYNCHRONOUS), | 5128 CreateMockWrite(*stream1_syn, 0, SYNCHRONOUS), |
| 5138 }; | 5129 }; |
| 5139 | 5130 |
| 5140 scoped_ptr<SpdyHeaderBlock> initial_headers(new SpdyHeaderBlock()); | 5131 scoped_ptr<SpdyHeaderBlock> initial_headers(new SpdyHeaderBlock()); |
| 5141 if (spdy_util_.spdy_version() < HTTP2) { | 5132 if (spdy_util_.spdy_version() < HTTP2) { |
| 5142 // In HTTP/2 PUSH_PROMISE headers won't show up in the response headers. | 5133 // In HTTP/2 PUSH_PROMISE headers won't show up in the response headers. |
| 5143 (*initial_headers)["alpha"] = "beta"; | 5134 (*initial_headers)["alpha"] = "beta"; |
| 5144 } | 5135 } |
| 5145 spdy_util_.AddUrlToHeaderBlock(GetDefaultUrlWithPath("/foo.dat"), | 5136 spdy_util_.AddUrlToHeaderBlock(GetDefaultUrlWithPath("/foo.dat"), |
| 5146 initial_headers.get()); | 5137 initial_headers.get()); |
| 5147 scoped_ptr<SpdyFrame> stream2_syn( | 5138 scoped_ptr<SpdyFrame> stream2_syn(spdy_util_.ConstructInitialSpdyPushFrame( |
| 5148 spdy_util_.ConstructInitialSpdyPushFrame(initial_headers.Pass(), 2, 1)); | 5139 std::move(initial_headers), 2, 1)); |
| 5149 | 5140 |
| 5150 scoped_ptr<SpdyHeaderBlock> middle_headers(new SpdyHeaderBlock()); | 5141 scoped_ptr<SpdyHeaderBlock> middle_headers(new SpdyHeaderBlock()); |
| 5151 (*middle_headers)["hello"] = "bye"; | 5142 (*middle_headers)["hello"] = "bye"; |
| 5152 scoped_ptr<SpdyFrame> stream2_headers1( | 5143 scoped_ptr<SpdyFrame> stream2_headers1(spdy_util_.ConstructSpdyControlFrame( |
| 5153 spdy_util_.ConstructSpdyControlFrame(middle_headers.Pass(), | 5144 std::move(middle_headers), false, 2, LOWEST, HEADERS, CONTROL_FLAG_NONE, |
| 5154 false, | 5145 0)); |
| 5155 2, | |
| 5156 LOWEST, | |
| 5157 HEADERS, | |
| 5158 CONTROL_FLAG_NONE, | |
| 5159 0)); | |
| 5160 | 5146 |
| 5161 scoped_ptr<SpdyHeaderBlock> late_headers(new SpdyHeaderBlock()); | 5147 scoped_ptr<SpdyHeaderBlock> late_headers(new SpdyHeaderBlock()); |
| 5162 (*late_headers)[spdy_util_.GetStatusKey()] = "200"; | 5148 (*late_headers)[spdy_util_.GetStatusKey()] = "200"; |
| 5163 if (spdy_util_.spdy_version() < HTTP2) { | 5149 if (spdy_util_.spdy_version() < HTTP2) { |
| 5164 // HTTP/2 eliminates use of the :version header. | 5150 // HTTP/2 eliminates use of the :version header. |
| 5165 (*late_headers)[spdy_util_.GetVersionKey()] = "HTTP/1.1"; | 5151 (*late_headers)[spdy_util_.GetVersionKey()] = "HTTP/1.1"; |
| 5166 } | 5152 } |
| 5167 scoped_ptr<SpdyFrame> stream2_headers2( | 5153 scoped_ptr<SpdyFrame> stream2_headers2(spdy_util_.ConstructSpdyControlFrame( |
| 5168 spdy_util_.ConstructSpdyControlFrame(late_headers.Pass(), | 5154 std::move(late_headers), false, 2, LOWEST, HEADERS, CONTROL_FLAG_NONE, |
| 5169 false, | 5155 0)); |
| 5170 2, | |
| 5171 LOWEST, | |
| 5172 HEADERS, | |
| 5173 CONTROL_FLAG_NONE, | |
| 5174 0)); | |
| 5175 | 5156 |
| 5176 scoped_ptr<SpdyFrame> | 5157 scoped_ptr<SpdyFrame> |
| 5177 stream1_reply(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); | 5158 stream1_reply(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); |
| 5178 const char kPushedData[] = "pushed"; | 5159 const char kPushedData[] = "pushed"; |
| 5179 scoped_ptr<SpdyFrame> stream2_body( | 5160 scoped_ptr<SpdyFrame> stream2_body( |
| 5180 spdy_util_.ConstructSpdyBodyFrame( | 5161 spdy_util_.ConstructSpdyBodyFrame( |
| 5181 2, kPushedData, strlen(kPushedData), true)); | 5162 2, kPushedData, strlen(kPushedData), true)); |
| 5182 MockRead reads[] = { | 5163 MockRead reads[] = { |
| 5183 CreateMockRead(*stream1_reply, 1), CreateMockRead(*stream2_syn, 2), | 5164 CreateMockRead(*stream1_reply, 1), CreateMockRead(*stream2_syn, 2), |
| 5184 CreateMockRead(*stream1_body, 3), MockRead(ASYNC, ERR_IO_PENDING, 4), | 5165 CreateMockRead(*stream1_body, 3), MockRead(ASYNC, ERR_IO_PENDING, 4), |
| (...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5273 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true)); | 5254 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true)); |
| 5274 scoped_ptr<SpdyFrame> stream1_body( | 5255 scoped_ptr<SpdyFrame> stream1_body( |
| 5275 spdy_util_.ConstructSpdyBodyFrame(1, true)); | 5256 spdy_util_.ConstructSpdyBodyFrame(1, true)); |
| 5276 MockWrite writes[] = { | 5257 MockWrite writes[] = { |
| 5277 CreateMockWrite(*stream1_syn, 0, SYNCHRONOUS), | 5258 CreateMockWrite(*stream1_syn, 0, SYNCHRONOUS), |
| 5278 }; | 5259 }; |
| 5279 | 5260 |
| 5280 scoped_ptr<SpdyHeaderBlock> initial_headers(new SpdyHeaderBlock()); | 5261 scoped_ptr<SpdyHeaderBlock> initial_headers(new SpdyHeaderBlock()); |
| 5281 spdy_util_.AddUrlToHeaderBlock(GetDefaultUrlWithPath("/foo.dat"), | 5262 spdy_util_.AddUrlToHeaderBlock(GetDefaultUrlWithPath("/foo.dat"), |
| 5282 initial_headers.get()); | 5263 initial_headers.get()); |
| 5283 scoped_ptr<SpdyFrame> stream2_syn( | 5264 scoped_ptr<SpdyFrame> stream2_syn(spdy_util_.ConstructInitialSpdyPushFrame( |
| 5284 spdy_util_.ConstructInitialSpdyPushFrame(initial_headers.Pass(), 2, 1)); | 5265 std::move(initial_headers), 2, 1)); |
| 5285 | 5266 |
| 5286 scoped_ptr<SpdyHeaderBlock> middle_headers(new SpdyHeaderBlock()); | 5267 scoped_ptr<SpdyHeaderBlock> middle_headers(new SpdyHeaderBlock()); |
| 5287 (*middle_headers)["hello"] = "bye"; | 5268 (*middle_headers)["hello"] = "bye"; |
| 5288 scoped_ptr<SpdyFrame> stream2_headers1( | 5269 scoped_ptr<SpdyFrame> stream2_headers1(spdy_util_.ConstructSpdyControlFrame( |
| 5289 spdy_util_.ConstructSpdyControlFrame(middle_headers.Pass(), | 5270 std::move(middle_headers), false, 2, LOWEST, HEADERS, CONTROL_FLAG_NONE, |
| 5290 false, | 5271 0)); |
| 5291 2, | |
| 5292 LOWEST, | |
| 5293 HEADERS, | |
| 5294 CONTROL_FLAG_NONE, | |
| 5295 0)); | |
| 5296 | 5272 |
| 5297 scoped_ptr<SpdyFrame> | 5273 scoped_ptr<SpdyFrame> |
| 5298 stream1_reply(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); | 5274 stream1_reply(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); |
| 5299 const char kPushedData[] = "pushed"; | 5275 const char kPushedData[] = "pushed"; |
| 5300 scoped_ptr<SpdyFrame> stream2_body( | 5276 scoped_ptr<SpdyFrame> stream2_body( |
| 5301 spdy_util_.ConstructSpdyBodyFrame( | 5277 spdy_util_.ConstructSpdyBodyFrame( |
| 5302 2, kPushedData, strlen(kPushedData), true)); | 5278 2, kPushedData, strlen(kPushedData), true)); |
| 5303 MockRead reads[] = { | 5279 MockRead reads[] = { |
| 5304 CreateMockRead(*stream1_reply, 1), CreateMockRead(*stream2_syn, 2), | 5280 CreateMockRead(*stream1_reply, 1), CreateMockRead(*stream2_syn, 2), |
| 5305 CreateMockRead(*stream1_body, 3), MockRead(ASYNC, ERR_IO_PENDING, 4), | 5281 CreateMockRead(*stream1_body, 3), MockRead(ASYNC, ERR_IO_PENDING, 4), |
| (...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5375 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_PROTOCOL_ERROR)); | 5351 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_PROTOCOL_ERROR)); |
| 5376 MockWrite writes[] = { | 5352 MockWrite writes[] = { |
| 5377 CreateMockWrite(*req, 0), CreateMockWrite(*rst, 4), | 5353 CreateMockWrite(*req, 0), CreateMockWrite(*rst, 4), |
| 5378 }; | 5354 }; |
| 5379 | 5355 |
| 5380 scoped_ptr<SpdyFrame> stream1_reply( | 5356 scoped_ptr<SpdyFrame> stream1_reply( |
| 5381 spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); | 5357 spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); |
| 5382 | 5358 |
| 5383 scoped_ptr<SpdyHeaderBlock> late_headers(new SpdyHeaderBlock()); | 5359 scoped_ptr<SpdyHeaderBlock> late_headers(new SpdyHeaderBlock()); |
| 5384 (*late_headers)["hello"] = "bye"; | 5360 (*late_headers)["hello"] = "bye"; |
| 5385 scoped_ptr<SpdyFrame> stream1_headers( | 5361 scoped_ptr<SpdyFrame> stream1_headers(spdy_util_.ConstructSpdyControlFrame( |
| 5386 spdy_util_.ConstructSpdyControlFrame(late_headers.Pass(), | 5362 std::move(late_headers), false, 1, LOWEST, HEADERS, CONTROL_FLAG_NONE, |
| 5387 false, | 5363 0)); |
| 5388 1, | |
| 5389 LOWEST, | |
| 5390 HEADERS, | |
| 5391 CONTROL_FLAG_NONE, | |
| 5392 0)); | |
| 5393 scoped_ptr<SpdyFrame> stream1_body( | 5364 scoped_ptr<SpdyFrame> stream1_body( |
| 5394 spdy_util_.ConstructSpdyBodyFrame(1, true)); | 5365 spdy_util_.ConstructSpdyBodyFrame(1, true)); |
| 5395 MockRead reads[] = { | 5366 MockRead reads[] = { |
| 5396 CreateMockRead(*stream1_reply, 1), | 5367 CreateMockRead(*stream1_reply, 1), |
| 5397 CreateMockRead(*stream1_headers, 2), | 5368 CreateMockRead(*stream1_headers, 2), |
| 5398 CreateMockRead(*stream1_body, 3), | 5369 CreateMockRead(*stream1_body, 3), |
| 5399 MockRead(ASYNC, 0, 5) // EOF | 5370 MockRead(ASYNC, 0, 5) // EOF |
| 5400 }; | 5371 }; |
| 5401 | 5372 |
| 5402 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); | 5373 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); |
| (...skipping 14 matching lines...) Expand all Loading... |
| 5417 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_PROTOCOL_ERROR)); | 5388 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_PROTOCOL_ERROR)); |
| 5418 MockWrite writes[] = { | 5389 MockWrite writes[] = { |
| 5419 CreateMockWrite(*req, 0), CreateMockWrite(*rst, 5), | 5390 CreateMockWrite(*req, 0), CreateMockWrite(*rst, 5), |
| 5420 }; | 5391 }; |
| 5421 | 5392 |
| 5422 scoped_ptr<SpdyFrame> stream1_reply( | 5393 scoped_ptr<SpdyFrame> stream1_reply( |
| 5423 spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); | 5394 spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); |
| 5424 | 5395 |
| 5425 scoped_ptr<SpdyHeaderBlock> late_headers(new SpdyHeaderBlock()); | 5396 scoped_ptr<SpdyHeaderBlock> late_headers(new SpdyHeaderBlock()); |
| 5426 (*late_headers)["hello"] = "bye"; | 5397 (*late_headers)["hello"] = "bye"; |
| 5427 scoped_ptr<SpdyFrame> stream1_headers( | 5398 scoped_ptr<SpdyFrame> stream1_headers(spdy_util_.ConstructSpdyControlFrame( |
| 5428 spdy_util_.ConstructSpdyControlFrame(late_headers.Pass(), | 5399 std::move(late_headers), false, 1, LOWEST, HEADERS, CONTROL_FLAG_NONE, |
| 5429 false, | 5400 0)); |
| 5430 1, | |
| 5431 LOWEST, | |
| 5432 HEADERS, | |
| 5433 CONTROL_FLAG_NONE, | |
| 5434 0)); | |
| 5435 scoped_ptr<SpdyFrame> stream1_body( | 5401 scoped_ptr<SpdyFrame> stream1_body( |
| 5436 spdy_util_.ConstructSpdyBodyFrame(1, false)); | 5402 spdy_util_.ConstructSpdyBodyFrame(1, false)); |
| 5437 scoped_ptr<SpdyFrame> stream1_body2( | 5403 scoped_ptr<SpdyFrame> stream1_body2( |
| 5438 spdy_util_.ConstructSpdyBodyFrame(1, true)); | 5404 spdy_util_.ConstructSpdyBodyFrame(1, true)); |
| 5439 MockRead reads[] = { | 5405 MockRead reads[] = { |
| 5440 CreateMockRead(*stream1_reply, 1), CreateMockRead(*stream1_body, 2), | 5406 CreateMockRead(*stream1_reply, 1), CreateMockRead(*stream1_body, 2), |
| 5441 CreateMockRead(*stream1_headers, 3), CreateMockRead(*stream1_body2, 4), | 5407 CreateMockRead(*stream1_headers, 3), CreateMockRead(*stream1_body2, 4), |
| 5442 MockRead(ASYNC, 0, 6) // EOF | 5408 MockRead(ASYNC, 0, 6) // EOF |
| 5443 }; | 5409 }; |
| 5444 | 5410 |
| (...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5525 request.method = "GET"; | 5491 request.method = "GET"; |
| 5526 request.url = GURL(url_to_fetch); | 5492 request.url = GURL(url_to_fetch); |
| 5527 request.load_flags = 0; | 5493 request.load_flags = 0; |
| 5528 | 5494 |
| 5529 // Enable cross-origin push. Since we are not using a proxy, this should | 5495 // Enable cross-origin push. Since we are not using a proxy, this should |
| 5530 // not actually enable cross-origin SPDY push. | 5496 // not actually enable cross-origin SPDY push. |
| 5531 scoped_ptr<SpdySessionDependencies> session_deps( | 5497 scoped_ptr<SpdySessionDependencies> session_deps( |
| 5532 CreateSpdySessionDependencies(GetParam())); | 5498 CreateSpdySessionDependencies(GetParam())); |
| 5533 session_deps->trusted_spdy_proxy = "123.45.67.89:8080"; | 5499 session_deps->trusted_spdy_proxy = "123.45.67.89:8080"; |
| 5534 NormalSpdyTransactionHelper helper(request, DEFAULT_PRIORITY, BoundNetLog(), | 5500 NormalSpdyTransactionHelper helper(request, DEFAULT_PRIORITY, BoundNetLog(), |
| 5535 GetParam(), session_deps.Pass()); | 5501 GetParam(), std::move(session_deps)); |
| 5536 helper.RunPreTestSetup(); | 5502 helper.RunPreTestSetup(); |
| 5537 helper.AddData(&data); | 5503 helper.AddData(&data); |
| 5538 | 5504 |
| 5539 HttpNetworkTransaction* trans = helper.trans(); | 5505 HttpNetworkTransaction* trans = helper.trans(); |
| 5540 | 5506 |
| 5541 // Start the transaction with basic parameters. | 5507 // Start the transaction with basic parameters. |
| 5542 TestCompletionCallback callback; | 5508 TestCompletionCallback callback; |
| 5543 | 5509 |
| 5544 int rv = trans->Start(&request, callback.callback(), BoundNetLog()); | 5510 int rv = trans->Start(&request, callback.callback(), BoundNetLog()); |
| 5545 EXPECT_EQ(ERR_IO_PENDING, rv); | 5511 EXPECT_EQ(ERR_IO_PENDING, rv); |
| (...skipping 837 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6383 } | 6349 } |
| 6384 | 6350 |
| 6385 TEST_P(SpdyNetworkTransactionTest, GoAwayOnOddPushStreamId) { | 6351 TEST_P(SpdyNetworkTransactionTest, GoAwayOnOddPushStreamId) { |
| 6386 if (spdy_util_.spdy_version() < SPDY3) | 6352 if (spdy_util_.spdy_version() < SPDY3) |
| 6387 return; | 6353 return; |
| 6388 | 6354 |
| 6389 scoped_ptr<SpdyHeaderBlock> push_headers(new SpdyHeaderBlock); | 6355 scoped_ptr<SpdyHeaderBlock> push_headers(new SpdyHeaderBlock); |
| 6390 spdy_util_.AddUrlToHeaderBlock("http://www.example.org/a.dat", | 6356 spdy_util_.AddUrlToHeaderBlock("http://www.example.org/a.dat", |
| 6391 push_headers.get()); | 6357 push_headers.get()); |
| 6392 scoped_ptr<SpdyFrame> push( | 6358 scoped_ptr<SpdyFrame> push( |
| 6393 spdy_util_.ConstructInitialSpdyPushFrame(push_headers.Pass(), 3, 1)); | 6359 spdy_util_.ConstructInitialSpdyPushFrame(std::move(push_headers), 3, 1)); |
| 6394 MockRead reads[] = {CreateMockRead(*push, 1)}; | 6360 MockRead reads[] = {CreateMockRead(*push, 1)}; |
| 6395 | 6361 |
| 6396 scoped_ptr<SpdyFrame> req( | 6362 scoped_ptr<SpdyFrame> req( |
| 6397 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true)); | 6363 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true)); |
| 6398 scoped_ptr<SpdyFrame> goaway(spdy_util_.ConstructSpdyGoAway( | 6364 scoped_ptr<SpdyFrame> goaway(spdy_util_.ConstructSpdyGoAway( |
| 6399 0, GOAWAY_PROTOCOL_ERROR, "Odd push stream id.")); | 6365 0, GOAWAY_PROTOCOL_ERROR, "Odd push stream id.")); |
| 6400 MockWrite writes[] = { | 6366 MockWrite writes[] = { |
| 6401 CreateMockWrite(*req, 0), CreateMockWrite(*goaway, 2), | 6367 CreateMockWrite(*req, 0), CreateMockWrite(*goaway, 2), |
| 6402 }; | 6368 }; |
| 6403 | 6369 |
| 6404 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); | 6370 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); |
| 6405 NormalSpdyTransactionHelper helper( | 6371 NormalSpdyTransactionHelper helper( |
| 6406 CreateGetRequest(), DEFAULT_PRIORITY, BoundNetLog(), GetParam(), NULL); | 6372 CreateGetRequest(), DEFAULT_PRIORITY, BoundNetLog(), GetParam(), NULL); |
| 6407 helper.RunToCompletion(&data); | 6373 helper.RunToCompletion(&data); |
| 6408 TransactionHelperResult out = helper.output(); | 6374 TransactionHelperResult out = helper.output(); |
| 6409 EXPECT_EQ(ERR_SPDY_PROTOCOL_ERROR, out.rv); | 6375 EXPECT_EQ(ERR_SPDY_PROTOCOL_ERROR, out.rv); |
| 6410 } | 6376 } |
| 6411 | 6377 |
| 6412 TEST_P(SpdyNetworkTransactionTest, | 6378 TEST_P(SpdyNetworkTransactionTest, |
| 6413 GoAwayOnPushStreamIdLesserOrEqualThanLastAccepted) { | 6379 GoAwayOnPushStreamIdLesserOrEqualThanLastAccepted) { |
| 6414 if (spdy_util_.spdy_version() < SPDY3) | 6380 if (spdy_util_.spdy_version() < SPDY3) |
| 6415 return; | 6381 return; |
| 6416 | 6382 |
| 6417 scoped_ptr<SpdyFrame> push_a(spdy_util_.ConstructSpdyPush( | 6383 scoped_ptr<SpdyFrame> push_a(spdy_util_.ConstructSpdyPush( |
| 6418 NULL, 0, 4, 1, GetDefaultUrlWithPath("/a.dat").c_str())); | 6384 NULL, 0, 4, 1, GetDefaultUrlWithPath("/a.dat").c_str())); |
| 6419 scoped_ptr<SpdyHeaderBlock> push_b_headers(new SpdyHeaderBlock); | 6385 scoped_ptr<SpdyHeaderBlock> push_b_headers(new SpdyHeaderBlock); |
| 6420 spdy_util_.AddUrlToHeaderBlock(GetDefaultUrlWithPath("/b.dat"), | 6386 spdy_util_.AddUrlToHeaderBlock(GetDefaultUrlWithPath("/b.dat"), |
| 6421 push_b_headers.get()); | 6387 push_b_headers.get()); |
| 6422 scoped_ptr<SpdyFrame> push_b( | 6388 scoped_ptr<SpdyFrame> push_b(spdy_util_.ConstructInitialSpdyPushFrame( |
| 6423 spdy_util_.ConstructInitialSpdyPushFrame(push_b_headers.Pass(), 2, 1)); | 6389 std::move(push_b_headers), 2, 1)); |
| 6424 MockRead reads[] = { | 6390 MockRead reads[] = { |
| 6425 CreateMockRead(*push_a, 1), CreateMockRead(*push_b, 2), | 6391 CreateMockRead(*push_a, 1), CreateMockRead(*push_b, 2), |
| 6426 }; | 6392 }; |
| 6427 | 6393 |
| 6428 scoped_ptr<SpdyFrame> req( | 6394 scoped_ptr<SpdyFrame> req( |
| 6429 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true)); | 6395 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true)); |
| 6430 scoped_ptr<SpdyFrame> goaway(spdy_util_.ConstructSpdyGoAway( | 6396 scoped_ptr<SpdyFrame> goaway(spdy_util_.ConstructSpdyGoAway( |
| 6431 4, | 6397 4, |
| 6432 GOAWAY_PROTOCOL_ERROR, | 6398 GOAWAY_PROTOCOL_ERROR, |
| 6433 "New push stream id must be greater than the last accepted.")); | 6399 "New push stream id must be greater than the last accepted.")); |
| (...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6500 MockRead(ASYNC, 0, 3) // EOF | 6466 MockRead(ASYNC, 0, 3) // EOF |
| 6501 }; | 6467 }; |
| 6502 | 6468 |
| 6503 SequencedSocketData data(reads, arraysize(reads), writes, | 6469 SequencedSocketData data(reads, arraysize(reads), writes, |
| 6504 arraysize(writes)); | 6470 arraysize(writes)); |
| 6505 HttpRequestInfo request; | 6471 HttpRequestInfo request; |
| 6506 request.method = "GET"; | 6472 request.method = "GET"; |
| 6507 request.url = GURL("https://www.example.org/"); | 6473 request.url = GURL("https://www.example.org/"); |
| 6508 NormalSpdyTransactionHelper helper( | 6474 NormalSpdyTransactionHelper helper( |
| 6509 request, DEFAULT_PRIORITY, BoundNetLog(), GetParam(), NULL); | 6475 request, DEFAULT_PRIORITY, BoundNetLog(), GetParam(), NULL); |
| 6510 helper.RunToCompletionWithSSLData(&data, ssl_provider.Pass()); | 6476 helper.RunToCompletionWithSSLData(&data, std::move(ssl_provider)); |
| 6511 TransactionHelperResult out = helper.output(); | 6477 TransactionHelperResult out = helper.output(); |
| 6512 EXPECT_EQ(OK, out.rv); | 6478 EXPECT_EQ(OK, out.rv); |
| 6513 EXPECT_EQ("HTTP/1.1 200", out.status_line); | 6479 EXPECT_EQ("HTTP/1.1 200", out.status_line); |
| 6514 EXPECT_EQ("hello!", out.response_data); | 6480 EXPECT_EQ("hello!", out.response_data); |
| 6515 } | 6481 } |
| 6516 }; | 6482 }; |
| 6517 | 6483 |
| 6518 //----------------------------------------------------------------------------- | 6484 //----------------------------------------------------------------------------- |
| 6519 // All tests are run with three different connection types: SPDY after NPN | 6485 // All tests are run with three different connection types: SPDY after NPN |
| 6520 // negotiation, SPDY without SSL, and SPDY with SSL. | 6486 // negotiation, SPDY without SSL, and SPDY with SSL. |
| 6521 // | 6487 // |
| 6522 // TODO(akalin): Use ::testing::Combine() when we are able to use | 6488 // TODO(akalin): Use ::testing::Combine() when we are able to use |
| 6523 // <tr1/tuple>. | 6489 // <tr1/tuple>. |
| 6524 INSTANTIATE_TEST_CASE_P( | 6490 INSTANTIATE_TEST_CASE_P( |
| 6525 Spdy, | 6491 Spdy, |
| 6526 SpdyNetworkTransactionNoTLSUsageCheckTest, | 6492 SpdyNetworkTransactionNoTLSUsageCheckTest, |
| 6527 ::testing::Values(SpdyNetworkTransactionTestParams(kProtoSPDY31, | 6493 ::testing::Values(SpdyNetworkTransactionTestParams(kProtoSPDY31, |
| 6528 HTTPS_SPDY_VIA_NPN, | 6494 HTTPS_SPDY_VIA_NPN, |
| 6529 false))); | 6495 false))); |
| 6530 | 6496 |
| 6531 TEST_P(SpdyNetworkTransactionNoTLSUsageCheckTest, TLSVersionTooOld) { | 6497 TEST_P(SpdyNetworkTransactionNoTLSUsageCheckTest, TLSVersionTooOld) { |
| 6532 scoped_ptr<SSLSocketDataProvider> ssl_provider( | 6498 scoped_ptr<SSLSocketDataProvider> ssl_provider( |
| 6533 new SSLSocketDataProvider(ASYNC, OK)); | 6499 new SSLSocketDataProvider(ASYNC, OK)); |
| 6534 SSLConnectionStatusSetVersion(SSL_CONNECTION_VERSION_SSL3, | 6500 SSLConnectionStatusSetVersion(SSL_CONNECTION_VERSION_SSL3, |
| 6535 &ssl_provider->connection_status); | 6501 &ssl_provider->connection_status); |
| 6536 | 6502 |
| 6537 RunNoTLSUsageCheckTest(ssl_provider.Pass()); | 6503 RunNoTLSUsageCheckTest(std::move(ssl_provider)); |
| 6538 } | 6504 } |
| 6539 | 6505 |
| 6540 TEST_P(SpdyNetworkTransactionNoTLSUsageCheckTest, TLSCipherSuiteSucky) { | 6506 TEST_P(SpdyNetworkTransactionNoTLSUsageCheckTest, TLSCipherSuiteSucky) { |
| 6541 scoped_ptr<SSLSocketDataProvider> ssl_provider( | 6507 scoped_ptr<SSLSocketDataProvider> ssl_provider( |
| 6542 new SSLSocketDataProvider(ASYNC, OK)); | 6508 new SSLSocketDataProvider(ASYNC, OK)); |
| 6543 // Set to TLS_RSA_WITH_NULL_MD5 | 6509 // Set to TLS_RSA_WITH_NULL_MD5 |
| 6544 SSLConnectionStatusSetCipherSuite(0x1, &ssl_provider->connection_status); | 6510 SSLConnectionStatusSetCipherSuite(0x1, &ssl_provider->connection_status); |
| 6545 | 6511 |
| 6546 RunNoTLSUsageCheckTest(ssl_provider.Pass()); | 6512 RunNoTLSUsageCheckTest(std::move(ssl_provider)); |
| 6547 } | 6513 } |
| 6548 | 6514 |
| 6549 class SpdyNetworkTransactionTLSUsageCheckTest | 6515 class SpdyNetworkTransactionTLSUsageCheckTest |
| 6550 : public SpdyNetworkTransactionTest { | 6516 : public SpdyNetworkTransactionTest { |
| 6551 protected: | 6517 protected: |
| 6552 void RunTLSUsageCheckTest(scoped_ptr<SSLSocketDataProvider> ssl_provider) { | 6518 void RunTLSUsageCheckTest(scoped_ptr<SSLSocketDataProvider> ssl_provider) { |
| 6553 scoped_ptr<SpdyFrame> goaway( | 6519 scoped_ptr<SpdyFrame> goaway( |
| 6554 spdy_util_.ConstructSpdyGoAway(0, GOAWAY_INADEQUATE_SECURITY, "")); | 6520 spdy_util_.ConstructSpdyGoAway(0, GOAWAY_INADEQUATE_SECURITY, "")); |
| 6555 MockWrite writes[] = {CreateMockWrite(*goaway)}; | 6521 MockWrite writes[] = {CreateMockWrite(*goaway)}; |
| 6556 | 6522 |
| 6557 StaticSocketDataProvider data(NULL, 0, writes, arraysize(writes)); | 6523 StaticSocketDataProvider data(NULL, 0, writes, arraysize(writes)); |
| 6558 HttpRequestInfo request; | 6524 HttpRequestInfo request; |
| 6559 request.method = "GET"; | 6525 request.method = "GET"; |
| 6560 request.url = GURL("https://www.example.org/"); | 6526 request.url = GURL("https://www.example.org/"); |
| 6561 NormalSpdyTransactionHelper helper( | 6527 NormalSpdyTransactionHelper helper( |
| 6562 request, DEFAULT_PRIORITY, BoundNetLog(), GetParam(), NULL); | 6528 request, DEFAULT_PRIORITY, BoundNetLog(), GetParam(), NULL); |
| 6563 helper.RunToCompletionWithSSLData(&data, ssl_provider.Pass()); | 6529 helper.RunToCompletionWithSSLData(&data, std::move(ssl_provider)); |
| 6564 TransactionHelperResult out = helper.output(); | 6530 TransactionHelperResult out = helper.output(); |
| 6565 EXPECT_EQ(ERR_SPDY_INADEQUATE_TRANSPORT_SECURITY, out.rv); | 6531 EXPECT_EQ(ERR_SPDY_INADEQUATE_TRANSPORT_SECURITY, out.rv); |
| 6566 } | 6532 } |
| 6567 }; | 6533 }; |
| 6568 | 6534 |
| 6569 INSTANTIATE_TEST_CASE_P( | 6535 INSTANTIATE_TEST_CASE_P( |
| 6570 Spdy, | 6536 Spdy, |
| 6571 SpdyNetworkTransactionTLSUsageCheckTest, | 6537 SpdyNetworkTransactionTLSUsageCheckTest, |
| 6572 ::testing::Values(SpdyNetworkTransactionTestParams(kProtoHTTP2, | 6538 ::testing::Values(SpdyNetworkTransactionTestParams(kProtoHTTP2, |
| 6573 HTTPS_SPDY_VIA_NPN, | 6539 HTTPS_SPDY_VIA_NPN, |
| 6574 false), | 6540 false), |
| 6575 SpdyNetworkTransactionTestParams(kProtoHTTP2, | 6541 SpdyNetworkTransactionTestParams(kProtoHTTP2, |
| 6576 HTTPS_SPDY_VIA_NPN, | 6542 HTTPS_SPDY_VIA_NPN, |
| 6577 true))); | 6543 true))); |
| 6578 | 6544 |
| 6579 TEST_P(SpdyNetworkTransactionTLSUsageCheckTest, TLSVersionTooOld) { | 6545 TEST_P(SpdyNetworkTransactionTLSUsageCheckTest, TLSVersionTooOld) { |
| 6580 scoped_ptr<SSLSocketDataProvider> ssl_provider( | 6546 scoped_ptr<SSLSocketDataProvider> ssl_provider( |
| 6581 new SSLSocketDataProvider(ASYNC, OK)); | 6547 new SSLSocketDataProvider(ASYNC, OK)); |
| 6582 SSLConnectionStatusSetVersion(SSL_CONNECTION_VERSION_SSL3, | 6548 SSLConnectionStatusSetVersion(SSL_CONNECTION_VERSION_SSL3, |
| 6583 &ssl_provider->connection_status); | 6549 &ssl_provider->connection_status); |
| 6584 | 6550 |
| 6585 RunTLSUsageCheckTest(ssl_provider.Pass()); | 6551 RunTLSUsageCheckTest(std::move(ssl_provider)); |
| 6586 } | 6552 } |
| 6587 | 6553 |
| 6588 TEST_P(SpdyNetworkTransactionTLSUsageCheckTest, TLSCipherSuiteSucky) { | 6554 TEST_P(SpdyNetworkTransactionTLSUsageCheckTest, TLSCipherSuiteSucky) { |
| 6589 scoped_ptr<SSLSocketDataProvider> ssl_provider( | 6555 scoped_ptr<SSLSocketDataProvider> ssl_provider( |
| 6590 new SSLSocketDataProvider(ASYNC, OK)); | 6556 new SSLSocketDataProvider(ASYNC, OK)); |
| 6591 // Set to TLS_RSA_WITH_NULL_MD5 | 6557 // Set to TLS_RSA_WITH_NULL_MD5 |
| 6592 SSLConnectionStatusSetCipherSuite(0x1, &ssl_provider->connection_status); | 6558 SSLConnectionStatusSetCipherSuite(0x1, &ssl_provider->connection_status); |
| 6593 | 6559 |
| 6594 RunTLSUsageCheckTest(ssl_provider.Pass()); | 6560 RunTLSUsageCheckTest(std::move(ssl_provider)); |
| 6595 } | 6561 } |
| 6596 | 6562 |
| 6597 } // namespace net | 6563 } // namespace net |
| OLD | NEW |