| 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 <cmath> | 5 #include <cmath> |
| 6 #include <memory> | 6 #include <memory> |
| 7 #include <string> | |
| 8 #include <utility> | 7 #include <utility> |
| 9 #include <vector> | 8 #include <vector> |
| 10 | 9 |
| 11 #include "base/bind.h" | 10 #include "base/bind.h" |
| 12 #include "base/bind_helpers.h" | 11 #include "base/bind_helpers.h" |
| 13 #include "base/files/file_util.h" | 12 #include "base/files/file_util.h" |
| 14 #include "base/files/scoped_temp_dir.h" | 13 #include "base/files/scoped_temp_dir.h" |
| 15 #include "base/memory/ptr_util.h" | 14 #include "base/memory/ptr_util.h" |
| 16 #include "base/run_loop.h" | 15 #include "base/run_loop.h" |
| 17 #include "base/test/test_file_util.h" | 16 #include "base/test/test_file_util.h" |
| (...skipping 14 matching lines...) Expand all Loading... |
| 32 #include "net/http/http_transaction_test_util.h" | 31 #include "net/http/http_transaction_test_util.h" |
| 33 #include "net/log/net_log_event_type.h" | 32 #include "net/log/net_log_event_type.h" |
| 34 #include "net/log/net_log_with_source.h" | 33 #include "net/log/net_log_with_source.h" |
| 35 #include "net/log/test_net_log.h" | 34 #include "net/log/test_net_log.h" |
| 36 #include "net/log/test_net_log_entry.h" | 35 #include "net/log/test_net_log_entry.h" |
| 37 #include "net/log/test_net_log_util.h" | 36 #include "net/log/test_net_log_util.h" |
| 38 #include "net/proxy/proxy_server.h" | 37 #include "net/proxy/proxy_server.h" |
| 39 #include "net/socket/client_socket_pool_base.h" | 38 #include "net/socket/client_socket_pool_base.h" |
| 40 #include "net/socket/next_proto.h" | 39 #include "net/socket/next_proto.h" |
| 41 #include "net/spdy/buffered_spdy_framer.h" | 40 #include "net/spdy/buffered_spdy_framer.h" |
| 41 #include "net/spdy/platform/api/spdy_string.h" |
| 42 #include "net/spdy/platform/api/spdy_string_piece.h" | 42 #include "net/spdy/platform/api/spdy_string_piece.h" |
| 43 #include "net/spdy/spdy_http_stream.h" | 43 #include "net/spdy/spdy_http_stream.h" |
| 44 #include "net/spdy/spdy_http_utils.h" | 44 #include "net/spdy/spdy_http_utils.h" |
| 45 #include "net/spdy/spdy_protocol.h" | 45 #include "net/spdy/spdy_protocol.h" |
| 46 #include "net/spdy/spdy_session.h" | 46 #include "net/spdy/spdy_session.h" |
| 47 #include "net/spdy/spdy_session_pool.h" | 47 #include "net/spdy/spdy_session_pool.h" |
| 48 #include "net/spdy/spdy_test_util_common.h" | 48 #include "net/spdy/spdy_test_util_common.h" |
| 49 #include "net/spdy/spdy_test_utils.h" | 49 #include "net/spdy/spdy_test_utils.h" |
| 50 #include "net/ssl/ssl_connection_status_flags.h" | 50 #include "net/ssl/ssl_connection_status_flags.h" |
| 51 #include "net/test/cert_test_util.h" | 51 #include "net/test/cert_test_util.h" |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 86 | 86 |
| 87 void SetUp() override { | 87 void SetUp() override { |
| 88 get_request_initialized_ = false; | 88 get_request_initialized_ = false; |
| 89 post_request_initialized_ = false; | 89 post_request_initialized_ = false; |
| 90 chunked_post_request_initialized_ = false; | 90 chunked_post_request_initialized_ = false; |
| 91 ASSERT_TRUE(temp_dir_.CreateUniqueTempDir()); | 91 ASSERT_TRUE(temp_dir_.CreateUniqueTempDir()); |
| 92 } | 92 } |
| 93 | 93 |
| 94 struct TransactionHelperResult { | 94 struct TransactionHelperResult { |
| 95 int rv; | 95 int rv; |
| 96 std::string status_line; | 96 SpdyString status_line; |
| 97 std::string response_data; | 97 SpdyString response_data; |
| 98 HttpResponseInfo response_info; | 98 HttpResponseInfo response_info; |
| 99 }; | 99 }; |
| 100 | 100 |
| 101 // A helper class that handles all the initial npn/ssl setup. | 101 // A helper class that handles all the initial npn/ssl setup. |
| 102 class NormalSpdyTransactionHelper { | 102 class NormalSpdyTransactionHelper { |
| 103 public: | 103 public: |
| 104 NormalSpdyTransactionHelper( | 104 NormalSpdyTransactionHelper( |
| 105 const HttpRequestInfo& request, | 105 const HttpRequestInfo& request, |
| 106 RequestPriority priority, | 106 RequestPriority priority, |
| 107 const NetLogWithSource& log, | 107 const NetLogWithSource& log, |
| (...skipping 292 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 400 upload_chunked_data_stream_.get(); | 400 upload_chunked_data_stream_.get(); |
| 401 chunked_post_request_initialized_ = true; | 401 chunked_post_request_initialized_ = true; |
| 402 } | 402 } |
| 403 return chunked_post_request_; | 403 return chunked_post_request_; |
| 404 } | 404 } |
| 405 | 405 |
| 406 // Read the result of a particular transaction, knowing that we've got | 406 // Read the result of a particular transaction, knowing that we've got |
| 407 // multiple transactions in the read pipeline; so as we read, we may have | 407 // multiple transactions in the read pipeline; so as we read, we may have |
| 408 // to skip over data destined for other transactions while we consume | 408 // to skip over data destined for other transactions while we consume |
| 409 // the data for |trans|. | 409 // the data for |trans|. |
| 410 int ReadResult(HttpNetworkTransaction* trans, | 410 int ReadResult(HttpNetworkTransaction* trans, SpdyString* result) { |
| 411 std::string* result) { | |
| 412 const int kSize = 3000; | 411 const int kSize = 3000; |
| 413 | 412 |
| 414 int bytes_read = 0; | 413 int bytes_read = 0; |
| 415 scoped_refptr<IOBufferWithSize> buf(new IOBufferWithSize(kSize)); | 414 scoped_refptr<IOBufferWithSize> buf(new IOBufferWithSize(kSize)); |
| 416 TestCompletionCallback callback; | 415 TestCompletionCallback callback; |
| 417 while (true) { | 416 while (true) { |
| 418 int rv = trans->Read(buf.get(), kSize, callback.callback()); | 417 int rv = trans->Read(buf.get(), kSize, callback.callback()); |
| 419 if (rv == ERR_IO_PENDING) { | 418 if (rv == ERR_IO_PENDING) { |
| 420 rv = callback.WaitForResult(); | 419 rv = callback.WaitForResult(); |
| 421 } else if (rv <= 0) { | 420 } else if (rv <= 0) { |
| (...skipping 19 matching lines...) Expand all Loading... |
| 441 key, url, | 440 key, url, |
| 442 /* enable_ip_based_pooling = */ true, log); | 441 /* enable_ip_based_pooling = */ true, log); |
| 443 ASSERT_TRUE(spdy_session); | 442 ASSERT_TRUE(spdy_session); |
| 444 EXPECT_EQ(0u, spdy_session->num_active_streams()); | 443 EXPECT_EQ(0u, spdy_session->num_active_streams()); |
| 445 EXPECT_EQ(0u, spdy_session->num_unclaimed_pushed_streams()); | 444 EXPECT_EQ(0u, spdy_session->num_unclaimed_pushed_streams()); |
| 446 } | 445 } |
| 447 | 446 |
| 448 void RunServerPushTest(SequencedSocketData* data, | 447 void RunServerPushTest(SequencedSocketData* data, |
| 449 HttpResponseInfo* response, | 448 HttpResponseInfo* response, |
| 450 HttpResponseInfo* push_response, | 449 HttpResponseInfo* push_response, |
| 451 const std::string& expected) { | 450 const SpdyString& expected) { |
| 452 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY, | 451 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY, |
| 453 NetLogWithSource(), nullptr); | 452 NetLogWithSource(), nullptr); |
| 454 helper.RunPreTestSetup(); | 453 helper.RunPreTestSetup(); |
| 455 helper.AddData(data); | 454 helper.AddData(data); |
| 456 | 455 |
| 457 HttpNetworkTransaction* trans = helper.trans(); | 456 HttpNetworkTransaction* trans = helper.trans(); |
| 458 | 457 |
| 459 // Start the transaction with basic parameters. | 458 // Start the transaction with basic parameters. |
| 460 TestCompletionCallback callback; | 459 TestCompletionCallback callback; |
| 461 int rv = trans->Start(&CreateGetRequest(), callback.callback(), | 460 int rv = trans->Start(&CreateGetRequest(), callback.callback(), |
| 462 NetLogWithSource()); | 461 NetLogWithSource()); |
| 463 EXPECT_THAT(rv, IsError(ERR_IO_PENDING)); | 462 EXPECT_THAT(rv, IsError(ERR_IO_PENDING)); |
| 464 rv = callback.WaitForResult(); | 463 rv = callback.WaitForResult(); |
| 465 | 464 |
| 466 // Finish async network reads/writes. | 465 // Finish async network reads/writes. |
| 467 base::RunLoop().RunUntilIdle(); | 466 base::RunLoop().RunUntilIdle(); |
| 468 | 467 |
| 469 // Request the pushed path. | 468 // Request the pushed path. |
| 470 HttpNetworkTransaction trans2(DEFAULT_PRIORITY, helper.session()); | 469 HttpNetworkTransaction trans2(DEFAULT_PRIORITY, helper.session()); |
| 471 rv = trans2.Start(&CreateGetPushRequest(), callback.callback(), | 470 rv = trans2.Start(&CreateGetPushRequest(), callback.callback(), |
| 472 NetLogWithSource()); | 471 NetLogWithSource()); |
| 473 EXPECT_THAT(rv, IsError(ERR_IO_PENDING)); | 472 EXPECT_THAT(rv, IsError(ERR_IO_PENDING)); |
| 474 base::RunLoop().RunUntilIdle(); | 473 base::RunLoop().RunUntilIdle(); |
| 475 | 474 |
| 476 // The data for the pushed path may be coming in more than 1 frame. Compile | 475 // The data for the pushed path may be coming in more than 1 frame. Compile |
| 477 // the results into a single string. | 476 // the results into a single string. |
| 478 | 477 |
| 479 // Read the server push body. | 478 // Read the server push body. |
| 480 std::string result2; | 479 SpdyString result2; |
| 481 ReadResult(&trans2, &result2); | 480 ReadResult(&trans2, &result2); |
| 482 // Read the response body. | 481 // Read the response body. |
| 483 std::string result; | 482 SpdyString result; |
| 484 ReadResult(trans, &result); | 483 ReadResult(trans, &result); |
| 485 | 484 |
| 486 // Verify that we consumed all test data. | 485 // Verify that we consumed all test data. |
| 487 EXPECT_TRUE(data->AllReadDataConsumed()); | 486 EXPECT_TRUE(data->AllReadDataConsumed()); |
| 488 EXPECT_TRUE(data->AllWriteDataConsumed()); | 487 EXPECT_TRUE(data->AllWriteDataConsumed()); |
| 489 | 488 |
| 490 LoadTimingInfo load_timing_info; | 489 LoadTimingInfo load_timing_info; |
| 491 EXPECT_TRUE(trans->GetLoadTimingInfo(&load_timing_info)); | 490 EXPECT_TRUE(trans->GetLoadTimingInfo(&load_timing_info)); |
| 492 EXPECT_TRUE(load_timing_info.push_start.is_null()); | 491 EXPECT_TRUE(load_timing_info.push_start.is_null()); |
| 493 EXPECT_TRUE(load_timing_info.push_end.is_null()); | 492 EXPECT_TRUE(load_timing_info.push_end.is_null()); |
| (...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 558 request.load_flags = 0; | 557 request.load_flags = 0; |
| 559 int rv = trans.Start(&request, callback.callback(), NetLogWithSource()); | 558 int rv = trans.Start(&request, callback.callback(), NetLogWithSource()); |
| 560 EXPECT_THAT(rv, IsError(ERR_IO_PENDING)); | 559 EXPECT_THAT(rv, IsError(ERR_IO_PENDING)); |
| 561 callback.WaitForResult(); | 560 callback.WaitForResult(); |
| 562 } | 561 } |
| 563 | 562 |
| 564 ChunkedUploadDataStream* upload_chunked_data_stream() const { | 563 ChunkedUploadDataStream* upload_chunked_data_stream() const { |
| 565 return upload_chunked_data_stream_.get(); | 564 return upload_chunked_data_stream_.get(); |
| 566 } | 565 } |
| 567 | 566 |
| 568 std::string GetDefaultUrlWithPath(const char* path) { | 567 SpdyString GetDefaultUrlWithPath(const char* path) { |
| 569 return std::string(kDefaultUrl) + path; | 568 return SpdyString(kDefaultUrl) + path; |
| 570 } | 569 } |
| 571 | 570 |
| 572 const GURL default_url_; | 571 const GURL default_url_; |
| 573 const HostPortPair host_port_pair_; | 572 const HostPortPair host_port_pair_; |
| 574 SpdyTestUtil spdy_util_; | 573 SpdyTestUtil spdy_util_; |
| 575 | 574 |
| 576 private: | 575 private: |
| 577 std::unique_ptr<ChunkedUploadDataStream> upload_chunked_data_stream_; | 576 std::unique_ptr<ChunkedUploadDataStream> upload_chunked_data_stream_; |
| 578 std::unique_ptr<UploadDataStream> upload_data_stream_; | 577 std::unique_ptr<UploadDataStream> upload_data_stream_; |
| 579 bool get_request_initialized_; | 578 bool get_request_initialized_; |
| (...skipping 1085 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1665 ASSERT_TRUE(helper.StartDefaultTest()); | 1664 ASSERT_TRUE(helper.StartDefaultTest()); |
| 1666 | 1665 |
| 1667 base::RunLoop().RunUntilIdle(); | 1666 base::RunLoop().RunUntilIdle(); |
| 1668 upload_chunked_data_stream()->AppendData(kUploadData, kUploadDataSize, false); | 1667 upload_chunked_data_stream()->AppendData(kUploadData, kUploadDataSize, false); |
| 1669 base::RunLoop().RunUntilIdle(); | 1668 base::RunLoop().RunUntilIdle(); |
| 1670 upload_chunked_data_stream()->AppendData(kUploadData, kUploadDataSize, true); | 1669 upload_chunked_data_stream()->AppendData(kUploadData, kUploadDataSize, true); |
| 1671 | 1670 |
| 1672 helper.FinishDefaultTest(); | 1671 helper.FinishDefaultTest(); |
| 1673 helper.VerifyDataConsumed(); | 1672 helper.VerifyDataConsumed(); |
| 1674 | 1673 |
| 1675 std::string expected_response; | 1674 SpdyString expected_response; |
| 1676 expected_response += kUploadData; | 1675 expected_response += kUploadData; |
| 1677 expected_response += kUploadData; | 1676 expected_response += kUploadData; |
| 1678 expected_response += kUploadData; | 1677 expected_response += kUploadData; |
| 1679 | 1678 |
| 1680 TransactionHelperResult out = helper.output(); | 1679 TransactionHelperResult out = helper.output(); |
| 1681 EXPECT_THAT(out.rv, IsOk()); | 1680 EXPECT_THAT(out.rv, IsOk()); |
| 1682 EXPECT_EQ("HTTP/1.1 200", out.status_line); | 1681 EXPECT_EQ("HTTP/1.1 200", out.status_line); |
| 1683 EXPECT_EQ(expected_response, out.response_data); | 1682 EXPECT_EQ(expected_response, out.response_data); |
| 1684 } | 1683 } |
| 1685 | 1684 |
| (...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1791 // Process the request headers, response headers, and response body. | 1790 // Process the request headers, response headers, and response body. |
| 1792 // The request body is still in flight. | 1791 // The request body is still in flight. |
| 1793 const HttpResponseInfo* response = helper.trans()->GetResponseInfo(); | 1792 const HttpResponseInfo* response = helper.trans()->GetResponseInfo(); |
| 1794 EXPECT_EQ("HTTP/1.1 200", response->headers->GetStatusLine()); | 1793 EXPECT_EQ("HTTP/1.1 200", response->headers->GetStatusLine()); |
| 1795 | 1794 |
| 1796 // Finish sending the request body. | 1795 // Finish sending the request body. |
| 1797 upload_chunked_data_stream()->AppendData(kUploadData, kUploadDataSize, true); | 1796 upload_chunked_data_stream()->AppendData(kUploadData, kUploadDataSize, true); |
| 1798 helper.WaitForCallbackToComplete(); | 1797 helper.WaitForCallbackToComplete(); |
| 1799 EXPECT_THAT(helper.output().rv, IsOk()); | 1798 EXPECT_THAT(helper.output().rv, IsOk()); |
| 1800 | 1799 |
| 1801 std::string response_body; | 1800 SpdyString response_body; |
| 1802 EXPECT_THAT(ReadTransaction(helper.trans(), &response_body), IsOk()); | 1801 EXPECT_THAT(ReadTransaction(helper.trans(), &response_body), IsOk()); |
| 1803 EXPECT_EQ(kUploadData, response_body); | 1802 EXPECT_EQ(kUploadData, response_body); |
| 1804 | 1803 |
| 1805 // Finish async network reads/writes. | 1804 // Finish async network reads/writes. |
| 1806 base::RunLoop().RunUntilIdle(); | 1805 base::RunLoop().RunUntilIdle(); |
| 1807 helper.VerifyDataConsumed(); | 1806 helper.VerifyDataConsumed(); |
| 1808 } | 1807 } |
| 1809 | 1808 |
| 1810 // The client upon cancellation tries to send a RST_STREAM frame. The mock | 1809 // The client upon cancellation tries to send a RST_STREAM frame. The mock |
| 1811 // socket causes the TCP write to return zero. This test checks that the client | 1810 // socket causes the TCP write to return zero. This test checks that the client |
| (...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1896 int rv = | 1895 int rv = |
| 1897 trans->Start(&helper.request(), callback.callback(), NetLogWithSource()); | 1896 trans->Start(&helper.request(), callback.callback(), NetLogWithSource()); |
| 1898 EXPECT_THAT(rv, IsError(ERR_IO_PENDING)); | 1897 EXPECT_THAT(rv, IsError(ERR_IO_PENDING)); |
| 1899 rv = callback.WaitForResult(); | 1898 rv = callback.WaitForResult(); |
| 1900 EXPECT_THAT(rv, IsOk()); | 1899 EXPECT_THAT(rv, IsOk()); |
| 1901 | 1900 |
| 1902 const HttpResponseInfo* response = trans->GetResponseInfo(); | 1901 const HttpResponseInfo* response = trans->GetResponseInfo(); |
| 1903 ASSERT_TRUE(response); | 1902 ASSERT_TRUE(response); |
| 1904 EXPECT_TRUE(response->headers); | 1903 EXPECT_TRUE(response->headers); |
| 1905 EXPECT_TRUE(response->was_fetched_via_spdy); | 1904 EXPECT_TRUE(response->was_fetched_via_spdy); |
| 1906 std::string response_data; | 1905 SpdyString response_data; |
| 1907 rv = ReadTransaction(trans, &response_data); | 1906 rv = ReadTransaction(trans, &response_data); |
| 1908 EXPECT_THAT(rv, IsError(ERR_SPDY_PROTOCOL_ERROR)); | 1907 EXPECT_THAT(rv, IsError(ERR_SPDY_PROTOCOL_ERROR)); |
| 1909 | 1908 |
| 1910 helper.VerifyDataConsumed(); | 1909 helper.VerifyDataConsumed(); |
| 1911 } | 1910 } |
| 1912 | 1911 |
| 1913 TEST_F(SpdyNetworkTransactionTest, ResetReplyWithTransferEncoding) { | 1912 TEST_F(SpdyNetworkTransactionTest, ResetReplyWithTransferEncoding) { |
| 1914 // Construct the request. | 1913 // Construct the request. |
| 1915 SpdySerializedFrame req( | 1914 SpdySerializedFrame req( |
| 1916 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); | 1915 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); |
| (...skipping 313 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2230 spdy_util_.ConstructSpdyPriority(2, 1, IDLE, true)); | 2229 spdy_util_.ConstructSpdyPriority(2, 1, IDLE, true)); |
| 2231 MockWrite writes[] = { | 2230 MockWrite writes[] = { |
| 2232 CreateMockWrite(req, 0), CreateMockWrite(priority, 2), | 2231 CreateMockWrite(req, 0), CreateMockWrite(priority, 2), |
| 2233 }; | 2232 }; |
| 2234 | 2233 |
| 2235 SpdySerializedFrame resp(spdy_util_.ConstructSpdyGetReply(nullptr, 0, 1)); | 2234 SpdySerializedFrame resp(spdy_util_.ConstructSpdyGetReply(nullptr, 0, 1)); |
| 2236 SpdySerializedFrame response_body_frame( | 2235 SpdySerializedFrame response_body_frame( |
| 2237 spdy_util_.ConstructSpdyDataFrame(1, "should not include", 18, true)); | 2236 spdy_util_.ConstructSpdyDataFrame(1, "should not include", 18, true)); |
| 2238 | 2237 |
| 2239 SpdyHeaderBlock push_headers; | 2238 SpdyHeaderBlock push_headers; |
| 2240 spdy_util_.AddUrlToHeaderBlock(std::string(kDefaultUrl) + "b.dat", | 2239 spdy_util_.AddUrlToHeaderBlock(SpdyString(kDefaultUrl) + "b.dat", |
| 2241 &push_headers); | 2240 &push_headers); |
| 2242 | 2241 |
| 2243 SpdySerializedFrame push_init_frame( | 2242 SpdySerializedFrame push_init_frame( |
| 2244 spdy_util_.ConstructInitialSpdyPushFrame(std::move(push_headers), 2, 1)); | 2243 spdy_util_.ConstructInitialSpdyPushFrame(std::move(push_headers), 2, 1)); |
| 2245 | 2244 |
| 2246 SpdySerializedFrame push_headers_frame( | 2245 SpdySerializedFrame push_headers_frame( |
| 2247 spdy_util_.ConstructSpdyPushHeaders(2, nullptr, 0)); | 2246 spdy_util_.ConstructSpdyPushHeaders(2, nullptr, 0)); |
| 2248 | 2247 |
| 2249 SpdySerializedFrame push_body_frame(spdy_util_.ConstructSpdyDataFrame( | 2248 SpdySerializedFrame push_body_frame(spdy_util_.ConstructSpdyDataFrame( |
| 2250 2, "should not include either", 25, false)); | 2249 2, "should not include either", 25, false)); |
| (...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2347 r->Start(); | 2346 r->Start(); |
| 2348 base::RunLoop().Run(); | 2347 base::RunLoop().Run(); |
| 2349 | 2348 |
| 2350 EXPECT_EQ(1, d.received_redirect_count()); | 2349 EXPECT_EQ(1, d.received_redirect_count()); |
| 2351 | 2350 |
| 2352 r->FollowDeferredRedirect(); | 2351 r->FollowDeferredRedirect(); |
| 2353 base::RunLoop().Run(); | 2352 base::RunLoop().Run(); |
| 2354 EXPECT_EQ(1, d.response_started_count()); | 2353 EXPECT_EQ(1, d.response_started_count()); |
| 2355 EXPECT_FALSE(d.received_data_before_response()); | 2354 EXPECT_FALSE(d.received_data_before_response()); |
| 2356 EXPECT_EQ(OK, d.request_status()); | 2355 EXPECT_EQ(OK, d.request_status()); |
| 2357 std::string contents("hello!"); | 2356 SpdyString contents("hello!"); |
| 2358 EXPECT_EQ(contents, d.data_received()); | 2357 EXPECT_EQ(contents, d.data_received()); |
| 2359 } | 2358 } |
| 2360 EXPECT_TRUE(data.AllReadDataConsumed()); | 2359 EXPECT_TRUE(data.AllReadDataConsumed()); |
| 2361 EXPECT_TRUE(data.AllWriteDataConsumed()); | 2360 EXPECT_TRUE(data.AllWriteDataConsumed()); |
| 2362 EXPECT_TRUE(data2.AllReadDataConsumed()); | 2361 EXPECT_TRUE(data2.AllReadDataConsumed()); |
| 2363 EXPECT_TRUE(data2.AllWriteDataConsumed()); | 2362 EXPECT_TRUE(data2.AllWriteDataConsumed()); |
| 2364 } | 2363 } |
| 2365 | 2364 |
| 2366 // Send a spdy request to www.example.org. Get a pushed stream that redirects to | 2365 // Send a spdy request to www.example.org. Get a pushed stream that redirects to |
| 2367 // www.foo.com. | 2366 // www.foo.com. |
| (...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2415 { | 2414 { |
| 2416 std::unique_ptr<URLRequest> r(spdy_url_request_context.CreateRequest( | 2415 std::unique_ptr<URLRequest> r(spdy_url_request_context.CreateRequest( |
| 2417 default_url_, DEFAULT_PRIORITY, &d)); | 2416 default_url_, DEFAULT_PRIORITY, &d)); |
| 2418 spdy_url_request_context.socket_factory(). | 2417 spdy_url_request_context.socket_factory(). |
| 2419 AddSocketDataProvider(&data); | 2418 AddSocketDataProvider(&data); |
| 2420 | 2419 |
| 2421 r->Start(); | 2420 r->Start(); |
| 2422 base::RunLoop().Run(); | 2421 base::RunLoop().Run(); |
| 2423 | 2422 |
| 2424 EXPECT_EQ(0, d.received_redirect_count()); | 2423 EXPECT_EQ(0, d.received_redirect_count()); |
| 2425 std::string contents("hello!"); | 2424 SpdyString contents("hello!"); |
| 2426 EXPECT_EQ(contents, d.data_received()); | 2425 EXPECT_EQ(contents, d.data_received()); |
| 2427 | 2426 |
| 2428 std::unique_ptr<URLRequest> r2(spdy_url_request_context.CreateRequest( | 2427 std::unique_ptr<URLRequest> r2(spdy_url_request_context.CreateRequest( |
| 2429 GURL(GetDefaultUrlWithPath("/foo.dat")), DEFAULT_PRIORITY, &d2)); | 2428 GURL(GetDefaultUrlWithPath("/foo.dat")), DEFAULT_PRIORITY, &d2)); |
| 2430 spdy_url_request_context.socket_factory(). | 2429 spdy_url_request_context.socket_factory(). |
| 2431 AddSocketDataProvider(&data2); | 2430 AddSocketDataProvider(&data2); |
| 2432 | 2431 |
| 2433 d2.set_quit_on_redirect(true); | 2432 d2.set_quit_on_redirect(true); |
| 2434 r2->Start(); | 2433 r2->Start(); |
| 2435 base::RunLoop().Run(); | 2434 base::RunLoop().Run(); |
| 2436 EXPECT_EQ(1, d2.received_redirect_count()); | 2435 EXPECT_EQ(1, d2.received_redirect_count()); |
| 2437 | 2436 |
| 2438 r2->FollowDeferredRedirect(); | 2437 r2->FollowDeferredRedirect(); |
| 2439 base::RunLoop().Run(); | 2438 base::RunLoop().Run(); |
| 2440 EXPECT_EQ(1, d2.response_started_count()); | 2439 EXPECT_EQ(1, d2.response_started_count()); |
| 2441 EXPECT_FALSE(d2.received_data_before_response()); | 2440 EXPECT_FALSE(d2.received_data_before_response()); |
| 2442 EXPECT_EQ(OK, d2.request_status()); | 2441 EXPECT_EQ(OK, d2.request_status()); |
| 2443 std::string contents2("hello!"); | 2442 SpdyString contents2("hello!"); |
| 2444 EXPECT_EQ(contents2, d2.data_received()); | 2443 EXPECT_EQ(contents2, d2.data_received()); |
| 2445 } | 2444 } |
| 2446 EXPECT_TRUE(data.AllReadDataConsumed()); | 2445 EXPECT_TRUE(data.AllReadDataConsumed()); |
| 2447 EXPECT_TRUE(data.AllWriteDataConsumed()); | 2446 EXPECT_TRUE(data.AllWriteDataConsumed()); |
| 2448 EXPECT_TRUE(data2.AllReadDataConsumed()); | 2447 EXPECT_TRUE(data2.AllReadDataConsumed()); |
| 2449 EXPECT_TRUE(data2.AllWriteDataConsumed()); | 2448 EXPECT_TRUE(data2.AllWriteDataConsumed()); |
| 2450 } | 2449 } |
| 2451 | 2450 |
| 2452 TEST_F(SpdyNetworkTransactionTest, ServerPushSingleDataFrame) { | 2451 TEST_F(SpdyNetworkTransactionTest, ServerPushSingleDataFrame) { |
| 2453 SpdySerializedFrame stream1_syn( | 2452 SpdySerializedFrame stream1_syn( |
| (...skipping 13 matching lines...) Expand all Loading... |
| 2467 SpdySerializedFrame stream2_body(spdy_util_.ConstructSpdyDataFrame( | 2466 SpdySerializedFrame stream2_body(spdy_util_.ConstructSpdyDataFrame( |
| 2468 2, kPushedData, strlen(kPushedData), true)); | 2467 2, kPushedData, strlen(kPushedData), true)); |
| 2469 MockRead reads[] = { | 2468 MockRead reads[] = { |
| 2470 CreateMockRead(stream1_reply, 1), CreateMockRead(stream2_syn, 2), | 2469 CreateMockRead(stream1_reply, 1), CreateMockRead(stream2_syn, 2), |
| 2471 CreateMockRead(stream1_body, 4), CreateMockRead(stream2_body, 5), | 2470 CreateMockRead(stream1_body, 4), CreateMockRead(stream2_body, 5), |
| 2472 MockRead(SYNCHRONOUS, ERR_IO_PENDING, 6), // Force a pause | 2471 MockRead(SYNCHRONOUS, ERR_IO_PENDING, 6), // Force a pause |
| 2473 }; | 2472 }; |
| 2474 | 2473 |
| 2475 HttpResponseInfo response; | 2474 HttpResponseInfo response; |
| 2476 HttpResponseInfo response2; | 2475 HttpResponseInfo response2; |
| 2477 std::string expected_push_result("pushed"); | 2476 SpdyString expected_push_result("pushed"); |
| 2478 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); | 2477 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); |
| 2479 RunServerPushTest(&data, | 2478 RunServerPushTest(&data, |
| 2480 &response, | 2479 &response, |
| 2481 &response2, | 2480 &response2, |
| 2482 expected_push_result); | 2481 expected_push_result); |
| 2483 | 2482 |
| 2484 // Verify the response headers. | 2483 // Verify the response headers. |
| 2485 EXPECT_TRUE(response.headers); | 2484 EXPECT_TRUE(response.headers); |
| 2486 EXPECT_EQ("HTTP/1.1 200", response.headers->GetStatusLine()); | 2485 EXPECT_EQ("HTTP/1.1 200", response.headers->GetStatusLine()); |
| 2487 | 2486 |
| (...skipping 22 matching lines...) Expand all Loading... |
| 2510 MockRead reads[] = { | 2509 MockRead reads[] = { |
| 2511 CreateMockRead(stream2_syn, 1), | 2510 CreateMockRead(stream2_syn, 1), |
| 2512 CreateMockRead(stream1_reply, 3), | 2511 CreateMockRead(stream1_reply, 3), |
| 2513 CreateMockRead(stream1_body, 4, SYNCHRONOUS), | 2512 CreateMockRead(stream1_body, 4, SYNCHRONOUS), |
| 2514 CreateMockRead(stream2_body, 5), | 2513 CreateMockRead(stream2_body, 5), |
| 2515 MockRead(SYNCHRONOUS, ERR_IO_PENDING, 6), // Force a pause | 2514 MockRead(SYNCHRONOUS, ERR_IO_PENDING, 6), // Force a pause |
| 2516 }; | 2515 }; |
| 2517 | 2516 |
| 2518 HttpResponseInfo response; | 2517 HttpResponseInfo response; |
| 2519 HttpResponseInfo response2; | 2518 HttpResponseInfo response2; |
| 2520 std::string expected_push_result("pushed"); | 2519 SpdyString expected_push_result("pushed"); |
| 2521 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); | 2520 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); |
| 2522 RunServerPushTest(&data, | 2521 RunServerPushTest(&data, |
| 2523 &response, | 2522 &response, |
| 2524 &response2, | 2523 &response2, |
| 2525 expected_push_result); | 2524 expected_push_result); |
| 2526 | 2525 |
| 2527 // Verify the response headers. | 2526 // Verify the response headers. |
| 2528 EXPECT_TRUE(response.headers); | 2527 EXPECT_TRUE(response.headers); |
| 2529 EXPECT_EQ("HTTP/1.1 200", response.headers->GetStatusLine()); | 2528 EXPECT_EQ("HTTP/1.1 200", response.headers->GetStatusLine()); |
| 2530 | 2529 |
| (...skipping 22 matching lines...) Expand all Loading... |
| 2553 MockRead reads[] = { | 2552 MockRead reads[] = { |
| 2554 CreateMockRead(stream1_reply, 1), | 2553 CreateMockRead(stream1_reply, 1), |
| 2555 CreateMockRead(stream2_syn, 2), | 2554 CreateMockRead(stream2_syn, 2), |
| 2556 CreateMockRead(stream2_body, 4), | 2555 CreateMockRead(stream2_body, 4), |
| 2557 CreateMockRead(stream1_body, 5, SYNCHRONOUS), | 2556 CreateMockRead(stream1_body, 5, SYNCHRONOUS), |
| 2558 MockRead(SYNCHRONOUS, ERR_IO_PENDING, 6), // Force a pause | 2557 MockRead(SYNCHRONOUS, ERR_IO_PENDING, 6), // Force a pause |
| 2559 }; | 2558 }; |
| 2560 | 2559 |
| 2561 HttpResponseInfo response; | 2560 HttpResponseInfo response; |
| 2562 HttpResponseInfo response2; | 2561 HttpResponseInfo response2; |
| 2563 std::string expected_push_result("pushed"); | 2562 SpdyString expected_push_result("pushed"); |
| 2564 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); | 2563 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); |
| 2565 RunServerPushTest(&data, | 2564 RunServerPushTest(&data, |
| 2566 &response, | 2565 &response, |
| 2567 &response2, | 2566 &response2, |
| 2568 expected_push_result); | 2567 expected_push_result); |
| 2569 | 2568 |
| 2570 // Verify the response headers. | 2569 // Verify the response headers. |
| 2571 EXPECT_TRUE(response.headers); | 2570 EXPECT_TRUE(response.headers); |
| 2572 EXPECT_EQ("HTTP/1.1 200", response.headers->GetStatusLine()); | 2571 EXPECT_EQ("HTTP/1.1 200", response.headers->GetStatusLine()); |
| 2573 | 2572 |
| (...skipping 192 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2766 CreateMockRead(stream1_reply, 1), | 2765 CreateMockRead(stream1_reply, 1), |
| 2767 CreateMockRead(stream2_syn, 2), | 2766 CreateMockRead(stream2_syn, 2), |
| 2768 CreateMockRead(stream3_syn, 4), | 2767 CreateMockRead(stream3_syn, 4), |
| 2769 CreateMockRead(stream1_body, 6), | 2768 CreateMockRead(stream1_body, 6), |
| 2770 CreateMockRead(stream2_body, 7), | 2769 CreateMockRead(stream2_body, 7), |
| 2771 MockRead(SYNCHRONOUS, ERR_IO_PENDING, 8), // Force a pause | 2770 MockRead(SYNCHRONOUS, ERR_IO_PENDING, 8), // Force a pause |
| 2772 }; | 2771 }; |
| 2773 | 2772 |
| 2774 HttpResponseInfo response; | 2773 HttpResponseInfo response; |
| 2775 HttpResponseInfo response2; | 2774 HttpResponseInfo response2; |
| 2776 std::string expected_push_result("pushed"); | 2775 SpdyString expected_push_result("pushed"); |
| 2777 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); | 2776 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); |
| 2778 RunServerPushTest(&data, | 2777 RunServerPushTest(&data, |
| 2779 &response, | 2778 &response, |
| 2780 &response2, | 2779 &response2, |
| 2781 expected_push_result); | 2780 expected_push_result); |
| 2782 | 2781 |
| 2783 // Verify the response headers. | 2782 // Verify the response headers. |
| 2784 EXPECT_TRUE(response.headers); | 2783 EXPECT_TRUE(response.headers); |
| 2785 EXPECT_EQ("HTTP/1.1 200", response.headers->GetStatusLine()); | 2784 EXPECT_EQ("HTTP/1.1 200", response.headers->GetStatusLine()); |
| 2786 | 2785 |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2822 CreateMockRead(stream2_body1, 4), | 2821 CreateMockRead(stream2_body1, 4), |
| 2823 CreateMockRead(stream2_body2, 5), | 2822 CreateMockRead(stream2_body2, 5), |
| 2824 CreateMockRead(stream2_body3, 6), | 2823 CreateMockRead(stream2_body3, 6), |
| 2825 CreateMockRead(stream2_body4, 7), | 2824 CreateMockRead(stream2_body4, 7), |
| 2826 CreateMockRead(stream1_body, 8, SYNCHRONOUS), | 2825 CreateMockRead(stream1_body, 8, SYNCHRONOUS), |
| 2827 MockRead(SYNCHRONOUS, ERR_IO_PENDING, 9), // Force a pause | 2826 MockRead(SYNCHRONOUS, ERR_IO_PENDING, 9), // Force a pause |
| 2828 }; | 2827 }; |
| 2829 | 2828 |
| 2830 HttpResponseInfo response; | 2829 HttpResponseInfo response; |
| 2831 HttpResponseInfo response2; | 2830 HttpResponseInfo response2; |
| 2832 std::string expected_push_result("pushed my darling hello my baby"); | 2831 SpdyString expected_push_result("pushed my darling hello my baby"); |
| 2833 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); | 2832 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); |
| 2834 RunServerPushTest(&data, &response, &response2, kPushedData); | 2833 RunServerPushTest(&data, &response, &response2, kPushedData); |
| 2835 | 2834 |
| 2836 // Verify the response headers. | 2835 // Verify the response headers. |
| 2837 EXPECT_TRUE(response.headers); | 2836 EXPECT_TRUE(response.headers); |
| 2838 EXPECT_EQ("HTTP/1.1 200", response.headers->GetStatusLine()); | 2837 EXPECT_EQ("HTTP/1.1 200", response.headers->GetStatusLine()); |
| 2839 | 2838 |
| 2840 // Verify the pushed stream. | 2839 // Verify the pushed stream. |
| 2841 EXPECT_TRUE(response2.headers); | 2840 EXPECT_TRUE(response2.headers); |
| 2842 EXPECT_EQ("HTTP/1.1 200", response2.headers->GetStatusLine()); | 2841 EXPECT_EQ("HTTP/1.1 200", response2.headers->GetStatusLine()); |
| (...skipping 278 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3121 | 3120 |
| 3122 HttpNetworkTransaction trans2(DEFAULT_PRIORITY, helper.session()); | 3121 HttpNetworkTransaction trans2(DEFAULT_PRIORITY, helper.session()); |
| 3123 TestCompletionCallback callback2; | 3122 TestCompletionCallback callback2; |
| 3124 rv = trans2.Start(&CreateGetPushRequest(), callback2.callback(), | 3123 rv = trans2.Start(&CreateGetPushRequest(), callback2.callback(), |
| 3125 NetLogWithSource()); | 3124 NetLogWithSource()); |
| 3126 rv = callback2.GetResult(rv); | 3125 rv = callback2.GetResult(rv); |
| 3127 EXPECT_THAT(rv, IsOk()); | 3126 EXPECT_THAT(rv, IsOk()); |
| 3128 response = *trans2.GetResponseInfo(); | 3127 response = *trans2.GetResponseInfo(); |
| 3129 EXPECT_TRUE(response.headers); | 3128 EXPECT_TRUE(response.headers); |
| 3130 EXPECT_EQ("HTTP/1.1 200", response.headers->GetStatusLine()); | 3129 EXPECT_EQ("HTTP/1.1 200", response.headers->GetStatusLine()); |
| 3131 std::string result; | 3130 SpdyString result; |
| 3132 ReadResult(&trans2, &result); | 3131 ReadResult(&trans2, &result); |
| 3133 EXPECT_EQ(kPushedData, result); | 3132 EXPECT_EQ(kPushedData, result); |
| 3134 | 3133 |
| 3135 data.Resume(); | 3134 data.Resume(); |
| 3136 base::RunLoop().RunUntilIdle(); | 3135 base::RunLoop().RunUntilIdle(); |
| 3137 | 3136 |
| 3138 EXPECT_TRUE(data.AllReadDataConsumed()); | 3137 EXPECT_TRUE(data.AllReadDataConsumed()); |
| 3139 EXPECT_TRUE(data.AllWriteDataConsumed()); | 3138 EXPECT_TRUE(data.AllWriteDataConsumed()); |
| 3140 } | 3139 } |
| 3141 | 3140 |
| (...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3193 helper.RunToCompletion(&data); | 3192 helper.RunToCompletion(&data); |
| 3194 TransactionHelperResult out = helper.output(); | 3193 TransactionHelperResult out = helper.output(); |
| 3195 | 3194 |
| 3196 EXPECT_THAT(out.rv, IsOk()); | 3195 EXPECT_THAT(out.rv, IsOk()); |
| 3197 EXPECT_EQ("HTTP/1.1 200", out.status_line); | 3196 EXPECT_EQ("HTTP/1.1 200", out.status_line); |
| 3198 EXPECT_EQ("hello!", out.response_data); | 3197 EXPECT_EQ("hello!", out.response_data); |
| 3199 | 3198 |
| 3200 scoped_refptr<HttpResponseHeaders> headers = out.response_info.headers; | 3199 scoped_refptr<HttpResponseHeaders> headers = out.response_info.headers; |
| 3201 EXPECT_TRUE(headers); | 3200 EXPECT_TRUE(headers); |
| 3202 size_t iter = 0; | 3201 size_t iter = 0; |
| 3203 std::string name, value; | 3202 SpdyString name, value; |
| 3204 SpdyHeaderBlock header_block; | 3203 SpdyHeaderBlock header_block; |
| 3205 while (headers->EnumerateHeaderLines(&iter, &name, &value)) { | 3204 while (headers->EnumerateHeaderLines(&iter, &name, &value)) { |
| 3206 auto value_it = header_block.find(name); | 3205 auto value_it = header_block.find(name); |
| 3207 if (value_it == header_block.end() || value_it->second.empty()) { | 3206 if (value_it == header_block.end() || value_it->second.empty()) { |
| 3208 header_block[name] = value; | 3207 header_block[name] = value; |
| 3209 } else { | 3208 } else { |
| 3210 std::string joint_value = value_it->second.as_string(); | 3209 SpdyString joint_value = value_it->second.as_string(); |
| 3211 joint_value.append(1, '\0'); | 3210 joint_value.append(1, '\0'); |
| 3212 joint_value.append(value); | 3211 joint_value.append(value); |
| 3213 header_block[name] = joint_value; | 3212 header_block[name] = joint_value; |
| 3214 } | 3213 } |
| 3215 } | 3214 } |
| 3216 EXPECT_EQ(test_cases[i].expected_headers, header_block); | 3215 EXPECT_EQ(test_cases[i].expected_headers, header_block); |
| 3217 } | 3216 } |
| 3218 } | 3217 } |
| 3219 | 3218 |
| 3220 // Verify that various response headers parse vary fields correctly through the | 3219 // Verify that various response headers parse vary fields correctly through the |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3263 MockWrite writes[] = { | 3262 MockWrite writes[] = { |
| 3264 CreateMockWrite(frame_req, 0), | 3263 CreateMockWrite(frame_req, 0), |
| 3265 }; | 3264 }; |
| 3266 | 3265 |
| 3267 // Construct the reply. | 3266 // Construct the reply. |
| 3268 SpdyHeaderBlock reply_headers; | 3267 SpdyHeaderBlock reply_headers; |
| 3269 AppendToHeaderBlock(test_cases[i].extra_headers[1], | 3268 AppendToHeaderBlock(test_cases[i].extra_headers[1], |
| 3270 test_cases[i].num_headers[1], | 3269 test_cases[i].num_headers[1], |
| 3271 &reply_headers); | 3270 &reply_headers); |
| 3272 // Construct the expected header reply string before moving |reply_headers|. | 3271 // Construct the expected header reply string before moving |reply_headers|. |
| 3273 std::string expected_reply = | 3272 SpdyString expected_reply = |
| 3274 spdy_test_util.ConstructSpdyReplyString(reply_headers); | 3273 spdy_test_util.ConstructSpdyReplyString(reply_headers); |
| 3275 | 3274 |
| 3276 SpdySerializedFrame frame_reply( | 3275 SpdySerializedFrame frame_reply( |
| 3277 spdy_test_util.ConstructSpdyReply(1, std::move(reply_headers))); | 3276 spdy_test_util.ConstructSpdyReply(1, std::move(reply_headers))); |
| 3278 | 3277 |
| 3279 SpdySerializedFrame body(spdy_test_util.ConstructSpdyDataFrame(1, true)); | 3278 SpdySerializedFrame body(spdy_test_util.ConstructSpdyDataFrame(1, true)); |
| 3280 MockRead reads[] = { | 3279 MockRead reads[] = { |
| 3281 CreateMockRead(frame_reply, 1), CreateMockRead(body, 2), | 3280 CreateMockRead(frame_reply, 1), CreateMockRead(body, 2), |
| 3282 MockRead(ASYNC, 0, 3) // EOF | 3281 MockRead(ASYNC, 0, 3) // EOF |
| 3283 }; | 3282 }; |
| (...skipping 20 matching lines...) Expand all Loading... |
| 3304 EXPECT_EQ("hello!", out.response_data) << i; | 3303 EXPECT_EQ("hello!", out.response_data) << i; |
| 3305 | 3304 |
| 3306 // Test the response information. | 3305 // Test the response information. |
| 3307 EXPECT_EQ(out.response_info.vary_data.is_valid(), | 3306 EXPECT_EQ(out.response_info.vary_data.is_valid(), |
| 3308 test_cases[i].vary_matches) << i; | 3307 test_cases[i].vary_matches) << i; |
| 3309 | 3308 |
| 3310 // Check the headers. | 3309 // Check the headers. |
| 3311 scoped_refptr<HttpResponseHeaders> headers = out.response_info.headers; | 3310 scoped_refptr<HttpResponseHeaders> headers = out.response_info.headers; |
| 3312 ASSERT_TRUE(headers) << i; | 3311 ASSERT_TRUE(headers) << i; |
| 3313 size_t iter = 0; | 3312 size_t iter = 0; |
| 3314 std::string name, value, lines; | 3313 SpdyString name, value, lines; |
| 3315 while (headers->EnumerateHeaderLines(&iter, &name, &value)) { | 3314 while (headers->EnumerateHeaderLines(&iter, &name, &value)) { |
| 3316 lines.append(name); | 3315 lines.append(name); |
| 3317 lines.append(": "); | 3316 lines.append(": "); |
| 3318 lines.append(value); | 3317 lines.append(value); |
| 3319 lines.append("\n"); | 3318 lines.append("\n"); |
| 3320 } | 3319 } |
| 3321 | 3320 |
| 3322 EXPECT_EQ(expected_reply, lines) << i; | 3321 EXPECT_EQ(expected_reply, lines) << i; |
| 3323 } | 3322 } |
| 3324 } | 3323 } |
| (...skipping 236 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3561 | 3560 |
| 3562 // Check that we logged all the headers correctly | 3561 // Check that we logged all the headers correctly |
| 3563 pos = ExpectLogContainsSomewhere(entries, 0, | 3562 pos = ExpectLogContainsSomewhere(entries, 0, |
| 3564 NetLogEventType::HTTP2_SESSION_SEND_HEADERS, | 3563 NetLogEventType::HTTP2_SESSION_SEND_HEADERS, |
| 3565 NetLogEventPhase::NONE); | 3564 NetLogEventPhase::NONE); |
| 3566 | 3565 |
| 3567 base::ListValue* header_list; | 3566 base::ListValue* header_list; |
| 3568 ASSERT_TRUE(entries[pos].params.get()); | 3567 ASSERT_TRUE(entries[pos].params.get()); |
| 3569 ASSERT_TRUE(entries[pos].params->GetList("headers", &header_list)); | 3568 ASSERT_TRUE(entries[pos].params->GetList("headers", &header_list)); |
| 3570 | 3569 |
| 3571 std::vector<std::string> expected; | 3570 std::vector<SpdyString> expected; |
| 3572 expected.push_back(std::string(spdy_util_.GetHostKey()) + | 3571 expected.push_back(SpdyString(spdy_util_.GetHostKey()) + ": www.example.org"); |
| 3573 ": www.example.org"); | 3572 expected.push_back(SpdyString(spdy_util_.GetPathKey()) + ": /"); |
| 3574 expected.push_back(std::string(spdy_util_.GetPathKey()) + ": /"); | 3573 expected.push_back(SpdyString(spdy_util_.GetSchemeKey()) + ": " + |
| 3575 expected.push_back(std::string(spdy_util_.GetSchemeKey()) + ": " + | |
| 3576 default_url_.scheme()); | 3574 default_url_.scheme()); |
| 3577 expected.push_back(std::string(spdy_util_.GetMethodKey()) + ": GET"); | 3575 expected.push_back(SpdyString(spdy_util_.GetMethodKey()) + ": GET"); |
| 3578 expected.push_back("user-agent: Chrome"); | 3576 expected.push_back("user-agent: Chrome"); |
| 3579 EXPECT_EQ(expected.size(), header_list->GetSize()); | 3577 EXPECT_EQ(expected.size(), header_list->GetSize()); |
| 3580 for (std::vector<std::string>::const_iterator it = expected.begin(); | 3578 for (std::vector<SpdyString>::const_iterator it = expected.begin(); |
| 3581 it != expected.end(); | 3579 it != expected.end(); ++it) { |
| 3582 ++it) { | |
| 3583 base::Value header(*it); | 3580 base::Value header(*it); |
| 3584 EXPECT_NE(header_list->end(), header_list->Find(header)) << | 3581 EXPECT_NE(header_list->end(), header_list->Find(header)) << |
| 3585 "Header not found: " << *it; | 3582 "Header not found: " << *it; |
| 3586 } | 3583 } |
| 3587 } | 3584 } |
| 3588 | 3585 |
| 3589 // Since we buffer the IO from the stream to the renderer, this test verifies | 3586 // Since we buffer the IO from the stream to the renderer, this test verifies |
| 3590 // that when we read out the maximum amount of data (e.g. we received 50 bytes | 3587 // that when we read out the maximum amount of data (e.g. we received 50 bytes |
| 3591 // on the network, but issued a Read for only 5 of those bytes) that the data | 3588 // on the network, but issued a Read for only 5 of those bytes) that the data |
| 3592 // flow still works correctly. | 3589 // flow still works correctly. |
| (...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3639 | 3636 |
| 3640 const HttpResponseInfo* response = trans->GetResponseInfo(); | 3637 const HttpResponseInfo* response = trans->GetResponseInfo(); |
| 3641 EXPECT_TRUE(response->headers); | 3638 EXPECT_TRUE(response->headers); |
| 3642 EXPECT_TRUE(response->was_fetched_via_spdy); | 3639 EXPECT_TRUE(response->was_fetched_via_spdy); |
| 3643 out.status_line = response->headers->GetStatusLine(); | 3640 out.status_line = response->headers->GetStatusLine(); |
| 3644 out.response_info = *response; // Make a copy so we can verify. | 3641 out.response_info = *response; // Make a copy so we can verify. |
| 3645 | 3642 |
| 3646 // Read Data | 3643 // Read Data |
| 3647 TestCompletionCallback read_callback; | 3644 TestCompletionCallback read_callback; |
| 3648 | 3645 |
| 3649 std::string content; | 3646 SpdyString content; |
| 3650 do { | 3647 do { |
| 3651 // Read small chunks at a time. | 3648 // Read small chunks at a time. |
| 3652 const int kSmallReadSize = 3; | 3649 const int kSmallReadSize = 3; |
| 3653 scoped_refptr<IOBuffer> buf(new IOBuffer(kSmallReadSize)); | 3650 scoped_refptr<IOBuffer> buf(new IOBuffer(kSmallReadSize)); |
| 3654 rv = trans->Read(buf.get(), kSmallReadSize, read_callback.callback()); | 3651 rv = trans->Read(buf.get(), kSmallReadSize, read_callback.callback()); |
| 3655 if (rv == ERR_IO_PENDING) { | 3652 if (rv == ERR_IO_PENDING) { |
| 3656 data.Resume(); | 3653 data.Resume(); |
| 3657 rv = read_callback.WaitForResult(); | 3654 rv = read_callback.WaitForResult(); |
| 3658 } | 3655 } |
| 3659 if (rv > 0) { | 3656 if (rv > 0) { |
| (...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3724 | 3721 |
| 3725 const HttpResponseInfo* response = trans->GetResponseInfo(); | 3722 const HttpResponseInfo* response = trans->GetResponseInfo(); |
| 3726 EXPECT_TRUE(response->headers); | 3723 EXPECT_TRUE(response->headers); |
| 3727 EXPECT_TRUE(response->was_fetched_via_spdy); | 3724 EXPECT_TRUE(response->was_fetched_via_spdy); |
| 3728 out.status_line = response->headers->GetStatusLine(); | 3725 out.status_line = response->headers->GetStatusLine(); |
| 3729 out.response_info = *response; // Make a copy so we can verify. | 3726 out.response_info = *response; // Make a copy so we can verify. |
| 3730 | 3727 |
| 3731 // Read Data | 3728 // Read Data |
| 3732 TestCompletionCallback read_callback; | 3729 TestCompletionCallback read_callback; |
| 3733 | 3730 |
| 3734 std::string content; | 3731 SpdyString content; |
| 3735 int reads_completed = 0; | 3732 int reads_completed = 0; |
| 3736 do { | 3733 do { |
| 3737 // Read small chunks at a time. | 3734 // Read small chunks at a time. |
| 3738 const int kSmallReadSize = 14; | 3735 const int kSmallReadSize = 14; |
| 3739 scoped_refptr<IOBuffer> buf(new IOBuffer(kSmallReadSize)); | 3736 scoped_refptr<IOBuffer> buf(new IOBuffer(kSmallReadSize)); |
| 3740 rv = trans->Read(buf.get(), kSmallReadSize, read_callback.callback()); | 3737 rv = trans->Read(buf.get(), kSmallReadSize, read_callback.callback()); |
| 3741 if (rv == ERR_IO_PENDING) { | 3738 if (rv == ERR_IO_PENDING) { |
| 3742 data.Resume(); | 3739 data.Resume(); |
| 3743 rv = read_callback.WaitForResult(); | 3740 rv = read_callback.WaitForResult(); |
| 3744 } | 3741 } |
| (...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3810 | 3807 |
| 3811 const HttpResponseInfo* response = trans->GetResponseInfo(); | 3808 const HttpResponseInfo* response = trans->GetResponseInfo(); |
| 3812 EXPECT_TRUE(response->headers); | 3809 EXPECT_TRUE(response->headers); |
| 3813 EXPECT_TRUE(response->was_fetched_via_spdy); | 3810 EXPECT_TRUE(response->was_fetched_via_spdy); |
| 3814 out.status_line = response->headers->GetStatusLine(); | 3811 out.status_line = response->headers->GetStatusLine(); |
| 3815 out.response_info = *response; // Make a copy so we can verify. | 3812 out.response_info = *response; // Make a copy so we can verify. |
| 3816 | 3813 |
| 3817 // Read Data | 3814 // Read Data |
| 3818 TestCompletionCallback read_callback; | 3815 TestCompletionCallback read_callback; |
| 3819 | 3816 |
| 3820 std::string content; | 3817 SpdyString content; |
| 3821 int reads_completed = 0; | 3818 int reads_completed = 0; |
| 3822 do { | 3819 do { |
| 3823 // Read small chunks at a time. | 3820 // Read small chunks at a time. |
| 3824 const int kSmallReadSize = 14; | 3821 const int kSmallReadSize = 14; |
| 3825 scoped_refptr<IOBuffer> buf(new IOBuffer(kSmallReadSize)); | 3822 scoped_refptr<IOBuffer> buf(new IOBuffer(kSmallReadSize)); |
| 3826 rv = trans->Read(buf.get(), kSmallReadSize, read_callback.callback()); | 3823 rv = trans->Read(buf.get(), kSmallReadSize, read_callback.callback()); |
| 3827 if (rv > 0) { | 3824 if (rv > 0) { |
| 3828 EXPECT_EQ(kSmallReadSize, rv); | 3825 EXPECT_EQ(kSmallReadSize, rv); |
| 3829 content.append(buf->data(), rv); | 3826 content.append(buf->data(), rv); |
| 3830 } else if (rv < 0) { | 3827 } else if (rv < 0) { |
| (...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3893 | 3890 |
| 3894 const HttpResponseInfo* response = trans->GetResponseInfo(); | 3891 const HttpResponseInfo* response = trans->GetResponseInfo(); |
| 3895 EXPECT_TRUE(response->headers); | 3892 EXPECT_TRUE(response->headers); |
| 3896 EXPECT_TRUE(response->was_fetched_via_spdy); | 3893 EXPECT_TRUE(response->was_fetched_via_spdy); |
| 3897 out.status_line = response->headers->GetStatusLine(); | 3894 out.status_line = response->headers->GetStatusLine(); |
| 3898 out.response_info = *response; // Make a copy so we can verify. | 3895 out.response_info = *response; // Make a copy so we can verify. |
| 3899 | 3896 |
| 3900 // Read Data | 3897 // Read Data |
| 3901 TestCompletionCallback read_callback; | 3898 TestCompletionCallback read_callback; |
| 3902 | 3899 |
| 3903 std::string content; | 3900 SpdyString content; |
| 3904 int reads_completed = 0; | 3901 int reads_completed = 0; |
| 3905 do { | 3902 do { |
| 3906 // Read small chunks at a time. | 3903 // Read small chunks at a time. |
| 3907 const int kSmallReadSize = 14; | 3904 const int kSmallReadSize = 14; |
| 3908 scoped_refptr<IOBuffer> buf(new IOBuffer(kSmallReadSize)); | 3905 scoped_refptr<IOBuffer> buf(new IOBuffer(kSmallReadSize)); |
| 3909 rv = trans->Read(buf.get(), kSmallReadSize, read_callback.callback()); | 3906 rv = trans->Read(buf.get(), kSmallReadSize, read_callback.callback()); |
| 3910 if (rv == ERR_IO_PENDING) { | 3907 if (rv == ERR_IO_PENDING) { |
| 3911 data.Resume(); | 3908 data.Resume(); |
| 3912 rv = read_callback.WaitForResult(); | 3909 rv = read_callback.WaitForResult(); |
| 3913 } | 3910 } |
| (...skipping 164 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4078 // Verify second response. | 4075 // Verify second response. |
| 4079 const HttpResponseInfo* response = trans2.GetResponseInfo(); | 4076 const HttpResponseInfo* response = trans2.GetResponseInfo(); |
| 4080 ASSERT_TRUE(response); | 4077 ASSERT_TRUE(response); |
| 4081 EXPECT_EQ(HttpResponseInfo::CONNECTION_INFO_HTTP2, response->connection_info); | 4078 EXPECT_EQ(HttpResponseInfo::CONNECTION_INFO_HTTP2, response->connection_info); |
| 4082 ASSERT_TRUE(response->headers); | 4079 ASSERT_TRUE(response->headers); |
| 4083 EXPECT_EQ("HTTP/1.1 200", response->headers->GetStatusLine()); | 4080 EXPECT_EQ("HTTP/1.1 200", response->headers->GetStatusLine()); |
| 4084 EXPECT_TRUE(response->was_fetched_via_spdy); | 4081 EXPECT_TRUE(response->was_fetched_via_spdy); |
| 4085 EXPECT_TRUE(response->was_alpn_negotiated); | 4082 EXPECT_TRUE(response->was_alpn_negotiated); |
| 4086 EXPECT_EQ("127.0.0.1", response->socket_address.host()); | 4083 EXPECT_EQ("127.0.0.1", response->socket_address.host()); |
| 4087 EXPECT_EQ(443, response->socket_address.port()); | 4084 EXPECT_EQ(443, response->socket_address.port()); |
| 4088 std::string response_data; | 4085 SpdyString response_data; |
| 4089 rv = ReadTransaction(&trans2, &response_data); | 4086 rv = ReadTransaction(&trans2, &response_data); |
| 4090 EXPECT_THAT(rv, IsOk()); | 4087 EXPECT_THAT(rv, IsOk()); |
| 4091 EXPECT_EQ("hello!", response_data); | 4088 EXPECT_EQ("hello!", response_data); |
| 4092 | 4089 |
| 4093 // Graceful GOAWAY was received, SpdySession should be unavailable. | 4090 // Graceful GOAWAY was received, SpdySession should be unavailable. |
| 4094 spdy_session = spdy_session_pool->FindAvailableSession( | 4091 spdy_session = spdy_session_pool->FindAvailableSession( |
| 4095 key, GURL(), | 4092 key, GURL(), |
| 4096 /* enable_ip_based_pooling = */ true, log); | 4093 /* enable_ip_based_pooling = */ true, log); |
| 4097 EXPECT_FALSE(spdy_session); | 4094 EXPECT_FALSE(spdy_session); |
| 4098 | 4095 |
| (...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4194 ASSERT_TRUE(response); | 4191 ASSERT_TRUE(response); |
| 4195 ASSERT_TRUE(response->headers); | 4192 ASSERT_TRUE(response->headers); |
| 4196 EXPECT_EQ("HTTP/1.1 200 OK", response->headers->GetStatusLine()); | 4193 EXPECT_EQ("HTTP/1.1 200 OK", response->headers->GetStatusLine()); |
| 4197 EXPECT_FALSE(response->was_fetched_via_spdy); | 4194 EXPECT_FALSE(response->was_fetched_via_spdy); |
| 4198 EXPECT_EQ(HttpResponseInfo::CONNECTION_INFO_HTTP1_1, | 4195 EXPECT_EQ(HttpResponseInfo::CONNECTION_INFO_HTTP1_1, |
| 4199 response->connection_info); | 4196 response->connection_info); |
| 4200 EXPECT_TRUE(response->was_alpn_negotiated); | 4197 EXPECT_TRUE(response->was_alpn_negotiated); |
| 4201 EXPECT_TRUE(request.url.SchemeIs("https")); | 4198 EXPECT_TRUE(request.url.SchemeIs("https")); |
| 4202 EXPECT_EQ("127.0.0.1", response->socket_address.host()); | 4199 EXPECT_EQ("127.0.0.1", response->socket_address.host()); |
| 4203 EXPECT_EQ(443, response->socket_address.port()); | 4200 EXPECT_EQ(443, response->socket_address.port()); |
| 4204 std::string response_data; | 4201 SpdyString response_data; |
| 4205 ASSERT_THAT(ReadTransaction(helper.trans(), &response_data), IsOk()); | 4202 ASSERT_THAT(ReadTransaction(helper.trans(), &response_data), IsOk()); |
| 4206 EXPECT_EQ("hello", response_data); | 4203 EXPECT_EQ("hello", response_data); |
| 4207 } | 4204 } |
| 4208 | 4205 |
| 4209 // Retry with HTTP/1.1 to the proxy when receiving HTTP_1_1_REQUIRED from the | 4206 // Retry with HTTP/1.1 to the proxy when receiving HTTP_1_1_REQUIRED from the |
| 4210 // proxy. Note that no actual protocol negotiation happens, instead this test | 4207 // proxy. Note that no actual protocol negotiation happens, instead this test |
| 4211 // forces protocols for both sockets. | 4208 // forces protocols for both sockets. |
| 4212 TEST_F(SpdyNetworkTransactionTest, HTTP11RequiredProxyRetry) { | 4209 TEST_F(SpdyNetworkTransactionTest, HTTP11RequiredProxyRetry) { |
| 4213 HttpRequestInfo request; | 4210 HttpRequestInfo request; |
| 4214 request.method = "GET"; | 4211 request.method = "GET"; |
| (...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4289 ASSERT_TRUE(response); | 4286 ASSERT_TRUE(response); |
| 4290 ASSERT_TRUE(response->headers); | 4287 ASSERT_TRUE(response->headers); |
| 4291 EXPECT_EQ("HTTP/1.1 200 OK", response->headers->GetStatusLine()); | 4288 EXPECT_EQ("HTTP/1.1 200 OK", response->headers->GetStatusLine()); |
| 4292 EXPECT_FALSE(response->was_fetched_via_spdy); | 4289 EXPECT_FALSE(response->was_fetched_via_spdy); |
| 4293 EXPECT_EQ(HttpResponseInfo::CONNECTION_INFO_HTTP1_1, | 4290 EXPECT_EQ(HttpResponseInfo::CONNECTION_INFO_HTTP1_1, |
| 4294 response->connection_info); | 4291 response->connection_info); |
| 4295 EXPECT_FALSE(response->was_alpn_negotiated); | 4292 EXPECT_FALSE(response->was_alpn_negotiated); |
| 4296 EXPECT_TRUE(request.url.SchemeIs("https")); | 4293 EXPECT_TRUE(request.url.SchemeIs("https")); |
| 4297 EXPECT_EQ("127.0.0.1", response->socket_address.host()); | 4294 EXPECT_EQ("127.0.0.1", response->socket_address.host()); |
| 4298 EXPECT_EQ(70, response->socket_address.port()); | 4295 EXPECT_EQ(70, response->socket_address.port()); |
| 4299 std::string response_data; | 4296 SpdyString response_data; |
| 4300 ASSERT_THAT(ReadTransaction(helper.trans(), &response_data), IsOk()); | 4297 ASSERT_THAT(ReadTransaction(helper.trans(), &response_data), IsOk()); |
| 4301 EXPECT_EQ("hello", response_data); | 4298 EXPECT_EQ("hello", response_data); |
| 4302 } | 4299 } |
| 4303 | 4300 |
| 4304 // Test to make sure we can correctly connect through a proxy. | 4301 // Test to make sure we can correctly connect through a proxy. |
| 4305 TEST_F(SpdyNetworkTransactionTest, ProxyConnect) { | 4302 TEST_F(SpdyNetworkTransactionTest, ProxyConnect) { |
| 4306 auto session_deps = base::MakeUnique<SpdySessionDependencies>( | 4303 auto session_deps = base::MakeUnique<SpdySessionDependencies>( |
| 4307 ProxyService::CreateFixedFromPacResult("PROXY myproxy:70")); | 4304 ProxyService::CreateFixedFromPacResult("PROXY myproxy:70")); |
| 4308 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY, | 4305 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY, |
| 4309 NetLogWithSource(), | 4306 NetLogWithSource(), |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4341 EXPECT_THAT(rv, IsError(ERR_IO_PENDING)); | 4338 EXPECT_THAT(rv, IsError(ERR_IO_PENDING)); |
| 4342 | 4339 |
| 4343 rv = callback.WaitForResult(); | 4340 rv = callback.WaitForResult(); |
| 4344 EXPECT_EQ(0, rv); | 4341 EXPECT_EQ(0, rv); |
| 4345 | 4342 |
| 4346 // Verify the response headers. | 4343 // Verify the response headers. |
| 4347 HttpResponseInfo response = *trans->GetResponseInfo(); | 4344 HttpResponseInfo response = *trans->GetResponseInfo(); |
| 4348 ASSERT_TRUE(response.headers); | 4345 ASSERT_TRUE(response.headers); |
| 4349 EXPECT_EQ("HTTP/1.1 200", response.headers->GetStatusLine()); | 4346 EXPECT_EQ("HTTP/1.1 200", response.headers->GetStatusLine()); |
| 4350 | 4347 |
| 4351 std::string response_data; | 4348 SpdyString response_data; |
| 4352 ASSERT_THAT(ReadTransaction(trans, &response_data), IsOk()); | 4349 ASSERT_THAT(ReadTransaction(trans, &response_data), IsOk()); |
| 4353 EXPECT_EQ("hello!", response_data); | 4350 EXPECT_EQ("hello!", response_data); |
| 4354 helper.VerifyDataConsumed(); | 4351 helper.VerifyDataConsumed(); |
| 4355 } | 4352 } |
| 4356 | 4353 |
| 4357 // Test to make sure we can correctly connect through a proxy to | 4354 // Test to make sure we can correctly connect through a proxy to |
| 4358 // www.example.org, if there already exists a direct spdy connection to | 4355 // www.example.org, if there already exists a direct spdy connection to |
| 4359 // www.example.org. See https://crbug.com/49874. | 4356 // www.example.org. See https://crbug.com/49874. |
| 4360 TEST_F(SpdyNetworkTransactionTest, DirectConnectProxyReconnect) { | 4357 TEST_F(SpdyNetworkTransactionTest, DirectConnectProxyReconnect) { |
| 4361 // Use a proxy service which returns a proxy fallback list from DIRECT to | 4358 // Use a proxy service which returns a proxy fallback list from DIRECT to |
| (...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4464 int rv = trans_proxy->Start(&request_proxy, callback_proxy.callback(), | 4461 int rv = trans_proxy->Start(&request_proxy, callback_proxy.callback(), |
| 4465 NetLogWithSource()); | 4462 NetLogWithSource()); |
| 4466 EXPECT_THAT(rv, IsError(ERR_IO_PENDING)); | 4463 EXPECT_THAT(rv, IsError(ERR_IO_PENDING)); |
| 4467 rv = callback_proxy.WaitForResult(); | 4464 rv = callback_proxy.WaitForResult(); |
| 4468 EXPECT_EQ(0, rv); | 4465 EXPECT_EQ(0, rv); |
| 4469 | 4466 |
| 4470 HttpResponseInfo response_proxy = *trans_proxy->GetResponseInfo(); | 4467 HttpResponseInfo response_proxy = *trans_proxy->GetResponseInfo(); |
| 4471 ASSERT_TRUE(response_proxy.headers); | 4468 ASSERT_TRUE(response_proxy.headers); |
| 4472 EXPECT_EQ("HTTP/1.1 200", response_proxy.headers->GetStatusLine()); | 4469 EXPECT_EQ("HTTP/1.1 200", response_proxy.headers->GetStatusLine()); |
| 4473 | 4470 |
| 4474 std::string response_data; | 4471 SpdyString response_data; |
| 4475 ASSERT_THAT(ReadTransaction(trans_proxy, &response_data), IsOk()); | 4472 ASSERT_THAT(ReadTransaction(trans_proxy, &response_data), IsOk()); |
| 4476 EXPECT_EQ("hello!", response_data); | 4473 EXPECT_EQ("hello!", response_data); |
| 4477 | 4474 |
| 4478 helper_proxy.VerifyDataConsumed(); | 4475 helper_proxy.VerifyDataConsumed(); |
| 4479 } | 4476 } |
| 4480 | 4477 |
| 4481 // When we get a TCP-level RST, we need to retry a HttpNetworkTransaction | 4478 // When we get a TCP-level RST, we need to retry a HttpNetworkTransaction |
| 4482 // on a new connection, if the connection was previously known to be good. | 4479 // on a new connection, if the connection was previously known to be good. |
| 4483 // This can happen when a server reboots without saying goodbye, or when | 4480 // This can happen when a server reboots without saying goodbye, or when |
| 4484 // we're behind a NAT that masked the RST. | 4481 // we're behind a NAT that masked the RST. |
| (...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4547 // Now schedule the ERR_CONNECTION_RESET. | 4544 // Now schedule the ERR_CONNECTION_RESET. |
| 4548 data1.Resume(); | 4545 data1.Resume(); |
| 4549 } | 4546 } |
| 4550 rv = callback.WaitForResult(); | 4547 rv = callback.WaitForResult(); |
| 4551 EXPECT_THAT(rv, IsOk()); | 4548 EXPECT_THAT(rv, IsOk()); |
| 4552 | 4549 |
| 4553 const HttpResponseInfo* response = trans.GetResponseInfo(); | 4550 const HttpResponseInfo* response = trans.GetResponseInfo(); |
| 4554 ASSERT_TRUE(response); | 4551 ASSERT_TRUE(response); |
| 4555 EXPECT_TRUE(response->headers); | 4552 EXPECT_TRUE(response->headers); |
| 4556 EXPECT_TRUE(response->was_fetched_via_spdy); | 4553 EXPECT_TRUE(response->was_fetched_via_spdy); |
| 4557 std::string response_data; | 4554 SpdyString response_data; |
| 4558 rv = ReadTransaction(&trans, &response_data); | 4555 rv = ReadTransaction(&trans, &response_data); |
| 4559 EXPECT_THAT(rv, IsOk()); | 4556 EXPECT_THAT(rv, IsOk()); |
| 4560 EXPECT_EQ("HTTP/1.1 200", response->headers->GetStatusLine()); | 4557 EXPECT_EQ("HTTP/1.1 200", response->headers->GetStatusLine()); |
| 4561 EXPECT_EQ("hello!", response_data); | 4558 EXPECT_EQ("hello!", response_data); |
| 4562 base::RunLoop().RunUntilIdle(); | 4559 base::RunLoop().RunUntilIdle(); |
| 4563 } | 4560 } |
| 4564 | 4561 |
| 4565 helper.VerifyDataConsumed(); | 4562 helper.VerifyDataConsumed(); |
| 4566 base::RunLoop().RunUntilIdle(); | 4563 base::RunLoop().RunUntilIdle(); |
| 4567 } | 4564 } |
| (...skipping 120 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4688 CreateMockRead(stream1_reply, 1), | 4685 CreateMockRead(stream1_reply, 1), |
| 4689 CreateMockRead(stream2_syn, 2), | 4686 CreateMockRead(stream2_syn, 2), |
| 4690 CreateMockRead(stream2_headers, 4), | 4687 CreateMockRead(stream2_headers, 4), |
| 4691 CreateMockRead(stream1_body, 5, SYNCHRONOUS), | 4688 CreateMockRead(stream1_body, 5, SYNCHRONOUS), |
| 4692 CreateMockRead(stream2_body, 6), | 4689 CreateMockRead(stream2_body, 6), |
| 4693 MockRead(SYNCHRONOUS, ERR_IO_PENDING, 7), // Force a pause | 4690 MockRead(SYNCHRONOUS, ERR_IO_PENDING, 7), // Force a pause |
| 4694 }; | 4691 }; |
| 4695 | 4692 |
| 4696 HttpResponseInfo response; | 4693 HttpResponseInfo response; |
| 4697 HttpResponseInfo response2; | 4694 HttpResponseInfo response2; |
| 4698 std::string expected_push_result("pushed"); | 4695 SpdyString expected_push_result("pushed"); |
| 4699 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); | 4696 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); |
| 4700 RunServerPushTest(&data, | 4697 RunServerPushTest(&data, |
| 4701 &response, | 4698 &response, |
| 4702 &response2, | 4699 &response2, |
| 4703 expected_push_result); | 4700 expected_push_result); |
| 4704 | 4701 |
| 4705 // Verify the response headers. | 4702 // Verify the response headers. |
| 4706 EXPECT_TRUE(response.headers); | 4703 EXPECT_TRUE(response.headers); |
| 4707 EXPECT_EQ("HTTP/1.1 200", response.headers->GetStatusLine()); | 4704 EXPECT_EQ("HTTP/1.1 200", response.headers->GetStatusLine()); |
| 4708 | 4705 |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4740 2, kPushedData, strlen(kPushedData), true)); | 4737 2, kPushedData, strlen(kPushedData), true)); |
| 4741 MockRead reads[] = { | 4738 MockRead reads[] = { |
| 4742 CreateMockRead(stream1_reply, 1), CreateMockRead(stream2_syn, 2), | 4739 CreateMockRead(stream1_reply, 1), CreateMockRead(stream2_syn, 2), |
| 4743 CreateMockRead(stream1_body, 4), MockRead(ASYNC, ERR_IO_PENDING, 5), | 4740 CreateMockRead(stream1_body, 4), MockRead(ASYNC, ERR_IO_PENDING, 5), |
| 4744 CreateMockRead(stream2_headers, 6), CreateMockRead(stream2_body, 7), | 4741 CreateMockRead(stream2_headers, 6), CreateMockRead(stream2_body, 7), |
| 4745 MockRead(ASYNC, ERR_IO_PENDING, 8), MockRead(ASYNC, 0, 9), // EOF | 4742 MockRead(ASYNC, ERR_IO_PENDING, 8), MockRead(ASYNC, 0, 9), // EOF |
| 4746 }; | 4743 }; |
| 4747 | 4744 |
| 4748 HttpResponseInfo response; | 4745 HttpResponseInfo response; |
| 4749 HttpResponseInfo response2; | 4746 HttpResponseInfo response2; |
| 4750 std::string expected_push_result("pushed"); | 4747 SpdyString expected_push_result("pushed"); |
| 4751 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); | 4748 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); |
| 4752 | 4749 |
| 4753 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY, | 4750 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY, |
| 4754 NetLogWithSource(), nullptr); | 4751 NetLogWithSource(), nullptr); |
| 4755 helper.AddData(&data); | 4752 helper.AddData(&data); |
| 4756 helper.RunPreTestSetup(); | 4753 helper.RunPreTestSetup(); |
| 4757 | 4754 |
| 4758 HttpNetworkTransaction* trans = helper.trans(); | 4755 HttpNetworkTransaction* trans = helper.trans(); |
| 4759 | 4756 |
| 4760 // Start the transaction. | 4757 // Start the transaction. |
| (...skipping 11 matching lines...) Expand all Loading... |
| 4772 // headers are not yet complete. | 4769 // headers are not yet complete. |
| 4773 HttpNetworkTransaction trans2(DEFAULT_PRIORITY, helper.session()); | 4770 HttpNetworkTransaction trans2(DEFAULT_PRIORITY, helper.session()); |
| 4774 rv = trans2.Start(&CreateGetPushRequest(), callback.callback(), | 4771 rv = trans2.Start(&CreateGetPushRequest(), callback.callback(), |
| 4775 NetLogWithSource()); | 4772 NetLogWithSource()); |
| 4776 EXPECT_THAT(rv, IsError(ERR_IO_PENDING)); | 4773 EXPECT_THAT(rv, IsError(ERR_IO_PENDING)); |
| 4777 data.Resume(); | 4774 data.Resume(); |
| 4778 data.RunUntilPaused(); | 4775 data.RunUntilPaused(); |
| 4779 base::RunLoop().RunUntilIdle(); | 4776 base::RunLoop().RunUntilIdle(); |
| 4780 | 4777 |
| 4781 // Read the server push body. | 4778 // Read the server push body. |
| 4782 std::string result2; | 4779 SpdyString result2; |
| 4783 ReadResult(&trans2, &result2); | 4780 ReadResult(&trans2, &result2); |
| 4784 // Read the response body. | 4781 // Read the response body. |
| 4785 std::string result; | 4782 SpdyString result; |
| 4786 ReadResult(trans, &result); | 4783 ReadResult(trans, &result); |
| 4787 | 4784 |
| 4788 // Verify that the received push data is same as the expected push data. | 4785 // Verify that the received push data is same as the expected push data. |
| 4789 EXPECT_EQ(result2.compare(expected_push_result), 0) | 4786 EXPECT_EQ(result2.compare(expected_push_result), 0) |
| 4790 << "Received data: " | 4787 << "Received data: " |
| 4791 << result2 | 4788 << result2 |
| 4792 << "||||| Expected data: " | 4789 << "||||| Expected data: " |
| 4793 << expected_push_result; | 4790 << expected_push_result; |
| 4794 | 4791 |
| 4795 // Verify the response headers. | 4792 // Verify the response headers. |
| (...skipping 167 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4963 TestCompletionCallback callback; | 4960 TestCompletionCallback callback; |
| 4964 | 4961 |
| 4965 int rv = trans->Start(&request, callback.callback(), NetLogWithSource()); | 4962 int rv = trans->Start(&request, callback.callback(), NetLogWithSource()); |
| 4966 EXPECT_THAT(rv, IsError(ERR_IO_PENDING)); | 4963 EXPECT_THAT(rv, IsError(ERR_IO_PENDING)); |
| 4967 rv = callback.WaitForResult(); | 4964 rv = callback.WaitForResult(); |
| 4968 | 4965 |
| 4969 // Finish async network reads/writes. | 4966 // Finish async network reads/writes. |
| 4970 base::RunLoop().RunUntilIdle(); | 4967 base::RunLoop().RunUntilIdle(); |
| 4971 | 4968 |
| 4972 // Read the response body. | 4969 // Read the response body. |
| 4973 std::string result; | 4970 SpdyString result; |
| 4974 ReadResult(trans, &result); | 4971 ReadResult(trans, &result); |
| 4975 | 4972 |
| 4976 // Verify that we consumed all test data. | 4973 // Verify that we consumed all test data. |
| 4977 EXPECT_TRUE(data.AllReadDataConsumed()); | 4974 EXPECT_TRUE(data.AllReadDataConsumed()); |
| 4978 EXPECT_TRUE(data.AllWriteDataConsumed()); | 4975 EXPECT_TRUE(data.AllWriteDataConsumed()); |
| 4979 | 4976 |
| 4980 // Verify the response headers. | 4977 // Verify the response headers. |
| 4981 // Copy the response info, because trans goes away. | 4978 // Copy the response info, because trans goes away. |
| 4982 response = *trans->GetResponseInfo(); | 4979 response = *trans->GetResponseInfo(); |
| 4983 | 4980 |
| (...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5060 rv = callback1.GetResult(rv); | 5057 rv = callback1.GetResult(rv); |
| 5061 EXPECT_THAT(rv, IsOk()); | 5058 EXPECT_THAT(rv, IsOk()); |
| 5062 | 5059 |
| 5063 EXPECT_TRUE(spdy_session->unclaimed_pushed_streams_.empty()); | 5060 EXPECT_TRUE(spdy_session->unclaimed_pushed_streams_.empty()); |
| 5064 EXPECT_EQ(0u, spdy_session->unclaimed_pushed_streams_.size()); | 5061 EXPECT_EQ(0u, spdy_session->unclaimed_pushed_streams_.size()); |
| 5065 | 5062 |
| 5066 HttpResponseInfo response = *trans0->GetResponseInfo(); | 5063 HttpResponseInfo response = *trans0->GetResponseInfo(); |
| 5067 EXPECT_TRUE(response.headers); | 5064 EXPECT_TRUE(response.headers); |
| 5068 EXPECT_EQ("HTTP/1.1 200", response.headers->GetStatusLine()); | 5065 EXPECT_EQ("HTTP/1.1 200", response.headers->GetStatusLine()); |
| 5069 | 5066 |
| 5070 std::string result0; | 5067 SpdyString result0; |
| 5071 ReadResult(trans0, &result0); | 5068 ReadResult(trans0, &result0); |
| 5072 EXPECT_EQ("hello!", result0); | 5069 EXPECT_EQ("hello!", result0); |
| 5073 | 5070 |
| 5074 HttpResponseInfo push_response = *trans1.GetResponseInfo(); | 5071 HttpResponseInfo push_response = *trans1.GetResponseInfo(); |
| 5075 EXPECT_TRUE(push_response.headers); | 5072 EXPECT_TRUE(push_response.headers); |
| 5076 EXPECT_EQ("HTTP/1.1 200", push_response.headers->GetStatusLine()); | 5073 EXPECT_EQ("HTTP/1.1 200", push_response.headers->GetStatusLine()); |
| 5077 | 5074 |
| 5078 std::string result1; | 5075 SpdyString result1; |
| 5079 ReadResult(&trans1, &result1); | 5076 ReadResult(&trans1, &result1); |
| 5080 EXPECT_EQ(kPushedData, result1); | 5077 EXPECT_EQ(kPushedData, result1); |
| 5081 | 5078 |
| 5082 base::RunLoop().RunUntilIdle(); | 5079 base::RunLoop().RunUntilIdle(); |
| 5083 helper.VerifyDataConsumed(); | 5080 helper.VerifyDataConsumed(); |
| 5084 VerifyStreamsClosed(helper); | 5081 VerifyStreamsClosed(helper); |
| 5085 } | 5082 } |
| 5086 | 5083 |
| 5087 // Verify that push works cross origin, even if there is already a connection | 5084 // Verify that push works cross origin, even if there is already a connection |
| 5088 // open to origin of pushed resource. | 5085 // open to origin of pushed resource. |
| (...skipping 135 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5224 EXPECT_TRUE(spdy_session0->unclaimed_pushed_streams_.empty()); | 5221 EXPECT_TRUE(spdy_session0->unclaimed_pushed_streams_.empty()); |
| 5225 EXPECT_EQ(0u, spdy_session0->unclaimed_pushed_streams_.size()); | 5222 EXPECT_EQ(0u, spdy_session0->unclaimed_pushed_streams_.size()); |
| 5226 | 5223 |
| 5227 EXPECT_TRUE(spdy_session1->unclaimed_pushed_streams_.empty()); | 5224 EXPECT_TRUE(spdy_session1->unclaimed_pushed_streams_.empty()); |
| 5228 EXPECT_EQ(0u, spdy_session1->unclaimed_pushed_streams_.size()); | 5225 EXPECT_EQ(0u, spdy_session1->unclaimed_pushed_streams_.size()); |
| 5229 | 5226 |
| 5230 HttpResponseInfo response0 = *trans0->GetResponseInfo(); | 5227 HttpResponseInfo response0 = *trans0->GetResponseInfo(); |
| 5231 EXPECT_TRUE(response0.headers); | 5228 EXPECT_TRUE(response0.headers); |
| 5232 EXPECT_EQ("HTTP/1.1 200", response0.headers->GetStatusLine()); | 5229 EXPECT_EQ("HTTP/1.1 200", response0.headers->GetStatusLine()); |
| 5233 | 5230 |
| 5234 std::string result0; | 5231 SpdyString result0; |
| 5235 ReadResult(trans0, &result0); | 5232 ReadResult(trans0, &result0); |
| 5236 EXPECT_EQ(kData0, result0); | 5233 EXPECT_EQ(kData0, result0); |
| 5237 | 5234 |
| 5238 HttpResponseInfo response1 = *trans1.GetResponseInfo(); | 5235 HttpResponseInfo response1 = *trans1.GetResponseInfo(); |
| 5239 EXPECT_TRUE(response1.headers); | 5236 EXPECT_TRUE(response1.headers); |
| 5240 EXPECT_EQ("HTTP/1.1 200", response1.headers->GetStatusLine()); | 5237 EXPECT_EQ("HTTP/1.1 200", response1.headers->GetStatusLine()); |
| 5241 | 5238 |
| 5242 std::string result1; | 5239 SpdyString result1; |
| 5243 ReadResult(&trans1, &result1); | 5240 ReadResult(&trans1, &result1); |
| 5244 EXPECT_EQ(kData1, result1); | 5241 EXPECT_EQ(kData1, result1); |
| 5245 | 5242 |
| 5246 HttpResponseInfo push_response = *trans2.GetResponseInfo(); | 5243 HttpResponseInfo push_response = *trans2.GetResponseInfo(); |
| 5247 EXPECT_TRUE(push_response.headers); | 5244 EXPECT_TRUE(push_response.headers); |
| 5248 EXPECT_EQ("HTTP/1.1 200", push_response.headers->GetStatusLine()); | 5245 EXPECT_EQ("HTTP/1.1 200", push_response.headers->GetStatusLine()); |
| 5249 | 5246 |
| 5250 std::string result2; | 5247 SpdyString result2; |
| 5251 ReadResult(&trans2, &result2); | 5248 ReadResult(&trans2, &result2); |
| 5252 EXPECT_EQ(kPushedData, result2); | 5249 EXPECT_EQ(kPushedData, result2); |
| 5253 | 5250 |
| 5254 base::RunLoop().RunUntilIdle(); | 5251 base::RunLoop().RunUntilIdle(); |
| 5255 helper.VerifyDataConsumed(); | 5252 helper.VerifyDataConsumed(); |
| 5256 VerifyStreamsClosed(helper); | 5253 VerifyStreamsClosed(helper); |
| 5257 } | 5254 } |
| 5258 | 5255 |
| 5259 TEST_F(SpdyNetworkTransactionTest, ServerPushInvalidCrossOrigin) { | 5256 TEST_F(SpdyNetworkTransactionTest, ServerPushInvalidCrossOrigin) { |
| 5260 // "spdy_pooling.pem" is valid for www.example.org, | 5257 // "spdy_pooling.pem" is valid for www.example.org, |
| (...skipping 204 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5465 // write, leading to a complete write of request body; after that we send | 5462 // write, leading to a complete write of request body; after that we send |
| 5466 // a reply with a body, to cause a graceful shutdown. | 5463 // a reply with a body, to cause a graceful shutdown. |
| 5467 | 5464 |
| 5468 // TODO(agayev): develop a socket data provider where both, reads and | 5465 // TODO(agayev): develop a socket data provider where both, reads and |
| 5469 // writes are ordered so that writing tests like these are easy and rewrite | 5466 // writes are ordered so that writing tests like these are easy and rewrite |
| 5470 // all these tests using it. Right now we are working around the | 5467 // all these tests using it. Right now we are working around the |
| 5471 // limitations as described above and it's not deterministic, tests may | 5468 // limitations as described above and it's not deterministic, tests may |
| 5472 // fail under specific circumstances. | 5469 // fail under specific circumstances. |
| 5473 TEST_F(SpdyNetworkTransactionTest, WindowUpdateReceived) { | 5470 TEST_F(SpdyNetworkTransactionTest, WindowUpdateReceived) { |
| 5474 static int kFrameCount = 2; | 5471 static int kFrameCount = 2; |
| 5475 std::unique_ptr<std::string> content( | 5472 std::unique_ptr<SpdyString> content( |
| 5476 new std::string(kMaxSpdyFrameChunkSize, 'a')); | 5473 new SpdyString(kMaxSpdyFrameChunkSize, 'a')); |
| 5477 SpdySerializedFrame req(spdy_util_.ConstructSpdyPost( | 5474 SpdySerializedFrame req(spdy_util_.ConstructSpdyPost( |
| 5478 kDefaultUrl, 1, kMaxSpdyFrameChunkSize * kFrameCount, LOWEST, nullptr, | 5475 kDefaultUrl, 1, kMaxSpdyFrameChunkSize * kFrameCount, LOWEST, nullptr, |
| 5479 0)); | 5476 0)); |
| 5480 SpdySerializedFrame body(spdy_util_.ConstructSpdyDataFrame( | 5477 SpdySerializedFrame body(spdy_util_.ConstructSpdyDataFrame( |
| 5481 1, content->c_str(), content->size(), false)); | 5478 1, content->c_str(), content->size(), false)); |
| 5482 SpdySerializedFrame body_end(spdy_util_.ConstructSpdyDataFrame( | 5479 SpdySerializedFrame body_end(spdy_util_.ConstructSpdyDataFrame( |
| 5483 1, content->c_str(), content->size(), true)); | 5480 1, content->c_str(), content->size(), true)); |
| 5484 | 5481 |
| 5485 MockWrite writes[] = { | 5482 MockWrite writes[] = { |
| 5486 CreateMockWrite(req, 0), CreateMockWrite(body, 1), | 5483 CreateMockWrite(req, 0), CreateMockWrite(body, 1), |
| (...skipping 122 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5609 kHttp2ConnectionHeaderPrefixSize, 0)); | 5606 kHttp2ConnectionHeaderPrefixSize, 0)); |
| 5610 writes.push_back(CreateMockWrite(initial_settings_frame, writes.size())); | 5607 writes.push_back(CreateMockWrite(initial_settings_frame, writes.size())); |
| 5611 writes.push_back(CreateMockWrite(initial_window_update, writes.size())); | 5608 writes.push_back(CreateMockWrite(initial_window_update, writes.size())); |
| 5612 writes.push_back(CreateMockWrite(req, writes.size())); | 5609 writes.push_back(CreateMockWrite(req, writes.size())); |
| 5613 | 5610 |
| 5614 std::vector<MockRead> reads; | 5611 std::vector<MockRead> reads; |
| 5615 SpdySerializedFrame resp(spdy_util_.ConstructSpdyGetReply(nullptr, 0, 1)); | 5612 SpdySerializedFrame resp(spdy_util_.ConstructSpdyGetReply(nullptr, 0, 1)); |
| 5616 reads.push_back(CreateMockRead(resp, writes.size() + reads.size())); | 5613 reads.push_back(CreateMockRead(resp, writes.size() + reads.size())); |
| 5617 | 5614 |
| 5618 std::vector<SpdySerializedFrame> body_frames; | 5615 std::vector<SpdySerializedFrame> body_frames; |
| 5619 const std::string body_data(kChunkSize, 'x'); | 5616 const SpdyString body_data(kChunkSize, 'x'); |
| 5620 for (size_t remaining = kTargetSize; remaining != 0;) { | 5617 for (size_t remaining = kTargetSize; remaining != 0;) { |
| 5621 size_t frame_size = std::min(remaining, body_data.size()); | 5618 size_t frame_size = std::min(remaining, body_data.size()); |
| 5622 body_frames.push_back(spdy_util_.ConstructSpdyDataFrame(1, body_data.data(), | 5619 body_frames.push_back(spdy_util_.ConstructSpdyDataFrame(1, body_data.data(), |
| 5623 frame_size, false)); | 5620 frame_size, false)); |
| 5624 reads.push_back( | 5621 reads.push_back( |
| 5625 CreateMockRead(body_frames.back(), writes.size() + reads.size())); | 5622 CreateMockRead(body_frames.back(), writes.size() + reads.size())); |
| 5626 remaining -= frame_size; | 5623 remaining -= frame_size; |
| 5627 } | 5624 } |
| 5628 // Yield. | 5625 // Yield. |
| 5629 reads.push_back( | 5626 reads.push_back( |
| (...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5692 base::RunLoop().RunUntilIdle(); | 5689 base::RunLoop().RunUntilIdle(); |
| 5693 helper.VerifyDataConsumed(); | 5690 helper.VerifyDataConsumed(); |
| 5694 } | 5691 } |
| 5695 | 5692 |
| 5696 // Test that WINDOW_UPDATE frame causing overflow is handled correctly. | 5693 // Test that WINDOW_UPDATE frame causing overflow is handled correctly. |
| 5697 TEST_F(SpdyNetworkTransactionTest, WindowUpdateOverflow) { | 5694 TEST_F(SpdyNetworkTransactionTest, WindowUpdateOverflow) { |
| 5698 // Number of full frames we hope to write (but will not, used to | 5695 // Number of full frames we hope to write (but will not, used to |
| 5699 // set content-length header correctly) | 5696 // set content-length header correctly) |
| 5700 static int kFrameCount = 3; | 5697 static int kFrameCount = 3; |
| 5701 | 5698 |
| 5702 std::unique_ptr<std::string> content( | 5699 std::unique_ptr<SpdyString> content( |
| 5703 new std::string(kMaxSpdyFrameChunkSize, 'a')); | 5700 new SpdyString(kMaxSpdyFrameChunkSize, 'a')); |
| 5704 SpdySerializedFrame req(spdy_util_.ConstructSpdyPost( | 5701 SpdySerializedFrame req(spdy_util_.ConstructSpdyPost( |
| 5705 kDefaultUrl, 1, kMaxSpdyFrameChunkSize * kFrameCount, LOWEST, nullptr, | 5702 kDefaultUrl, 1, kMaxSpdyFrameChunkSize * kFrameCount, LOWEST, nullptr, |
| 5706 0)); | 5703 0)); |
| 5707 SpdySerializedFrame body(spdy_util_.ConstructSpdyDataFrame( | 5704 SpdySerializedFrame body(spdy_util_.ConstructSpdyDataFrame( |
| 5708 1, content->c_str(), content->size(), false)); | 5705 1, content->c_str(), content->size(), false)); |
| 5709 SpdySerializedFrame rst( | 5706 SpdySerializedFrame rst( |
| 5710 spdy_util_.ConstructSpdyRstStream(1, ERROR_CODE_FLOW_CONTROL_ERROR)); | 5707 spdy_util_.ConstructSpdyRstStream(1, ERROR_CODE_FLOW_CONTROL_ERROR)); |
| 5711 | 5708 |
| 5712 // We're not going to write a data frame with FIN, we'll receive a bad | 5709 // We're not going to write a data frame with FIN, we'll receive a bad |
| 5713 // WINDOW_UPDATE while sending a request and will send a RST_STREAM frame. | 5710 // WINDOW_UPDATE while sending a request and will send a RST_STREAM frame. |
| (...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5777 // |initial_window_size|. | 5774 // |initial_window_size|. |
| 5778 size_t num_upload_buffers = | 5775 size_t num_upload_buffers = |
| 5779 ceil(static_cast<double>(initial_window_size) / kBufferSize); | 5776 ceil(static_cast<double>(initial_window_size) / kBufferSize); |
| 5780 // Each upload data buffer consists of |num_frames_in_one_upload_buffer| | 5777 // Each upload data buffer consists of |num_frames_in_one_upload_buffer| |
| 5781 // frames, each with |kMaxSpdyFrameChunkSize| bytes except the last frame, | 5778 // frames, each with |kMaxSpdyFrameChunkSize| bytes except the last frame, |
| 5782 // which has kBufferSize % kMaxSpdyChunkSize bytes. | 5779 // which has kBufferSize % kMaxSpdyChunkSize bytes. |
| 5783 size_t num_frames_in_one_upload_buffer = | 5780 size_t num_frames_in_one_upload_buffer = |
| 5784 ceil(static_cast<double>(kBufferSize) / kMaxSpdyFrameChunkSize); | 5781 ceil(static_cast<double>(kBufferSize) / kMaxSpdyFrameChunkSize); |
| 5785 | 5782 |
| 5786 // Construct content for a data frame of maximum size. | 5783 // Construct content for a data frame of maximum size. |
| 5787 std::string content(kMaxSpdyFrameChunkSize, 'a'); | 5784 SpdyString content(kMaxSpdyFrameChunkSize, 'a'); |
| 5788 | 5785 |
| 5789 SpdySerializedFrame req(spdy_util_.ConstructSpdyPost( | 5786 SpdySerializedFrame req(spdy_util_.ConstructSpdyPost( |
| 5790 kDefaultUrl, 1, | 5787 kDefaultUrl, 1, |
| 5791 /*content_length=*/kBufferSize * num_upload_buffers + kUploadDataSize, | 5788 /*content_length=*/kBufferSize * num_upload_buffers + kUploadDataSize, |
| 5792 LOWEST, nullptr, 0)); | 5789 LOWEST, nullptr, 0)); |
| 5793 | 5790 |
| 5794 // Full frames. | 5791 // Full frames. |
| 5795 SpdySerializedFrame body1(spdy_util_.ConstructSpdyDataFrame( | 5792 SpdySerializedFrame body1(spdy_util_.ConstructSpdyDataFrame( |
| 5796 1, content.c_str(), content.size(), false)); | 5793 1, content.c_str(), content.size(), false)); |
| 5797 | 5794 |
| 5798 // Last frame in each upload data buffer. | 5795 // Last frame in each upload data buffer. |
| 5799 SpdySerializedFrame body2(spdy_util_.ConstructSpdyDataFrame( | 5796 SpdySerializedFrame body2(spdy_util_.ConstructSpdyDataFrame( |
| 5800 1, content.c_str(), kBufferSize % kMaxSpdyFrameChunkSize, false)); | 5797 1, content.c_str(), kBufferSize % kMaxSpdyFrameChunkSize, false)); |
| 5801 | 5798 |
| 5802 // The very last frame before the stalled frames. | 5799 // The very last frame before the stalled frames. |
| 5803 SpdySerializedFrame body3(spdy_util_.ConstructSpdyDataFrame( | 5800 SpdySerializedFrame body3(spdy_util_.ConstructSpdyDataFrame( |
| 5804 1, content.c_str(), | 5801 1, content.c_str(), |
| 5805 initial_window_size % kBufferSize % kMaxSpdyFrameChunkSize, false)); | 5802 initial_window_size % kBufferSize % kMaxSpdyFrameChunkSize, false)); |
| 5806 | 5803 |
| 5807 // Data frames to be sent once WINDOW_UPDATE frame is received. | 5804 // Data frames to be sent once WINDOW_UPDATE frame is received. |
| 5808 | 5805 |
| 5809 // If kBufferSize * num_upload_buffers > initial_window_size, | 5806 // If kBufferSize * num_upload_buffers > initial_window_size, |
| 5810 // we need one additional frame to send the rest of 'a'. | 5807 // we need one additional frame to send the rest of 'a'. |
| 5811 std::string last_body(kBufferSize * num_upload_buffers - initial_window_size, | 5808 SpdyString last_body(kBufferSize * num_upload_buffers - initial_window_size, |
| 5812 'a'); | 5809 'a'); |
| 5813 SpdySerializedFrame body4(spdy_util_.ConstructSpdyDataFrame( | 5810 SpdySerializedFrame body4(spdy_util_.ConstructSpdyDataFrame( |
| 5814 1, last_body.c_str(), last_body.size(), false)); | 5811 1, last_body.c_str(), last_body.size(), false)); |
| 5815 | 5812 |
| 5816 // Also send a "hello!" after WINDOW_UPDATE. | 5813 // Also send a "hello!" after WINDOW_UPDATE. |
| 5817 SpdySerializedFrame body5(spdy_util_.ConstructSpdyDataFrame(1, true)); | 5814 SpdySerializedFrame body5(spdy_util_.ConstructSpdyDataFrame(1, true)); |
| 5818 | 5815 |
| 5819 // Fill in mock writes. | 5816 // Fill in mock writes. |
| 5820 size_t i = 0; | 5817 size_t i = 0; |
| 5821 std::vector<MockWrite> writes; | 5818 std::vector<MockWrite> writes; |
| 5822 writes.push_back(CreateMockWrite(req, i++)); | 5819 writes.push_back(CreateMockWrite(req, i++)); |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5859 SpdySerializedFrame reply(spdy_util_.ConstructSpdyPostReply(nullptr, 0)); | 5856 SpdySerializedFrame reply(spdy_util_.ConstructSpdyPostReply(nullptr, 0)); |
| 5860 reads.push_back(CreateMockRead(reply, i++)); | 5857 reads.push_back(CreateMockRead(reply, i++)); |
| 5861 reads.push_back(CreateMockRead(body2, i++)); | 5858 reads.push_back(CreateMockRead(body2, i++)); |
| 5862 reads.push_back(CreateMockRead(body5, i++)); | 5859 reads.push_back(CreateMockRead(body5, i++)); |
| 5863 reads.push_back(MockRead(ASYNC, 0, i++)); // EOF | 5860 reads.push_back(MockRead(ASYNC, 0, i++)); // EOF |
| 5864 | 5861 |
| 5865 SequencedSocketData data(reads.data(), reads.size(), writes.data(), | 5862 SequencedSocketData data(reads.data(), reads.size(), writes.data(), |
| 5866 writes.size()); | 5863 writes.size()); |
| 5867 | 5864 |
| 5868 std::vector<std::unique_ptr<UploadElementReader>> element_readers; | 5865 std::vector<std::unique_ptr<UploadElementReader>> element_readers; |
| 5869 std::string upload_data_string(kBufferSize * num_upload_buffers, 'a'); | 5866 SpdyString upload_data_string(kBufferSize * num_upload_buffers, 'a'); |
| 5870 upload_data_string.append(kUploadData, kUploadDataSize); | 5867 upload_data_string.append(kUploadData, kUploadDataSize); |
| 5871 element_readers.push_back(base::WrapUnique(new UploadBytesElementReader( | 5868 element_readers.push_back(base::WrapUnique(new UploadBytesElementReader( |
| 5872 upload_data_string.c_str(), upload_data_string.size()))); | 5869 upload_data_string.c_str(), upload_data_string.size()))); |
| 5873 ElementsUploadDataStream upload_data_stream(std::move(element_readers), 0); | 5870 ElementsUploadDataStream upload_data_stream(std::move(element_readers), 0); |
| 5874 | 5871 |
| 5875 HttpRequestInfo request; | 5872 HttpRequestInfo request; |
| 5876 request.method = "POST"; | 5873 request.method = "POST"; |
| 5877 request.url = default_url_; | 5874 request.url = default_url_; |
| 5878 request.upload_data_stream = &upload_data_stream; | 5875 request.upload_data_stream = &upload_data_stream; |
| 5879 NormalSpdyTransactionHelper helper(request, DEFAULT_PRIORITY, | 5876 NormalSpdyTransactionHelper helper(request, DEFAULT_PRIORITY, |
| (...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5927 // |initial_window_size|. | 5924 // |initial_window_size|. |
| 5928 size_t num_upload_buffers = | 5925 size_t num_upload_buffers = |
| 5929 ceil(static_cast<double>(initial_window_size) / kBufferSize); | 5926 ceil(static_cast<double>(initial_window_size) / kBufferSize); |
| 5930 // Each upload data buffer consists of |num_frames_in_one_upload_buffer| | 5927 // Each upload data buffer consists of |num_frames_in_one_upload_buffer| |
| 5931 // frames, each with |kMaxSpdyFrameChunkSize| bytes except the last frame, | 5928 // frames, each with |kMaxSpdyFrameChunkSize| bytes except the last frame, |
| 5932 // which has kBufferSize % kMaxSpdyChunkSize bytes. | 5929 // which has kBufferSize % kMaxSpdyChunkSize bytes. |
| 5933 size_t num_frames_in_one_upload_buffer = | 5930 size_t num_frames_in_one_upload_buffer = |
| 5934 ceil(static_cast<double>(kBufferSize) / kMaxSpdyFrameChunkSize); | 5931 ceil(static_cast<double>(kBufferSize) / kMaxSpdyFrameChunkSize); |
| 5935 | 5932 |
| 5936 // Construct content for a data frame of maximum size. | 5933 // Construct content for a data frame of maximum size. |
| 5937 std::string content(kMaxSpdyFrameChunkSize, 'a'); | 5934 SpdyString content(kMaxSpdyFrameChunkSize, 'a'); |
| 5938 | 5935 |
| 5939 SpdySerializedFrame req(spdy_util_.ConstructSpdyPost( | 5936 SpdySerializedFrame req(spdy_util_.ConstructSpdyPost( |
| 5940 kDefaultUrl, 1, | 5937 kDefaultUrl, 1, |
| 5941 /*content_length=*/kBufferSize * num_upload_buffers + kUploadDataSize, | 5938 /*content_length=*/kBufferSize * num_upload_buffers + kUploadDataSize, |
| 5942 LOWEST, nullptr, 0)); | 5939 LOWEST, nullptr, 0)); |
| 5943 | 5940 |
| 5944 // Full frames. | 5941 // Full frames. |
| 5945 SpdySerializedFrame body1(spdy_util_.ConstructSpdyDataFrame( | 5942 SpdySerializedFrame body1(spdy_util_.ConstructSpdyDataFrame( |
| 5946 1, content.c_str(), content.size(), false)); | 5943 1, content.c_str(), content.size(), false)); |
| 5947 | 5944 |
| 5948 // Last frame in each upload data buffer. | 5945 // Last frame in each upload data buffer. |
| 5949 SpdySerializedFrame body2(spdy_util_.ConstructSpdyDataFrame( | 5946 SpdySerializedFrame body2(spdy_util_.ConstructSpdyDataFrame( |
| 5950 1, content.c_str(), kBufferSize % kMaxSpdyFrameChunkSize, false)); | 5947 1, content.c_str(), kBufferSize % kMaxSpdyFrameChunkSize, false)); |
| 5951 | 5948 |
| 5952 // The very last frame before the stalled frames. | 5949 // The very last frame before the stalled frames. |
| 5953 SpdySerializedFrame body3(spdy_util_.ConstructSpdyDataFrame( | 5950 SpdySerializedFrame body3(spdy_util_.ConstructSpdyDataFrame( |
| 5954 1, content.c_str(), | 5951 1, content.c_str(), |
| 5955 initial_window_size % kBufferSize % kMaxSpdyFrameChunkSize, false)); | 5952 initial_window_size % kBufferSize % kMaxSpdyFrameChunkSize, false)); |
| 5956 | 5953 |
| 5957 // Data frames to be sent once WINDOW_UPDATE frame is received. | 5954 // Data frames to be sent once WINDOW_UPDATE frame is received. |
| 5958 | 5955 |
| 5959 // If kBufferSize * num_upload_buffers > initial_window_size, | 5956 // If kBufferSize * num_upload_buffers > initial_window_size, |
| 5960 // we need one additional frame to send the rest of 'a'. | 5957 // we need one additional frame to send the rest of 'a'. |
| 5961 std::string last_body(kBufferSize * num_upload_buffers - initial_window_size, | 5958 SpdyString last_body(kBufferSize * num_upload_buffers - initial_window_size, |
| 5962 'a'); | 5959 'a'); |
| 5963 SpdySerializedFrame body4(spdy_util_.ConstructSpdyDataFrame( | 5960 SpdySerializedFrame body4(spdy_util_.ConstructSpdyDataFrame( |
| 5964 1, last_body.c_str(), last_body.size(), false)); | 5961 1, last_body.c_str(), last_body.size(), false)); |
| 5965 | 5962 |
| 5966 // Also send a "hello!" after WINDOW_UPDATE. | 5963 // Also send a "hello!" after WINDOW_UPDATE. |
| 5967 SpdySerializedFrame body5(spdy_util_.ConstructSpdyDataFrame(1, true)); | 5964 SpdySerializedFrame body5(spdy_util_.ConstructSpdyDataFrame(1, true)); |
| 5968 | 5965 |
| 5969 // Fill in mock writes. | 5966 // Fill in mock writes. |
| 5970 size_t i = 0; | 5967 size_t i = 0; |
| 5971 std::vector<MockWrite> writes; | 5968 std::vector<MockWrite> writes; |
| 5972 writes.push_back(CreateMockWrite(req, i++)); | 5969 writes.push_back(CreateMockWrite(req, i++)); |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6018 reads.push_back(CreateMockRead(body2, i++)); | 6015 reads.push_back(CreateMockRead(body2, i++)); |
| 6019 reads.push_back(CreateMockRead(body5, i++)); | 6016 reads.push_back(CreateMockRead(body5, i++)); |
| 6020 reads.push_back(MockRead(ASYNC, 0, i++)); // EOF | 6017 reads.push_back(MockRead(ASYNC, 0, i++)); // EOF |
| 6021 | 6018 |
| 6022 // Force all writes to happen before any read, last write will not | 6019 // Force all writes to happen before any read, last write will not |
| 6023 // actually queue a frame, due to window size being 0. | 6020 // actually queue a frame, due to window size being 0. |
| 6024 SequencedSocketData data(reads.data(), reads.size(), writes.data(), | 6021 SequencedSocketData data(reads.data(), reads.size(), writes.data(), |
| 6025 writes.size()); | 6022 writes.size()); |
| 6026 | 6023 |
| 6027 std::vector<std::unique_ptr<UploadElementReader>> element_readers; | 6024 std::vector<std::unique_ptr<UploadElementReader>> element_readers; |
| 6028 std::string upload_data_string(kBufferSize * num_upload_buffers, 'a'); | 6025 SpdyString upload_data_string(kBufferSize * num_upload_buffers, 'a'); |
| 6029 upload_data_string.append(kUploadData, kUploadDataSize); | 6026 upload_data_string.append(kUploadData, kUploadDataSize); |
| 6030 element_readers.push_back(base::WrapUnique(new UploadBytesElementReader( | 6027 element_readers.push_back(base::WrapUnique(new UploadBytesElementReader( |
| 6031 upload_data_string.c_str(), upload_data_string.size()))); | 6028 upload_data_string.c_str(), upload_data_string.size()))); |
| 6032 ElementsUploadDataStream upload_data_stream(std::move(element_readers), 0); | 6029 ElementsUploadDataStream upload_data_stream(std::move(element_readers), 0); |
| 6033 | 6030 |
| 6034 HttpRequestInfo request; | 6031 HttpRequestInfo request; |
| 6035 request.method = "POST"; | 6032 request.method = "POST"; |
| 6036 request.url = default_url_; | 6033 request.url = default_url_; |
| 6037 request.upload_data_stream = &upload_data_stream; | 6034 request.upload_data_stream = &upload_data_stream; |
| 6038 NormalSpdyTransactionHelper helper(request, DEFAULT_PRIORITY, | 6035 NormalSpdyTransactionHelper helper(request, DEFAULT_PRIORITY, |
| (...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6089 // |initial_window_size|. | 6086 // |initial_window_size|. |
| 6090 size_t num_upload_buffers = | 6087 size_t num_upload_buffers = |
| 6091 ceil(static_cast<double>(initial_window_size) / kBufferSize); | 6088 ceil(static_cast<double>(initial_window_size) / kBufferSize); |
| 6092 // Each upload data buffer consists of |num_frames_in_one_upload_buffer| | 6089 // Each upload data buffer consists of |num_frames_in_one_upload_buffer| |
| 6093 // frames, each with |kMaxSpdyFrameChunkSize| bytes except the last frame, | 6090 // frames, each with |kMaxSpdyFrameChunkSize| bytes except the last frame, |
| 6094 // which has kBufferSize % kMaxSpdyChunkSize bytes. | 6091 // which has kBufferSize % kMaxSpdyChunkSize bytes. |
| 6095 size_t num_frames_in_one_upload_buffer = | 6092 size_t num_frames_in_one_upload_buffer = |
| 6096 ceil(static_cast<double>(kBufferSize) / kMaxSpdyFrameChunkSize); | 6093 ceil(static_cast<double>(kBufferSize) / kMaxSpdyFrameChunkSize); |
| 6097 | 6094 |
| 6098 // Construct content for a data frame of maximum size. | 6095 // Construct content for a data frame of maximum size. |
| 6099 std::string content(kMaxSpdyFrameChunkSize, 'a'); | 6096 SpdyString content(kMaxSpdyFrameChunkSize, 'a'); |
| 6100 | 6097 |
| 6101 SpdySerializedFrame req(spdy_util_.ConstructSpdyPost( | 6098 SpdySerializedFrame req(spdy_util_.ConstructSpdyPost( |
| 6102 kDefaultUrl, 1, | 6099 kDefaultUrl, 1, |
| 6103 /*content_length=*/kBufferSize * num_upload_buffers + kUploadDataSize, | 6100 /*content_length=*/kBufferSize * num_upload_buffers + kUploadDataSize, |
| 6104 LOWEST, nullptr, 0)); | 6101 LOWEST, nullptr, 0)); |
| 6105 | 6102 |
| 6106 // Full frames. | 6103 // Full frames. |
| 6107 SpdySerializedFrame body1(spdy_util_.ConstructSpdyDataFrame( | 6104 SpdySerializedFrame body1(spdy_util_.ConstructSpdyDataFrame( |
| 6108 1, content.c_str(), content.size(), false)); | 6105 1, content.c_str(), content.size(), false)); |
| 6109 | 6106 |
| 6110 // Last frame in each upload data buffer. | 6107 // Last frame in each upload data buffer. |
| 6111 SpdySerializedFrame body2(spdy_util_.ConstructSpdyDataFrame( | 6108 SpdySerializedFrame body2(spdy_util_.ConstructSpdyDataFrame( |
| 6112 1, content.c_str(), kBufferSize % kMaxSpdyFrameChunkSize, false)); | 6109 1, content.c_str(), kBufferSize % kMaxSpdyFrameChunkSize, false)); |
| 6113 | 6110 |
| 6114 // The very last frame before the stalled frames. | 6111 // The very last frame before the stalled frames. |
| 6115 SpdySerializedFrame body3(spdy_util_.ConstructSpdyDataFrame( | 6112 SpdySerializedFrame body3(spdy_util_.ConstructSpdyDataFrame( |
| 6116 1, content.c_str(), | 6113 1, content.c_str(), |
| 6117 initial_window_size % kBufferSize % kMaxSpdyFrameChunkSize, false)); | 6114 initial_window_size % kBufferSize % kMaxSpdyFrameChunkSize, false)); |
| 6118 | 6115 |
| 6119 // Data frames to be sent once WINDOW_UPDATE frame is received. | 6116 // Data frames to be sent once WINDOW_UPDATE frame is received. |
| 6120 | 6117 |
| 6121 // If kBufferSize * num_upload_buffers > initial_window_size, | 6118 // If kBufferSize * num_upload_buffers > initial_window_size, |
| 6122 // we need one additional frame to send the rest of 'a'. | 6119 // we need one additional frame to send the rest of 'a'. |
| 6123 std::string last_body(kBufferSize * num_upload_buffers - initial_window_size, | 6120 SpdyString last_body(kBufferSize * num_upload_buffers - initial_window_size, |
| 6124 'a'); | 6121 'a'); |
| 6125 SpdySerializedFrame body4(spdy_util_.ConstructSpdyDataFrame( | 6122 SpdySerializedFrame body4(spdy_util_.ConstructSpdyDataFrame( |
| 6126 1, last_body.c_str(), last_body.size(), false)); | 6123 1, last_body.c_str(), last_body.size(), false)); |
| 6127 | 6124 |
| 6128 // Also send a "hello!" after WINDOW_UPDATE. | 6125 // Also send a "hello!" after WINDOW_UPDATE. |
| 6129 SpdySerializedFrame body5(spdy_util_.ConstructSpdyDataFrame(1, true)); | 6126 SpdySerializedFrame body5(spdy_util_.ConstructSpdyDataFrame(1, true)); |
| 6130 | 6127 |
| 6131 // Fill in mock writes. | 6128 // Fill in mock writes. |
| 6132 size_t i = 0; | 6129 size_t i = 0; |
| 6133 std::vector<MockWrite> writes; | 6130 std::vector<MockWrite> writes; |
| 6134 writes.push_back(CreateMockWrite(req, i++)); | 6131 writes.push_back(CreateMockWrite(req, i++)); |
| (...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6182 reads.push_back(CreateMockRead(body2, i++)); | 6179 reads.push_back(CreateMockRead(body2, i++)); |
| 6183 reads.push_back(CreateMockRead(body5, i++)); | 6180 reads.push_back(CreateMockRead(body5, i++)); |
| 6184 reads.push_back(MockRead(ASYNC, 0, i++)); // EOF | 6181 reads.push_back(MockRead(ASYNC, 0, i++)); // EOF |
| 6185 | 6182 |
| 6186 // Force all writes to happen before any read, last write will not | 6183 // Force all writes to happen before any read, last write will not |
| 6187 // actually queue a frame, due to window size being 0. | 6184 // actually queue a frame, due to window size being 0. |
| 6188 SequencedSocketData data(reads.data(), reads.size(), writes.data(), | 6185 SequencedSocketData data(reads.data(), reads.size(), writes.data(), |
| 6189 writes.size()); | 6186 writes.size()); |
| 6190 | 6187 |
| 6191 std::vector<std::unique_ptr<UploadElementReader>> element_readers; | 6188 std::vector<std::unique_ptr<UploadElementReader>> element_readers; |
| 6192 std::string upload_data_string(kBufferSize * num_upload_buffers, 'a'); | 6189 SpdyString upload_data_string(kBufferSize * num_upload_buffers, 'a'); |
| 6193 upload_data_string.append(kUploadData, kUploadDataSize); | 6190 upload_data_string.append(kUploadData, kUploadDataSize); |
| 6194 element_readers.push_back(base::WrapUnique(new UploadBytesElementReader( | 6191 element_readers.push_back(base::WrapUnique(new UploadBytesElementReader( |
| 6195 upload_data_string.c_str(), upload_data_string.size()))); | 6192 upload_data_string.c_str(), upload_data_string.size()))); |
| 6196 ElementsUploadDataStream upload_data_stream(std::move(element_readers), 0); | 6193 ElementsUploadDataStream upload_data_stream(std::move(element_readers), 0); |
| 6197 | 6194 |
| 6198 HttpRequestInfo request; | 6195 HttpRequestInfo request; |
| 6199 request.method = "POST"; | 6196 request.method = "POST"; |
| 6200 request.url = default_url_; | 6197 request.url = default_url_; |
| 6201 request.upload_data_stream = &upload_data_stream; | 6198 request.upload_data_stream = &upload_data_stream; |
| 6202 NormalSpdyTransactionHelper helper(request, DEFAULT_PRIORITY, | 6199 NormalSpdyTransactionHelper helper(request, DEFAULT_PRIORITY, |
| (...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6290 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY, | 6287 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY, |
| 6291 NetLogWithSource(), nullptr); | 6288 NetLogWithSource(), nullptr); |
| 6292 helper.RunToCompletion(&data); | 6289 helper.RunToCompletion(&data); |
| 6293 TransactionHelperResult out = helper.output(); | 6290 TransactionHelperResult out = helper.output(); |
| 6294 EXPECT_THAT(out.rv, IsError(ERR_SPDY_PROTOCOL_ERROR)); | 6291 EXPECT_THAT(out.rv, IsError(ERR_SPDY_PROTOCOL_ERROR)); |
| 6295 } | 6292 } |
| 6296 | 6293 |
| 6297 // Regression test for https://crbug.com/493348: request header exceeds 16 kB | 6294 // Regression test for https://crbug.com/493348: request header exceeds 16 kB |
| 6298 // and thus sent in multiple frames when using HTTP/2. | 6295 // and thus sent in multiple frames when using HTTP/2. |
| 6299 TEST_F(SpdyNetworkTransactionTest, LargeRequest) { | 6296 TEST_F(SpdyNetworkTransactionTest, LargeRequest) { |
| 6300 const std::string kKey("foo"); | 6297 const SpdyString kKey("foo"); |
| 6301 const std::string kValue(1 << 15, 'z'); | 6298 const SpdyString kValue(1 << 15, 'z'); |
| 6302 | 6299 |
| 6303 HttpRequestInfo request; | 6300 HttpRequestInfo request; |
| 6304 request.method = "GET"; | 6301 request.method = "GET"; |
| 6305 request.url = default_url_; | 6302 request.url = default_url_; |
| 6306 request.extra_headers.SetHeader(kKey, kValue); | 6303 request.extra_headers.SetHeader(kKey, kValue); |
| 6307 | 6304 |
| 6308 SpdyHeaderBlock headers(spdy_util_.ConstructGetHeaderBlock(kDefaultUrl)); | 6305 SpdyHeaderBlock headers(spdy_util_.ConstructGetHeaderBlock(kDefaultUrl)); |
| 6309 headers[kKey] = kValue; | 6306 headers[kKey] = kValue; |
| 6310 SpdySerializedFrame req( | 6307 SpdySerializedFrame req( |
| 6311 spdy_util_.ConstructSpdyHeaders(1, std::move(headers), LOWEST, true)); | 6308 spdy_util_.ConstructSpdyHeaders(1, std::move(headers), LOWEST, true)); |
| (...skipping 23 matching lines...) Expand all Loading... |
| 6335 TEST_F(SpdyNetworkTransactionTest, LargeResponseHeader) { | 6332 TEST_F(SpdyNetworkTransactionTest, LargeResponseHeader) { |
| 6336 SpdyHeaderBlock headers(spdy_util_.ConstructGetHeaderBlock(kDefaultUrl)); | 6333 SpdyHeaderBlock headers(spdy_util_.ConstructGetHeaderBlock(kDefaultUrl)); |
| 6337 SpdySerializedFrame req( | 6334 SpdySerializedFrame req( |
| 6338 spdy_util_.ConstructSpdyHeaders(1, std::move(headers), LOWEST, true)); | 6335 spdy_util_.ConstructSpdyHeaders(1, std::move(headers), LOWEST, true)); |
| 6339 MockWrite writes[] = { | 6336 MockWrite writes[] = { |
| 6340 CreateMockWrite(req, 0), | 6337 CreateMockWrite(req, 0), |
| 6341 }; | 6338 }; |
| 6342 | 6339 |
| 6343 // HPACK decoder implementation limits string literal length to 16 kB. | 6340 // HPACK decoder implementation limits string literal length to 16 kB. |
| 6344 const char* response_headers[2]; | 6341 const char* response_headers[2]; |
| 6345 const std::string kKey(16 * 1024, 'a'); | 6342 const SpdyString kKey(16 * 1024, 'a'); |
| 6346 response_headers[0] = kKey.data(); | 6343 response_headers[0] = kKey.data(); |
| 6347 const std::string kValue(16 * 1024, 'b'); | 6344 const SpdyString kValue(16 * 1024, 'b'); |
| 6348 response_headers[1] = kValue.data(); | 6345 response_headers[1] = kValue.data(); |
| 6349 | 6346 |
| 6350 SpdySerializedFrame resp( | 6347 SpdySerializedFrame resp( |
| 6351 spdy_util_.ConstructSpdyGetReply(response_headers, 1, 1)); | 6348 spdy_util_.ConstructSpdyGetReply(response_headers, 1, 1)); |
| 6352 SpdySerializedFrame body(spdy_util_.ConstructSpdyDataFrame(1, true)); | 6349 SpdySerializedFrame body(spdy_util_.ConstructSpdyDataFrame(1, true)); |
| 6353 MockRead reads[] = { | 6350 MockRead reads[] = { |
| 6354 CreateMockRead(resp, 1), CreateMockRead(body, 2), | 6351 CreateMockRead(resp, 1), CreateMockRead(body, 2), |
| 6355 MockRead(ASYNC, 0, 3) // EOF | 6352 MockRead(ASYNC, 0, 3) // EOF |
| 6356 }; | 6353 }; |
| 6357 | 6354 |
| (...skipping 239 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6597 TEST_F(SpdyNetworkTransactionTLSUsageCheckTest, TLSCipherSuiteSucky) { | 6594 TEST_F(SpdyNetworkTransactionTLSUsageCheckTest, TLSCipherSuiteSucky) { |
| 6598 std::unique_ptr<SSLSocketDataProvider> ssl_provider( | 6595 std::unique_ptr<SSLSocketDataProvider> ssl_provider( |
| 6599 new SSLSocketDataProvider(ASYNC, OK)); | 6596 new SSLSocketDataProvider(ASYNC, OK)); |
| 6600 // Set to TLS_RSA_WITH_NULL_MD5 | 6597 // Set to TLS_RSA_WITH_NULL_MD5 |
| 6601 SSLConnectionStatusSetCipherSuite(0x1, &ssl_provider->connection_status); | 6598 SSLConnectionStatusSetCipherSuite(0x1, &ssl_provider->connection_status); |
| 6602 | 6599 |
| 6603 RunTLSUsageCheckTest(std::move(ssl_provider)); | 6600 RunTLSUsageCheckTest(std::move(ssl_provider)); |
| 6604 } | 6601 } |
| 6605 | 6602 |
| 6606 } // namespace net | 6603 } // namespace net |
| OLD | NEW |