| 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> | 7 #include <string> |
| 8 #include <utility> | 8 #include <utility> |
| 9 #include <vector> | 9 #include <vector> |
| 10 | 10 |
| (...skipping 476 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 487 EXPECT_TRUE(trans2->GetLoadTimingInfo(&load_timing_info2)); | 487 EXPECT_TRUE(trans2->GetLoadTimingInfo(&load_timing_info2)); |
| 488 EXPECT_FALSE(load_timing_info2.push_start.is_null()); | 488 EXPECT_FALSE(load_timing_info2.push_start.is_null()); |
| 489 EXPECT_FALSE(load_timing_info2.push_end.is_null()); | 489 EXPECT_FALSE(load_timing_info2.push_end.is_null()); |
| 490 | 490 |
| 491 // Verify that the received push data is same as the expected push data. | 491 // Verify that the received push data is same as the expected push data. |
| 492 EXPECT_EQ(result2.compare(expected), 0) << "Received data: " | 492 EXPECT_EQ(result2.compare(expected), 0) << "Received data: " |
| 493 << result2 | 493 << result2 |
| 494 << "||||| Expected data: " | 494 << "||||| Expected data: " |
| 495 << expected; | 495 << expected; |
| 496 | 496 |
| 497 // Verify the SYN_REPLY. | 497 // Verify the response HEADERS. |
| 498 // Copy the response info, because trans goes away. | 498 // Copy the response info, because trans goes away. |
| 499 *response = *trans->GetResponseInfo(); | 499 *response = *trans->GetResponseInfo(); |
| 500 *push_response = *trans2->GetResponseInfo(); | 500 *push_response = *trans2->GetResponseInfo(); |
| 501 | 501 |
| 502 VerifyStreamsClosed(helper); | 502 VerifyStreamsClosed(helper); |
| 503 } | 503 } |
| 504 | 504 |
| 505 static void DeleteSessionCallback(NormalSpdyTransactionHelper* helper, | 505 static void DeleteSessionCallback(NormalSpdyTransactionHelper* helper, |
| 506 int result) { | 506 int result) { |
| 507 helper->ResetTrans(); | 507 helper->ResetTrans(); |
| (...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 555 auto trans = | 555 auto trans = |
| 556 base::MakeUnique<HttpNetworkTransaction>(DEFAULT_PRIORITY, session.get()); | 556 base::MakeUnique<HttpNetworkTransaction>(DEFAULT_PRIORITY, session.get()); |
| 557 } | 557 } |
| 558 | 558 |
| 559 TEST_F(SpdyNetworkTransactionTest, Get) { | 559 TEST_F(SpdyNetworkTransactionTest, Get) { |
| 560 // Construct the request. | 560 // Construct the request. |
| 561 SpdySerializedFrame req( | 561 SpdySerializedFrame req( |
| 562 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); | 562 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); |
| 563 MockWrite writes[] = {CreateMockWrite(req, 0)}; | 563 MockWrite writes[] = {CreateMockWrite(req, 0)}; |
| 564 | 564 |
| 565 SpdySerializedFrame resp(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); | 565 SpdySerializedFrame resp(spdy_util_.ConstructSpdyGetReply(NULL, 0, 1)); |
| 566 SpdySerializedFrame body(spdy_util_.ConstructSpdyDataFrame(1, true)); | 566 SpdySerializedFrame body(spdy_util_.ConstructSpdyDataFrame(1, true)); |
| 567 MockRead reads[] = { | 567 MockRead reads[] = { |
| 568 CreateMockRead(resp, 1), CreateMockRead(body, 2), | 568 CreateMockRead(resp, 1), CreateMockRead(body, 2), |
| 569 MockRead(ASYNC, 0, 3) // EOF | 569 MockRead(ASYNC, 0, 3) // EOF |
| 570 }; | 570 }; |
| 571 | 571 |
| 572 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); | 572 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); |
| 573 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY, | 573 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY, |
| 574 BoundNetLog(), NULL); | 574 BoundNetLog(), NULL); |
| 575 helper.RunToCompletion(&data); | 575 helper.RunToCompletion(&data); |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 608 EXPECT_EQ(3, spdy_prio); | 608 EXPECT_EQ(3, spdy_prio); |
| 609 break; | 609 break; |
| 610 case IDLE: | 610 case IDLE: |
| 611 EXPECT_EQ(4, spdy_prio); | 611 EXPECT_EQ(4, spdy_prio); |
| 612 break; | 612 break; |
| 613 default: | 613 default: |
| 614 FAIL(); | 614 FAIL(); |
| 615 } | 615 } |
| 616 | 616 |
| 617 SpdySerializedFrame resp( | 617 SpdySerializedFrame resp( |
| 618 spdy_test_util.ConstructSpdyGetSynReply(nullptr, 0, 1)); | 618 spdy_test_util.ConstructSpdyGetReply(nullptr, 0, 1)); |
| 619 SpdySerializedFrame body(spdy_test_util.ConstructSpdyDataFrame(1, true)); | 619 SpdySerializedFrame body(spdy_test_util.ConstructSpdyDataFrame(1, true)); |
| 620 MockRead reads[] = { | 620 MockRead reads[] = { |
| 621 CreateMockRead(resp, 1), CreateMockRead(body, 2), | 621 CreateMockRead(resp, 1), CreateMockRead(body, 2), |
| 622 MockRead(ASYNC, 0, 3) // EOF | 622 MockRead(ASYNC, 0, 3) // EOF |
| 623 }; | 623 }; |
| 624 | 624 |
| 625 SequencedSocketData data(reads, arraysize(reads), writes, | 625 SequencedSocketData data(reads, arraysize(reads), writes, |
| 626 arraysize(writes)); | 626 arraysize(writes)); |
| 627 HttpRequestInfo http_req = CreateGetRequest(); | 627 HttpRequestInfo http_req = CreateGetRequest(); |
| 628 | 628 |
| (...skipping 12 matching lines...) Expand all Loading... |
| 641 // This can't use the TransactionHelper method, since it only | 641 // This can't use the TransactionHelper method, since it only |
| 642 // handles a single transaction, and finishes them as soon | 642 // handles a single transaction, and finishes them as soon |
| 643 // as it launches them. | 643 // as it launches them. |
| 644 | 644 |
| 645 // TODO(gavinp): create a working generalized TransactionHelper that | 645 // TODO(gavinp): create a working generalized TransactionHelper that |
| 646 // can allow multiple streams in flight. | 646 // can allow multiple streams in flight. |
| 647 | 647 |
| 648 TEST_F(SpdyNetworkTransactionTest, ThreeGets) { | 648 TEST_F(SpdyNetworkTransactionTest, ThreeGets) { |
| 649 SpdySerializedFrame req( | 649 SpdySerializedFrame req( |
| 650 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); | 650 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); |
| 651 SpdySerializedFrame resp(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); | 651 SpdySerializedFrame resp(spdy_util_.ConstructSpdyGetReply(NULL, 0, 1)); |
| 652 SpdySerializedFrame body(spdy_util_.ConstructSpdyDataFrame(1, false)); | 652 SpdySerializedFrame body(spdy_util_.ConstructSpdyDataFrame(1, false)); |
| 653 SpdySerializedFrame fbody(spdy_util_.ConstructSpdyDataFrame(1, true)); | 653 SpdySerializedFrame fbody(spdy_util_.ConstructSpdyDataFrame(1, true)); |
| 654 | 654 |
| 655 SpdySerializedFrame req2( | 655 SpdySerializedFrame req2( |
| 656 spdy_util_.ConstructSpdyGet(nullptr, 0, 3, LOWEST, true)); | 656 spdy_util_.ConstructSpdyGet(nullptr, 0, 3, LOWEST, true)); |
| 657 SpdySerializedFrame resp2(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 3)); | 657 SpdySerializedFrame resp2(spdy_util_.ConstructSpdyGetReply(NULL, 0, 3)); |
| 658 SpdySerializedFrame body2(spdy_util_.ConstructSpdyDataFrame(3, false)); | 658 SpdySerializedFrame body2(spdy_util_.ConstructSpdyDataFrame(3, false)); |
| 659 SpdySerializedFrame fbody2(spdy_util_.ConstructSpdyDataFrame(3, true)); | 659 SpdySerializedFrame fbody2(spdy_util_.ConstructSpdyDataFrame(3, true)); |
| 660 | 660 |
| 661 SpdySerializedFrame req3( | 661 SpdySerializedFrame req3( |
| 662 spdy_util_.ConstructSpdyGet(nullptr, 0, 5, LOWEST, true)); | 662 spdy_util_.ConstructSpdyGet(nullptr, 0, 5, LOWEST, true)); |
| 663 SpdySerializedFrame resp3(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 5)); | 663 SpdySerializedFrame resp3(spdy_util_.ConstructSpdyGetReply(NULL, 0, 5)); |
| 664 SpdySerializedFrame body3(spdy_util_.ConstructSpdyDataFrame(5, false)); | 664 SpdySerializedFrame body3(spdy_util_.ConstructSpdyDataFrame(5, false)); |
| 665 SpdySerializedFrame fbody3(spdy_util_.ConstructSpdyDataFrame(5, true)); | 665 SpdySerializedFrame fbody3(spdy_util_.ConstructSpdyDataFrame(5, true)); |
| 666 | 666 |
| 667 MockWrite writes[] = { | 667 MockWrite writes[] = { |
| 668 CreateMockWrite(req, 0), CreateMockWrite(req2, 3), | 668 CreateMockWrite(req, 0), CreateMockWrite(req2, 3), |
| 669 CreateMockWrite(req3, 6), | 669 CreateMockWrite(req3, 6), |
| 670 }; | 670 }; |
| 671 MockRead reads[] = { | 671 MockRead reads[] = { |
| 672 CreateMockRead(resp, 1), CreateMockRead(body, 2), | 672 CreateMockRead(resp, 1), CreateMockRead(body, 2), |
| 673 CreateMockRead(resp2, 4), CreateMockRead(body2, 5), | 673 CreateMockRead(resp2, 4), CreateMockRead(body2, 5), |
| (...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 733 EXPECT_THAT(out.rv, IsOk()); | 733 EXPECT_THAT(out.rv, IsOk()); |
| 734 | 734 |
| 735 EXPECT_THAT(out.rv, IsOk()); | 735 EXPECT_THAT(out.rv, IsOk()); |
| 736 EXPECT_EQ("HTTP/1.1 200", out.status_line); | 736 EXPECT_EQ("HTTP/1.1 200", out.status_line); |
| 737 EXPECT_EQ("hello!hello!", out.response_data); | 737 EXPECT_EQ("hello!hello!", out.response_data); |
| 738 } | 738 } |
| 739 | 739 |
| 740 TEST_F(SpdyNetworkTransactionTest, TwoGetsLateBinding) { | 740 TEST_F(SpdyNetworkTransactionTest, TwoGetsLateBinding) { |
| 741 SpdySerializedFrame req( | 741 SpdySerializedFrame req( |
| 742 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); | 742 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); |
| 743 SpdySerializedFrame resp(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); | 743 SpdySerializedFrame resp(spdy_util_.ConstructSpdyGetReply(NULL, 0, 1)); |
| 744 SpdySerializedFrame body(spdy_util_.ConstructSpdyDataFrame(1, false)); | 744 SpdySerializedFrame body(spdy_util_.ConstructSpdyDataFrame(1, false)); |
| 745 SpdySerializedFrame fbody(spdy_util_.ConstructSpdyDataFrame(1, true)); | 745 SpdySerializedFrame fbody(spdy_util_.ConstructSpdyDataFrame(1, true)); |
| 746 | 746 |
| 747 SpdySerializedFrame req2( | 747 SpdySerializedFrame req2( |
| 748 spdy_util_.ConstructSpdyGet(nullptr, 0, 3, LOWEST, true)); | 748 spdy_util_.ConstructSpdyGet(nullptr, 0, 3, LOWEST, true)); |
| 749 SpdySerializedFrame resp2(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 3)); | 749 SpdySerializedFrame resp2(spdy_util_.ConstructSpdyGetReply(NULL, 0, 3)); |
| 750 SpdySerializedFrame body2(spdy_util_.ConstructSpdyDataFrame(3, false)); | 750 SpdySerializedFrame body2(spdy_util_.ConstructSpdyDataFrame(3, false)); |
| 751 SpdySerializedFrame fbody2(spdy_util_.ConstructSpdyDataFrame(3, true)); | 751 SpdySerializedFrame fbody2(spdy_util_.ConstructSpdyDataFrame(3, true)); |
| 752 | 752 |
| 753 MockWrite writes[] = { | 753 MockWrite writes[] = { |
| 754 CreateMockWrite(req, 0), CreateMockWrite(req2, 3), | 754 CreateMockWrite(req, 0), CreateMockWrite(req2, 3), |
| 755 }; | 755 }; |
| 756 MockRead reads[] = { | 756 MockRead reads[] = { |
| 757 CreateMockRead(resp, 1), CreateMockRead(body, 2), | 757 CreateMockRead(resp, 1), CreateMockRead(body, 2), |
| 758 CreateMockRead(resp2, 4), CreateMockRead(body2, 5), | 758 CreateMockRead(resp2, 4), CreateMockRead(body2, 5), |
| 759 CreateMockRead(fbody, 6), CreateMockRead(fbody2, 7), | 759 CreateMockRead(fbody, 6), CreateMockRead(fbody2, 7), |
| (...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 815 EXPECT_THAT(out.rv, IsOk()); | 815 EXPECT_THAT(out.rv, IsOk()); |
| 816 EXPECT_EQ("HTTP/1.1 200", out.status_line); | 816 EXPECT_EQ("HTTP/1.1 200", out.status_line); |
| 817 EXPECT_EQ("hello!hello!", out.response_data); | 817 EXPECT_EQ("hello!hello!", out.response_data); |
| 818 | 818 |
| 819 helper.VerifyDataConsumed(); | 819 helper.VerifyDataConsumed(); |
| 820 } | 820 } |
| 821 | 821 |
| 822 TEST_F(SpdyNetworkTransactionTest, TwoGetsLateBindingFromPreconnect) { | 822 TEST_F(SpdyNetworkTransactionTest, TwoGetsLateBindingFromPreconnect) { |
| 823 SpdySerializedFrame req( | 823 SpdySerializedFrame req( |
| 824 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); | 824 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); |
| 825 SpdySerializedFrame resp(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); | 825 SpdySerializedFrame resp(spdy_util_.ConstructSpdyGetReply(NULL, 0, 1)); |
| 826 SpdySerializedFrame body(spdy_util_.ConstructSpdyDataFrame(1, false)); | 826 SpdySerializedFrame body(spdy_util_.ConstructSpdyDataFrame(1, false)); |
| 827 SpdySerializedFrame fbody(spdy_util_.ConstructSpdyDataFrame(1, true)); | 827 SpdySerializedFrame fbody(spdy_util_.ConstructSpdyDataFrame(1, true)); |
| 828 | 828 |
| 829 SpdySerializedFrame req2( | 829 SpdySerializedFrame req2( |
| 830 spdy_util_.ConstructSpdyGet(nullptr, 0, 3, LOWEST, true)); | 830 spdy_util_.ConstructSpdyGet(nullptr, 0, 3, LOWEST, true)); |
| 831 SpdySerializedFrame resp2(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 3)); | 831 SpdySerializedFrame resp2(spdy_util_.ConstructSpdyGetReply(NULL, 0, 3)); |
| 832 SpdySerializedFrame body2(spdy_util_.ConstructSpdyDataFrame(3, false)); | 832 SpdySerializedFrame body2(spdy_util_.ConstructSpdyDataFrame(3, false)); |
| 833 SpdySerializedFrame fbody2(spdy_util_.ConstructSpdyDataFrame(3, true)); | 833 SpdySerializedFrame fbody2(spdy_util_.ConstructSpdyDataFrame(3, true)); |
| 834 | 834 |
| 835 MockWrite writes[] = { | 835 MockWrite writes[] = { |
| 836 CreateMockWrite(req, 0), CreateMockWrite(req2, 3), | 836 CreateMockWrite(req, 0), CreateMockWrite(req2, 3), |
| 837 }; | 837 }; |
| 838 MockRead reads[] = { | 838 MockRead reads[] = { |
| 839 CreateMockRead(resp, 1), CreateMockRead(body, 2), | 839 CreateMockRead(resp, 1), CreateMockRead(body, 2), |
| 840 CreateMockRead(resp2, 4), CreateMockRead(body2, 5), | 840 CreateMockRead(resp2, 4), CreateMockRead(body2, 5), |
| 841 CreateMockRead(fbody, 6), CreateMockRead(fbody2, 7), | 841 CreateMockRead(fbody, 6), CreateMockRead(fbody2, 7), |
| (...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 912 // Similar to ThreeGets above, however this test adds a SETTINGS | 912 // Similar to ThreeGets above, however this test adds a SETTINGS |
| 913 // frame. The SETTINGS frame is read during the IO loop waiting on | 913 // frame. The SETTINGS frame is read during the IO loop waiting on |
| 914 // the first transaction completion, and sets a maximum concurrent | 914 // the first transaction completion, and sets a maximum concurrent |
| 915 // stream limit of 1. This means that our IO loop exists after the | 915 // stream limit of 1. This means that our IO loop exists after the |
| 916 // second transaction completes, so we can assert on read_index(). | 916 // second transaction completes, so we can assert on read_index(). |
| 917 TEST_F(SpdyNetworkTransactionTest, ThreeGetsWithMaxConcurrent) { | 917 TEST_F(SpdyNetworkTransactionTest, ThreeGetsWithMaxConcurrent) { |
| 918 // Construct the request. | 918 // Construct the request. |
| 919 // Each request fully completes before the next starts. | 919 // Each request fully completes before the next starts. |
| 920 SpdySerializedFrame req( | 920 SpdySerializedFrame req( |
| 921 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); | 921 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); |
| 922 SpdySerializedFrame resp(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); | 922 SpdySerializedFrame resp(spdy_util_.ConstructSpdyGetReply(NULL, 0, 1)); |
| 923 SpdySerializedFrame body(spdy_util_.ConstructSpdyDataFrame(1, false)); | 923 SpdySerializedFrame body(spdy_util_.ConstructSpdyDataFrame(1, false)); |
| 924 SpdySerializedFrame fbody(spdy_util_.ConstructSpdyDataFrame(1, true)); | 924 SpdySerializedFrame fbody(spdy_util_.ConstructSpdyDataFrame(1, true)); |
| 925 spdy_util_.UpdateWithStreamDestruction(1); | 925 spdy_util_.UpdateWithStreamDestruction(1); |
| 926 | 926 |
| 927 SpdySerializedFrame req2( | 927 SpdySerializedFrame req2( |
| 928 spdy_util_.ConstructSpdyGet(nullptr, 0, 3, LOWEST, true)); | 928 spdy_util_.ConstructSpdyGet(nullptr, 0, 3, LOWEST, true)); |
| 929 SpdySerializedFrame resp2(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 3)); | 929 SpdySerializedFrame resp2(spdy_util_.ConstructSpdyGetReply(NULL, 0, 3)); |
| 930 SpdySerializedFrame body2(spdy_util_.ConstructSpdyDataFrame(3, false)); | 930 SpdySerializedFrame body2(spdy_util_.ConstructSpdyDataFrame(3, false)); |
| 931 SpdySerializedFrame fbody2(spdy_util_.ConstructSpdyDataFrame(3, true)); | 931 SpdySerializedFrame fbody2(spdy_util_.ConstructSpdyDataFrame(3, true)); |
| 932 spdy_util_.UpdateWithStreamDestruction(3); | 932 spdy_util_.UpdateWithStreamDestruction(3); |
| 933 | 933 |
| 934 SpdySerializedFrame req3( | 934 SpdySerializedFrame req3( |
| 935 spdy_util_.ConstructSpdyGet(nullptr, 0, 5, LOWEST, true)); | 935 spdy_util_.ConstructSpdyGet(nullptr, 0, 5, LOWEST, true)); |
| 936 SpdySerializedFrame resp3(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 5)); | 936 SpdySerializedFrame resp3(spdy_util_.ConstructSpdyGetReply(NULL, 0, 5)); |
| 937 SpdySerializedFrame body3(spdy_util_.ConstructSpdyDataFrame(5, false)); | 937 SpdySerializedFrame body3(spdy_util_.ConstructSpdyDataFrame(5, false)); |
| 938 SpdySerializedFrame fbody3(spdy_util_.ConstructSpdyDataFrame(5, true)); | 938 SpdySerializedFrame fbody3(spdy_util_.ConstructSpdyDataFrame(5, true)); |
| 939 | 939 |
| 940 SettingsMap settings; | 940 SettingsMap settings; |
| 941 const uint32_t max_concurrent_streams = 1; | 941 const uint32_t max_concurrent_streams = 1; |
| 942 settings[SETTINGS_MAX_CONCURRENT_STREAMS] = | 942 settings[SETTINGS_MAX_CONCURRENT_STREAMS] = |
| 943 SettingsFlagsAndValue(SETTINGS_FLAG_NONE, max_concurrent_streams); | 943 SettingsFlagsAndValue(SETTINGS_FLAG_NONE, max_concurrent_streams); |
| 944 SpdySerializedFrame settings_frame( | 944 SpdySerializedFrame settings_frame( |
| 945 spdy_util_.ConstructSpdySettings(settings)); | 945 spdy_util_.ConstructSpdySettings(settings)); |
| 946 SpdySerializedFrame settings_ack(spdy_util_.ConstructSpdySettingsAck()); | 946 SpdySerializedFrame settings_ack(spdy_util_.ConstructSpdySettingsAck()); |
| (...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1040 | 1040 |
| 1041 // Similar to ThreeGetsWithMaxConcurrent above, however this test adds | 1041 // Similar to ThreeGetsWithMaxConcurrent above, however this test adds |
| 1042 // a fourth transaction. The third and fourth transactions have | 1042 // a fourth transaction. The third and fourth transactions have |
| 1043 // different data ("hello!" vs "hello!hello!") and because of the | 1043 // different data ("hello!" vs "hello!hello!") and because of the |
| 1044 // user specified priority, we expect to see them inverted in | 1044 // user specified priority, we expect to see them inverted in |
| 1045 // the response from the server. | 1045 // the response from the server. |
| 1046 TEST_F(SpdyNetworkTransactionTest, FourGetsWithMaxConcurrentPriority) { | 1046 TEST_F(SpdyNetworkTransactionTest, FourGetsWithMaxConcurrentPriority) { |
| 1047 // Construct the request. | 1047 // Construct the request. |
| 1048 SpdySerializedFrame req( | 1048 SpdySerializedFrame req( |
| 1049 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); | 1049 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); |
| 1050 SpdySerializedFrame resp(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); | 1050 SpdySerializedFrame resp(spdy_util_.ConstructSpdyGetReply(NULL, 0, 1)); |
| 1051 SpdySerializedFrame body(spdy_util_.ConstructSpdyDataFrame(1, false)); | 1051 SpdySerializedFrame body(spdy_util_.ConstructSpdyDataFrame(1, false)); |
| 1052 SpdySerializedFrame fbody(spdy_util_.ConstructSpdyDataFrame(1, true)); | 1052 SpdySerializedFrame fbody(spdy_util_.ConstructSpdyDataFrame(1, true)); |
| 1053 spdy_util_.UpdateWithStreamDestruction(1); | 1053 spdy_util_.UpdateWithStreamDestruction(1); |
| 1054 | 1054 |
| 1055 SpdySerializedFrame req2( | 1055 SpdySerializedFrame req2( |
| 1056 spdy_util_.ConstructSpdyGet(nullptr, 0, 3, LOWEST, true)); | 1056 spdy_util_.ConstructSpdyGet(nullptr, 0, 3, LOWEST, true)); |
| 1057 SpdySerializedFrame resp2(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 3)); | 1057 SpdySerializedFrame resp2(spdy_util_.ConstructSpdyGetReply(NULL, 0, 3)); |
| 1058 SpdySerializedFrame body2(spdy_util_.ConstructSpdyDataFrame(3, false)); | 1058 SpdySerializedFrame body2(spdy_util_.ConstructSpdyDataFrame(3, false)); |
| 1059 SpdySerializedFrame fbody2(spdy_util_.ConstructSpdyDataFrame(3, true)); | 1059 SpdySerializedFrame fbody2(spdy_util_.ConstructSpdyDataFrame(3, true)); |
| 1060 spdy_util_.UpdateWithStreamDestruction(3); | 1060 spdy_util_.UpdateWithStreamDestruction(3); |
| 1061 | 1061 |
| 1062 SpdySerializedFrame req4( | 1062 SpdySerializedFrame req4( |
| 1063 spdy_util_.ConstructSpdyGet(nullptr, 0, 5, HIGHEST, true)); | 1063 spdy_util_.ConstructSpdyGet(nullptr, 0, 5, HIGHEST, true)); |
| 1064 SpdySerializedFrame resp4(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 5)); | 1064 SpdySerializedFrame resp4(spdy_util_.ConstructSpdyGetReply(NULL, 0, 5)); |
| 1065 SpdySerializedFrame fbody4(spdy_util_.ConstructSpdyDataFrame(5, true)); | 1065 SpdySerializedFrame fbody4(spdy_util_.ConstructSpdyDataFrame(5, true)); |
| 1066 spdy_util_.UpdateWithStreamDestruction(5); | 1066 spdy_util_.UpdateWithStreamDestruction(5); |
| 1067 | 1067 |
| 1068 SpdySerializedFrame req3( | 1068 SpdySerializedFrame req3( |
| 1069 spdy_util_.ConstructSpdyGet(nullptr, 0, 7, LOWEST, true)); | 1069 spdy_util_.ConstructSpdyGet(nullptr, 0, 7, LOWEST, true)); |
| 1070 SpdySerializedFrame resp3(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 7)); | 1070 SpdySerializedFrame resp3(spdy_util_.ConstructSpdyGetReply(NULL, 0, 7)); |
| 1071 SpdySerializedFrame body3(spdy_util_.ConstructSpdyDataFrame(7, false)); | 1071 SpdySerializedFrame body3(spdy_util_.ConstructSpdyDataFrame(7, false)); |
| 1072 SpdySerializedFrame fbody3(spdy_util_.ConstructSpdyDataFrame(7, true)); | 1072 SpdySerializedFrame fbody3(spdy_util_.ConstructSpdyDataFrame(7, true)); |
| 1073 | 1073 |
| 1074 SettingsMap settings; | 1074 SettingsMap settings; |
| 1075 const uint32_t max_concurrent_streams = 1; | 1075 const uint32_t max_concurrent_streams = 1; |
| 1076 settings[SETTINGS_MAX_CONCURRENT_STREAMS] = | 1076 settings[SETTINGS_MAX_CONCURRENT_STREAMS] = |
| 1077 SettingsFlagsAndValue(SETTINGS_FLAG_NONE, max_concurrent_streams); | 1077 SettingsFlagsAndValue(SETTINGS_FLAG_NONE, max_concurrent_streams); |
| 1078 SpdySerializedFrame settings_frame( | 1078 SpdySerializedFrame settings_frame( |
| 1079 spdy_util_.ConstructSpdySettings(settings)); | 1079 spdy_util_.ConstructSpdySettings(settings)); |
| 1080 SpdySerializedFrame settings_ack(spdy_util_.ConstructSpdySettingsAck()); | 1080 SpdySerializedFrame settings_ack(spdy_util_.ConstructSpdySettingsAck()); |
| (...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1191 } | 1191 } |
| 1192 | 1192 |
| 1193 // Similar to ThreeGetsMaxConcurrrent above, however, this test | 1193 // Similar to ThreeGetsMaxConcurrrent above, however, this test |
| 1194 // deletes a session in the middle of the transaction to ensure | 1194 // deletes a session in the middle of the transaction to ensure |
| 1195 // that we properly remove pendingcreatestream objects from | 1195 // that we properly remove pendingcreatestream objects from |
| 1196 // the spdy_session | 1196 // the spdy_session |
| 1197 TEST_F(SpdyNetworkTransactionTest, ThreeGetsWithMaxConcurrentDelete) { | 1197 TEST_F(SpdyNetworkTransactionTest, ThreeGetsWithMaxConcurrentDelete) { |
| 1198 // Construct the request. | 1198 // Construct the request. |
| 1199 SpdySerializedFrame req( | 1199 SpdySerializedFrame req( |
| 1200 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); | 1200 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); |
| 1201 SpdySerializedFrame resp(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); | 1201 SpdySerializedFrame resp(spdy_util_.ConstructSpdyGetReply(NULL, 0, 1)); |
| 1202 SpdySerializedFrame body(spdy_util_.ConstructSpdyDataFrame(1, false)); | 1202 SpdySerializedFrame body(spdy_util_.ConstructSpdyDataFrame(1, false)); |
| 1203 SpdySerializedFrame fbody(spdy_util_.ConstructSpdyDataFrame(1, true)); | 1203 SpdySerializedFrame fbody(spdy_util_.ConstructSpdyDataFrame(1, true)); |
| 1204 spdy_util_.UpdateWithStreamDestruction(1); | 1204 spdy_util_.UpdateWithStreamDestruction(1); |
| 1205 | 1205 |
| 1206 SpdySerializedFrame req2( | 1206 SpdySerializedFrame req2( |
| 1207 spdy_util_.ConstructSpdyGet(nullptr, 0, 3, LOWEST, true)); | 1207 spdy_util_.ConstructSpdyGet(nullptr, 0, 3, LOWEST, true)); |
| 1208 SpdySerializedFrame resp2(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 3)); | 1208 SpdySerializedFrame resp2(spdy_util_.ConstructSpdyGetReply(NULL, 0, 3)); |
| 1209 SpdySerializedFrame body2(spdy_util_.ConstructSpdyDataFrame(3, false)); | 1209 SpdySerializedFrame body2(spdy_util_.ConstructSpdyDataFrame(3, false)); |
| 1210 SpdySerializedFrame fbody2(spdy_util_.ConstructSpdyDataFrame(3, true)); | 1210 SpdySerializedFrame fbody2(spdy_util_.ConstructSpdyDataFrame(3, true)); |
| 1211 | 1211 |
| 1212 SettingsMap settings; | 1212 SettingsMap settings; |
| 1213 const uint32_t max_concurrent_streams = 1; | 1213 const uint32_t max_concurrent_streams = 1; |
| 1214 settings[SETTINGS_MAX_CONCURRENT_STREAMS] = | 1214 settings[SETTINGS_MAX_CONCURRENT_STREAMS] = |
| 1215 SettingsFlagsAndValue(SETTINGS_FLAG_NONE, max_concurrent_streams); | 1215 SettingsFlagsAndValue(SETTINGS_FLAG_NONE, max_concurrent_streams); |
| 1216 SpdySerializedFrame settings_frame( | 1216 SpdySerializedFrame settings_frame( |
| 1217 spdy_util_.ConstructSpdySettings(settings)); | 1217 spdy_util_.ConstructSpdySettings(settings)); |
| 1218 SpdySerializedFrame settings_ack(spdy_util_.ConstructSpdySettingsAck()); | 1218 SpdySerializedFrame settings_ack(spdy_util_.ConstructSpdySettingsAck()); |
| (...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1318 | 1318 |
| 1319 } // namespace | 1319 } // namespace |
| 1320 | 1320 |
| 1321 // Similar to ThreeGetsMaxConcurrrentDelete above, however, this test | 1321 // Similar to ThreeGetsMaxConcurrrentDelete above, however, this test |
| 1322 // closes the socket while we have a pending transaction waiting for | 1322 // closes the socket while we have a pending transaction waiting for |
| 1323 // a pending stream creation. http://crbug.com/52901 | 1323 // a pending stream creation. http://crbug.com/52901 |
| 1324 TEST_F(SpdyNetworkTransactionTest, ThreeGetsWithMaxConcurrentSocketClose) { | 1324 TEST_F(SpdyNetworkTransactionTest, ThreeGetsWithMaxConcurrentSocketClose) { |
| 1325 // Construct the request. | 1325 // Construct the request. |
| 1326 SpdySerializedFrame req( | 1326 SpdySerializedFrame req( |
| 1327 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); | 1327 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); |
| 1328 SpdySerializedFrame resp(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); | 1328 SpdySerializedFrame resp(spdy_util_.ConstructSpdyGetReply(NULL, 0, 1)); |
| 1329 SpdySerializedFrame body(spdy_util_.ConstructSpdyDataFrame(1, false)); | 1329 SpdySerializedFrame body(spdy_util_.ConstructSpdyDataFrame(1, false)); |
| 1330 SpdySerializedFrame fin_body(spdy_util_.ConstructSpdyDataFrame(1, true)); | 1330 SpdySerializedFrame fin_body(spdy_util_.ConstructSpdyDataFrame(1, true)); |
| 1331 spdy_util_.UpdateWithStreamDestruction(1); | 1331 spdy_util_.UpdateWithStreamDestruction(1); |
| 1332 | 1332 |
| 1333 SpdySerializedFrame req2( | 1333 SpdySerializedFrame req2( |
| 1334 spdy_util_.ConstructSpdyGet(nullptr, 0, 3, LOWEST, true)); | 1334 spdy_util_.ConstructSpdyGet(nullptr, 0, 3, LOWEST, true)); |
| 1335 SpdySerializedFrame resp2(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 3)); | 1335 SpdySerializedFrame resp2(spdy_util_.ConstructSpdyGetReply(NULL, 0, 3)); |
| 1336 | 1336 |
| 1337 SettingsMap settings; | 1337 SettingsMap settings; |
| 1338 const uint32_t max_concurrent_streams = 1; | 1338 const uint32_t max_concurrent_streams = 1; |
| 1339 settings[SETTINGS_MAX_CONCURRENT_STREAMS] = | 1339 settings[SETTINGS_MAX_CONCURRENT_STREAMS] = |
| 1340 SettingsFlagsAndValue(SETTINGS_FLAG_NONE, max_concurrent_streams); | 1340 SettingsFlagsAndValue(SETTINGS_FLAG_NONE, max_concurrent_streams); |
| 1341 SpdySerializedFrame settings_frame( | 1341 SpdySerializedFrame settings_frame( |
| 1342 spdy_util_.ConstructSpdySettings(settings)); | 1342 spdy_util_.ConstructSpdySettings(settings)); |
| 1343 SpdySerializedFrame settings_ack(spdy_util_.ConstructSpdySettingsAck()); | 1343 SpdySerializedFrame settings_ack(spdy_util_.ConstructSpdySettingsAck()); |
| 1344 | 1344 |
| 1345 MockWrite writes[] = { | 1345 MockWrite writes[] = { |
| (...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1416 // Test that a simple PUT request works. | 1416 // Test that a simple PUT request works. |
| 1417 TEST_F(SpdyNetworkTransactionTest, Put) { | 1417 TEST_F(SpdyNetworkTransactionTest, Put) { |
| 1418 // Setup the request | 1418 // Setup the request |
| 1419 HttpRequestInfo request; | 1419 HttpRequestInfo request; |
| 1420 request.method = "PUT"; | 1420 request.method = "PUT"; |
| 1421 request.url = default_url_; | 1421 request.url = default_url_; |
| 1422 | 1422 |
| 1423 SpdyHeaderBlock put_headers( | 1423 SpdyHeaderBlock put_headers( |
| 1424 spdy_util_.ConstructPutHeaderBlock(kDefaultUrl, 0)); | 1424 spdy_util_.ConstructPutHeaderBlock(kDefaultUrl, 0)); |
| 1425 SpdySerializedFrame req( | 1425 SpdySerializedFrame req( |
| 1426 spdy_util_.ConstructSpdySyn(1, std::move(put_headers), LOWEST, true)); | 1426 spdy_util_.ConstructSpdyHeaders(1, std::move(put_headers), LOWEST, true)); |
| 1427 MockWrite writes[] = { | 1427 MockWrite writes[] = { |
| 1428 CreateMockWrite(req, 0), | 1428 CreateMockWrite(req, 0), |
| 1429 }; | 1429 }; |
| 1430 | 1430 |
| 1431 SpdySerializedFrame resp(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); | 1431 SpdySerializedFrame resp(spdy_util_.ConstructSpdyGetReply(NULL, 0, 1)); |
| 1432 SpdySerializedFrame body(spdy_util_.ConstructSpdyDataFrame(1, true)); | 1432 SpdySerializedFrame body(spdy_util_.ConstructSpdyDataFrame(1, true)); |
| 1433 MockRead reads[] = { | 1433 MockRead reads[] = { |
| 1434 CreateMockRead(resp, 1), CreateMockRead(body, 2), | 1434 CreateMockRead(resp, 1), CreateMockRead(body, 2), |
| 1435 MockRead(ASYNC, 0, 3) // EOF | 1435 MockRead(ASYNC, 0, 3) // EOF |
| 1436 }; | 1436 }; |
| 1437 | 1437 |
| 1438 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); | 1438 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); |
| 1439 NormalSpdyTransactionHelper helper(request, DEFAULT_PRIORITY, BoundNetLog(), | 1439 NormalSpdyTransactionHelper helper(request, DEFAULT_PRIORITY, BoundNetLog(), |
| 1440 NULL); | 1440 NULL); |
| 1441 helper.RunToCompletion(&data); | 1441 helper.RunToCompletion(&data); |
| 1442 TransactionHelperResult out = helper.output(); | 1442 TransactionHelperResult out = helper.output(); |
| 1443 | 1443 |
| 1444 EXPECT_THAT(out.rv, IsOk()); | 1444 EXPECT_THAT(out.rv, IsOk()); |
| 1445 EXPECT_EQ("HTTP/1.1 200", out.status_line); | 1445 EXPECT_EQ("HTTP/1.1 200", out.status_line); |
| 1446 } | 1446 } |
| 1447 | 1447 |
| 1448 // Test that a simple HEAD request works. | 1448 // Test that a simple HEAD request works. |
| 1449 TEST_F(SpdyNetworkTransactionTest, Head) { | 1449 TEST_F(SpdyNetworkTransactionTest, Head) { |
| 1450 // Setup the request | 1450 // Setup the request |
| 1451 HttpRequestInfo request; | 1451 HttpRequestInfo request; |
| 1452 request.method = "HEAD"; | 1452 request.method = "HEAD"; |
| 1453 request.url = default_url_; | 1453 request.url = default_url_; |
| 1454 | 1454 |
| 1455 SpdyHeaderBlock head_headers( | 1455 SpdyHeaderBlock head_headers( |
| 1456 spdy_util_.ConstructHeadHeaderBlock(kDefaultUrl, 0)); | 1456 spdy_util_.ConstructHeadHeaderBlock(kDefaultUrl, 0)); |
| 1457 SpdySerializedFrame req( | 1457 SpdySerializedFrame req(spdy_util_.ConstructSpdyHeaders( |
| 1458 spdy_util_.ConstructSpdySyn(1, std::move(head_headers), LOWEST, true)); | 1458 1, std::move(head_headers), LOWEST, true)); |
| 1459 MockWrite writes[] = { | 1459 MockWrite writes[] = { |
| 1460 CreateMockWrite(req, 0), | 1460 CreateMockWrite(req, 0), |
| 1461 }; | 1461 }; |
| 1462 | 1462 |
| 1463 SpdySerializedFrame resp(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); | 1463 SpdySerializedFrame resp(spdy_util_.ConstructSpdyGetReply(NULL, 0, 1)); |
| 1464 SpdySerializedFrame body(spdy_util_.ConstructSpdyDataFrame(1, true)); | 1464 SpdySerializedFrame body(spdy_util_.ConstructSpdyDataFrame(1, true)); |
| 1465 MockRead reads[] = { | 1465 MockRead reads[] = { |
| 1466 CreateMockRead(resp, 1), CreateMockRead(body, 2), | 1466 CreateMockRead(resp, 1), CreateMockRead(body, 2), |
| 1467 MockRead(ASYNC, 0, 3) // EOF | 1467 MockRead(ASYNC, 0, 3) // EOF |
| 1468 }; | 1468 }; |
| 1469 | 1469 |
| 1470 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); | 1470 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); |
| 1471 NormalSpdyTransactionHelper helper(request, DEFAULT_PRIORITY, BoundNetLog(), | 1471 NormalSpdyTransactionHelper helper(request, DEFAULT_PRIORITY, BoundNetLog(), |
| 1472 NULL); | 1472 NULL); |
| 1473 helper.RunToCompletion(&data); | 1473 helper.RunToCompletion(&data); |
| 1474 TransactionHelperResult out = helper.output(); | 1474 TransactionHelperResult out = helper.output(); |
| 1475 | 1475 |
| 1476 EXPECT_THAT(out.rv, IsOk()); | 1476 EXPECT_THAT(out.rv, IsOk()); |
| 1477 EXPECT_EQ("HTTP/1.1 200", out.status_line); | 1477 EXPECT_EQ("HTTP/1.1 200", out.status_line); |
| 1478 } | 1478 } |
| 1479 | 1479 |
| 1480 // Test that a simple POST works. | 1480 // Test that a simple POST works. |
| 1481 TEST_F(SpdyNetworkTransactionTest, Post) { | 1481 TEST_F(SpdyNetworkTransactionTest, Post) { |
| 1482 SpdySerializedFrame req(spdy_util_.ConstructSpdyPost( | 1482 SpdySerializedFrame req(spdy_util_.ConstructSpdyPost( |
| 1483 kDefaultUrl, 1, kUploadDataSize, LOWEST, NULL, 0)); | 1483 kDefaultUrl, 1, kUploadDataSize, LOWEST, NULL, 0)); |
| 1484 SpdySerializedFrame body(spdy_util_.ConstructSpdyDataFrame(1, true)); | 1484 SpdySerializedFrame body(spdy_util_.ConstructSpdyDataFrame(1, true)); |
| 1485 MockWrite writes[] = { | 1485 MockWrite writes[] = { |
| 1486 CreateMockWrite(req, 0), CreateMockWrite(body, 1), // POST upload frame | 1486 CreateMockWrite(req, 0), CreateMockWrite(body, 1), // POST upload frame |
| 1487 }; | 1487 }; |
| 1488 | 1488 |
| 1489 SpdySerializedFrame resp(spdy_util_.ConstructSpdyPostSynReply(NULL, 0)); | 1489 SpdySerializedFrame resp(spdy_util_.ConstructSpdyPostReply(NULL, 0)); |
| 1490 MockRead reads[] = { | 1490 MockRead reads[] = { |
| 1491 CreateMockRead(resp, 2), CreateMockRead(body, 3), | 1491 CreateMockRead(resp, 2), CreateMockRead(body, 3), |
| 1492 MockRead(ASYNC, 0, 4) // EOF | 1492 MockRead(ASYNC, 0, 4) // EOF |
| 1493 }; | 1493 }; |
| 1494 | 1494 |
| 1495 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); | 1495 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); |
| 1496 NormalSpdyTransactionHelper helper(CreatePostRequest(), DEFAULT_PRIORITY, | 1496 NormalSpdyTransactionHelper helper(CreatePostRequest(), DEFAULT_PRIORITY, |
| 1497 BoundNetLog(), NULL); | 1497 BoundNetLog(), NULL); |
| 1498 helper.RunToCompletion(&data); | 1498 helper.RunToCompletion(&data); |
| 1499 TransactionHelperResult out = helper.output(); | 1499 TransactionHelperResult out = helper.output(); |
| 1500 EXPECT_THAT(out.rv, IsOk()); | 1500 EXPECT_THAT(out.rv, IsOk()); |
| 1501 EXPECT_EQ("HTTP/1.1 200", out.status_line); | 1501 EXPECT_EQ("HTTP/1.1 200", out.status_line); |
| 1502 EXPECT_EQ("hello!", out.response_data); | 1502 EXPECT_EQ("hello!", out.response_data); |
| 1503 } | 1503 } |
| 1504 | 1504 |
| 1505 // Test that a POST with a file works. | 1505 // Test that a POST with a file works. |
| 1506 TEST_F(SpdyNetworkTransactionTest, FilePost) { | 1506 TEST_F(SpdyNetworkTransactionTest, FilePost) { |
| 1507 SpdySerializedFrame req(spdy_util_.ConstructSpdyPost( | 1507 SpdySerializedFrame req(spdy_util_.ConstructSpdyPost( |
| 1508 kDefaultUrl, 1, kUploadDataSize, LOWEST, NULL, 0)); | 1508 kDefaultUrl, 1, kUploadDataSize, LOWEST, NULL, 0)); |
| 1509 SpdySerializedFrame body(spdy_util_.ConstructSpdyDataFrame(1, true)); | 1509 SpdySerializedFrame body(spdy_util_.ConstructSpdyDataFrame(1, true)); |
| 1510 MockWrite writes[] = { | 1510 MockWrite writes[] = { |
| 1511 CreateMockWrite(req, 0), CreateMockWrite(body, 1), // POST upload frame | 1511 CreateMockWrite(req, 0), CreateMockWrite(body, 1), // POST upload frame |
| 1512 }; | 1512 }; |
| 1513 | 1513 |
| 1514 SpdySerializedFrame resp(spdy_util_.ConstructSpdyPostSynReply(NULL, 0)); | 1514 SpdySerializedFrame resp(spdy_util_.ConstructSpdyPostReply(NULL, 0)); |
| 1515 MockRead reads[] = { | 1515 MockRead reads[] = { |
| 1516 CreateMockRead(resp, 2), CreateMockRead(body, 3), | 1516 CreateMockRead(resp, 2), CreateMockRead(body, 3), |
| 1517 MockRead(ASYNC, 0, 4) // EOF | 1517 MockRead(ASYNC, 0, 4) // EOF |
| 1518 }; | 1518 }; |
| 1519 | 1519 |
| 1520 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); | 1520 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); |
| 1521 NormalSpdyTransactionHelper helper(CreateFilePostRequest(), DEFAULT_PRIORITY, | 1521 NormalSpdyTransactionHelper helper(CreateFilePostRequest(), DEFAULT_PRIORITY, |
| 1522 BoundNetLog(), NULL); | 1522 BoundNetLog(), NULL); |
| 1523 helper.RunToCompletion(&data); | 1523 helper.RunToCompletion(&data); |
| 1524 TransactionHelperResult out = helper.output(); | 1524 TransactionHelperResult out = helper.output(); |
| (...skipping 25 matching lines...) Expand all Loading... |
| 1550 | 1550 |
| 1551 // Test that a complex POST works. | 1551 // Test that a complex POST works. |
| 1552 TEST_F(SpdyNetworkTransactionTest, ComplexPost) { | 1552 TEST_F(SpdyNetworkTransactionTest, ComplexPost) { |
| 1553 SpdySerializedFrame req(spdy_util_.ConstructSpdyPost( | 1553 SpdySerializedFrame req(spdy_util_.ConstructSpdyPost( |
| 1554 kDefaultUrl, 1, kUploadDataSize, LOWEST, NULL, 0)); | 1554 kDefaultUrl, 1, kUploadDataSize, LOWEST, NULL, 0)); |
| 1555 SpdySerializedFrame body(spdy_util_.ConstructSpdyDataFrame(1, true)); | 1555 SpdySerializedFrame body(spdy_util_.ConstructSpdyDataFrame(1, true)); |
| 1556 MockWrite writes[] = { | 1556 MockWrite writes[] = { |
| 1557 CreateMockWrite(req, 0), CreateMockWrite(body, 1), // POST upload frame | 1557 CreateMockWrite(req, 0), CreateMockWrite(body, 1), // POST upload frame |
| 1558 }; | 1558 }; |
| 1559 | 1559 |
| 1560 SpdySerializedFrame resp(spdy_util_.ConstructSpdyPostSynReply(NULL, 0)); | 1560 SpdySerializedFrame resp(spdy_util_.ConstructSpdyPostReply(NULL, 0)); |
| 1561 MockRead reads[] = { | 1561 MockRead reads[] = { |
| 1562 CreateMockRead(resp, 2), CreateMockRead(body, 3), | 1562 CreateMockRead(resp, 2), CreateMockRead(body, 3), |
| 1563 MockRead(ASYNC, 0, 4) // EOF | 1563 MockRead(ASYNC, 0, 4) // EOF |
| 1564 }; | 1564 }; |
| 1565 | 1565 |
| 1566 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); | 1566 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); |
| 1567 NormalSpdyTransactionHelper helper(CreateComplexPostRequest(), | 1567 NormalSpdyTransactionHelper helper(CreateComplexPostRequest(), |
| 1568 DEFAULT_PRIORITY, BoundNetLog(), NULL); | 1568 DEFAULT_PRIORITY, BoundNetLog(), NULL); |
| 1569 helper.RunToCompletion(&data); | 1569 helper.RunToCompletion(&data); |
| 1570 TransactionHelperResult out = helper.output(); | 1570 TransactionHelperResult out = helper.output(); |
| 1571 EXPECT_THAT(out.rv, IsOk()); | 1571 EXPECT_THAT(out.rv, IsOk()); |
| 1572 EXPECT_EQ("HTTP/1.1 200", out.status_line); | 1572 EXPECT_EQ("HTTP/1.1 200", out.status_line); |
| 1573 EXPECT_EQ("hello!", out.response_data); | 1573 EXPECT_EQ("hello!", out.response_data); |
| 1574 } | 1574 } |
| 1575 | 1575 |
| 1576 // Test that a chunked POST works. | 1576 // Test that a chunked POST works. |
| 1577 TEST_F(SpdyNetworkTransactionTest, ChunkedPost) { | 1577 TEST_F(SpdyNetworkTransactionTest, ChunkedPost) { |
| 1578 SpdySerializedFrame req(spdy_util_.ConstructChunkedSpdyPost(NULL, 0)); | 1578 SpdySerializedFrame req(spdy_util_.ConstructChunkedSpdyPost(NULL, 0)); |
| 1579 SpdySerializedFrame body(spdy_util_.ConstructSpdyDataFrame(1, true)); | 1579 SpdySerializedFrame body(spdy_util_.ConstructSpdyDataFrame(1, true)); |
| 1580 MockWrite writes[] = { | 1580 MockWrite writes[] = { |
| 1581 CreateMockWrite(req, 0), CreateMockWrite(body, 1), | 1581 CreateMockWrite(req, 0), CreateMockWrite(body, 1), |
| 1582 }; | 1582 }; |
| 1583 | 1583 |
| 1584 SpdySerializedFrame resp(spdy_util_.ConstructSpdyPostSynReply(NULL, 0)); | 1584 SpdySerializedFrame resp(spdy_util_.ConstructSpdyPostReply(NULL, 0)); |
| 1585 MockRead reads[] = { | 1585 MockRead reads[] = { |
| 1586 CreateMockRead(resp, 2), CreateMockRead(body, 3), | 1586 CreateMockRead(resp, 2), CreateMockRead(body, 3), |
| 1587 MockRead(ASYNC, 0, 4) // EOF | 1587 MockRead(ASYNC, 0, 4) // EOF |
| 1588 }; | 1588 }; |
| 1589 | 1589 |
| 1590 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); | 1590 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); |
| 1591 NormalSpdyTransactionHelper helper(CreateChunkedPostRequest(), | 1591 NormalSpdyTransactionHelper helper(CreateChunkedPostRequest(), |
| 1592 DEFAULT_PRIORITY, BoundNetLog(), NULL); | 1592 DEFAULT_PRIORITY, BoundNetLog(), NULL); |
| 1593 | 1593 |
| 1594 // These chunks get merged into a single frame when being sent. | 1594 // These chunks get merged into a single frame when being sent. |
| (...skipping 13 matching lines...) Expand all Loading... |
| 1608 TEST_F(SpdyNetworkTransactionTest, DelayedChunkedPost) { | 1608 TEST_F(SpdyNetworkTransactionTest, DelayedChunkedPost) { |
| 1609 SpdySerializedFrame req(spdy_util_.ConstructChunkedSpdyPost(NULL, 0)); | 1609 SpdySerializedFrame req(spdy_util_.ConstructChunkedSpdyPost(NULL, 0)); |
| 1610 SpdySerializedFrame chunk1(spdy_util_.ConstructSpdyDataFrame(1, false)); | 1610 SpdySerializedFrame chunk1(spdy_util_.ConstructSpdyDataFrame(1, false)); |
| 1611 SpdySerializedFrame chunk2(spdy_util_.ConstructSpdyDataFrame(1, false)); | 1611 SpdySerializedFrame chunk2(spdy_util_.ConstructSpdyDataFrame(1, false)); |
| 1612 SpdySerializedFrame chunk3(spdy_util_.ConstructSpdyDataFrame(1, true)); | 1612 SpdySerializedFrame chunk3(spdy_util_.ConstructSpdyDataFrame(1, true)); |
| 1613 MockWrite writes[] = { | 1613 MockWrite writes[] = { |
| 1614 CreateMockWrite(req, 0), CreateMockWrite(chunk1, 1), | 1614 CreateMockWrite(req, 0), CreateMockWrite(chunk1, 1), |
| 1615 CreateMockWrite(chunk2, 2), CreateMockWrite(chunk3, 3), | 1615 CreateMockWrite(chunk2, 2), CreateMockWrite(chunk3, 3), |
| 1616 }; | 1616 }; |
| 1617 | 1617 |
| 1618 SpdySerializedFrame resp(spdy_util_.ConstructSpdyPostSynReply(NULL, 0)); | 1618 SpdySerializedFrame resp(spdy_util_.ConstructSpdyPostReply(NULL, 0)); |
| 1619 MockRead reads[] = { | 1619 MockRead reads[] = { |
| 1620 CreateMockRead(resp, 4), CreateMockRead(chunk1, 5), | 1620 CreateMockRead(resp, 4), CreateMockRead(chunk1, 5), |
| 1621 CreateMockRead(chunk2, 6), CreateMockRead(chunk3, 7), | 1621 CreateMockRead(chunk2, 6), CreateMockRead(chunk3, 7), |
| 1622 MockRead(ASYNC, 0, 8) // EOF | 1622 MockRead(ASYNC, 0, 8) // EOF |
| 1623 }; | 1623 }; |
| 1624 | 1624 |
| 1625 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); | 1625 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); |
| 1626 NormalSpdyTransactionHelper helper(CreateChunkedPostRequest(), | 1626 NormalSpdyTransactionHelper helper(CreateChunkedPostRequest(), |
| 1627 DEFAULT_PRIORITY, BoundNetLog(), NULL); | 1627 DEFAULT_PRIORITY, BoundNetLog(), NULL); |
| 1628 | 1628 |
| (...skipping 29 matching lines...) Expand all Loading... |
| 1658 request.method = "POST"; | 1658 request.method = "POST"; |
| 1659 request.url = default_url_; | 1659 request.url = default_url_; |
| 1660 // Create an empty UploadData. | 1660 // Create an empty UploadData. |
| 1661 request.upload_data_stream = NULL; | 1661 request.upload_data_stream = NULL; |
| 1662 | 1662 |
| 1663 // When request.upload_data_stream is NULL for post, content-length is | 1663 // When request.upload_data_stream is NULL for post, content-length is |
| 1664 // expected to be 0. | 1664 // expected to be 0. |
| 1665 SpdyHeaderBlock req_block( | 1665 SpdyHeaderBlock req_block( |
| 1666 spdy_util_.ConstructPostHeaderBlock(kDefaultUrl, 0)); | 1666 spdy_util_.ConstructPostHeaderBlock(kDefaultUrl, 0)); |
| 1667 SpdySerializedFrame req( | 1667 SpdySerializedFrame req( |
| 1668 spdy_util_.ConstructSpdySyn(1, std::move(req_block), LOWEST, true)); | 1668 spdy_util_.ConstructSpdyHeaders(1, std::move(req_block), LOWEST, true)); |
| 1669 | 1669 |
| 1670 MockWrite writes[] = { | 1670 MockWrite writes[] = { |
| 1671 CreateMockWrite(req, 0), | 1671 CreateMockWrite(req, 0), |
| 1672 }; | 1672 }; |
| 1673 | 1673 |
| 1674 SpdySerializedFrame resp(spdy_util_.ConstructSpdyPostSynReply(NULL, 0)); | 1674 SpdySerializedFrame resp(spdy_util_.ConstructSpdyPostReply(NULL, 0)); |
| 1675 SpdySerializedFrame body(spdy_util_.ConstructSpdyDataFrame(1, true)); | 1675 SpdySerializedFrame body(spdy_util_.ConstructSpdyDataFrame(1, true)); |
| 1676 MockRead reads[] = { | 1676 MockRead reads[] = { |
| 1677 CreateMockRead(resp, 1), CreateMockRead(body, 2), | 1677 CreateMockRead(resp, 1), CreateMockRead(body, 2), |
| 1678 MockRead(ASYNC, 0, 3) // EOF | 1678 MockRead(ASYNC, 0, 3) // EOF |
| 1679 }; | 1679 }; |
| 1680 | 1680 |
| 1681 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); | 1681 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); |
| 1682 | 1682 |
| 1683 NormalSpdyTransactionHelper helper(request, DEFAULT_PRIORITY, BoundNetLog(), | 1683 NormalSpdyTransactionHelper helper(request, DEFAULT_PRIORITY, BoundNetLog(), |
| 1684 NULL); | 1684 NULL); |
| (...skipping 14 matching lines...) Expand all Loading... |
| 1699 HttpRequestInfo request; | 1699 HttpRequestInfo request; |
| 1700 request.method = "POST"; | 1700 request.method = "POST"; |
| 1701 request.url = default_url_; | 1701 request.url = default_url_; |
| 1702 request.upload_data_stream = &stream; | 1702 request.upload_data_stream = &stream; |
| 1703 | 1703 |
| 1704 const uint64_t kContentLength = 0; | 1704 const uint64_t kContentLength = 0; |
| 1705 | 1705 |
| 1706 SpdyHeaderBlock req_block( | 1706 SpdyHeaderBlock req_block( |
| 1707 spdy_util_.ConstructPostHeaderBlock(kDefaultUrl, kContentLength)); | 1707 spdy_util_.ConstructPostHeaderBlock(kDefaultUrl, kContentLength)); |
| 1708 SpdySerializedFrame req( | 1708 SpdySerializedFrame req( |
| 1709 spdy_util_.ConstructSpdySyn(1, std::move(req_block), LOWEST, true)); | 1709 spdy_util_.ConstructSpdyHeaders(1, std::move(req_block), LOWEST, true)); |
| 1710 | 1710 |
| 1711 MockWrite writes[] = { | 1711 MockWrite writes[] = { |
| 1712 CreateMockWrite(req, 0), | 1712 CreateMockWrite(req, 0), |
| 1713 }; | 1713 }; |
| 1714 | 1714 |
| 1715 SpdySerializedFrame resp(spdy_util_.ConstructSpdyPostSynReply(NULL, 0)); | 1715 SpdySerializedFrame resp(spdy_util_.ConstructSpdyPostReply(NULL, 0)); |
| 1716 SpdySerializedFrame body(spdy_util_.ConstructSpdyDataFrame(1, true)); | 1716 SpdySerializedFrame body(spdy_util_.ConstructSpdyDataFrame(1, true)); |
| 1717 MockRead reads[] = { | 1717 MockRead reads[] = { |
| 1718 CreateMockRead(resp, 1), CreateMockRead(body, 2), | 1718 CreateMockRead(resp, 1), CreateMockRead(body, 2), |
| 1719 MockRead(ASYNC, 0, 3) // EOF | 1719 MockRead(ASYNC, 0, 3) // EOF |
| 1720 }; | 1720 }; |
| 1721 | 1721 |
| 1722 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); | 1722 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); |
| 1723 | 1723 |
| 1724 NormalSpdyTransactionHelper helper(request, DEFAULT_PRIORITY, BoundNetLog(), | 1724 NormalSpdyTransactionHelper helper(request, DEFAULT_PRIORITY, BoundNetLog(), |
| 1725 NULL); | 1725 NULL); |
| 1726 helper.RunToCompletion(&data); | 1726 helper.RunToCompletion(&data); |
| 1727 TransactionHelperResult out = helper.output(); | 1727 TransactionHelperResult out = helper.output(); |
| 1728 EXPECT_THAT(out.rv, IsOk()); | 1728 EXPECT_THAT(out.rv, IsOk()); |
| 1729 EXPECT_EQ("HTTP/1.1 200", out.status_line); | 1729 EXPECT_EQ("HTTP/1.1 200", out.status_line); |
| 1730 EXPECT_EQ("hello!", out.response_data); | 1730 EXPECT_EQ("hello!", out.response_data); |
| 1731 } | 1731 } |
| 1732 | 1732 |
| 1733 // While we're doing a post, the server sends the reply before upload completes. | 1733 // While we're doing a post, the server sends the reply before upload completes. |
| 1734 TEST_F(SpdyNetworkTransactionTest, ResponseBeforePostCompletes) { | 1734 TEST_F(SpdyNetworkTransactionTest, ResponseBeforePostCompletes) { |
| 1735 SpdySerializedFrame req(spdy_util_.ConstructChunkedSpdyPost(NULL, 0)); | 1735 SpdySerializedFrame req(spdy_util_.ConstructChunkedSpdyPost(NULL, 0)); |
| 1736 SpdySerializedFrame body(spdy_util_.ConstructSpdyDataFrame(1, true)); | 1736 SpdySerializedFrame body(spdy_util_.ConstructSpdyDataFrame(1, true)); |
| 1737 MockWrite writes[] = { | 1737 MockWrite writes[] = { |
| 1738 CreateMockWrite(req, 0), CreateMockWrite(body, 3), | 1738 CreateMockWrite(req, 0), CreateMockWrite(body, 3), |
| 1739 }; | 1739 }; |
| 1740 SpdySerializedFrame resp(spdy_util_.ConstructSpdyPostSynReply(NULL, 0)); | 1740 SpdySerializedFrame resp(spdy_util_.ConstructSpdyPostReply(NULL, 0)); |
| 1741 MockRead reads[] = { | 1741 MockRead reads[] = { |
| 1742 CreateMockRead(resp, 1), CreateMockRead(body, 2), | 1742 CreateMockRead(resp, 1), CreateMockRead(body, 2), |
| 1743 MockRead(ASYNC, 0, 4) // EOF | 1743 MockRead(ASYNC, 0, 4) // EOF |
| 1744 }; | 1744 }; |
| 1745 | 1745 |
| 1746 // Write the request headers, and read the complete response | 1746 // Write the request headers, and read the complete response |
| 1747 // while still waiting for chunked request data. | 1747 // while still waiting for chunked request data. |
| 1748 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); | 1748 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); |
| 1749 NormalSpdyTransactionHelper helper(CreateChunkedPostRequest(), | 1749 NormalSpdyTransactionHelper helper(CreateChunkedPostRequest(), |
| 1750 DEFAULT_PRIORITY, BoundNetLog(), NULL); | 1750 DEFAULT_PRIORITY, BoundNetLog(), NULL); |
| 1751 helper.RunPreTestSetup(); | 1751 helper.RunPreTestSetup(); |
| 1752 helper.AddData(&data); | 1752 helper.AddData(&data); |
| 1753 | 1753 |
| 1754 ASSERT_TRUE(helper.StartDefaultTest()); | 1754 ASSERT_TRUE(helper.StartDefaultTest()); |
| 1755 | 1755 |
| 1756 base::RunLoop().RunUntilIdle(); | 1756 base::RunLoop().RunUntilIdle(); |
| 1757 | 1757 |
| 1758 // Process the request headers, SYN_REPLY, and response body. | 1758 // Process the request headers, response headers, and response body. |
| 1759 // The request body is still in flight. | 1759 // The request body is still in flight. |
| 1760 const HttpResponseInfo* response = helper.trans()->GetResponseInfo(); | 1760 const HttpResponseInfo* response = helper.trans()->GetResponseInfo(); |
| 1761 EXPECT_EQ("HTTP/1.1 200", response->headers->GetStatusLine()); | 1761 EXPECT_EQ("HTTP/1.1 200", response->headers->GetStatusLine()); |
| 1762 | 1762 |
| 1763 // Finish sending the request body. | 1763 // Finish sending the request body. |
| 1764 upload_chunked_data_stream()->AppendData(kUploadData, kUploadDataSize, true); | 1764 upload_chunked_data_stream()->AppendData(kUploadData, kUploadDataSize, true); |
| 1765 helper.WaitForCallbackToComplete(); | 1765 helper.WaitForCallbackToComplete(); |
| 1766 EXPECT_THAT(helper.output().rv, IsOk()); | 1766 EXPECT_THAT(helper.output().rv, IsOk()); |
| 1767 | 1767 |
| 1768 std::string response_body; | 1768 std::string response_body; |
| 1769 EXPECT_THAT(ReadTransaction(helper.trans(), &response_body), IsOk()); | 1769 EXPECT_THAT(ReadTransaction(helper.trans(), &response_body), IsOk()); |
| 1770 EXPECT_EQ(kUploadData, response_body); | 1770 EXPECT_EQ(kUploadData, response_body); |
| 1771 helper.VerifyDataConsumed(); | 1771 helper.VerifyDataConsumed(); |
| 1772 } | 1772 } |
| 1773 | 1773 |
| 1774 // The client upon cancellation tries to send a RST_STREAM frame. The mock | 1774 // The client upon cancellation tries to send a RST_STREAM frame. The mock |
| 1775 // socket causes the TCP write to return zero. This test checks that the client | 1775 // socket causes the TCP write to return zero. This test checks that the client |
| 1776 // tries to queue up the RST_STREAM frame again. | 1776 // tries to queue up the RST_STREAM frame again. |
| 1777 TEST_F(SpdyNetworkTransactionTest, SocketWriteReturnsZero) { | 1777 TEST_F(SpdyNetworkTransactionTest, SocketWriteReturnsZero) { |
| 1778 SpdySerializedFrame req( | 1778 SpdySerializedFrame req( |
| 1779 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); | 1779 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); |
| 1780 SpdySerializedFrame rst( | 1780 SpdySerializedFrame rst( |
| 1781 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_CANCEL)); | 1781 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_CANCEL)); |
| 1782 MockWrite writes[] = { | 1782 MockWrite writes[] = { |
| 1783 CreateMockWrite(req, 0, SYNCHRONOUS), MockWrite(SYNCHRONOUS, 0, 0, 2), | 1783 CreateMockWrite(req, 0, SYNCHRONOUS), MockWrite(SYNCHRONOUS, 0, 0, 2), |
| 1784 CreateMockWrite(rst, 3, SYNCHRONOUS), | 1784 CreateMockWrite(rst, 3, SYNCHRONOUS), |
| 1785 }; | 1785 }; |
| 1786 | 1786 |
| 1787 SpdySerializedFrame resp(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); | 1787 SpdySerializedFrame resp(spdy_util_.ConstructSpdyGetReply(NULL, 0, 1)); |
| 1788 MockRead reads[] = { | 1788 MockRead reads[] = { |
| 1789 CreateMockRead(resp, 1, ASYNC), MockRead(ASYNC, 0, 0, 4) // EOF | 1789 CreateMockRead(resp, 1, ASYNC), MockRead(ASYNC, 0, 0, 4) // EOF |
| 1790 }; | 1790 }; |
| 1791 | 1791 |
| 1792 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); | 1792 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); |
| 1793 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY, | 1793 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY, |
| 1794 BoundNetLog(), NULL); | 1794 BoundNetLog(), NULL); |
| 1795 helper.RunPreTestSetup(); | 1795 helper.RunPreTestSetup(); |
| 1796 helper.AddData(&data); | 1796 helper.AddData(&data); |
| 1797 HttpNetworkTransaction* trans = helper.trans(); | 1797 HttpNetworkTransaction* trans = helper.trans(); |
| 1798 | 1798 |
| 1799 TestCompletionCallback callback; | 1799 TestCompletionCallback callback; |
| 1800 int rv = trans->Start( | 1800 int rv = trans->Start( |
| 1801 &CreateGetRequest(), callback.callback(), BoundNetLog()); | 1801 &CreateGetRequest(), callback.callback(), BoundNetLog()); |
| 1802 EXPECT_THAT(callback.GetResult(rv), IsOk()); | 1802 EXPECT_THAT(callback.GetResult(rv), IsOk()); |
| 1803 | 1803 |
| 1804 helper.ResetTrans(); | 1804 helper.ResetTrans(); |
| 1805 base::RunLoop().RunUntilIdle(); | 1805 base::RunLoop().RunUntilIdle(); |
| 1806 | 1806 |
| 1807 helper.VerifyDataConsumed(); | 1807 helper.VerifyDataConsumed(); |
| 1808 } | 1808 } |
| 1809 | 1809 |
| 1810 // Test that the transaction doesn't crash when we don't have a reply. | 1810 // Test that the transaction doesn't crash when we don't have a reply. |
| 1811 TEST_F(SpdyNetworkTransactionTest, ResponseWithoutSynReply) { | 1811 TEST_F(SpdyNetworkTransactionTest, ResponseWithoutHeaders) { |
| 1812 SpdySerializedFrame body(spdy_util_.ConstructSpdyDataFrame(1, true)); | 1812 SpdySerializedFrame body(spdy_util_.ConstructSpdyDataFrame(1, true)); |
| 1813 MockRead reads[] = { | 1813 MockRead reads[] = { |
| 1814 CreateMockRead(body, 1), MockRead(ASYNC, 0, 3) // EOF | 1814 CreateMockRead(body, 1), MockRead(ASYNC, 0, 3) // EOF |
| 1815 }; | 1815 }; |
| 1816 | 1816 |
| 1817 SpdySerializedFrame req( | 1817 SpdySerializedFrame req( |
| 1818 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); | 1818 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); |
| 1819 SpdySerializedFrame rst( | 1819 SpdySerializedFrame rst( |
| 1820 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_PROTOCOL_ERROR)); | 1820 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_PROTOCOL_ERROR)); |
| 1821 MockWrite writes[] = { | 1821 MockWrite writes[] = { |
| (...skipping 11 matching lines...) Expand all Loading... |
| 1833 // stream ID. See http://crbug.com/45639. | 1833 // stream ID. See http://crbug.com/45639. |
| 1834 TEST_F(SpdyNetworkTransactionTest, ResponseWithTwoSynReplies) { | 1834 TEST_F(SpdyNetworkTransactionTest, ResponseWithTwoSynReplies) { |
| 1835 SpdySerializedFrame req( | 1835 SpdySerializedFrame req( |
| 1836 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); | 1836 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); |
| 1837 SpdySerializedFrame rst( | 1837 SpdySerializedFrame rst( |
| 1838 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_PROTOCOL_ERROR)); | 1838 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_PROTOCOL_ERROR)); |
| 1839 MockWrite writes[] = { | 1839 MockWrite writes[] = { |
| 1840 CreateMockWrite(req, 0), CreateMockWrite(rst, 4), | 1840 CreateMockWrite(req, 0), CreateMockWrite(rst, 4), |
| 1841 }; | 1841 }; |
| 1842 | 1842 |
| 1843 SpdySerializedFrame resp0(spdy_util_.ConstructSpdyGetSynReply(nullptr, 0, 1)); | 1843 SpdySerializedFrame resp0(spdy_util_.ConstructSpdyGetReply(nullptr, 0, 1)); |
| 1844 SpdySerializedFrame resp1(spdy_util_.ConstructSpdyGetSynReply(nullptr, 0, 1)); | 1844 SpdySerializedFrame resp1(spdy_util_.ConstructSpdyGetReply(nullptr, 0, 1)); |
| 1845 SpdySerializedFrame body(spdy_util_.ConstructSpdyDataFrame(1, true)); | 1845 SpdySerializedFrame body(spdy_util_.ConstructSpdyDataFrame(1, true)); |
| 1846 MockRead reads[] = { | 1846 MockRead reads[] = { |
| 1847 CreateMockRead(resp0, 1), CreateMockRead(resp1, 2), | 1847 CreateMockRead(resp0, 1), CreateMockRead(resp1, 2), |
| 1848 CreateMockRead(body, 3), MockRead(ASYNC, 0, 5) // EOF | 1848 CreateMockRead(body, 3), MockRead(ASYNC, 0, 5) // EOF |
| 1849 }; | 1849 }; |
| 1850 | 1850 |
| 1851 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); | 1851 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); |
| 1852 | 1852 |
| 1853 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY, | 1853 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY, |
| 1854 BoundNetLog(), NULL); | 1854 BoundNetLog(), NULL); |
| (...skipping 25 matching lines...) Expand all Loading... |
| 1880 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); | 1880 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); |
| 1881 SpdySerializedFrame rst( | 1881 SpdySerializedFrame rst( |
| 1882 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_PROTOCOL_ERROR)); | 1882 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_PROTOCOL_ERROR)); |
| 1883 MockWrite writes[] = { | 1883 MockWrite writes[] = { |
| 1884 CreateMockWrite(req, 0), CreateMockWrite(rst, 2), | 1884 CreateMockWrite(req, 0), CreateMockWrite(rst, 2), |
| 1885 }; | 1885 }; |
| 1886 | 1886 |
| 1887 const char* const headers[] = { | 1887 const char* const headers[] = { |
| 1888 "transfer-encoding", "chunked" | 1888 "transfer-encoding", "chunked" |
| 1889 }; | 1889 }; |
| 1890 SpdySerializedFrame resp(spdy_util_.ConstructSpdyGetSynReply(headers, 1, 1)); | 1890 SpdySerializedFrame resp(spdy_util_.ConstructSpdyGetReply(headers, 1, 1)); |
| 1891 SpdySerializedFrame body(spdy_util_.ConstructSpdyDataFrame(1, true)); | 1891 SpdySerializedFrame body(spdy_util_.ConstructSpdyDataFrame(1, true)); |
| 1892 MockRead reads[] = { | 1892 MockRead reads[] = { |
| 1893 CreateMockRead(resp, 1), CreateMockRead(body, 3), | 1893 CreateMockRead(resp, 1), CreateMockRead(body, 3), |
| 1894 MockRead(ASYNC, 0, 4) // EOF | 1894 MockRead(ASYNC, 0, 4) // EOF |
| 1895 }; | 1895 }; |
| 1896 | 1896 |
| 1897 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); | 1897 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); |
| 1898 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY, | 1898 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY, |
| 1899 BoundNetLog(), NULL); | 1899 BoundNetLog(), NULL); |
| 1900 helper.RunToCompletion(&data); | 1900 helper.RunToCompletion(&data); |
| 1901 TransactionHelperResult out = helper.output(); | 1901 TransactionHelperResult out = helper.output(); |
| 1902 EXPECT_THAT(out.rv, IsError(ERR_SPDY_PROTOCOL_ERROR)); | 1902 EXPECT_THAT(out.rv, IsError(ERR_SPDY_PROTOCOL_ERROR)); |
| 1903 | 1903 |
| 1904 helper.session()->spdy_session_pool()->CloseAllSessions(); | 1904 helper.session()->spdy_session_pool()->CloseAllSessions(); |
| 1905 helper.VerifyDataConsumed(); | 1905 helper.VerifyDataConsumed(); |
| 1906 } | 1906 } |
| 1907 | 1907 |
| 1908 TEST_F(SpdyNetworkTransactionTest, ResetPushWithTransferEncoding) { | 1908 TEST_F(SpdyNetworkTransactionTest, ResetPushWithTransferEncoding) { |
| 1909 // Construct the request. | 1909 // Construct the request. |
| 1910 SpdySerializedFrame req( | 1910 SpdySerializedFrame req( |
| 1911 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); | 1911 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); |
| 1912 SpdySerializedFrame rst( | 1912 SpdySerializedFrame rst( |
| 1913 spdy_util_.ConstructSpdyRstStream(2, RST_STREAM_PROTOCOL_ERROR)); | 1913 spdy_util_.ConstructSpdyRstStream(2, RST_STREAM_PROTOCOL_ERROR)); |
| 1914 MockWrite writes[] = { | 1914 MockWrite writes[] = { |
| 1915 CreateMockWrite(req, 0), CreateMockWrite(rst, 4), | 1915 CreateMockWrite(req, 0), CreateMockWrite(rst, 4), |
| 1916 }; | 1916 }; |
| 1917 | 1917 |
| 1918 SpdySerializedFrame resp(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); | 1918 SpdySerializedFrame resp(spdy_util_.ConstructSpdyGetReply(NULL, 0, 1)); |
| 1919 const char* const headers[] = { | 1919 const char* const headers[] = { |
| 1920 "transfer-encoding", "chunked" | 1920 "transfer-encoding", "chunked" |
| 1921 }; | 1921 }; |
| 1922 SpdySerializedFrame push( | 1922 SpdySerializedFrame push( |
| 1923 spdy_util_.ConstructSpdyPush(headers, arraysize(headers) / 2, 2, 1, | 1923 spdy_util_.ConstructSpdyPush(headers, arraysize(headers) / 2, 2, 1, |
| 1924 GetDefaultUrlWithPath("/1").c_str())); | 1924 GetDefaultUrlWithPath("/1").c_str())); |
| 1925 SpdySerializedFrame body(spdy_util_.ConstructSpdyDataFrame(1, true)); | 1925 SpdySerializedFrame body(spdy_util_.ConstructSpdyDataFrame(1, true)); |
| 1926 MockRead reads[] = { | 1926 MockRead reads[] = { |
| 1927 CreateMockRead(resp, 1), CreateMockRead(push, 2), CreateMockRead(body, 3), | 1927 CreateMockRead(resp, 1), CreateMockRead(push, 2), CreateMockRead(body, 3), |
| 1928 MockRead(ASYNC, 0, 5) // EOF | 1928 MockRead(ASYNC, 0, 5) // EOF |
| (...skipping 13 matching lines...) Expand all Loading... |
| 1942 } | 1942 } |
| 1943 | 1943 |
| 1944 TEST_F(SpdyNetworkTransactionTest, CancelledTransaction) { | 1944 TEST_F(SpdyNetworkTransactionTest, CancelledTransaction) { |
| 1945 // Construct the request. | 1945 // Construct the request. |
| 1946 SpdySerializedFrame req( | 1946 SpdySerializedFrame req( |
| 1947 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); | 1947 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); |
| 1948 MockWrite writes[] = { | 1948 MockWrite writes[] = { |
| 1949 CreateMockWrite(req), | 1949 CreateMockWrite(req), |
| 1950 }; | 1950 }; |
| 1951 | 1951 |
| 1952 SpdySerializedFrame resp(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); | 1952 SpdySerializedFrame resp(spdy_util_.ConstructSpdyGetReply(NULL, 0, 1)); |
| 1953 MockRead reads[] = { | 1953 MockRead reads[] = { |
| 1954 CreateMockRead(resp), | 1954 CreateMockRead(resp), |
| 1955 // This following read isn't used by the test, except during the | 1955 // This following read isn't used by the test, except during the |
| 1956 // RunUntilIdle() call at the end since the SpdySession survives the | 1956 // RunUntilIdle() call at the end since the SpdySession survives the |
| 1957 // HttpNetworkTransaction and still tries to continue Read()'ing. Any | 1957 // HttpNetworkTransaction and still tries to continue Read()'ing. Any |
| 1958 // MockRead will do here. | 1958 // MockRead will do here. |
| 1959 MockRead(ASYNC, 0, 0) // EOF | 1959 MockRead(ASYNC, 0, 0) // EOF |
| 1960 }; | 1960 }; |
| 1961 | 1961 |
| 1962 StaticSocketDataProvider data(reads, arraysize(reads), | 1962 StaticSocketDataProvider data(reads, arraysize(reads), |
| (...skipping 21 matching lines...) Expand all Loading... |
| 1984 TEST_F(SpdyNetworkTransactionTest, CancelledTransactionSendRst) { | 1984 TEST_F(SpdyNetworkTransactionTest, CancelledTransactionSendRst) { |
| 1985 SpdySerializedFrame req( | 1985 SpdySerializedFrame req( |
| 1986 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); | 1986 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); |
| 1987 SpdySerializedFrame rst( | 1987 SpdySerializedFrame rst( |
| 1988 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_CANCEL)); | 1988 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_CANCEL)); |
| 1989 MockWrite writes[] = { | 1989 MockWrite writes[] = { |
| 1990 CreateMockWrite(req, 0, SYNCHRONOUS), | 1990 CreateMockWrite(req, 0, SYNCHRONOUS), |
| 1991 CreateMockWrite(rst, 2, SYNCHRONOUS), | 1991 CreateMockWrite(rst, 2, SYNCHRONOUS), |
| 1992 }; | 1992 }; |
| 1993 | 1993 |
| 1994 SpdySerializedFrame resp(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); | 1994 SpdySerializedFrame resp(spdy_util_.ConstructSpdyGetReply(NULL, 0, 1)); |
| 1995 MockRead reads[] = { | 1995 MockRead reads[] = { |
| 1996 CreateMockRead(resp, 1, ASYNC), MockRead(ASYNC, 0, 0, 3) // EOF | 1996 CreateMockRead(resp, 1, ASYNC), MockRead(ASYNC, 0, 0, 3) // EOF |
| 1997 }; | 1997 }; |
| 1998 | 1998 |
| 1999 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); | 1999 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); |
| 2000 | 2000 |
| 2001 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY, | 2001 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY, |
| 2002 BoundNetLog(), NULL); | 2002 BoundNetLog(), NULL); |
| 2003 helper.RunPreTestSetup(); | 2003 helper.RunPreTestSetup(); |
| 2004 helper.AddData(&data); | 2004 helper.AddData(&data); |
| (...skipping 21 matching lines...) Expand all Loading... |
| 2026 MockWrite writes2[] = {CreateMockWrite(req, 0)}; | 2026 MockWrite writes2[] = {CreateMockWrite(req, 0)}; |
| 2027 | 2027 |
| 2028 // The indicated length of this frame is longer than its actual length. When | 2028 // The indicated length of this frame is longer than its actual length. When |
| 2029 // the session receives an empty frame after this one, it shuts down the | 2029 // the session receives an empty frame after this one, it shuts down the |
| 2030 // session, and calls the read callback with the incomplete data. | 2030 // session, and calls the read callback with the incomplete data. |
| 2031 const uint8_t kGetBodyFrame2[] = { | 2031 const uint8_t kGetBodyFrame2[] = { |
| 2032 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, | 2032 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, |
| 2033 0x07, 'h', 'e', 'l', 'l', 'o', '!', | 2033 0x07, 'h', 'e', 'l', 'l', 'o', '!', |
| 2034 }; | 2034 }; |
| 2035 | 2035 |
| 2036 SpdySerializedFrame resp(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); | 2036 SpdySerializedFrame resp(spdy_util_.ConstructSpdyGetReply(NULL, 0, 1)); |
| 2037 MockRead reads[] = { | 2037 MockRead reads[] = { |
| 2038 CreateMockRead(resp, 1), | 2038 CreateMockRead(resp, 1), |
| 2039 MockRead(ASYNC, ERR_IO_PENDING, 2), // Force a pause | 2039 MockRead(ASYNC, ERR_IO_PENDING, 2), // Force a pause |
| 2040 MockRead(ASYNC, reinterpret_cast<const char*>(kGetBodyFrame2), | 2040 MockRead(ASYNC, reinterpret_cast<const char*>(kGetBodyFrame2), |
| 2041 arraysize(kGetBodyFrame2), 3), | 2041 arraysize(kGetBodyFrame2), 3), |
| 2042 MockRead(ASYNC, ERR_IO_PENDING, 4), // Force a pause | 2042 MockRead(ASYNC, ERR_IO_PENDING, 4), // Force a pause |
| 2043 MockRead(ASYNC, 0, 0, 5), // EOF | 2043 MockRead(ASYNC, 0, 0, 5), // EOF |
| 2044 }; | 2044 }; |
| 2045 MockRead reads2[] = { | 2045 MockRead reads2[] = { |
| 2046 CreateMockRead(resp, 1), MockRead(ASYNC, 0, 0, 2), // EOF | 2046 CreateMockRead(resp, 1), MockRead(ASYNC, 0, 0, 2), // EOF |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2081 } | 2081 } |
| 2082 | 2082 |
| 2083 // Verify that the client can correctly deal with the user callback deleting the | 2083 // Verify that the client can correctly deal with the user callback deleting the |
| 2084 // transaction. Failures will usually be valgrind errors. See | 2084 // transaction. Failures will usually be valgrind errors. See |
| 2085 // http://crbug.com/46925 | 2085 // http://crbug.com/46925 |
| 2086 TEST_F(SpdyNetworkTransactionTest, DeleteSessionOnReadCallback) { | 2086 TEST_F(SpdyNetworkTransactionTest, DeleteSessionOnReadCallback) { |
| 2087 SpdySerializedFrame req( | 2087 SpdySerializedFrame req( |
| 2088 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); | 2088 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); |
| 2089 MockWrite writes[] = {CreateMockWrite(req, 0)}; | 2089 MockWrite writes[] = {CreateMockWrite(req, 0)}; |
| 2090 | 2090 |
| 2091 SpdySerializedFrame resp(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); | 2091 SpdySerializedFrame resp(spdy_util_.ConstructSpdyGetReply(NULL, 0, 1)); |
| 2092 SpdySerializedFrame body(spdy_util_.ConstructSpdyDataFrame(1, true)); | 2092 SpdySerializedFrame body(spdy_util_.ConstructSpdyDataFrame(1, true)); |
| 2093 MockRead reads[] = { | 2093 MockRead reads[] = { |
| 2094 CreateMockRead(resp, 1), | 2094 CreateMockRead(resp, 1), |
| 2095 MockRead(ASYNC, ERR_IO_PENDING, 2), // Force a pause | 2095 MockRead(ASYNC, ERR_IO_PENDING, 2), // Force a pause |
| 2096 CreateMockRead(body, 3), MockRead(ASYNC, 0, 0, 4), // EOF | 2096 CreateMockRead(body, 3), MockRead(ASYNC, 0, 0, 4), // EOF |
| 2097 }; | 2097 }; |
| 2098 | 2098 |
| 2099 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); | 2099 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); |
| 2100 | 2100 |
| 2101 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY, | 2101 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY, |
| (...skipping 26 matching lines...) Expand all Loading... |
| 2128 } | 2128 } |
| 2129 | 2129 |
| 2130 // Send a spdy request to www.example.org that gets redirected to www.foo.com. | 2130 // Send a spdy request to www.example.org that gets redirected to www.foo.com. |
| 2131 TEST_F(SpdyNetworkTransactionTest, DISABLED_RedirectGetRequest) { | 2131 TEST_F(SpdyNetworkTransactionTest, DISABLED_RedirectGetRequest) { |
| 2132 SpdyHeaderBlock headers(spdy_util_.ConstructGetHeaderBlock(kDefaultUrl)); | 2132 SpdyHeaderBlock headers(spdy_util_.ConstructGetHeaderBlock(kDefaultUrl)); |
| 2133 headers["user-agent"] = ""; | 2133 headers["user-agent"] = ""; |
| 2134 headers["accept-encoding"] = "gzip, deflate"; | 2134 headers["accept-encoding"] = "gzip, deflate"; |
| 2135 | 2135 |
| 2136 // Setup writes/reads to www.example.org | 2136 // Setup writes/reads to www.example.org |
| 2137 SpdySerializedFrame req( | 2137 SpdySerializedFrame req( |
| 2138 spdy_util_.ConstructSpdySyn(1, std::move(headers), LOWEST, true)); | 2138 spdy_util_.ConstructSpdyHeaders(1, std::move(headers), LOWEST, true)); |
| 2139 SpdySerializedFrame resp(spdy_util_.ConstructSpdyGetSynReplyRedirect(1)); | 2139 SpdySerializedFrame resp(spdy_util_.ConstructSpdyGetReplyRedirect(1)); |
| 2140 MockWrite writes[] = { | 2140 MockWrite writes[] = { |
| 2141 CreateMockWrite(req, 1), | 2141 CreateMockWrite(req, 1), |
| 2142 }; | 2142 }; |
| 2143 MockRead reads[] = { | 2143 MockRead reads[] = { |
| 2144 CreateMockRead(resp, 2), MockRead(ASYNC, 0, 0, 3) // EOF | 2144 CreateMockRead(resp, 2), MockRead(ASYNC, 0, 0, 3) // EOF |
| 2145 }; | 2145 }; |
| 2146 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); | 2146 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); |
| 2147 | 2147 |
| 2148 // Setup writes/reads to www.foo.com | 2148 // Setup writes/reads to www.foo.com |
| 2149 SpdyHeaderBlock headers2( | 2149 SpdyHeaderBlock headers2( |
| 2150 spdy_util_.ConstructGetHeaderBlock("http://www.foo.com/index.php")); | 2150 spdy_util_.ConstructGetHeaderBlock("http://www.foo.com/index.php")); |
| 2151 headers2["user-agent"] = ""; | 2151 headers2["user-agent"] = ""; |
| 2152 headers2["accept-encoding"] = "gzip, deflate"; | 2152 headers2["accept-encoding"] = "gzip, deflate"; |
| 2153 SpdySerializedFrame req2( | 2153 SpdySerializedFrame req2( |
| 2154 spdy_util_.ConstructSpdySyn(1, std::move(headers2), LOWEST, true)); | 2154 spdy_util_.ConstructSpdyHeaders(1, std::move(headers2), LOWEST, true)); |
| 2155 MockWrite writes2[] = { | 2155 MockWrite writes2[] = { |
| 2156 CreateMockWrite(req2, 1), | 2156 CreateMockWrite(req2, 1), |
| 2157 }; | 2157 }; |
| 2158 | 2158 |
| 2159 SpdySerializedFrame resp2(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); | 2159 SpdySerializedFrame resp2(spdy_util_.ConstructSpdyGetReply(NULL, 0, 1)); |
| 2160 SpdySerializedFrame body2(spdy_util_.ConstructSpdyDataFrame(1, true)); | 2160 SpdySerializedFrame body2(spdy_util_.ConstructSpdyDataFrame(1, true)); |
| 2161 MockRead reads2[] = { | 2161 MockRead reads2[] = { |
| 2162 CreateMockRead(resp2, 2), CreateMockRead(body2, 3), | 2162 CreateMockRead(resp2, 2), CreateMockRead(body2, 3), |
| 2163 MockRead(ASYNC, 0, 0, 4) // EOF | 2163 MockRead(ASYNC, 0, 0, 4) // EOF |
| 2164 }; | 2164 }; |
| 2165 | 2165 |
| 2166 SequencedSocketData data2(reads2, arraysize(reads2), writes2, | 2166 SequencedSocketData data2(reads2, arraysize(reads2), writes2, |
| 2167 arraysize(writes2)); | 2167 arraysize(writes2)); |
| 2168 | 2168 |
| 2169 // TODO(erikchen): Make test support SPDYSSL, SPDYNPN | 2169 // TODO(erikchen): Make test support SPDYSSL, SPDYNPN |
| (...skipping 29 matching lines...) Expand all Loading... |
| 2199 | 2199 |
| 2200 // Send a spdy request to www.example.org. Get a pushed stream that redirects to | 2200 // Send a spdy request to www.example.org. Get a pushed stream that redirects to |
| 2201 // www.foo.com. | 2201 // www.foo.com. |
| 2202 TEST_F(SpdyNetworkTransactionTest, DISABLED_RedirectServerPush) { | 2202 TEST_F(SpdyNetworkTransactionTest, DISABLED_RedirectServerPush) { |
| 2203 SpdyHeaderBlock headers(spdy_util_.ConstructGetHeaderBlock(kDefaultUrl)); | 2203 SpdyHeaderBlock headers(spdy_util_.ConstructGetHeaderBlock(kDefaultUrl)); |
| 2204 headers["user-agent"] = ""; | 2204 headers["user-agent"] = ""; |
| 2205 headers["accept-encoding"] = "gzip, deflate"; | 2205 headers["accept-encoding"] = "gzip, deflate"; |
| 2206 | 2206 |
| 2207 // Setup writes/reads to www.example.org | 2207 // Setup writes/reads to www.example.org |
| 2208 SpdySerializedFrame req( | 2208 SpdySerializedFrame req( |
| 2209 spdy_util_.ConstructSpdySyn(1, std::move(headers), LOWEST, true)); | 2209 spdy_util_.ConstructSpdyHeaders(1, std::move(headers), LOWEST, true)); |
| 2210 SpdySerializedFrame resp(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); | 2210 SpdySerializedFrame resp(spdy_util_.ConstructSpdyGetReply(NULL, 0, 1)); |
| 2211 SpdySerializedFrame rep(spdy_util_.ConstructSpdyPush( | 2211 SpdySerializedFrame rep(spdy_util_.ConstructSpdyPush( |
| 2212 NULL, 0, 2, 1, GetDefaultUrlWithPath("/foo.dat").c_str(), | 2212 NULL, 0, 2, 1, GetDefaultUrlWithPath("/foo.dat").c_str(), |
| 2213 "301 Moved Permanently", "http://www.foo.com/index.php")); | 2213 "301 Moved Permanently", "http://www.foo.com/index.php")); |
| 2214 SpdySerializedFrame body(spdy_util_.ConstructSpdyDataFrame(1, true)); | 2214 SpdySerializedFrame body(spdy_util_.ConstructSpdyDataFrame(1, true)); |
| 2215 SpdySerializedFrame rst( | 2215 SpdySerializedFrame rst( |
| 2216 spdy_util_.ConstructSpdyRstStream(2, RST_STREAM_CANCEL)); | 2216 spdy_util_.ConstructSpdyRstStream(2, RST_STREAM_CANCEL)); |
| 2217 MockWrite writes[] = { | 2217 MockWrite writes[] = { |
| 2218 CreateMockWrite(req, 1), CreateMockWrite(rst, 6), | 2218 CreateMockWrite(req, 1), CreateMockWrite(rst, 6), |
| 2219 }; | 2219 }; |
| 2220 MockRead reads[] = { | 2220 MockRead reads[] = { |
| 2221 CreateMockRead(resp, 2), CreateMockRead(rep, 3), CreateMockRead(body, 4), | 2221 CreateMockRead(resp, 2), CreateMockRead(rep, 3), CreateMockRead(body, 4), |
| 2222 MockRead(ASYNC, ERR_IO_PENDING, 5), // Force a pause | 2222 MockRead(ASYNC, ERR_IO_PENDING, 5), // Force a pause |
| 2223 MockRead(ASYNC, 0, 0, 7) // EOF | 2223 MockRead(ASYNC, 0, 0, 7) // EOF |
| 2224 }; | 2224 }; |
| 2225 | 2225 |
| 2226 // Setup writes/reads to www.foo.com | 2226 // Setup writes/reads to www.foo.com |
| 2227 SpdyHeaderBlock headers2( | 2227 SpdyHeaderBlock headers2( |
| 2228 spdy_util_.ConstructGetHeaderBlock("http://www.foo.com/index.php")); | 2228 spdy_util_.ConstructGetHeaderBlock("http://www.foo.com/index.php")); |
| 2229 headers2["user-agent"] = ""; | 2229 headers2["user-agent"] = ""; |
| 2230 headers2["accept-encoding"] = "gzip, deflate"; | 2230 headers2["accept-encoding"] = "gzip, deflate"; |
| 2231 SpdySerializedFrame req2( | 2231 SpdySerializedFrame req2( |
| 2232 spdy_util_.ConstructSpdySyn(1, std::move(headers2), LOWEST, true)); | 2232 spdy_util_.ConstructSpdyHeaders(1, std::move(headers2), LOWEST, true)); |
| 2233 SpdySerializedFrame resp2(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); | 2233 SpdySerializedFrame resp2(spdy_util_.ConstructSpdyGetReply(NULL, 0, 1)); |
| 2234 SpdySerializedFrame body2(spdy_util_.ConstructSpdyDataFrame(1, true)); | 2234 SpdySerializedFrame body2(spdy_util_.ConstructSpdyDataFrame(1, true)); |
| 2235 MockWrite writes2[] = { | 2235 MockWrite writes2[] = { |
| 2236 CreateMockWrite(req2, 1), | 2236 CreateMockWrite(req2, 1), |
| 2237 }; | 2237 }; |
| 2238 MockRead reads2[] = { | 2238 MockRead reads2[] = { |
| 2239 CreateMockRead(resp2, 2), CreateMockRead(body2, 3), | 2239 CreateMockRead(resp2, 2), CreateMockRead(body2, 3), |
| 2240 MockRead(ASYNC, 0, 0, 5) // EOF | 2240 MockRead(ASYNC, 0, 0, 5) // EOF |
| 2241 }; | 2241 }; |
| 2242 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); | 2242 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); |
| 2243 SequencedSocketData data2(reads2, arraysize(reads2), writes2, | 2243 SequencedSocketData data2(reads2, arraysize(reads2), writes2, |
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2285 | 2285 |
| 2286 TEST_F(SpdyNetworkTransactionTest, ServerPushSingleDataFrame) { | 2286 TEST_F(SpdyNetworkTransactionTest, ServerPushSingleDataFrame) { |
| 2287 SpdySerializedFrame stream1_syn( | 2287 SpdySerializedFrame stream1_syn( |
| 2288 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); | 2288 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); |
| 2289 SpdySerializedFrame stream1_body(spdy_util_.ConstructSpdyDataFrame(1, true)); | 2289 SpdySerializedFrame stream1_body(spdy_util_.ConstructSpdyDataFrame(1, true)); |
| 2290 MockWrite writes[] = { | 2290 MockWrite writes[] = { |
| 2291 CreateMockWrite(stream1_syn, 0), | 2291 CreateMockWrite(stream1_syn, 0), |
| 2292 }; | 2292 }; |
| 2293 | 2293 |
| 2294 SpdySerializedFrame stream1_reply( | 2294 SpdySerializedFrame stream1_reply( |
| 2295 spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); | 2295 spdy_util_.ConstructSpdyGetReply(NULL, 0, 1)); |
| 2296 SpdySerializedFrame stream2_syn(spdy_util_.ConstructSpdyPush( | 2296 SpdySerializedFrame stream2_syn(spdy_util_.ConstructSpdyPush( |
| 2297 NULL, 0, 2, 1, GetDefaultUrlWithPath("/foo.dat").c_str())); | 2297 NULL, 0, 2, 1, GetDefaultUrlWithPath("/foo.dat").c_str())); |
| 2298 const char kPushedData[] = "pushed"; | 2298 const char kPushedData[] = "pushed"; |
| 2299 SpdySerializedFrame stream2_body(spdy_util_.ConstructSpdyDataFrame( | 2299 SpdySerializedFrame stream2_body(spdy_util_.ConstructSpdyDataFrame( |
| 2300 2, kPushedData, strlen(kPushedData), true)); | 2300 2, kPushedData, strlen(kPushedData), true)); |
| 2301 MockRead reads[] = { | 2301 MockRead reads[] = { |
| 2302 CreateMockRead(stream1_reply, 1), | 2302 CreateMockRead(stream1_reply, 1), |
| 2303 CreateMockRead(stream2_syn, 2), | 2303 CreateMockRead(stream2_syn, 2), |
| 2304 CreateMockRead(stream1_body, 3, SYNCHRONOUS), | 2304 CreateMockRead(stream1_body, 3, SYNCHRONOUS), |
| 2305 CreateMockRead(stream2_body, 4), | 2305 CreateMockRead(stream2_body, 4), |
| 2306 MockRead(SYNCHRONOUS, ERR_IO_PENDING, 5), // Force a pause | 2306 MockRead(SYNCHRONOUS, ERR_IO_PENDING, 5), // Force a pause |
| 2307 }; | 2307 }; |
| 2308 | 2308 |
| 2309 HttpResponseInfo response; | 2309 HttpResponseInfo response; |
| 2310 HttpResponseInfo response2; | 2310 HttpResponseInfo response2; |
| 2311 std::string expected_push_result("pushed"); | 2311 std::string expected_push_result("pushed"); |
| 2312 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); | 2312 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); |
| 2313 RunServerPushTest(&data, | 2313 RunServerPushTest(&data, |
| 2314 &response, | 2314 &response, |
| 2315 &response2, | 2315 &response2, |
| 2316 expected_push_result); | 2316 expected_push_result); |
| 2317 | 2317 |
| 2318 // Verify the SYN_REPLY. | 2318 // Verify the response headers. |
| 2319 EXPECT_TRUE(response.headers); | 2319 EXPECT_TRUE(response.headers); |
| 2320 EXPECT_EQ("HTTP/1.1 200", response.headers->GetStatusLine()); | 2320 EXPECT_EQ("HTTP/1.1 200", response.headers->GetStatusLine()); |
| 2321 | 2321 |
| 2322 // Verify the pushed stream. | 2322 // Verify the pushed stream. |
| 2323 EXPECT_TRUE(response2.headers); | 2323 EXPECT_TRUE(response2.headers); |
| 2324 EXPECT_EQ("HTTP/1.1 200", response2.headers->GetStatusLine()); | 2324 EXPECT_EQ("HTTP/1.1 200", response2.headers->GetStatusLine()); |
| 2325 } | 2325 } |
| 2326 | 2326 |
| 2327 TEST_F(SpdyNetworkTransactionTest, ServerPushBeforeSynReply) { | 2327 TEST_F(SpdyNetworkTransactionTest, ServerPushBeforeHeaders) { |
| 2328 SpdySerializedFrame stream1_syn( | 2328 SpdySerializedFrame stream1_syn( |
| 2329 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); | 2329 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); |
| 2330 MockWrite writes[] = { | 2330 MockWrite writes[] = { |
| 2331 CreateMockWrite(stream1_syn, 0), | 2331 CreateMockWrite(stream1_syn, 0), |
| 2332 }; | 2332 }; |
| 2333 | 2333 |
| 2334 SpdySerializedFrame stream2_syn(spdy_util_.ConstructSpdyPush( | 2334 SpdySerializedFrame stream2_syn(spdy_util_.ConstructSpdyPush( |
| 2335 nullptr, 0, 2, 1, GetDefaultUrlWithPath("/foo.dat").c_str())); | 2335 nullptr, 0, 2, 1, GetDefaultUrlWithPath("/foo.dat").c_str())); |
| 2336 SpdySerializedFrame stream1_reply( | 2336 SpdySerializedFrame stream1_reply( |
| 2337 spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); | 2337 spdy_util_.ConstructSpdyGetReply(NULL, 0, 1)); |
| 2338 SpdySerializedFrame stream1_body(spdy_util_.ConstructSpdyDataFrame(1, true)); | 2338 SpdySerializedFrame stream1_body(spdy_util_.ConstructSpdyDataFrame(1, true)); |
| 2339 const char kPushedData[] = "pushed"; | 2339 const char kPushedData[] = "pushed"; |
| 2340 SpdySerializedFrame stream2_body(spdy_util_.ConstructSpdyDataFrame( | 2340 SpdySerializedFrame stream2_body(spdy_util_.ConstructSpdyDataFrame( |
| 2341 2, kPushedData, strlen(kPushedData), true)); | 2341 2, kPushedData, strlen(kPushedData), true)); |
| 2342 MockRead reads[] = { | 2342 MockRead reads[] = { |
| 2343 CreateMockRead(stream2_syn, 1), | 2343 CreateMockRead(stream2_syn, 1), |
| 2344 CreateMockRead(stream1_reply, 2), | 2344 CreateMockRead(stream1_reply, 2), |
| 2345 CreateMockRead(stream1_body, 3, SYNCHRONOUS), | 2345 CreateMockRead(stream1_body, 3, SYNCHRONOUS), |
| 2346 CreateMockRead(stream2_body, 4), | 2346 CreateMockRead(stream2_body, 4), |
| 2347 MockRead(SYNCHRONOUS, ERR_IO_PENDING, 5), // Force a pause | 2347 MockRead(SYNCHRONOUS, ERR_IO_PENDING, 5), // Force a pause |
| 2348 }; | 2348 }; |
| 2349 | 2349 |
| 2350 HttpResponseInfo response; | 2350 HttpResponseInfo response; |
| 2351 HttpResponseInfo response2; | 2351 HttpResponseInfo response2; |
| 2352 std::string expected_push_result("pushed"); | 2352 std::string expected_push_result("pushed"); |
| 2353 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); | 2353 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); |
| 2354 RunServerPushTest(&data, | 2354 RunServerPushTest(&data, |
| 2355 &response, | 2355 &response, |
| 2356 &response2, | 2356 &response2, |
| 2357 expected_push_result); | 2357 expected_push_result); |
| 2358 | 2358 |
| 2359 // Verify the SYN_REPLY. | 2359 // Verify the response headers. |
| 2360 EXPECT_TRUE(response.headers); | 2360 EXPECT_TRUE(response.headers); |
| 2361 EXPECT_EQ("HTTP/1.1 200", response.headers->GetStatusLine()); | 2361 EXPECT_EQ("HTTP/1.1 200", response.headers->GetStatusLine()); |
| 2362 | 2362 |
| 2363 // Verify the pushed stream. | 2363 // Verify the pushed stream. |
| 2364 EXPECT_TRUE(response2.headers); | 2364 EXPECT_TRUE(response2.headers); |
| 2365 EXPECT_EQ("HTTP/1.1 200", response2.headers->GetStatusLine()); | 2365 EXPECT_EQ("HTTP/1.1 200", response2.headers->GetStatusLine()); |
| 2366 } | 2366 } |
| 2367 | 2367 |
| 2368 TEST_F(SpdyNetworkTransactionTest, ServerPushSingleDataFrame2) { | 2368 TEST_F(SpdyNetworkTransactionTest, ServerPushSingleDataFrame2) { |
| 2369 SpdySerializedFrame stream1_syn( | 2369 SpdySerializedFrame stream1_syn( |
| 2370 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); | 2370 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); |
| 2371 MockWrite writes[] = { | 2371 MockWrite writes[] = { |
| 2372 CreateMockWrite(stream1_syn, 0), | 2372 CreateMockWrite(stream1_syn, 0), |
| 2373 }; | 2373 }; |
| 2374 | 2374 |
| 2375 SpdySerializedFrame stream1_reply( | 2375 SpdySerializedFrame stream1_reply( |
| 2376 spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); | 2376 spdy_util_.ConstructSpdyGetReply(NULL, 0, 1)); |
| 2377 SpdySerializedFrame stream2_syn(spdy_util_.ConstructSpdyPush( | 2377 SpdySerializedFrame stream2_syn(spdy_util_.ConstructSpdyPush( |
| 2378 NULL, 0, 2, 1, GetDefaultUrlWithPath("/foo.dat").c_str())); | 2378 NULL, 0, 2, 1, GetDefaultUrlWithPath("/foo.dat").c_str())); |
| 2379 const char kPushedData[] = "pushed"; | 2379 const char kPushedData[] = "pushed"; |
| 2380 SpdySerializedFrame stream2_body(spdy_util_.ConstructSpdyDataFrame( | 2380 SpdySerializedFrame stream2_body(spdy_util_.ConstructSpdyDataFrame( |
| 2381 2, kPushedData, strlen(kPushedData), true)); | 2381 2, kPushedData, strlen(kPushedData), true)); |
| 2382 SpdySerializedFrame stream1_body(spdy_util_.ConstructSpdyDataFrame(1, true)); | 2382 SpdySerializedFrame stream1_body(spdy_util_.ConstructSpdyDataFrame(1, true)); |
| 2383 MockRead reads[] = { | 2383 MockRead reads[] = { |
| 2384 CreateMockRead(stream1_reply, 1), | 2384 CreateMockRead(stream1_reply, 1), |
| 2385 CreateMockRead(stream2_syn, 2), | 2385 CreateMockRead(stream2_syn, 2), |
| 2386 CreateMockRead(stream2_body, 3), | 2386 CreateMockRead(stream2_body, 3), |
| 2387 CreateMockRead(stream1_body, 4, SYNCHRONOUS), | 2387 CreateMockRead(stream1_body, 4, SYNCHRONOUS), |
| 2388 MockRead(SYNCHRONOUS, ERR_IO_PENDING, 5), // Force a pause | 2388 MockRead(SYNCHRONOUS, ERR_IO_PENDING, 5), // Force a pause |
| 2389 }; | 2389 }; |
| 2390 | 2390 |
| 2391 HttpResponseInfo response; | 2391 HttpResponseInfo response; |
| 2392 HttpResponseInfo response2; | 2392 HttpResponseInfo response2; |
| 2393 std::string expected_push_result("pushed"); | 2393 std::string expected_push_result("pushed"); |
| 2394 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); | 2394 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); |
| 2395 RunServerPushTest(&data, | 2395 RunServerPushTest(&data, |
| 2396 &response, | 2396 &response, |
| 2397 &response2, | 2397 &response2, |
| 2398 expected_push_result); | 2398 expected_push_result); |
| 2399 | 2399 |
| 2400 // Verify the SYN_REPLY. | 2400 // Verify the response headers. |
| 2401 EXPECT_TRUE(response.headers); | 2401 EXPECT_TRUE(response.headers); |
| 2402 EXPECT_EQ("HTTP/1.1 200", response.headers->GetStatusLine()); | 2402 EXPECT_EQ("HTTP/1.1 200", response.headers->GetStatusLine()); |
| 2403 | 2403 |
| 2404 // Verify the pushed stream. | 2404 // Verify the pushed stream. |
| 2405 EXPECT_TRUE(response2.headers); | 2405 EXPECT_TRUE(response2.headers); |
| 2406 EXPECT_EQ("HTTP/1.1 200", response2.headers->GetStatusLine()); | 2406 EXPECT_EQ("HTTP/1.1 200", response2.headers->GetStatusLine()); |
| 2407 } | 2407 } |
| 2408 | 2408 |
| 2409 TEST_F(SpdyNetworkTransactionTest, ServerPushServerAborted) { | 2409 TEST_F(SpdyNetworkTransactionTest, ServerPushServerAborted) { |
| 2410 SpdySerializedFrame stream1_syn( | 2410 SpdySerializedFrame stream1_syn( |
| 2411 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); | 2411 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); |
| 2412 SpdySerializedFrame stream1_body(spdy_util_.ConstructSpdyDataFrame(1, true)); | 2412 SpdySerializedFrame stream1_body(spdy_util_.ConstructSpdyDataFrame(1, true)); |
| 2413 MockWrite writes[] = { | 2413 MockWrite writes[] = { |
| 2414 CreateMockWrite(stream1_syn, 0), | 2414 CreateMockWrite(stream1_syn, 0), |
| 2415 }; | 2415 }; |
| 2416 | 2416 |
| 2417 SpdySerializedFrame stream1_reply( | 2417 SpdySerializedFrame stream1_reply( |
| 2418 spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); | 2418 spdy_util_.ConstructSpdyGetReply(NULL, 0, 1)); |
| 2419 SpdySerializedFrame stream2_syn(spdy_util_.ConstructSpdyPush( | 2419 SpdySerializedFrame stream2_syn(spdy_util_.ConstructSpdyPush( |
| 2420 NULL, 0, 2, 1, GetDefaultUrlWithPath("/foo.dat").c_str())); | 2420 NULL, 0, 2, 1, GetDefaultUrlWithPath("/foo.dat").c_str())); |
| 2421 SpdySerializedFrame stream2_rst( | 2421 SpdySerializedFrame stream2_rst( |
| 2422 spdy_util_.ConstructSpdyRstStream(2, RST_STREAM_PROTOCOL_ERROR)); | 2422 spdy_util_.ConstructSpdyRstStream(2, RST_STREAM_PROTOCOL_ERROR)); |
| 2423 MockRead reads[] = { | 2423 MockRead reads[] = { |
| 2424 CreateMockRead(stream1_reply, 1), | 2424 CreateMockRead(stream1_reply, 1), |
| 2425 CreateMockRead(stream2_syn, 2), | 2425 CreateMockRead(stream2_syn, 2), |
| 2426 CreateMockRead(stream2_rst, 3), | 2426 CreateMockRead(stream2_rst, 3), |
| 2427 CreateMockRead(stream1_body, 4, SYNCHRONOUS), | 2427 CreateMockRead(stream1_body, 4, SYNCHRONOUS), |
| 2428 MockRead(SYNCHRONOUS, ERR_IO_PENDING, 5), // Force a pause | 2428 MockRead(SYNCHRONOUS, ERR_IO_PENDING, 5), // Force a pause |
| (...skipping 13 matching lines...) Expand all Loading... |
| 2442 int rv = trans->Start( | 2442 int rv = trans->Start( |
| 2443 &CreateGetRequest(), callback.callback(), BoundNetLog()); | 2443 &CreateGetRequest(), callback.callback(), BoundNetLog()); |
| 2444 EXPECT_THAT(rv, IsError(ERR_IO_PENDING)); | 2444 EXPECT_THAT(rv, IsError(ERR_IO_PENDING)); |
| 2445 rv = callback.WaitForResult(); | 2445 rv = callback.WaitForResult(); |
| 2446 EXPECT_THAT(rv, IsOk()); | 2446 EXPECT_THAT(rv, IsOk()); |
| 2447 | 2447 |
| 2448 // Verify that we consumed all test data. | 2448 // Verify that we consumed all test data. |
| 2449 EXPECT_TRUE(data.AllReadDataConsumed()); | 2449 EXPECT_TRUE(data.AllReadDataConsumed()); |
| 2450 EXPECT_TRUE(data.AllWriteDataConsumed()); | 2450 EXPECT_TRUE(data.AllWriteDataConsumed()); |
| 2451 | 2451 |
| 2452 // Verify the SYN_REPLY. | 2452 // Verify the response headers. |
| 2453 HttpResponseInfo response = *trans->GetResponseInfo(); | 2453 HttpResponseInfo response = *trans->GetResponseInfo(); |
| 2454 EXPECT_TRUE(response.headers); | 2454 EXPECT_TRUE(response.headers); |
| 2455 EXPECT_EQ("HTTP/1.1 200", response.headers->GetStatusLine()); | 2455 EXPECT_EQ("HTTP/1.1 200", response.headers->GetStatusLine()); |
| 2456 } | 2456 } |
| 2457 | 2457 |
| 2458 // Verify that we don't leak streams and that we properly send a reset | 2458 // Verify that we don't leak streams and that we properly send a reset |
| 2459 // if the server pushes the same stream twice. | 2459 // if the server pushes the same stream twice. |
| 2460 TEST_F(SpdyNetworkTransactionTest, ServerPushDuplicate) { | 2460 TEST_F(SpdyNetworkTransactionTest, ServerPushDuplicate) { |
| 2461 SpdySerializedFrame stream1_syn( | 2461 SpdySerializedFrame stream1_syn( |
| 2462 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); | 2462 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); |
| 2463 SpdySerializedFrame stream1_body(spdy_util_.ConstructSpdyDataFrame(1, true)); | 2463 SpdySerializedFrame stream1_body(spdy_util_.ConstructSpdyDataFrame(1, true)); |
| 2464 SpdySerializedFrame stream3_rst( | 2464 SpdySerializedFrame stream3_rst( |
| 2465 spdy_util_.ConstructSpdyRstStream(4, RST_STREAM_PROTOCOL_ERROR)); | 2465 spdy_util_.ConstructSpdyRstStream(4, RST_STREAM_PROTOCOL_ERROR)); |
| 2466 MockWrite writes[] = { | 2466 MockWrite writes[] = { |
| 2467 CreateMockWrite(stream1_syn, 0), CreateMockWrite(stream3_rst, 4), | 2467 CreateMockWrite(stream1_syn, 0), CreateMockWrite(stream3_rst, 4), |
| 2468 }; | 2468 }; |
| 2469 | 2469 |
| 2470 SpdySerializedFrame stream1_reply( | 2470 SpdySerializedFrame stream1_reply( |
| 2471 spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); | 2471 spdy_util_.ConstructSpdyGetReply(NULL, 0, 1)); |
| 2472 SpdySerializedFrame stream2_syn(spdy_util_.ConstructSpdyPush( | 2472 SpdySerializedFrame stream2_syn(spdy_util_.ConstructSpdyPush( |
| 2473 NULL, 0, 2, 1, GetDefaultUrlWithPath("/foo.dat").c_str())); | 2473 NULL, 0, 2, 1, GetDefaultUrlWithPath("/foo.dat").c_str())); |
| 2474 const char kPushedData[] = "pushed"; | 2474 const char kPushedData[] = "pushed"; |
| 2475 SpdySerializedFrame stream2_body(spdy_util_.ConstructSpdyDataFrame( | 2475 SpdySerializedFrame stream2_body(spdy_util_.ConstructSpdyDataFrame( |
| 2476 2, kPushedData, strlen(kPushedData), true)); | 2476 2, kPushedData, strlen(kPushedData), true)); |
| 2477 SpdySerializedFrame stream3_syn(spdy_util_.ConstructSpdyPush( | 2477 SpdySerializedFrame stream3_syn(spdy_util_.ConstructSpdyPush( |
| 2478 NULL, 0, 4, 1, GetDefaultUrlWithPath("/foo.dat").c_str())); | 2478 NULL, 0, 4, 1, GetDefaultUrlWithPath("/foo.dat").c_str())); |
| 2479 MockRead reads[] = { | 2479 MockRead reads[] = { |
| 2480 CreateMockRead(stream1_reply, 1), | 2480 CreateMockRead(stream1_reply, 1), |
| 2481 CreateMockRead(stream2_syn, 2), | 2481 CreateMockRead(stream2_syn, 2), |
| 2482 CreateMockRead(stream3_syn, 3), | 2482 CreateMockRead(stream3_syn, 3), |
| 2483 CreateMockRead(stream1_body, 5), | 2483 CreateMockRead(stream1_body, 5), |
| 2484 CreateMockRead(stream2_body, 6), | 2484 CreateMockRead(stream2_body, 6), |
| 2485 MockRead(SYNCHRONOUS, ERR_IO_PENDING, 7), // Force a pause | 2485 MockRead(SYNCHRONOUS, ERR_IO_PENDING, 7), // Force a pause |
| 2486 }; | 2486 }; |
| 2487 | 2487 |
| 2488 HttpResponseInfo response; | 2488 HttpResponseInfo response; |
| 2489 HttpResponseInfo response2; | 2489 HttpResponseInfo response2; |
| 2490 std::string expected_push_result("pushed"); | 2490 std::string expected_push_result("pushed"); |
| 2491 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); | 2491 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); |
| 2492 RunServerPushTest(&data, | 2492 RunServerPushTest(&data, |
| 2493 &response, | 2493 &response, |
| 2494 &response2, | 2494 &response2, |
| 2495 expected_push_result); | 2495 expected_push_result); |
| 2496 | 2496 |
| 2497 // Verify the SYN_REPLY. | 2497 // Verify the response headers. |
| 2498 EXPECT_TRUE(response.headers); | 2498 EXPECT_TRUE(response.headers); |
| 2499 EXPECT_EQ("HTTP/1.1 200", response.headers->GetStatusLine()); | 2499 EXPECT_EQ("HTTP/1.1 200", response.headers->GetStatusLine()); |
| 2500 | 2500 |
| 2501 // Verify the pushed stream. | 2501 // Verify the pushed stream. |
| 2502 EXPECT_TRUE(response2.headers); | 2502 EXPECT_TRUE(response2.headers); |
| 2503 EXPECT_EQ("HTTP/1.1 200", response2.headers->GetStatusLine()); | 2503 EXPECT_EQ("HTTP/1.1 200", response2.headers->GetStatusLine()); |
| 2504 } | 2504 } |
| 2505 | 2505 |
| 2506 TEST_F(SpdyNetworkTransactionTest, ServerPushMultipleDataFrame) { | 2506 TEST_F(SpdyNetworkTransactionTest, ServerPushMultipleDataFrame) { |
| 2507 SpdySerializedFrame stream1_syn( | 2507 SpdySerializedFrame stream1_syn( |
| 2508 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); | 2508 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); |
| 2509 SpdySerializedFrame stream1_body(spdy_util_.ConstructSpdyDataFrame(1, true)); | 2509 SpdySerializedFrame stream1_body(spdy_util_.ConstructSpdyDataFrame(1, true)); |
| 2510 MockWrite writes[] = { | 2510 MockWrite writes[] = { |
| 2511 CreateMockWrite(stream1_syn, 0), | 2511 CreateMockWrite(stream1_syn, 0), |
| 2512 }; | 2512 }; |
| 2513 | 2513 |
| 2514 SpdySerializedFrame stream1_reply( | 2514 SpdySerializedFrame stream1_reply( |
| 2515 spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); | 2515 spdy_util_.ConstructSpdyGetReply(NULL, 0, 1)); |
| 2516 SpdySerializedFrame stream2_syn(spdy_util_.ConstructSpdyPush( | 2516 SpdySerializedFrame stream2_syn(spdy_util_.ConstructSpdyPush( |
| 2517 NULL, 0, 2, 1, GetDefaultUrlWithPath("/foo.dat").c_str())); | 2517 NULL, 0, 2, 1, GetDefaultUrlWithPath("/foo.dat").c_str())); |
| 2518 static const char kPushedData[] = "pushed my darling hello my baby"; | 2518 static const char kPushedData[] = "pushed my darling hello my baby"; |
| 2519 SpdySerializedFrame stream2_body_base(spdy_util_.ConstructSpdyDataFrame( | 2519 SpdySerializedFrame stream2_body_base(spdy_util_.ConstructSpdyDataFrame( |
| 2520 2, kPushedData, strlen(kPushedData), true)); | 2520 2, kPushedData, strlen(kPushedData), true)); |
| 2521 const size_t kChunkSize = strlen(kPushedData) / 4; | 2521 const size_t kChunkSize = strlen(kPushedData) / 4; |
| 2522 SpdySerializedFrame stream2_body1(stream2_body_base.data(), kChunkSize, | 2522 SpdySerializedFrame stream2_body1(stream2_body_base.data(), kChunkSize, |
| 2523 false); | 2523 false); |
| 2524 SpdySerializedFrame stream2_body2(stream2_body_base.data() + kChunkSize, | 2524 SpdySerializedFrame stream2_body2(stream2_body_base.data() + kChunkSize, |
| 2525 kChunkSize, false); | 2525 kChunkSize, false); |
| (...skipping 12 matching lines...) Expand all Loading... |
| 2538 CreateMockRead(stream1_body, 7, SYNCHRONOUS), | 2538 CreateMockRead(stream1_body, 7, SYNCHRONOUS), |
| 2539 MockRead(SYNCHRONOUS, ERR_IO_PENDING, 8), // Force a pause | 2539 MockRead(SYNCHRONOUS, ERR_IO_PENDING, 8), // Force a pause |
| 2540 }; | 2540 }; |
| 2541 | 2541 |
| 2542 HttpResponseInfo response; | 2542 HttpResponseInfo response; |
| 2543 HttpResponseInfo response2; | 2543 HttpResponseInfo response2; |
| 2544 std::string expected_push_result("pushed my darling hello my baby"); | 2544 std::string expected_push_result("pushed my darling hello my baby"); |
| 2545 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); | 2545 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); |
| 2546 RunServerPushTest(&data, &response, &response2, kPushedData); | 2546 RunServerPushTest(&data, &response, &response2, kPushedData); |
| 2547 | 2547 |
| 2548 // Verify the SYN_REPLY. | 2548 // Verify the response headers. |
| 2549 EXPECT_TRUE(response.headers); | 2549 EXPECT_TRUE(response.headers); |
| 2550 EXPECT_EQ("HTTP/1.1 200", response.headers->GetStatusLine()); | 2550 EXPECT_EQ("HTTP/1.1 200", response.headers->GetStatusLine()); |
| 2551 | 2551 |
| 2552 // Verify the pushed stream. | 2552 // Verify the pushed stream. |
| 2553 EXPECT_TRUE(response2.headers); | 2553 EXPECT_TRUE(response2.headers); |
| 2554 EXPECT_EQ("HTTP/1.1 200", response2.headers->GetStatusLine()); | 2554 EXPECT_EQ("HTTP/1.1 200", response2.headers->GetStatusLine()); |
| 2555 } | 2555 } |
| 2556 | 2556 |
| 2557 TEST_F(SpdyNetworkTransactionTest, ServerPushMultipleDataFrameInterrupted) { | 2557 TEST_F(SpdyNetworkTransactionTest, ServerPushMultipleDataFrameInterrupted) { |
| 2558 SpdySerializedFrame stream1_syn( | 2558 SpdySerializedFrame stream1_syn( |
| 2559 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); | 2559 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); |
| 2560 SpdySerializedFrame stream1_body(spdy_util_.ConstructSpdyDataFrame(1, true)); | 2560 SpdySerializedFrame stream1_body(spdy_util_.ConstructSpdyDataFrame(1, true)); |
| 2561 MockWrite writes[] = { | 2561 MockWrite writes[] = { |
| 2562 CreateMockWrite(stream1_syn, 0), | 2562 CreateMockWrite(stream1_syn, 0), |
| 2563 }; | 2563 }; |
| 2564 | 2564 |
| 2565 SpdySerializedFrame stream1_reply( | 2565 SpdySerializedFrame stream1_reply( |
| 2566 spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); | 2566 spdy_util_.ConstructSpdyGetReply(NULL, 0, 1)); |
| 2567 SpdySerializedFrame stream2_syn(spdy_util_.ConstructSpdyPush( | 2567 SpdySerializedFrame stream2_syn(spdy_util_.ConstructSpdyPush( |
| 2568 NULL, 0, 2, 1, GetDefaultUrlWithPath("/foo.dat").c_str())); | 2568 NULL, 0, 2, 1, GetDefaultUrlWithPath("/foo.dat").c_str())); |
| 2569 static const char kPushedData[] = "pushed my darling hello my baby"; | 2569 static const char kPushedData[] = "pushed my darling hello my baby"; |
| 2570 SpdySerializedFrame stream2_body_base(spdy_util_.ConstructSpdyDataFrame( | 2570 SpdySerializedFrame stream2_body_base(spdy_util_.ConstructSpdyDataFrame( |
| 2571 2, kPushedData, strlen(kPushedData), true)); | 2571 2, kPushedData, strlen(kPushedData), true)); |
| 2572 const size_t kChunkSize = strlen(kPushedData) / 4; | 2572 const size_t kChunkSize = strlen(kPushedData) / 4; |
| 2573 SpdySerializedFrame stream2_body1(stream2_body_base.data(), kChunkSize, | 2573 SpdySerializedFrame stream2_body1(stream2_body_base.data(), kChunkSize, |
| 2574 false); | 2574 false); |
| 2575 SpdySerializedFrame stream2_body2(stream2_body_base.data() + kChunkSize, | 2575 SpdySerializedFrame stream2_body2(stream2_body_base.data() + kChunkSize, |
| 2576 kChunkSize, false); | 2576 kChunkSize, false); |
| (...skipping 11 matching lines...) Expand all Loading... |
| 2588 CreateMockRead(stream2_body4, 6), | 2588 CreateMockRead(stream2_body4, 6), |
| 2589 CreateMockRead(stream1_body, 7, SYNCHRONOUS), | 2589 CreateMockRead(stream1_body, 7, SYNCHRONOUS), |
| 2590 MockRead(SYNCHRONOUS, ERR_IO_PENDING, 8) // Force a pause. | 2590 MockRead(SYNCHRONOUS, ERR_IO_PENDING, 8) // Force a pause. |
| 2591 }; | 2591 }; |
| 2592 | 2592 |
| 2593 HttpResponseInfo response; | 2593 HttpResponseInfo response; |
| 2594 HttpResponseInfo response2; | 2594 HttpResponseInfo response2; |
| 2595 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); | 2595 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); |
| 2596 RunServerPushTest(&data, &response, &response2, kPushedData); | 2596 RunServerPushTest(&data, &response, &response2, kPushedData); |
| 2597 | 2597 |
| 2598 // Verify the SYN_REPLY. | 2598 // Verify the response headers. |
| 2599 EXPECT_TRUE(response.headers); | 2599 EXPECT_TRUE(response.headers); |
| 2600 EXPECT_EQ("HTTP/1.1 200", response.headers->GetStatusLine()); | 2600 EXPECT_EQ("HTTP/1.1 200", response.headers->GetStatusLine()); |
| 2601 | 2601 |
| 2602 // Verify the pushed stream. | 2602 // Verify the pushed stream. |
| 2603 EXPECT_TRUE(response2.headers); | 2603 EXPECT_TRUE(response2.headers); |
| 2604 EXPECT_EQ("HTTP/1.1 200", response2.headers->GetStatusLine()); | 2604 EXPECT_EQ("HTTP/1.1 200", response2.headers->GetStatusLine()); |
| 2605 } | 2605 } |
| 2606 | 2606 |
| 2607 TEST_F(SpdyNetworkTransactionTest, ServerPushInvalidAssociatedStreamID0) { | 2607 TEST_F(SpdyNetworkTransactionTest, ServerPushInvalidAssociatedStreamID0) { |
| 2608 SpdySerializedFrame stream1_syn( | 2608 SpdySerializedFrame stream1_syn( |
| 2609 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); | 2609 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); |
| 2610 SpdySerializedFrame goaway(spdy_util_.ConstructSpdyGoAway( | 2610 SpdySerializedFrame goaway(spdy_util_.ConstructSpdyGoAway( |
| 2611 0, GOAWAY_PROTOCOL_ERROR, "Framer error: 1 (INVALID_STREAM_ID).")); | 2611 0, GOAWAY_PROTOCOL_ERROR, "Framer error: 1 (INVALID_STREAM_ID).")); |
| 2612 MockWrite writes[] = { | 2612 MockWrite writes[] = { |
| 2613 CreateMockWrite(stream1_syn, 0), CreateMockWrite(goaway, 3), | 2613 CreateMockWrite(stream1_syn, 0), CreateMockWrite(goaway, 3), |
| 2614 }; | 2614 }; |
| 2615 | 2615 |
| 2616 SpdySerializedFrame stream1_reply( | 2616 SpdySerializedFrame stream1_reply( |
| 2617 spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); | 2617 spdy_util_.ConstructSpdyGetReply(NULL, 0, 1)); |
| 2618 SpdySerializedFrame stream2_syn(spdy_util_.ConstructSpdyPush( | 2618 SpdySerializedFrame stream2_syn(spdy_util_.ConstructSpdyPush( |
| 2619 NULL, 0, 2, 0, GetDefaultUrlWithPath("/foo.dat").c_str())); | 2619 NULL, 0, 2, 0, GetDefaultUrlWithPath("/foo.dat").c_str())); |
| 2620 MockRead reads[] = { | 2620 MockRead reads[] = { |
| 2621 CreateMockRead(stream1_reply, 1), CreateMockRead(stream2_syn, 2), | 2621 CreateMockRead(stream1_reply, 1), CreateMockRead(stream2_syn, 2), |
| 2622 }; | 2622 }; |
| 2623 | 2623 |
| 2624 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); | 2624 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); |
| 2625 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY, | 2625 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY, |
| 2626 BoundNetLog(), NULL); | 2626 BoundNetLog(), NULL); |
| 2627 | 2627 |
| 2628 helper.RunPreTestSetup(); | 2628 helper.RunPreTestSetup(); |
| 2629 helper.AddData(&data); | 2629 helper.AddData(&data); |
| 2630 | 2630 |
| 2631 HttpNetworkTransaction* trans = helper.trans(); | 2631 HttpNetworkTransaction* trans = helper.trans(); |
| 2632 | 2632 |
| 2633 // Start the transaction with basic parameters. | 2633 // Start the transaction with basic parameters. |
| 2634 TestCompletionCallback callback; | 2634 TestCompletionCallback callback; |
| 2635 int rv = trans->Start( | 2635 int rv = trans->Start( |
| 2636 &CreateGetRequest(), callback.callback(), BoundNetLog()); | 2636 &CreateGetRequest(), callback.callback(), BoundNetLog()); |
| 2637 EXPECT_THAT(rv, IsError(ERR_IO_PENDING)); | 2637 EXPECT_THAT(rv, IsError(ERR_IO_PENDING)); |
| 2638 rv = callback.WaitForResult(); | 2638 rv = callback.WaitForResult(); |
| 2639 EXPECT_THAT(rv, IsOk()); | 2639 EXPECT_THAT(rv, IsOk()); |
| 2640 | 2640 |
| 2641 // Verify that we consumed all test data. | 2641 // Verify that we consumed all test data. |
| 2642 EXPECT_TRUE(data.AllReadDataConsumed()); | 2642 EXPECT_TRUE(data.AllReadDataConsumed()); |
| 2643 EXPECT_TRUE(data.AllWriteDataConsumed()); | 2643 EXPECT_TRUE(data.AllWriteDataConsumed()); |
| 2644 | 2644 |
| 2645 // Verify the SYN_REPLY. | 2645 // Verify the response headers. |
| 2646 HttpResponseInfo response = *trans->GetResponseInfo(); | 2646 HttpResponseInfo response = *trans->GetResponseInfo(); |
| 2647 EXPECT_TRUE(response.headers); | 2647 EXPECT_TRUE(response.headers); |
| 2648 EXPECT_EQ("HTTP/1.1 200", response.headers->GetStatusLine()); | 2648 EXPECT_EQ("HTTP/1.1 200", response.headers->GetStatusLine()); |
| 2649 } | 2649 } |
| 2650 | 2650 |
| 2651 TEST_F(SpdyNetworkTransactionTest, ServerPushInvalidAssociatedStreamID9) { | 2651 TEST_F(SpdyNetworkTransactionTest, ServerPushInvalidAssociatedStreamID9) { |
| 2652 SpdySerializedFrame stream1_syn( | 2652 SpdySerializedFrame stream1_syn( |
| 2653 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); | 2653 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); |
| 2654 SpdySerializedFrame stream1_body(spdy_util_.ConstructSpdyDataFrame(1, true)); | 2654 SpdySerializedFrame stream1_body(spdy_util_.ConstructSpdyDataFrame(1, true)); |
| 2655 SpdySerializedFrame stream2_rst( | 2655 SpdySerializedFrame stream2_rst( |
| 2656 spdy_util_.ConstructSpdyRstStream(2, RST_STREAM_INVALID_STREAM)); | 2656 spdy_util_.ConstructSpdyRstStream(2, RST_STREAM_INVALID_STREAM)); |
| 2657 MockWrite writes[] = { | 2657 MockWrite writes[] = { |
| 2658 CreateMockWrite(stream1_syn, 0), CreateMockWrite(stream2_rst, 3), | 2658 CreateMockWrite(stream1_syn, 0), CreateMockWrite(stream2_rst, 3), |
| 2659 }; | 2659 }; |
| 2660 | 2660 |
| 2661 SpdySerializedFrame stream1_reply( | 2661 SpdySerializedFrame stream1_reply( |
| 2662 spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); | 2662 spdy_util_.ConstructSpdyGetReply(NULL, 0, 1)); |
| 2663 SpdySerializedFrame stream2_syn(spdy_util_.ConstructSpdyPush( | 2663 SpdySerializedFrame stream2_syn(spdy_util_.ConstructSpdyPush( |
| 2664 NULL, 0, 2, 9, GetDefaultUrlWithPath("/foo.dat").c_str())); | 2664 NULL, 0, 2, 9, GetDefaultUrlWithPath("/foo.dat").c_str())); |
| 2665 MockRead reads[] = { | 2665 MockRead reads[] = { |
| 2666 CreateMockRead(stream1_reply, 1), CreateMockRead(stream2_syn, 2), | 2666 CreateMockRead(stream1_reply, 1), CreateMockRead(stream2_syn, 2), |
| 2667 CreateMockRead(stream1_body, 4), | 2667 CreateMockRead(stream1_body, 4), |
| 2668 MockRead(SYNCHRONOUS, ERR_IO_PENDING, 5), // Force a pause | 2668 MockRead(SYNCHRONOUS, ERR_IO_PENDING, 5), // Force a pause |
| 2669 }; | 2669 }; |
| 2670 | 2670 |
| 2671 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); | 2671 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); |
| 2672 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY, | 2672 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY, |
| 2673 BoundNetLog(), NULL); | 2673 BoundNetLog(), NULL); |
| 2674 | 2674 |
| 2675 helper.RunPreTestSetup(); | 2675 helper.RunPreTestSetup(); |
| 2676 helper.AddData(&data); | 2676 helper.AddData(&data); |
| 2677 | 2677 |
| 2678 HttpNetworkTransaction* trans = helper.trans(); | 2678 HttpNetworkTransaction* trans = helper.trans(); |
| 2679 | 2679 |
| 2680 // Start the transaction with basic parameters. | 2680 // Start the transaction with basic parameters. |
| 2681 TestCompletionCallback callback; | 2681 TestCompletionCallback callback; |
| 2682 int rv = trans->Start( | 2682 int rv = trans->Start( |
| 2683 &CreateGetRequest(), callback.callback(), BoundNetLog()); | 2683 &CreateGetRequest(), callback.callback(), BoundNetLog()); |
| 2684 EXPECT_THAT(rv, IsError(ERR_IO_PENDING)); | 2684 EXPECT_THAT(rv, IsError(ERR_IO_PENDING)); |
| 2685 rv = callback.WaitForResult(); | 2685 rv = callback.WaitForResult(); |
| 2686 EXPECT_THAT(rv, IsOk()); | 2686 EXPECT_THAT(rv, IsOk()); |
| 2687 | 2687 |
| 2688 // Verify that we consumed all test data. | 2688 // Verify that we consumed all test data. |
| 2689 EXPECT_TRUE(data.AllReadDataConsumed()); | 2689 EXPECT_TRUE(data.AllReadDataConsumed()); |
| 2690 EXPECT_TRUE(data.AllWriteDataConsumed()); | 2690 EXPECT_TRUE(data.AllWriteDataConsumed()); |
| 2691 | 2691 |
| 2692 // Verify the SYN_REPLY. | 2692 // Verify the response headers. |
| 2693 HttpResponseInfo response = *trans->GetResponseInfo(); | 2693 HttpResponseInfo response = *trans->GetResponseInfo(); |
| 2694 EXPECT_TRUE(response.headers); | 2694 EXPECT_TRUE(response.headers); |
| 2695 EXPECT_EQ("HTTP/1.1 200", response.headers->GetStatusLine()); | 2695 EXPECT_EQ("HTTP/1.1 200", response.headers->GetStatusLine()); |
| 2696 } | 2696 } |
| 2697 | 2697 |
| 2698 TEST_F(SpdyNetworkTransactionTest, ServerPushNoURL) { | 2698 TEST_F(SpdyNetworkTransactionTest, ServerPushNoURL) { |
| 2699 SpdySerializedFrame stream1_syn( | 2699 SpdySerializedFrame stream1_syn( |
| 2700 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); | 2700 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); |
| 2701 SpdySerializedFrame stream1_body(spdy_util_.ConstructSpdyDataFrame(1, true)); | 2701 SpdySerializedFrame stream1_body(spdy_util_.ConstructSpdyDataFrame(1, true)); |
| 2702 SpdySerializedFrame stream2_rst( | 2702 SpdySerializedFrame stream2_rst( |
| 2703 spdy_util_.ConstructSpdyRstStream(2, RST_STREAM_PROTOCOL_ERROR)); | 2703 spdy_util_.ConstructSpdyRstStream(2, RST_STREAM_PROTOCOL_ERROR)); |
| 2704 MockWrite writes[] = { | 2704 MockWrite writes[] = { |
| 2705 CreateMockWrite(stream1_syn, 0), CreateMockWrite(stream2_rst, 3), | 2705 CreateMockWrite(stream1_syn, 0), CreateMockWrite(stream2_rst, 3), |
| 2706 }; | 2706 }; |
| 2707 | 2707 |
| 2708 SpdySerializedFrame stream1_reply( | 2708 SpdySerializedFrame stream1_reply( |
| 2709 spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); | 2709 spdy_util_.ConstructSpdyGetReply(NULL, 0, 1)); |
| 2710 SpdyHeaderBlock incomplete_headers; | 2710 SpdyHeaderBlock incomplete_headers; |
| 2711 incomplete_headers[spdy_util_.GetStatusKey()] = "200 OK"; | 2711 incomplete_headers[spdy_util_.GetStatusKey()] = "200 OK"; |
| 2712 incomplete_headers["hello"] = "bye"; | 2712 incomplete_headers["hello"] = "bye"; |
| 2713 SpdySerializedFrame stream2_syn(spdy_util_.ConstructInitialSpdyPushFrame( | 2713 SpdySerializedFrame stream2_syn(spdy_util_.ConstructInitialSpdyPushFrame( |
| 2714 std::move(incomplete_headers), 2, 1)); | 2714 std::move(incomplete_headers), 2, 1)); |
| 2715 MockRead reads[] = { | 2715 MockRead reads[] = { |
| 2716 CreateMockRead(stream1_reply, 1), CreateMockRead(stream2_syn, 2), | 2716 CreateMockRead(stream1_reply, 1), CreateMockRead(stream2_syn, 2), |
| 2717 CreateMockRead(stream1_body, 4), | 2717 CreateMockRead(stream1_body, 4), |
| 2718 MockRead(SYNCHRONOUS, ERR_IO_PENDING, 5) // Force a pause | 2718 MockRead(SYNCHRONOUS, ERR_IO_PENDING, 5) // Force a pause |
| 2719 }; | 2719 }; |
| (...skipping 12 matching lines...) Expand all Loading... |
| 2732 int rv = trans->Start( | 2732 int rv = trans->Start( |
| 2733 &CreateGetRequest(), callback.callback(), BoundNetLog()); | 2733 &CreateGetRequest(), callback.callback(), BoundNetLog()); |
| 2734 EXPECT_THAT(rv, IsError(ERR_IO_PENDING)); | 2734 EXPECT_THAT(rv, IsError(ERR_IO_PENDING)); |
| 2735 rv = callback.WaitForResult(); | 2735 rv = callback.WaitForResult(); |
| 2736 EXPECT_THAT(rv, IsOk()); | 2736 EXPECT_THAT(rv, IsOk()); |
| 2737 | 2737 |
| 2738 // Verify that we consumed all test data. | 2738 // Verify that we consumed all test data. |
| 2739 EXPECT_TRUE(data.AllReadDataConsumed()); | 2739 EXPECT_TRUE(data.AllReadDataConsumed()); |
| 2740 EXPECT_TRUE(data.AllWriteDataConsumed()); | 2740 EXPECT_TRUE(data.AllWriteDataConsumed()); |
| 2741 | 2741 |
| 2742 // Verify the SYN_REPLY. | 2742 // Verify the response headers. |
| 2743 HttpResponseInfo response = *trans->GetResponseInfo(); | 2743 HttpResponseInfo response = *trans->GetResponseInfo(); |
| 2744 EXPECT_TRUE(response.headers); | 2744 EXPECT_TRUE(response.headers); |
| 2745 EXPECT_EQ("HTTP/1.1 200", response.headers->GetStatusLine()); | 2745 EXPECT_EQ("HTTP/1.1 200", response.headers->GetStatusLine()); |
| 2746 } | 2746 } |
| 2747 | 2747 |
| 2748 // PUSH_PROMISE on a server-initiated stream should trigger GOAWAY. | 2748 // PUSH_PROMISE on a server-initiated stream should trigger GOAWAY. |
| 2749 TEST_F(SpdyNetworkTransactionTest, ServerPushOnPushedStream) { | 2749 TEST_F(SpdyNetworkTransactionTest, ServerPushOnPushedStream) { |
| 2750 SpdySerializedFrame stream1_syn( | 2750 SpdySerializedFrame stream1_syn( |
| 2751 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); | 2751 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); |
| 2752 SpdySerializedFrame goaway(spdy_util_.ConstructSpdyGoAway( | 2752 SpdySerializedFrame goaway(spdy_util_.ConstructSpdyGoAway( |
| 2753 2, GOAWAY_PROTOCOL_ERROR, "Push on even stream id.")); | 2753 2, GOAWAY_PROTOCOL_ERROR, "Push on even stream id.")); |
| 2754 MockWrite writes[] = { | 2754 MockWrite writes[] = { |
| 2755 CreateMockWrite(stream1_syn, 0), CreateMockWrite(goaway, 4), | 2755 CreateMockWrite(stream1_syn, 0), CreateMockWrite(goaway, 4), |
| 2756 }; | 2756 }; |
| 2757 | 2757 |
| 2758 SpdySerializedFrame stream1_reply( | 2758 SpdySerializedFrame stream1_reply( |
| 2759 spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); | 2759 spdy_util_.ConstructSpdyGetReply(NULL, 0, 1)); |
| 2760 SpdySerializedFrame stream2_syn(spdy_util_.ConstructSpdyPush( | 2760 SpdySerializedFrame stream2_syn(spdy_util_.ConstructSpdyPush( |
| 2761 nullptr, 0, 2, 1, GetDefaultUrlWithPath("/foo.dat").c_str())); | 2761 nullptr, 0, 2, 1, GetDefaultUrlWithPath("/foo.dat").c_str())); |
| 2762 SpdySerializedFrame stream3_syn(spdy_util_.ConstructSpdyPush( | 2762 SpdySerializedFrame stream3_syn(spdy_util_.ConstructSpdyPush( |
| 2763 nullptr, 0, 4, 2, GetDefaultUrlWithPath("/bar.dat").c_str())); | 2763 nullptr, 0, 4, 2, GetDefaultUrlWithPath("/bar.dat").c_str())); |
| 2764 MockRead reads[] = { | 2764 MockRead reads[] = { |
| 2765 CreateMockRead(stream1_reply, 1), CreateMockRead(stream2_syn, 2), | 2765 CreateMockRead(stream1_reply, 1), CreateMockRead(stream2_syn, 2), |
| 2766 CreateMockRead(stream3_syn, 3), | 2766 CreateMockRead(stream3_syn, 3), |
| 2767 }; | 2767 }; |
| 2768 | 2768 |
| 2769 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); | 2769 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); |
| 2770 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY, | 2770 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY, |
| 2771 BoundNetLog(), nullptr); | 2771 BoundNetLog(), nullptr); |
| 2772 helper.RunToCompletion(&data); | 2772 helper.RunToCompletion(&data); |
| 2773 } | 2773 } |
| 2774 | 2774 |
| 2775 // PUSH_PROMISE on a closed client-initiated stream should trigger RST_STREAM. | 2775 // PUSH_PROMISE on a closed client-initiated stream should trigger RST_STREAM. |
| 2776 TEST_F(SpdyNetworkTransactionTest, ServerPushOnClosedStream) { | 2776 TEST_F(SpdyNetworkTransactionTest, ServerPushOnClosedStream) { |
| 2777 SpdySerializedFrame stream1_syn( | 2777 SpdySerializedFrame stream1_syn( |
| 2778 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); | 2778 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); |
| 2779 SpdySerializedFrame rst( | 2779 SpdySerializedFrame rst( |
| 2780 spdy_util_.ConstructSpdyRstStream(2, RST_STREAM_INVALID_STREAM)); | 2780 spdy_util_.ConstructSpdyRstStream(2, RST_STREAM_INVALID_STREAM)); |
| 2781 MockWrite writes[] = { | 2781 MockWrite writes[] = { |
| 2782 CreateMockWrite(stream1_syn, 0), CreateMockWrite(rst, 5), | 2782 CreateMockWrite(stream1_syn, 0), CreateMockWrite(rst, 5), |
| 2783 }; | 2783 }; |
| 2784 | 2784 |
| 2785 SpdySerializedFrame stream1_reply( | 2785 SpdySerializedFrame stream1_reply( |
| 2786 spdy_util_.ConstructSpdyGetSynReply(nullptr, 0, 1)); | 2786 spdy_util_.ConstructSpdyGetReply(nullptr, 0, 1)); |
| 2787 SpdySerializedFrame stream1_body(spdy_util_.ConstructSpdyDataFrame(1, true)); | 2787 SpdySerializedFrame stream1_body(spdy_util_.ConstructSpdyDataFrame(1, true)); |
| 2788 SpdySerializedFrame stream2_syn(spdy_util_.ConstructSpdyPush( | 2788 SpdySerializedFrame stream2_syn(spdy_util_.ConstructSpdyPush( |
| 2789 nullptr, 0, 2, 1, GetDefaultUrlWithPath("/foo.dat").c_str())); | 2789 nullptr, 0, 2, 1, GetDefaultUrlWithPath("/foo.dat").c_str())); |
| 2790 MockRead reads[] = { | 2790 MockRead reads[] = { |
| 2791 CreateMockRead(stream1_reply, 1), CreateMockRead(stream1_body, 2), | 2791 CreateMockRead(stream1_reply, 1), CreateMockRead(stream1_body, 2), |
| 2792 CreateMockRead(stream2_syn, 3), MockRead(SYNCHRONOUS, ERR_IO_PENDING, 4), | 2792 CreateMockRead(stream2_syn, 3), MockRead(SYNCHRONOUS, ERR_IO_PENDING, 4), |
| 2793 }; | 2793 }; |
| 2794 | 2794 |
| 2795 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); | 2795 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); |
| 2796 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY, | 2796 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY, |
| (...skipping 22 matching lines...) Expand all Loading... |
| 2819 TEST_F(SpdyNetworkTransactionTest, ServerPushOnClosedPushedStream) { | 2819 TEST_F(SpdyNetworkTransactionTest, ServerPushOnClosedPushedStream) { |
| 2820 SpdySerializedFrame stream1_syn( | 2820 SpdySerializedFrame stream1_syn( |
| 2821 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); | 2821 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); |
| 2822 SpdySerializedFrame goaway(spdy_util_.ConstructSpdyGoAway( | 2822 SpdySerializedFrame goaway(spdy_util_.ConstructSpdyGoAway( |
| 2823 2, GOAWAY_PROTOCOL_ERROR, "Push on even stream id.")); | 2823 2, GOAWAY_PROTOCOL_ERROR, "Push on even stream id.")); |
| 2824 MockWrite writes[] = { | 2824 MockWrite writes[] = { |
| 2825 CreateMockWrite(stream1_syn, 0), CreateMockWrite(goaway, 7), | 2825 CreateMockWrite(stream1_syn, 0), CreateMockWrite(goaway, 7), |
| 2826 }; | 2826 }; |
| 2827 | 2827 |
| 2828 SpdySerializedFrame stream1_reply( | 2828 SpdySerializedFrame stream1_reply( |
| 2829 spdy_util_.ConstructSpdyGetSynReply(nullptr, 0, 1)); | 2829 spdy_util_.ConstructSpdyGetReply(nullptr, 0, 1)); |
| 2830 SpdySerializedFrame stream2_syn(spdy_util_.ConstructSpdyPush( | 2830 SpdySerializedFrame stream2_syn(spdy_util_.ConstructSpdyPush( |
| 2831 nullptr, 0, 2, 1, GetDefaultUrlWithPath("/foo.dat").c_str())); | 2831 nullptr, 0, 2, 1, GetDefaultUrlWithPath("/foo.dat").c_str())); |
| 2832 SpdySerializedFrame stream1_body(spdy_util_.ConstructSpdyDataFrame(1, true)); | 2832 SpdySerializedFrame stream1_body(spdy_util_.ConstructSpdyDataFrame(1, true)); |
| 2833 const char kPushedData[] = "pushed"; | 2833 const char kPushedData[] = "pushed"; |
| 2834 SpdySerializedFrame stream2_body(spdy_util_.ConstructSpdyDataFrame( | 2834 SpdySerializedFrame stream2_body(spdy_util_.ConstructSpdyDataFrame( |
| 2835 2, kPushedData, strlen(kPushedData), true)); | 2835 2, kPushedData, strlen(kPushedData), true)); |
| 2836 SpdySerializedFrame stream3_syn(spdy_util_.ConstructSpdyPush( | 2836 SpdySerializedFrame stream3_syn(spdy_util_.ConstructSpdyPush( |
| 2837 nullptr, 0, 4, 2, GetDefaultUrlWithPath("/bar.dat").c_str())); | 2837 nullptr, 0, 4, 2, GetDefaultUrlWithPath("/bar.dat").c_str())); |
| 2838 | 2838 |
| 2839 MockRead reads[] = { | 2839 MockRead reads[] = { |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2872 ReadResult(trans2.get(), &result); | 2872 ReadResult(trans2.get(), &result); |
| 2873 EXPECT_EQ(kPushedData, result); | 2873 EXPECT_EQ(kPushedData, result); |
| 2874 | 2874 |
| 2875 data.Resume(); | 2875 data.Resume(); |
| 2876 base::RunLoop().RunUntilIdle(); | 2876 base::RunLoop().RunUntilIdle(); |
| 2877 | 2877 |
| 2878 EXPECT_TRUE(data.AllReadDataConsumed()); | 2878 EXPECT_TRUE(data.AllReadDataConsumed()); |
| 2879 EXPECT_TRUE(data.AllWriteDataConsumed()); | 2879 EXPECT_TRUE(data.AllWriteDataConsumed()); |
| 2880 } | 2880 } |
| 2881 | 2881 |
| 2882 // Verify that various SynReply headers parse correctly through the | 2882 // Verify that various response headers parse correctly through the HTTP layer. |
| 2883 // HTTP layer. | 2883 TEST_F(SpdyNetworkTransactionTest, ResponseHeaders) { |
| 2884 TEST_F(SpdyNetworkTransactionTest, SynReplyHeaders) { | 2884 struct ResponseHeadersTests { |
| 2885 struct SynReplyHeadersTests { | |
| 2886 int num_headers; | 2885 int num_headers; |
| 2887 const char* extra_headers[5]; | 2886 const char* extra_headers[5]; |
| 2888 SpdyHeaderBlock expected_headers; | 2887 SpdyHeaderBlock expected_headers; |
| 2889 } test_cases[] = { | 2888 } test_cases[] = { |
| 2890 // This uses a multi-valued cookie header. | 2889 // This uses a multi-valued cookie header. |
| 2891 { 2, | 2890 { 2, |
| 2892 { "cookie", "val1", | 2891 { "cookie", "val1", |
| 2893 "cookie", "val2", // will get appended separated by NULL | 2892 "cookie", "val2", // will get appended separated by NULL |
| 2894 NULL | 2893 NULL |
| 2895 }, | 2894 }, |
| (...skipping 20 matching lines...) Expand all Loading... |
| 2916 | 2915 |
| 2917 test_cases[0].expected_headers["cookie"] = base::StringPiece("val1\0val2", 9); | 2916 test_cases[0].expected_headers["cookie"] = base::StringPiece("val1\0val2", 9); |
| 2918 test_cases[2].expected_headers["cookie"] = "val1,val2"; | 2917 test_cases[2].expected_headers["cookie"] = "val1,val2"; |
| 2919 | 2918 |
| 2920 for (size_t i = 0; i < arraysize(test_cases); ++i) { | 2919 for (size_t i = 0; i < arraysize(test_cases); ++i) { |
| 2921 SpdyTestUtil spdy_test_util; | 2920 SpdyTestUtil spdy_test_util; |
| 2922 SpdySerializedFrame req( | 2921 SpdySerializedFrame req( |
| 2923 spdy_test_util.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); | 2922 spdy_test_util.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); |
| 2924 MockWrite writes[] = {CreateMockWrite(req, 0)}; | 2923 MockWrite writes[] = {CreateMockWrite(req, 0)}; |
| 2925 | 2924 |
| 2926 SpdySerializedFrame resp(spdy_test_util.ConstructSpdyGetSynReply( | 2925 SpdySerializedFrame resp(spdy_test_util.ConstructSpdyGetReply( |
| 2927 test_cases[i].extra_headers, test_cases[i].num_headers, 1)); | 2926 test_cases[i].extra_headers, test_cases[i].num_headers, 1)); |
| 2928 SpdySerializedFrame body(spdy_test_util.ConstructSpdyDataFrame(1, true)); | 2927 SpdySerializedFrame body(spdy_test_util.ConstructSpdyDataFrame(1, true)); |
| 2929 MockRead reads[] = { | 2928 MockRead reads[] = { |
| 2930 CreateMockRead(resp, 1), CreateMockRead(body, 2), | 2929 CreateMockRead(resp, 1), CreateMockRead(body, 2), |
| 2931 MockRead(ASYNC, 0, 3) // EOF | 2930 MockRead(ASYNC, 0, 3) // EOF |
| 2932 }; | 2931 }; |
| 2933 | 2932 |
| 2934 SequencedSocketData data(reads, arraysize(reads), writes, | 2933 SequencedSocketData data(reads, arraysize(reads), writes, |
| 2935 arraysize(writes)); | 2934 arraysize(writes)); |
| 2936 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY, | 2935 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY, |
| (...skipping 19 matching lines...) Expand all Loading... |
| 2956 std::string joint_value = mutable_header_block_value.as_string(); | 2955 std::string joint_value = mutable_header_block_value.as_string(); |
| 2957 joint_value.append(1, '\0'); | 2956 joint_value.append(1, '\0'); |
| 2958 joint_value.append(value); | 2957 joint_value.append(value); |
| 2959 mutable_header_block_value = joint_value; | 2958 mutable_header_block_value = joint_value; |
| 2960 } | 2959 } |
| 2961 } | 2960 } |
| 2962 EXPECT_EQ(test_cases[i].expected_headers, header_block); | 2961 EXPECT_EQ(test_cases[i].expected_headers, header_block); |
| 2963 } | 2962 } |
| 2964 } | 2963 } |
| 2965 | 2964 |
| 2966 // Verify that various SynReply headers parse vary fields correctly | 2965 // Verify that various response headers parse vary fields correctly through the |
| 2967 // through the HTTP layer, and the response matches the request. | 2966 // HTTP layer, and the response matches the request. |
| 2968 TEST_F(SpdyNetworkTransactionTest, SynReplyHeadersVary) { | 2967 TEST_F(SpdyNetworkTransactionTest, ResponseHeadersVary) { |
| 2969 // Modify the following data to change/add test cases: | 2968 // Modify the following data to change/add test cases: |
| 2970 struct SynReplyTests { | 2969 struct ResponseTests { |
| 2971 bool vary_matches; | 2970 bool vary_matches; |
| 2972 int num_headers[2]; | 2971 int num_headers[2]; |
| 2973 const char* extra_headers[2][16]; | 2972 const char* extra_headers[2][16]; |
| 2974 } test_cases[] = { | 2973 } test_cases[] = { |
| 2975 // Test the case of a multi-valued cookie. When the value is delimited | 2974 // Test the case of a multi-valued cookie. When the value is delimited |
| 2976 // with NUL characters, it needs to be unfolded into multiple headers. | 2975 // with NUL characters, it needs to be unfolded into multiple headers. |
| 2977 {true, | 2976 {true, |
| 2978 {1, 3}, | 2977 {1, 3}, |
| 2979 {{"cookie", "val1,val2", NULL}, | 2978 {{"cookie", "val1,val2", NULL}, |
| 2980 {spdy_util_.GetStatusKey(), "200", spdy_util_.GetPathKey(), | 2979 {spdy_util_.GetStatusKey(), "200", spdy_util_.GetPathKey(), |
| (...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3062 lines.append(name); | 3061 lines.append(name); |
| 3063 lines.append(": "); | 3062 lines.append(": "); |
| 3064 lines.append(value); | 3063 lines.append(value); |
| 3065 lines.append("\n"); | 3064 lines.append("\n"); |
| 3066 } | 3065 } |
| 3067 | 3066 |
| 3068 EXPECT_EQ(expected_reply, lines) << i; | 3067 EXPECT_EQ(expected_reply, lines) << i; |
| 3069 } | 3068 } |
| 3070 } | 3069 } |
| 3071 | 3070 |
| 3072 // Verify that we don't crash on invalid SynReply responses. | 3071 // Verify that we don't crash on invalid response headers. |
| 3073 TEST_F(SpdyNetworkTransactionTest, InvalidSynReply) { | 3072 TEST_F(SpdyNetworkTransactionTest, InvalidResponseHeaders) { |
| 3074 struct InvalidSynReplyTests { | 3073 struct InvalidResponseHeadersTests { |
| 3075 int num_headers; | 3074 int num_headers; |
| 3076 const char* headers[10]; | 3075 const char* headers[10]; |
| 3077 } test_cases[] = { | 3076 } test_cases[] = { |
| 3078 // SYN_REPLY missing status header | 3077 // Response headers missing status header |
| 3079 { | 3078 { |
| 3080 3, | 3079 3, |
| 3081 {spdy_util_.GetPathKey(), "/index.php", "cookie", "val1", "cookie", | 3080 {spdy_util_.GetPathKey(), "/index.php", "cookie", "val1", "cookie", |
| 3082 "val2", NULL}, | 3081 "val2", NULL}, |
| 3083 }, | 3082 }, |
| 3084 // SYN_REPLY missing version header | 3083 // Response headers missing version header |
| 3085 { | 3084 { |
| 3086 1, {spdy_util_.GetPathKey(), "/index.php", "status", "200", NULL}, | 3085 1, {spdy_util_.GetPathKey(), "/index.php", "status", "200", NULL}, |
| 3087 }, | 3086 }, |
| 3088 // SYN_REPLY with no headers | 3087 // Response headers with no headers |
| 3089 { | 3088 { |
| 3090 0, {NULL}, | 3089 0, {NULL}, |
| 3091 }, | 3090 }, |
| 3092 }; | 3091 }; |
| 3093 | 3092 |
| 3094 for (size_t i = 0; i < arraysize(test_cases); ++i) { | 3093 for (size_t i = 0; i < arraysize(test_cases); ++i) { |
| 3095 SpdyTestUtil spdy_test_util; | 3094 SpdyTestUtil spdy_test_util; |
| 3096 | 3095 |
| 3097 SpdySerializedFrame req( | 3096 SpdySerializedFrame req( |
| 3098 spdy_test_util.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); | 3097 spdy_test_util.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); |
| (...skipping 24 matching lines...) Expand all Loading... |
| 3123 } | 3122 } |
| 3124 | 3123 |
| 3125 TEST_F(SpdyNetworkTransactionTest, CorruptFrameSessionError) { | 3124 TEST_F(SpdyNetworkTransactionTest, CorruptFrameSessionError) { |
| 3126 SpdySerializedFrame req( | 3125 SpdySerializedFrame req( |
| 3127 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); | 3126 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); |
| 3128 SpdySerializedFrame goaway(spdy_util_.ConstructSpdyGoAway( | 3127 SpdySerializedFrame goaway(spdy_util_.ConstructSpdyGoAway( |
| 3129 0, GOAWAY_COMPRESSION_ERROR, "Framer error: 6 (DECOMPRESS_FAILURE).")); | 3128 0, GOAWAY_COMPRESSION_ERROR, "Framer error: 6 (DECOMPRESS_FAILURE).")); |
| 3130 MockWrite writes[] = {CreateMockWrite(req, 0), CreateMockWrite(goaway, 2)}; | 3129 MockWrite writes[] = {CreateMockWrite(req, 0), CreateMockWrite(goaway, 2)}; |
| 3131 | 3130 |
| 3132 // This is the length field that's too short. | 3131 // This is the length field that's too short. |
| 3133 SpdySerializedFrame syn_reply_wrong_length( | 3132 SpdySerializedFrame reply_wrong_length( |
| 3134 spdy_util_.ConstructSpdyGetSynReply(nullptr, 0, 1)); | 3133 spdy_util_.ConstructSpdyGetReply(nullptr, 0, 1)); |
| 3135 size_t right_size = syn_reply_wrong_length.size() - | 3134 size_t right_size = reply_wrong_length.size() - |
| 3136 SpdyConstants::GetControlFrameHeaderSize(HTTP2); | 3135 SpdyConstants::GetControlFrameHeaderSize(HTTP2); |
| 3137 size_t wrong_size = right_size - 4; | 3136 size_t wrong_size = right_size - 4; |
| 3138 test::SetFrameLength(&syn_reply_wrong_length, wrong_size, HTTP2); | 3137 test::SetFrameLength(&reply_wrong_length, wrong_size, HTTP2); |
| 3139 | 3138 |
| 3140 MockRead reads[] = { | 3139 MockRead reads[] = { |
| 3141 MockRead(ASYNC, syn_reply_wrong_length.data(), | 3140 MockRead(ASYNC, reply_wrong_length.data(), reply_wrong_length.size() - 4, |
| 3142 syn_reply_wrong_length.size() - 4, 1), | 3141 1), |
| 3143 }; | 3142 }; |
| 3144 | 3143 |
| 3145 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); | 3144 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); |
| 3146 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY, | 3145 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY, |
| 3147 BoundNetLog(), NULL); | 3146 BoundNetLog(), NULL); |
| 3148 helper.RunToCompletion(&data); | 3147 helper.RunToCompletion(&data); |
| 3149 TransactionHelperResult out = helper.output(); | 3148 TransactionHelperResult out = helper.output(); |
| 3150 EXPECT_THAT(out.rv, IsError(ERR_SPDY_COMPRESSION_ERROR)); | 3149 EXPECT_THAT(out.rv, IsError(ERR_SPDY_COMPRESSION_ERROR)); |
| 3151 } | 3150 } |
| 3152 | 3151 |
| 3153 TEST_F(SpdyNetworkTransactionTest, GoAwayOnDecompressionFailure) { | 3152 TEST_F(SpdyNetworkTransactionTest, GoAwayOnDecompressionFailure) { |
| 3154 SpdySerializedFrame req( | 3153 SpdySerializedFrame req( |
| 3155 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); | 3154 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); |
| 3156 SpdySerializedFrame goaway(spdy_util_.ConstructSpdyGoAway( | 3155 SpdySerializedFrame goaway(spdy_util_.ConstructSpdyGoAway( |
| 3157 0, GOAWAY_COMPRESSION_ERROR, "Framer error: 6 (DECOMPRESS_FAILURE).")); | 3156 0, GOAWAY_COMPRESSION_ERROR, "Framer error: 6 (DECOMPRESS_FAILURE).")); |
| 3158 MockWrite writes[] = {CreateMockWrite(req, 0), CreateMockWrite(goaway, 2)}; | 3157 MockWrite writes[] = {CreateMockWrite(req, 0), CreateMockWrite(goaway, 2)}; |
| 3159 | 3158 |
| 3160 // Read HEADERS with corrupted payload. | 3159 // Read HEADERS with corrupted payload. |
| 3161 SpdySerializedFrame resp(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); | 3160 SpdySerializedFrame resp(spdy_util_.ConstructSpdyGetReply(NULL, 0, 1)); |
| 3162 memset(resp.data() + 12, 0xcf, resp.size() - 12); | 3161 memset(resp.data() + 12, 0xcf, resp.size() - 12); |
| 3163 MockRead reads[] = {CreateMockRead(resp, 1)}; | 3162 MockRead reads[] = {CreateMockRead(resp, 1)}; |
| 3164 | 3163 |
| 3165 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); | 3164 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); |
| 3166 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY, | 3165 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY, |
| 3167 BoundNetLog(), NULL); | 3166 BoundNetLog(), NULL); |
| 3168 helper.RunToCompletion(&data); | 3167 helper.RunToCompletion(&data); |
| 3169 TransactionHelperResult out = helper.output(); | 3168 TransactionHelperResult out = helper.output(); |
| 3170 EXPECT_THAT(out.rv, IsError(ERR_SPDY_COMPRESSION_ERROR)); | 3169 EXPECT_THAT(out.rv, IsError(ERR_SPDY_COMPRESSION_ERROR)); |
| 3171 } | 3170 } |
| (...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3216 EXPECT_TRUE(helper.StartDefaultTest()); | 3215 EXPECT_TRUE(helper.StartDefaultTest()); |
| 3217 helper.FinishDefaultTest(); | 3216 helper.FinishDefaultTest(); |
| 3218 EXPECT_TRUE(data.AllWriteDataConsumed()); | 3217 EXPECT_TRUE(data.AllWriteDataConsumed()); |
| 3219 EXPECT_TRUE(data.AllReadDataConsumed()); | 3218 EXPECT_TRUE(data.AllReadDataConsumed()); |
| 3220 TransactionHelperResult out = helper.output(); | 3219 TransactionHelperResult out = helper.output(); |
| 3221 EXPECT_THAT(out.rv, IsError(ERR_FAILED)); | 3220 EXPECT_THAT(out.rv, IsError(ERR_FAILED)); |
| 3222 } | 3221 } |
| 3223 | 3222 |
| 3224 // Test that partial writes work. | 3223 // Test that partial writes work. |
| 3225 TEST_F(SpdyNetworkTransactionTest, PartialWrite) { | 3224 TEST_F(SpdyNetworkTransactionTest, PartialWrite) { |
| 3226 // Chop the SYN_STREAM frame into 5 chunks. | 3225 // Chop the HEADERS frame into 5 chunks. |
| 3227 SpdySerializedFrame req( | 3226 SpdySerializedFrame req( |
| 3228 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); | 3227 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); |
| 3229 const int kChunks = 5; | 3228 const int kChunks = 5; |
| 3230 std::unique_ptr<MockWrite[]> writes(ChopWriteFrame(req, kChunks)); | 3229 std::unique_ptr<MockWrite[]> writes(ChopWriteFrame(req, kChunks)); |
| 3231 for (int i = 0; i < kChunks; ++i) { | 3230 for (int i = 0; i < kChunks; ++i) { |
| 3232 writes[i].sequence_number = i; | 3231 writes[i].sequence_number = i; |
| 3233 } | 3232 } |
| 3234 | 3233 |
| 3235 SpdySerializedFrame resp(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); | 3234 SpdySerializedFrame resp(spdy_util_.ConstructSpdyGetReply(NULL, 0, 1)); |
| 3236 SpdySerializedFrame body(spdy_util_.ConstructSpdyDataFrame(1, true)); | 3235 SpdySerializedFrame body(spdy_util_.ConstructSpdyDataFrame(1, true)); |
| 3237 MockRead reads[] = { | 3236 MockRead reads[] = { |
| 3238 CreateMockRead(resp, kChunks), CreateMockRead(body, kChunks + 1), | 3237 CreateMockRead(resp, kChunks), CreateMockRead(body, kChunks + 1), |
| 3239 MockRead(ASYNC, 0, kChunks + 2) // EOF | 3238 MockRead(ASYNC, 0, kChunks + 2) // EOF |
| 3240 }; | 3239 }; |
| 3241 | 3240 |
| 3242 SequencedSocketData data(reads, arraysize(reads), writes.get(), kChunks); | 3241 SequencedSocketData data(reads, arraysize(reads), writes.get(), kChunks); |
| 3243 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY, | 3242 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY, |
| 3244 BoundNetLog(), NULL); | 3243 BoundNetLog(), NULL); |
| 3245 helper.RunToCompletion(&data); | 3244 helper.RunToCompletion(&data); |
| 3246 TransactionHelperResult out = helper.output(); | 3245 TransactionHelperResult out = helper.output(); |
| 3247 EXPECT_THAT(out.rv, IsOk()); | 3246 EXPECT_THAT(out.rv, IsOk()); |
| 3248 EXPECT_EQ("HTTP/1.1 200", out.status_line); | 3247 EXPECT_EQ("HTTP/1.1 200", out.status_line); |
| 3249 EXPECT_EQ("hello!", out.response_data); | 3248 EXPECT_EQ("hello!", out.response_data); |
| 3250 } | 3249 } |
| 3251 | 3250 |
| 3252 // Test that the NetLog contains good data for a simple GET request. | 3251 // Test that the NetLog contains good data for a simple GET request. |
| 3253 TEST_F(SpdyNetworkTransactionTest, NetLog) { | 3252 TEST_F(SpdyNetworkTransactionTest, NetLog) { |
| 3254 static const char* const kExtraHeaders[] = { | 3253 static const char* const kExtraHeaders[] = { |
| 3255 "user-agent", "Chrome", | 3254 "user-agent", "Chrome", |
| 3256 }; | 3255 }; |
| 3257 SpdySerializedFrame req( | 3256 SpdySerializedFrame req( |
| 3258 spdy_util_.ConstructSpdyGet(kExtraHeaders, 1, 1, LOWEST, true)); | 3257 spdy_util_.ConstructSpdyGet(kExtraHeaders, 1, 1, LOWEST, true)); |
| 3259 MockWrite writes[] = {CreateMockWrite(req, 0)}; | 3258 MockWrite writes[] = {CreateMockWrite(req, 0)}; |
| 3260 | 3259 |
| 3261 SpdySerializedFrame resp(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); | 3260 SpdySerializedFrame resp(spdy_util_.ConstructSpdyGetReply(NULL, 0, 1)); |
| 3262 SpdySerializedFrame body(spdy_util_.ConstructSpdyDataFrame(1, true)); | 3261 SpdySerializedFrame body(spdy_util_.ConstructSpdyDataFrame(1, true)); |
| 3263 MockRead reads[] = { | 3262 MockRead reads[] = { |
| 3264 CreateMockRead(resp, 1), CreateMockRead(body, 2), | 3263 CreateMockRead(resp, 1), CreateMockRead(body, 2), |
| 3265 MockRead(ASYNC, 0, 3) // EOF | 3264 MockRead(ASYNC, 0, 3) // EOF |
| 3266 }; | 3265 }; |
| 3267 | 3266 |
| 3268 BoundTestNetLog log; | 3267 BoundTestNetLog log; |
| 3269 | 3268 |
| 3270 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); | 3269 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); |
| 3271 NormalSpdyTransactionHelper helper(CreateGetRequestWithUserAgent(), | 3270 NormalSpdyTransactionHelper helper(CreateGetRequestWithUserAgent(), |
| (...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3347 const SpdySerializedFrame* data_frames[2] = { | 3346 const SpdySerializedFrame* data_frames[2] = { |
| 3348 &data_frame_1, &data_frame_2, | 3347 &data_frame_1, &data_frame_2, |
| 3349 }; | 3348 }; |
| 3350 char combined_data_frames[100]; | 3349 char combined_data_frames[100]; |
| 3351 int combined_data_frames_len = | 3350 int combined_data_frames_len = |
| 3352 CombineFrames(data_frames, arraysize(data_frames), | 3351 CombineFrames(data_frames, arraysize(data_frames), |
| 3353 combined_data_frames, arraysize(combined_data_frames)); | 3352 combined_data_frames, arraysize(combined_data_frames)); |
| 3354 SpdySerializedFrame last_frame( | 3353 SpdySerializedFrame last_frame( |
| 3355 spdy_util_.ConstructSpdyDataFrame(1, "d", 1, /*fin=*/true)); | 3354 spdy_util_.ConstructSpdyDataFrame(1, "d", 1, /*fin=*/true)); |
| 3356 | 3355 |
| 3357 SpdySerializedFrame resp(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); | 3356 SpdySerializedFrame resp(spdy_util_.ConstructSpdyGetReply(NULL, 0, 1)); |
| 3358 MockRead reads[] = { | 3357 MockRead reads[] = { |
| 3359 CreateMockRead(resp, 1), | 3358 CreateMockRead(resp, 1), |
| 3360 MockRead(ASYNC, ERR_IO_PENDING, 2), // Force a pause | 3359 MockRead(ASYNC, ERR_IO_PENDING, 2), // Force a pause |
| 3361 MockRead(ASYNC, combined_data_frames, combined_data_frames_len, 3), | 3360 MockRead(ASYNC, combined_data_frames, combined_data_frames_len, 3), |
| 3362 MockRead(ASYNC, ERR_IO_PENDING, 4), // Force a pause | 3361 MockRead(ASYNC, ERR_IO_PENDING, 4), // Force a pause |
| 3363 CreateMockRead(last_frame, 5), | 3362 CreateMockRead(last_frame, 5), |
| 3364 MockRead(ASYNC, 0, 6) // EOF | 3363 MockRead(ASYNC, 0, 6) // EOF |
| 3365 }; | 3364 }; |
| 3366 | 3365 |
| 3367 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); | 3366 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); |
| (...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3434 spdy_util_.ConstructSpdyDataFrame(1, "message", 7, /*fin=*/false)); | 3433 spdy_util_.ConstructSpdyDataFrame(1, "message", 7, /*fin=*/false)); |
| 3435 SpdySerializedFrame data_frame_fin( | 3434 SpdySerializedFrame data_frame_fin( |
| 3436 spdy_util_.ConstructSpdyDataFrame(1, "message", 7, /*fin=*/true)); | 3435 spdy_util_.ConstructSpdyDataFrame(1, "message", 7, /*fin=*/true)); |
| 3437 const SpdySerializedFrame* data_frames[4] = {&data_frame, &data_frame, | 3436 const SpdySerializedFrame* data_frames[4] = {&data_frame, &data_frame, |
| 3438 &data_frame, &data_frame_fin}; | 3437 &data_frame, &data_frame_fin}; |
| 3439 char combined_data_frames[100]; | 3438 char combined_data_frames[100]; |
| 3440 int combined_data_frames_len = | 3439 int combined_data_frames_len = |
| 3441 CombineFrames(data_frames, arraysize(data_frames), | 3440 CombineFrames(data_frames, arraysize(data_frames), |
| 3442 combined_data_frames, arraysize(combined_data_frames)); | 3441 combined_data_frames, arraysize(combined_data_frames)); |
| 3443 | 3442 |
| 3444 SpdySerializedFrame resp(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); | 3443 SpdySerializedFrame resp(spdy_util_.ConstructSpdyGetReply(NULL, 0, 1)); |
| 3445 MockRead reads[] = { | 3444 MockRead reads[] = { |
| 3446 CreateMockRead(resp, 1), | 3445 CreateMockRead(resp, 1), |
| 3447 MockRead(ASYNC, ERR_IO_PENDING, 2), // Force a pause | 3446 MockRead(ASYNC, ERR_IO_PENDING, 2), // Force a pause |
| 3448 MockRead(ASYNC, combined_data_frames, combined_data_frames_len, 3), | 3447 MockRead(ASYNC, combined_data_frames, combined_data_frames_len, 3), |
| 3449 MockRead(ASYNC, 0, 4) // EOF | 3448 MockRead(ASYNC, 0, 4) // EOF |
| 3450 }; | 3449 }; |
| 3451 | 3450 |
| 3452 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); | 3451 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); |
| 3453 | 3452 |
| 3454 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY, | 3453 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY, |
| (...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3511 EXPECT_EQ("messagemessagemessagemessage", out.response_data); | 3510 EXPECT_EQ("messagemessagemessagemessage", out.response_data); |
| 3512 } | 3511 } |
| 3513 | 3512 |
| 3514 // Verify the case where we buffer data but read it after it has been buffered. | 3513 // Verify the case where we buffer data but read it after it has been buffered. |
| 3515 TEST_F(SpdyNetworkTransactionTest, BufferedAll) { | 3514 TEST_F(SpdyNetworkTransactionTest, BufferedAll) { |
| 3516 SpdySerializedFrame req( | 3515 SpdySerializedFrame req( |
| 3517 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); | 3516 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); |
| 3518 MockWrite writes[] = {CreateMockWrite(req, 0)}; | 3517 MockWrite writes[] = {CreateMockWrite(req, 0)}; |
| 3519 | 3518 |
| 3520 // 5 data frames in a single read. | 3519 // 5 data frames in a single read. |
| 3521 SpdySerializedFrame reply(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); | 3520 SpdySerializedFrame reply(spdy_util_.ConstructSpdyGetReply(NULL, 0, 1)); |
| 3522 SpdySerializedFrame data_frame( | 3521 SpdySerializedFrame data_frame( |
| 3523 spdy_util_.ConstructSpdyDataFrame(1, "message", 7, /*fin=*/false)); | 3522 spdy_util_.ConstructSpdyDataFrame(1, "message", 7, /*fin=*/false)); |
| 3524 SpdySerializedFrame data_frame_fin( | 3523 SpdySerializedFrame data_frame_fin( |
| 3525 spdy_util_.ConstructSpdyDataFrame(1, "message", 7, /*fin=*/true)); | 3524 spdy_util_.ConstructSpdyDataFrame(1, "message", 7, /*fin=*/true)); |
| 3526 const SpdySerializedFrame* frames[5] = {&reply, &data_frame, &data_frame, | 3525 const SpdySerializedFrame* frames[5] = {&reply, &data_frame, &data_frame, |
| 3527 &data_frame, &data_frame_fin}; | 3526 &data_frame, &data_frame_fin}; |
| 3528 char combined_frames[200]; | 3527 char combined_frames[200]; |
| 3529 int combined_frames_len = | 3528 int combined_frames_len = |
| 3530 CombineFrames(frames, arraysize(frames), | 3529 CombineFrames(frames, arraysize(frames), |
| 3531 combined_frames, arraysize(combined_frames)); | 3530 combined_frames, arraysize(combined_frames)); |
| (...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3602 // All data frames in a single read. | 3601 // All data frames in a single read. |
| 3603 // NOTE: We don't FIN the stream. | 3602 // NOTE: We don't FIN the stream. |
| 3604 SpdySerializedFrame data_frame( | 3603 SpdySerializedFrame data_frame( |
| 3605 spdy_util_.ConstructSpdyDataFrame(1, "message", 7, /*fin=*/false)); | 3604 spdy_util_.ConstructSpdyDataFrame(1, "message", 7, /*fin=*/false)); |
| 3606 const SpdySerializedFrame* data_frames[4] = {&data_frame, &data_frame, | 3605 const SpdySerializedFrame* data_frames[4] = {&data_frame, &data_frame, |
| 3607 &data_frame, &data_frame}; | 3606 &data_frame, &data_frame}; |
| 3608 char combined_data_frames[100]; | 3607 char combined_data_frames[100]; |
| 3609 int combined_data_frames_len = | 3608 int combined_data_frames_len = |
| 3610 CombineFrames(data_frames, arraysize(data_frames), | 3609 CombineFrames(data_frames, arraysize(data_frames), |
| 3611 combined_data_frames, arraysize(combined_data_frames)); | 3610 combined_data_frames, arraysize(combined_data_frames)); |
| 3612 SpdySerializedFrame resp(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); | 3611 SpdySerializedFrame resp(spdy_util_.ConstructSpdyGetReply(NULL, 0, 1)); |
| 3613 MockRead reads[] = { | 3612 MockRead reads[] = { |
| 3614 CreateMockRead(resp, 1), | 3613 CreateMockRead(resp, 1), |
| 3615 MockRead(ASYNC, ERR_IO_PENDING, 2), // Force a wait | 3614 MockRead(ASYNC, ERR_IO_PENDING, 2), // Force a wait |
| 3616 MockRead(ASYNC, combined_data_frames, combined_data_frames_len, 3), | 3615 MockRead(ASYNC, combined_data_frames, combined_data_frames_len, 3), |
| 3617 MockRead(ASYNC, 0, 4) // EOF | 3616 MockRead(ASYNC, 0, 4) // EOF |
| 3618 }; | 3617 }; |
| 3619 | 3618 |
| 3620 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); | 3619 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); |
| 3621 | 3620 |
| 3622 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY, | 3621 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY, |
| (...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3682 SpdySerializedFrame req( | 3681 SpdySerializedFrame req( |
| 3683 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); | 3682 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); |
| 3684 SpdySerializedFrame rst( | 3683 SpdySerializedFrame rst( |
| 3685 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_CANCEL)); | 3684 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_CANCEL)); |
| 3686 MockWrite writes[] = {CreateMockWrite(req, 0), CreateMockWrite(rst, 4)}; | 3685 MockWrite writes[] = {CreateMockWrite(req, 0), CreateMockWrite(rst, 4)}; |
| 3687 | 3686 |
| 3688 // NOTE: We don't FIN the stream. | 3687 // NOTE: We don't FIN the stream. |
| 3689 SpdySerializedFrame data_frame( | 3688 SpdySerializedFrame data_frame( |
| 3690 spdy_util_.ConstructSpdyDataFrame(1, "message", 7, /*fin=*/false)); | 3689 spdy_util_.ConstructSpdyDataFrame(1, "message", 7, /*fin=*/false)); |
| 3691 | 3690 |
| 3692 SpdySerializedFrame resp(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); | 3691 SpdySerializedFrame resp(spdy_util_.ConstructSpdyGetReply(NULL, 0, 1)); |
| 3693 MockRead reads[] = { | 3692 MockRead reads[] = { |
| 3694 CreateMockRead(resp, 1), | 3693 CreateMockRead(resp, 1), |
| 3695 MockRead(ASYNC, ERR_IO_PENDING, 2), // Force a wait | 3694 MockRead(ASYNC, ERR_IO_PENDING, 2), // Force a wait |
| 3696 CreateMockRead(data_frame, 3), MockRead(ASYNC, 0, 5) // EOF | 3695 CreateMockRead(data_frame, 3), MockRead(ASYNC, 0, 5) // EOF |
| 3697 }; | 3696 }; |
| 3698 | 3697 |
| 3699 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); | 3698 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); |
| 3700 | 3699 |
| 3701 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY, | 3700 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY, |
| 3702 BoundNetLog(), NULL); | 3701 BoundNetLog(), NULL); |
| (...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3759 helper.RunToCompletion(&data); | 3758 helper.RunToCompletion(&data); |
| 3760 TransactionHelperResult out = helper.output(); | 3759 TransactionHelperResult out = helper.output(); |
| 3761 EXPECT_THAT(out.rv, IsError(ERR_ABORTED)); | 3760 EXPECT_THAT(out.rv, IsError(ERR_ABORTED)); |
| 3762 } | 3761 } |
| 3763 | 3762 |
| 3764 TEST_F(SpdyNetworkTransactionTest, CloseWithActiveStream) { | 3763 TEST_F(SpdyNetworkTransactionTest, CloseWithActiveStream) { |
| 3765 SpdySerializedFrame req( | 3764 SpdySerializedFrame req( |
| 3766 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); | 3765 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); |
| 3767 MockWrite writes[] = {CreateMockWrite(req, 0)}; | 3766 MockWrite writes[] = {CreateMockWrite(req, 0)}; |
| 3768 | 3767 |
| 3769 SpdySerializedFrame resp(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); | 3768 SpdySerializedFrame resp(spdy_util_.ConstructSpdyGetReply(NULL, 0, 1)); |
| 3770 MockRead reads[] = { | 3769 MockRead reads[] = { |
| 3771 CreateMockRead(resp, 1), MockRead(SYNCHRONOUS, 0, 2) // EOF | 3770 CreateMockRead(resp, 1), MockRead(SYNCHRONOUS, 0, 2) // EOF |
| 3772 }; | 3771 }; |
| 3773 | 3772 |
| 3774 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); | 3773 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); |
| 3775 BoundNetLog log; | 3774 BoundNetLog log; |
| 3776 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY, log, | 3775 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY, log, |
| 3777 NULL); | 3776 NULL); |
| 3778 helper.RunPreTestSetup(); | 3777 helper.RunPreTestSetup(); |
| 3779 helper.AddData(&data); | 3778 helper.AddData(&data); |
| (...skipping 24 matching lines...) Expand all Loading... |
| 3804 HttpRequestInfo request; | 3803 HttpRequestInfo request; |
| 3805 request.method = "GET"; | 3804 request.method = "GET"; |
| 3806 request.url = default_url_; | 3805 request.url = default_url_; |
| 3807 // Do not force SPDY so that second socket can negotiate HTTP/1.1. | 3806 // Do not force SPDY so that second socket can negotiate HTTP/1.1. |
| 3808 NormalSpdyTransactionHelper helper(request, DEFAULT_PRIORITY, BoundNetLog(), | 3807 NormalSpdyTransactionHelper helper(request, DEFAULT_PRIORITY, BoundNetLog(), |
| 3809 nullptr); | 3808 nullptr); |
| 3810 | 3809 |
| 3811 // First socket: HTTP/2 request rejected with HTTP_1_1_REQUIRED. | 3810 // First socket: HTTP/2 request rejected with HTTP_1_1_REQUIRED. |
| 3812 SpdyHeaderBlock headers(spdy_util_.ConstructGetHeaderBlock(kDefaultUrl)); | 3811 SpdyHeaderBlock headers(spdy_util_.ConstructGetHeaderBlock(kDefaultUrl)); |
| 3813 SpdySerializedFrame req( | 3812 SpdySerializedFrame req( |
| 3814 spdy_util_.ConstructSpdySyn(1, std::move(headers), LOWEST, true)); | 3813 spdy_util_.ConstructSpdyHeaders(1, std::move(headers), LOWEST, true)); |
| 3815 MockWrite writes0[] = {CreateMockWrite(req, 0)}; | 3814 MockWrite writes0[] = {CreateMockWrite(req, 0)}; |
| 3816 SpdySerializedFrame go_away(spdy_util_.ConstructSpdyGoAway( | 3815 SpdySerializedFrame go_away(spdy_util_.ConstructSpdyGoAway( |
| 3817 0, GOAWAY_HTTP_1_1_REQUIRED, "Try again using HTTP/1.1 please.")); | 3816 0, GOAWAY_HTTP_1_1_REQUIRED, "Try again using HTTP/1.1 please.")); |
| 3818 MockRead reads0[] = {CreateMockRead(go_away, 1)}; | 3817 MockRead reads0[] = {CreateMockRead(go_away, 1)}; |
| 3819 SequencedSocketData data0(reads0, arraysize(reads0), writes0, | 3818 SequencedSocketData data0(reads0, arraysize(reads0), writes0, |
| 3820 arraysize(writes0)); | 3819 arraysize(writes0)); |
| 3821 | 3820 |
| 3822 std::unique_ptr<SSLSocketDataProvider> ssl_provider0( | 3821 std::unique_ptr<SSLSocketDataProvider> ssl_provider0( |
| 3823 new SSLSocketDataProvider(ASYNC, OK)); | 3822 new SSLSocketDataProvider(ASYNC, OK)); |
| 3824 // Expect HTTP/2 protocols too in SSLConfig. | 3823 // Expect HTTP/2 protocols too in SSLConfig. |
| (...skipping 153 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3978 helper.RunPreTestSetup(); | 3977 helper.RunPreTestSetup(); |
| 3979 HttpNetworkTransaction* trans = helper.trans(); | 3978 HttpNetworkTransaction* trans = helper.trans(); |
| 3980 | 3979 |
| 3981 const char kConnect443[] = { | 3980 const char kConnect443[] = { |
| 3982 "CONNECT www.example.org:443 HTTP/1.1\r\n" | 3981 "CONNECT www.example.org:443 HTTP/1.1\r\n" |
| 3983 "Host: www.example.org:443\r\n" | 3982 "Host: www.example.org:443\r\n" |
| 3984 "Proxy-Connection: keep-alive\r\n\r\n"}; | 3983 "Proxy-Connection: keep-alive\r\n\r\n"}; |
| 3985 const char kHTTP200[] = {"HTTP/1.1 200 OK\r\n\r\n"}; | 3984 const char kHTTP200[] = {"HTTP/1.1 200 OK\r\n\r\n"}; |
| 3986 SpdySerializedFrame req( | 3985 SpdySerializedFrame req( |
| 3987 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); | 3986 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); |
| 3988 SpdySerializedFrame resp(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); | 3987 SpdySerializedFrame resp(spdy_util_.ConstructSpdyGetReply(NULL, 0, 1)); |
| 3989 SpdySerializedFrame body(spdy_util_.ConstructSpdyDataFrame(1, true)); | 3988 SpdySerializedFrame body(spdy_util_.ConstructSpdyDataFrame(1, true)); |
| 3990 | 3989 |
| 3991 MockWrite writes[] = { | 3990 MockWrite writes[] = { |
| 3992 MockWrite(SYNCHRONOUS, kConnect443, arraysize(kConnect443) - 1, 0), | 3991 MockWrite(SYNCHRONOUS, kConnect443, arraysize(kConnect443) - 1, 0), |
| 3993 CreateMockWrite(req, 2), | 3992 CreateMockWrite(req, 2), |
| 3994 }; | 3993 }; |
| 3995 MockRead reads[] = { | 3994 MockRead reads[] = { |
| 3996 MockRead(SYNCHRONOUS, kHTTP200, arraysize(kHTTP200) - 1, 1), | 3995 MockRead(SYNCHRONOUS, kHTTP200, arraysize(kHTTP200) - 1, 1), |
| 3997 CreateMockRead(resp, 3), CreateMockRead(body, 4), | 3996 CreateMockRead(resp, 3), CreateMockRead(body, 4), |
| 3998 MockRead(ASYNC, 0, 0, 5), | 3997 MockRead(ASYNC, 0, 0, 5), |
| 3999 }; | 3998 }; |
| 4000 std::unique_ptr<SequencedSocketData> data(new SequencedSocketData( | 3999 std::unique_ptr<SequencedSocketData> data(new SequencedSocketData( |
| 4001 reads, arraysize(reads), writes, arraysize(writes))); | 4000 reads, arraysize(reads), writes, arraysize(writes))); |
| 4002 | 4001 |
| 4003 helper.AddData(data.get()); | 4002 helper.AddData(data.get()); |
| 4004 TestCompletionCallback callback; | 4003 TestCompletionCallback callback; |
| 4005 | 4004 |
| 4006 int rv = trans->Start( | 4005 int rv = trans->Start( |
| 4007 &CreateGetRequest(), callback.callback(), BoundNetLog()); | 4006 &CreateGetRequest(), callback.callback(), BoundNetLog()); |
| 4008 EXPECT_THAT(rv, IsError(ERR_IO_PENDING)); | 4007 EXPECT_THAT(rv, IsError(ERR_IO_PENDING)); |
| 4009 | 4008 |
| 4010 rv = callback.WaitForResult(); | 4009 rv = callback.WaitForResult(); |
| 4011 EXPECT_EQ(0, rv); | 4010 EXPECT_EQ(0, rv); |
| 4012 | 4011 |
| 4013 // Verify the SYN_REPLY. | 4012 // Verify the response headers. |
| 4014 HttpResponseInfo response = *trans->GetResponseInfo(); | 4013 HttpResponseInfo response = *trans->GetResponseInfo(); |
| 4015 ASSERT_TRUE(response.headers); | 4014 ASSERT_TRUE(response.headers); |
| 4016 EXPECT_EQ("HTTP/1.1 200", response.headers->GetStatusLine()); | 4015 EXPECT_EQ("HTTP/1.1 200", response.headers->GetStatusLine()); |
| 4017 | 4016 |
| 4018 std::string response_data; | 4017 std::string response_data; |
| 4019 ASSERT_THAT(ReadTransaction(trans, &response_data), IsOk()); | 4018 ASSERT_THAT(ReadTransaction(trans, &response_data), IsOk()); |
| 4020 EXPECT_EQ("hello!", response_data); | 4019 EXPECT_EQ("hello!", response_data); |
| 4021 helper.VerifyDataConsumed(); | 4020 helper.VerifyDataConsumed(); |
| 4022 } | 4021 } |
| 4023 | 4022 |
| (...skipping 15 matching lines...) Expand all Loading... |
| 4039 SpdySessionPool* spdy_session_pool = helper.session()->spdy_session_pool(); | 4038 SpdySessionPool* spdy_session_pool = helper.session()->spdy_session_pool(); |
| 4040 helper.RunPreTestSetup(); | 4039 helper.RunPreTestSetup(); |
| 4041 | 4040 |
| 4042 // Construct and send a simple GET request. | 4041 // Construct and send a simple GET request. |
| 4043 SpdySerializedFrame req( | 4042 SpdySerializedFrame req( |
| 4044 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); | 4043 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); |
| 4045 MockWrite writes[] = { | 4044 MockWrite writes[] = { |
| 4046 CreateMockWrite(req, 0), | 4045 CreateMockWrite(req, 0), |
| 4047 }; | 4046 }; |
| 4048 | 4047 |
| 4049 SpdySerializedFrame resp(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); | 4048 SpdySerializedFrame resp(spdy_util_.ConstructSpdyGetReply(NULL, 0, 1)); |
| 4050 SpdySerializedFrame body(spdy_util_.ConstructSpdyDataFrame(1, true)); | 4049 SpdySerializedFrame body(spdy_util_.ConstructSpdyDataFrame(1, true)); |
| 4051 MockRead reads[] = { | 4050 MockRead reads[] = { |
| 4052 CreateMockRead(resp, 1), CreateMockRead(body, 2), | 4051 CreateMockRead(resp, 1), CreateMockRead(body, 2), |
| 4053 MockRead(SYNCHRONOUS, ERR_IO_PENDING, 3), // Force a pause | 4052 MockRead(SYNCHRONOUS, ERR_IO_PENDING, 3), // Force a pause |
| 4054 }; | 4053 }; |
| 4055 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); | 4054 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); |
| 4056 helper.AddData(&data); | 4055 helper.AddData(&data); |
| 4057 HttpNetworkTransaction* trans = helper.trans(); | 4056 HttpNetworkTransaction* trans = helper.trans(); |
| 4058 | 4057 |
| 4059 TestCompletionCallback callback; | 4058 TestCompletionCallback callback; |
| (...skipping 29 matching lines...) Expand all Loading... |
| 4089 SpdyTestUtil spdy_util_2; | 4088 SpdyTestUtil spdy_util_2; |
| 4090 | 4089 |
| 4091 // Set up data for the proxy connection. | 4090 // Set up data for the proxy connection. |
| 4092 const char kConnect443[] = { | 4091 const char kConnect443[] = { |
| 4093 "CONNECT www.example.org:443 HTTP/1.1\r\n" | 4092 "CONNECT www.example.org:443 HTTP/1.1\r\n" |
| 4094 "Host: www.example.org:443\r\n" | 4093 "Host: www.example.org:443\r\n" |
| 4095 "Proxy-Connection: keep-alive\r\n\r\n"}; | 4094 "Proxy-Connection: keep-alive\r\n\r\n"}; |
| 4096 const char kHTTP200[] = {"HTTP/1.1 200 OK\r\n\r\n"}; | 4095 const char kHTTP200[] = {"HTTP/1.1 200 OK\r\n\r\n"}; |
| 4097 SpdySerializedFrame req2(spdy_util_2.ConstructSpdyGet( | 4096 SpdySerializedFrame req2(spdy_util_2.ConstructSpdyGet( |
| 4098 GetDefaultUrlWithPath("/foo.dat").c_str(), 1, LOWEST)); | 4097 GetDefaultUrlWithPath("/foo.dat").c_str(), 1, LOWEST)); |
| 4099 SpdySerializedFrame resp2(spdy_util_2.ConstructSpdyGetSynReply(NULL, 0, 1)); | 4098 SpdySerializedFrame resp2(spdy_util_2.ConstructSpdyGetReply(NULL, 0, 1)); |
| 4100 SpdySerializedFrame body2(spdy_util_2.ConstructSpdyDataFrame(1, true)); | 4099 SpdySerializedFrame body2(spdy_util_2.ConstructSpdyDataFrame(1, true)); |
| 4101 | 4100 |
| 4102 MockWrite writes2[] = { | 4101 MockWrite writes2[] = { |
| 4103 MockWrite(SYNCHRONOUS, kConnect443, arraysize(kConnect443) - 1, 0), | 4102 MockWrite(SYNCHRONOUS, kConnect443, arraysize(kConnect443) - 1, 0), |
| 4104 CreateMockWrite(req2, 2), | 4103 CreateMockWrite(req2, 2), |
| 4105 }; | 4104 }; |
| 4106 MockRead reads2[] = { | 4105 MockRead reads2[] = { |
| 4107 MockRead(SYNCHRONOUS, kHTTP200, arraysize(kHTTP200) - 1, 1), | 4106 MockRead(SYNCHRONOUS, kHTTP200, arraysize(kHTTP200) - 1, 1), |
| 4108 CreateMockRead(resp2, 3), CreateMockRead(body2, 4), | 4107 CreateMockRead(resp2, 3), CreateMockRead(body2, 4), |
| 4109 MockRead(ASYNC, 0, 5) // EOF | 4108 MockRead(ASYNC, 0, 5) // EOF |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4142 EXPECT_EQ("hello!", response_data); | 4141 EXPECT_EQ("hello!", response_data); |
| 4143 | 4142 |
| 4144 helper_proxy.VerifyDataConsumed(); | 4143 helper_proxy.VerifyDataConsumed(); |
| 4145 } | 4144 } |
| 4146 | 4145 |
| 4147 // When we get a TCP-level RST, we need to retry a HttpNetworkTransaction | 4146 // When we get a TCP-level RST, we need to retry a HttpNetworkTransaction |
| 4148 // on a new connection, if the connection was previously known to be good. | 4147 // on a new connection, if the connection was previously known to be good. |
| 4149 // This can happen when a server reboots without saying goodbye, or when | 4148 // This can happen when a server reboots without saying goodbye, or when |
| 4150 // we're behind a NAT that masked the RST. | 4149 // we're behind a NAT that masked the RST. |
| 4151 TEST_F(SpdyNetworkTransactionTest, VerifyRetryOnConnectionReset) { | 4150 TEST_F(SpdyNetworkTransactionTest, VerifyRetryOnConnectionReset) { |
| 4152 SpdySerializedFrame resp(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); | 4151 SpdySerializedFrame resp(spdy_util_.ConstructSpdyGetReply(NULL, 0, 1)); |
| 4153 SpdySerializedFrame body(spdy_util_.ConstructSpdyDataFrame(1, true)); | 4152 SpdySerializedFrame body(spdy_util_.ConstructSpdyDataFrame(1, true)); |
| 4154 MockRead reads[] = { | 4153 MockRead reads[] = { |
| 4155 CreateMockRead(resp, 1), CreateMockRead(body, 2), | 4154 CreateMockRead(resp, 1), CreateMockRead(body, 2), |
| 4156 MockRead(ASYNC, ERR_IO_PENDING, 3), | 4155 MockRead(ASYNC, ERR_IO_PENDING, 3), |
| 4157 MockRead(ASYNC, ERR_CONNECTION_RESET, 4), | 4156 MockRead(ASYNC, ERR_CONNECTION_RESET, 4), |
| 4158 }; | 4157 }; |
| 4159 | 4158 |
| 4160 MockRead reads2[] = { | 4159 MockRead reads2[] = { |
| 4161 CreateMockRead(resp, 1), CreateMockRead(body, 2), | 4160 CreateMockRead(resp, 1), CreateMockRead(body, 2), |
| 4162 MockRead(ASYNC, 0, 3) // EOF | 4161 MockRead(ASYNC, 0, 3) // EOF |
| (...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4252 CreateMockWrite(req_get, 0), CreateMockWrite(req_get_authorization, 3), | 4251 CreateMockWrite(req_get, 0), CreateMockWrite(req_get_authorization, 3), |
| 4253 }; | 4252 }; |
| 4254 | 4253 |
| 4255 // The first response is a 401 authentication challenge, and the second | 4254 // The first response is a 401 authentication challenge, and the second |
| 4256 // response will be a 200 response since the second request includes a valid | 4255 // response will be a 200 response since the second request includes a valid |
| 4257 // Authorization header. | 4256 // Authorization header. |
| 4258 const char* const kExtraAuthenticationHeaders[] = { | 4257 const char* const kExtraAuthenticationHeaders[] = { |
| 4259 "www-authenticate", | 4258 "www-authenticate", |
| 4260 "Basic realm=\"MyRealm\"" | 4259 "Basic realm=\"MyRealm\"" |
| 4261 }; | 4260 }; |
| 4262 SpdySerializedFrame resp_authentication(spdy_util_.ConstructSpdySynReplyError( | 4261 SpdySerializedFrame resp_authentication(spdy_util_.ConstructSpdyReplyError( |
| 4263 "401 Authentication Required", kExtraAuthenticationHeaders, | 4262 "401 Authentication Required", kExtraAuthenticationHeaders, |
| 4264 arraysize(kExtraAuthenticationHeaders) / 2, 1)); | 4263 arraysize(kExtraAuthenticationHeaders) / 2, 1)); |
| 4265 SpdySerializedFrame body_authentication( | 4264 SpdySerializedFrame body_authentication( |
| 4266 spdy_util_.ConstructSpdyDataFrame(1, true)); | 4265 spdy_util_.ConstructSpdyDataFrame(1, true)); |
| 4267 SpdySerializedFrame resp_data( | 4266 SpdySerializedFrame resp_data(spdy_util_.ConstructSpdyGetReply(NULL, 0, 3)); |
| 4268 spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 3)); | |
| 4269 SpdySerializedFrame body_data(spdy_util_.ConstructSpdyDataFrame(3, true)); | 4267 SpdySerializedFrame body_data(spdy_util_.ConstructSpdyDataFrame(3, true)); |
| 4270 MockRead spdy_reads[] = { | 4268 MockRead spdy_reads[] = { |
| 4271 CreateMockRead(resp_authentication, 1), | 4269 CreateMockRead(resp_authentication, 1), |
| 4272 CreateMockRead(body_authentication, 2), | 4270 CreateMockRead(body_authentication, 2), |
| 4273 CreateMockRead(resp_data, 4), | 4271 CreateMockRead(resp_data, 4), |
| 4274 CreateMockRead(body_data, 5), | 4272 CreateMockRead(body_data, 5), |
| 4275 MockRead(ASYNC, 0, 6), | 4273 MockRead(ASYNC, 0, 6), |
| 4276 }; | 4274 }; |
| 4277 | 4275 |
| 4278 SequencedSocketData data(spdy_reads, arraysize(spdy_reads), spdy_writes, | 4276 SequencedSocketData data(spdy_reads, arraysize(spdy_reads), spdy_writes, |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4321 } | 4319 } |
| 4322 | 4320 |
| 4323 TEST_F(SpdyNetworkTransactionTest, ServerPushWithHeaders) { | 4321 TEST_F(SpdyNetworkTransactionTest, ServerPushWithHeaders) { |
| 4324 SpdySerializedFrame stream1_syn( | 4322 SpdySerializedFrame stream1_syn( |
| 4325 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); | 4323 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); |
| 4326 MockWrite writes[] = { | 4324 MockWrite writes[] = { |
| 4327 CreateMockWrite(stream1_syn, 0), | 4325 CreateMockWrite(stream1_syn, 0), |
| 4328 }; | 4326 }; |
| 4329 | 4327 |
| 4330 SpdySerializedFrame stream1_reply( | 4328 SpdySerializedFrame stream1_reply( |
| 4331 spdy_util_.ConstructSpdyGetSynReply(nullptr, 0, 1)); | 4329 spdy_util_.ConstructSpdyGetReply(nullptr, 0, 1)); |
| 4332 | 4330 |
| 4333 SpdyHeaderBlock initial_headers; | 4331 SpdyHeaderBlock initial_headers; |
| 4334 spdy_util_.AddUrlToHeaderBlock(GetDefaultUrlWithPath("/foo.dat"), | 4332 spdy_util_.AddUrlToHeaderBlock(GetDefaultUrlWithPath("/foo.dat"), |
| 4335 &initial_headers); | 4333 &initial_headers); |
| 4336 SpdySerializedFrame stream2_syn(spdy_util_.ConstructInitialSpdyPushFrame( | 4334 SpdySerializedFrame stream2_syn(spdy_util_.ConstructInitialSpdyPushFrame( |
| 4337 std::move(initial_headers), 2, 1)); | 4335 std::move(initial_headers), 2, 1)); |
| 4338 | 4336 |
| 4339 SpdyHeaderBlock late_headers; | 4337 SpdyHeaderBlock late_headers; |
| 4340 late_headers[spdy_util_.GetStatusKey()] = "200"; | 4338 late_headers[spdy_util_.GetStatusKey()] = "200"; |
| 4341 late_headers["hello"] = "bye"; | 4339 late_headers["hello"] = "bye"; |
| (...skipping 17 matching lines...) Expand all Loading... |
| 4359 | 4357 |
| 4360 HttpResponseInfo response; | 4358 HttpResponseInfo response; |
| 4361 HttpResponseInfo response2; | 4359 HttpResponseInfo response2; |
| 4362 std::string expected_push_result("pushed"); | 4360 std::string expected_push_result("pushed"); |
| 4363 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); | 4361 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); |
| 4364 RunServerPushTest(&data, | 4362 RunServerPushTest(&data, |
| 4365 &response, | 4363 &response, |
| 4366 &response2, | 4364 &response2, |
| 4367 expected_push_result); | 4365 expected_push_result); |
| 4368 | 4366 |
| 4369 // Verify the SYN_REPLY. | 4367 // Verify the response headers. |
| 4370 EXPECT_TRUE(response.headers); | 4368 EXPECT_TRUE(response.headers); |
| 4371 EXPECT_EQ("HTTP/1.1 200", response.headers->GetStatusLine()); | 4369 EXPECT_EQ("HTTP/1.1 200", response.headers->GetStatusLine()); |
| 4372 | 4370 |
| 4373 // Verify the pushed stream. | 4371 // Verify the pushed stream. |
| 4374 EXPECT_TRUE(response2.headers); | 4372 EXPECT_TRUE(response2.headers); |
| 4375 EXPECT_EQ("HTTP/1.1 200", response2.headers->GetStatusLine()); | 4373 EXPECT_EQ("HTTP/1.1 200", response2.headers->GetStatusLine()); |
| 4376 } | 4374 } |
| 4377 | 4375 |
| 4378 TEST_F(SpdyNetworkTransactionTest, ServerPushClaimBeforeHeaders) { | 4376 TEST_F(SpdyNetworkTransactionTest, ServerPushClaimBeforeHeaders) { |
| 4379 // We push a stream and attempt to claim it before the headers come down. | 4377 // We push a stream and attempt to claim it before the headers come down. |
| 4380 SpdySerializedFrame stream1_syn( | 4378 SpdySerializedFrame stream1_syn( |
| 4381 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); | 4379 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); |
| 4382 MockWrite writes[] = { | 4380 MockWrite writes[] = { |
| 4383 CreateMockWrite(stream1_syn, 0, SYNCHRONOUS), | 4381 CreateMockWrite(stream1_syn, 0, SYNCHRONOUS), |
| 4384 }; | 4382 }; |
| 4385 | 4383 |
| 4386 SpdySerializedFrame stream1_reply( | 4384 SpdySerializedFrame stream1_reply( |
| 4387 spdy_util_.ConstructSpdyGetSynReply(nullptr, 0, 1)); | 4385 spdy_util_.ConstructSpdyGetReply(nullptr, 0, 1)); |
| 4388 SpdyHeaderBlock initial_headers; | 4386 SpdyHeaderBlock initial_headers; |
| 4389 spdy_util_.AddUrlToHeaderBlock(GetDefaultUrlWithPath("/foo.dat"), | 4387 spdy_util_.AddUrlToHeaderBlock(GetDefaultUrlWithPath("/foo.dat"), |
| 4390 &initial_headers); | 4388 &initial_headers); |
| 4391 SpdySerializedFrame stream2_syn(spdy_util_.ConstructInitialSpdyPushFrame( | 4389 SpdySerializedFrame stream2_syn(spdy_util_.ConstructInitialSpdyPushFrame( |
| 4392 std::move(initial_headers), 2, 1)); | 4390 std::move(initial_headers), 2, 1)); |
| 4393 SpdySerializedFrame stream1_body(spdy_util_.ConstructSpdyDataFrame(1, true)); | 4391 SpdySerializedFrame stream1_body(spdy_util_.ConstructSpdyDataFrame(1, true)); |
| 4394 SpdyHeaderBlock late_headers; | 4392 SpdyHeaderBlock late_headers; |
| 4395 late_headers[spdy_util_.GetStatusKey()] = "200"; | 4393 late_headers[spdy_util_.GetStatusKey()] = "200"; |
| 4396 late_headers["hello"] = "bye"; | 4394 late_headers["hello"] = "bye"; |
| 4397 SpdySerializedFrame stream2_headers(spdy_util_.ConstructSpdyResponseHeaders( | 4395 SpdySerializedFrame stream2_headers(spdy_util_.ConstructSpdyResponseHeaders( |
| (...skipping 18 matching lines...) Expand all Loading... |
| 4416 helper.AddData(&data); | 4414 helper.AddData(&data); |
| 4417 helper.RunPreTestSetup(); | 4415 helper.RunPreTestSetup(); |
| 4418 | 4416 |
| 4419 HttpNetworkTransaction* trans = helper.trans(); | 4417 HttpNetworkTransaction* trans = helper.trans(); |
| 4420 | 4418 |
| 4421 // Start the transaction. | 4419 // Start the transaction. |
| 4422 TestCompletionCallback callback; | 4420 TestCompletionCallback callback; |
| 4423 int rv = trans->Start( | 4421 int rv = trans->Start( |
| 4424 &CreateGetRequest(), callback.callback(), BoundNetLog()); | 4422 &CreateGetRequest(), callback.callback(), BoundNetLog()); |
| 4425 EXPECT_THAT(rv, IsError(ERR_IO_PENDING)); | 4423 EXPECT_THAT(rv, IsError(ERR_IO_PENDING)); |
| 4426 // Run until we've received the primary SYN_STREAM, the pushed SYN_STREAM, | 4424 // Run until we've received the primary HEADERS, the pushed HEADERS, |
| 4427 // and the body of the primary stream, but before we've received the HEADERS | 4425 // and the body of the primary stream, but before we've received the HEADERS |
| 4428 // for the pushed stream. | 4426 // for the pushed stream. |
| 4429 data.RunUntilPaused(); | 4427 data.RunUntilPaused(); |
| 4430 EXPECT_THAT(callback.WaitForResult(), IsOk()); | 4428 EXPECT_THAT(callback.WaitForResult(), IsOk()); |
| 4431 | 4429 |
| 4432 // Request the pushed path. At this point, we've received the push, but the | 4430 // Request the pushed path. At this point, we've received the push, but the |
| 4433 // headers are not yet complete. | 4431 // headers are not yet complete. |
| 4434 std::unique_ptr<HttpNetworkTransaction> trans2( | 4432 std::unique_ptr<HttpNetworkTransaction> trans2( |
| 4435 new HttpNetworkTransaction(DEFAULT_PRIORITY, helper.session())); | 4433 new HttpNetworkTransaction(DEFAULT_PRIORITY, helper.session())); |
| 4436 rv = trans2->Start( | 4434 rv = trans2->Start( |
| (...skipping 10 matching lines...) Expand all Loading... |
| 4447 std::string result; | 4445 std::string result; |
| 4448 ReadResult(trans, &result); | 4446 ReadResult(trans, &result); |
| 4449 | 4447 |
| 4450 // Verify that the received push data is same as the expected push data. | 4448 // Verify that the received push data is same as the expected push data. |
| 4451 EXPECT_EQ(result2.compare(expected_push_result), 0) | 4449 EXPECT_EQ(result2.compare(expected_push_result), 0) |
| 4452 << "Received data: " | 4450 << "Received data: " |
| 4453 << result2 | 4451 << result2 |
| 4454 << "||||| Expected data: " | 4452 << "||||| Expected data: " |
| 4455 << expected_push_result; | 4453 << expected_push_result; |
| 4456 | 4454 |
| 4457 // Verify the SYN_REPLY. | 4455 // Verify the response headers. |
| 4458 // Copy the response info, because trans goes away. | 4456 // Copy the response info, because trans goes away. |
| 4459 response = *trans->GetResponseInfo(); | 4457 response = *trans->GetResponseInfo(); |
| 4460 response2 = *trans2->GetResponseInfo(); | 4458 response2 = *trans2->GetResponseInfo(); |
| 4461 | 4459 |
| 4462 VerifyStreamsClosed(helper); | 4460 VerifyStreamsClosed(helper); |
| 4463 | 4461 |
| 4464 // Verify the SYN_REPLY. | 4462 // Verify the response headers. |
| 4465 EXPECT_TRUE(response.headers); | 4463 EXPECT_TRUE(response.headers); |
| 4466 EXPECT_EQ("HTTP/1.1 200", response.headers->GetStatusLine()); | 4464 EXPECT_EQ("HTTP/1.1 200", response.headers->GetStatusLine()); |
| 4467 | 4465 |
| 4468 // Verify the pushed stream. | 4466 // Verify the pushed stream. |
| 4469 EXPECT_TRUE(response2.headers); | 4467 EXPECT_TRUE(response2.headers); |
| 4470 EXPECT_EQ("HTTP/1.1 200", response2.headers->GetStatusLine()); | 4468 EXPECT_EQ("HTTP/1.1 200", response2.headers->GetStatusLine()); |
| 4471 | 4469 |
| 4472 // Read the final EOF (which will close the session) | 4470 // Read the final EOF (which will close the session) |
| 4473 data.Resume(); | 4471 data.Resume(); |
| 4474 base::RunLoop().RunUntilIdle(); | 4472 base::RunLoop().RunUntilIdle(); |
| 4475 | 4473 |
| 4476 // Verify that we consumed all test data. | 4474 // Verify that we consumed all test data. |
| 4477 EXPECT_TRUE(data.AllReadDataConsumed()); | 4475 EXPECT_TRUE(data.AllReadDataConsumed()); |
| 4478 EXPECT_TRUE(data.AllWriteDataConsumed()); | 4476 EXPECT_TRUE(data.AllWriteDataConsumed()); |
| 4479 } | 4477 } |
| 4480 | 4478 |
| 4481 // TODO(baranovich): HTTP 2 does not allow multiple HEADERS frames | 4479 // TODO(baranovich): HTTP 2 does not allow multiple HEADERS frames |
| 4482 TEST_F(SpdyNetworkTransactionTest, ServerPushWithTwoHeaderFrames) { | 4480 TEST_F(SpdyNetworkTransactionTest, ServerPushWithTwoHeaderFrames) { |
| 4483 // We push a stream and attempt to claim it before the headers come down. | 4481 // We push a stream and attempt to claim it before the headers come down. |
| 4484 SpdySerializedFrame stream1_syn( | 4482 SpdySerializedFrame stream1_syn( |
| 4485 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); | 4483 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); |
| 4486 MockWrite writes[] = { | 4484 MockWrite writes[] = { |
| 4487 CreateMockWrite(stream1_syn, 0, SYNCHRONOUS), | 4485 CreateMockWrite(stream1_syn, 0, SYNCHRONOUS), |
| 4488 }; | 4486 }; |
| 4489 | 4487 |
| 4490 SpdySerializedFrame stream1_reply( | 4488 SpdySerializedFrame stream1_reply( |
| 4491 spdy_util_.ConstructSpdyGetSynReply(nullptr, 0, 1)); | 4489 spdy_util_.ConstructSpdyGetReply(nullptr, 0, 1)); |
| 4492 | 4490 |
| 4493 SpdyHeaderBlock initial_headers; | 4491 SpdyHeaderBlock initial_headers; |
| 4494 spdy_util_.AddUrlToHeaderBlock(GetDefaultUrlWithPath("/foo.dat"), | 4492 spdy_util_.AddUrlToHeaderBlock(GetDefaultUrlWithPath("/foo.dat"), |
| 4495 &initial_headers); | 4493 &initial_headers); |
| 4496 SpdySerializedFrame stream2_syn(spdy_util_.ConstructInitialSpdyPushFrame( | 4494 SpdySerializedFrame stream2_syn(spdy_util_.ConstructInitialSpdyPushFrame( |
| 4497 std::move(initial_headers), 2, 1)); | 4495 std::move(initial_headers), 2, 1)); |
| 4498 | 4496 |
| 4499 SpdySerializedFrame stream1_body(spdy_util_.ConstructSpdyDataFrame(1, true)); | 4497 SpdySerializedFrame stream1_body(spdy_util_.ConstructSpdyDataFrame(1, true)); |
| 4500 | 4498 |
| 4501 SpdyHeaderBlock middle_headers; | 4499 SpdyHeaderBlock middle_headers; |
| (...skipping 30 matching lines...) Expand all Loading... |
| 4532 helper.AddData(&data); | 4530 helper.AddData(&data); |
| 4533 helper.RunPreTestSetup(); | 4531 helper.RunPreTestSetup(); |
| 4534 | 4532 |
| 4535 HttpNetworkTransaction* trans = helper.trans(); | 4533 HttpNetworkTransaction* trans = helper.trans(); |
| 4536 | 4534 |
| 4537 // Start the transaction. | 4535 // Start the transaction. |
| 4538 TestCompletionCallback callback; | 4536 TestCompletionCallback callback; |
| 4539 int rv = trans->Start( | 4537 int rv = trans->Start( |
| 4540 &CreateGetRequest(), callback.callback(), BoundNetLog()); | 4538 &CreateGetRequest(), callback.callback(), BoundNetLog()); |
| 4541 EXPECT_THAT(rv, IsError(ERR_IO_PENDING)); | 4539 EXPECT_THAT(rv, IsError(ERR_IO_PENDING)); |
| 4542 // Run until we've received the primary SYN_STREAM, the pushed SYN_STREAM, | 4540 // Run until we've received the primary HEADERS, the pushed HEADERS, |
| 4543 // the first HEADERS frame, and the body of the primary stream, but before | 4541 // the first HEADERS frame, and the body of the primary stream, but before |
| 4544 // we've received the final HEADERS for the pushed stream. | 4542 // we've received the final HEADERS for the pushed stream. |
| 4545 data.RunUntilPaused(); | 4543 data.RunUntilPaused(); |
| 4546 EXPECT_EQ(0, callback.WaitForResult()); | 4544 EXPECT_EQ(0, callback.WaitForResult()); |
| 4547 | 4545 |
| 4548 // Request the pushed path. At this point, we've received the push, but the | 4546 // Request the pushed path. At this point, we've received the push, but the |
| 4549 // headers are not yet complete. | 4547 // headers are not yet complete. |
| 4550 std::unique_ptr<HttpNetworkTransaction> trans2( | 4548 std::unique_ptr<HttpNetworkTransaction> trans2( |
| 4551 new HttpNetworkTransaction(DEFAULT_PRIORITY, helper.session())); | 4549 new HttpNetworkTransaction(DEFAULT_PRIORITY, helper.session())); |
| 4552 rv = trans2->Start( | 4550 rv = trans2->Start( |
| (...skipping 10 matching lines...) Expand all Loading... |
| 4563 // Read the server push body. | 4561 // Read the server push body. |
| 4564 std::string result2; | 4562 std::string result2; |
| 4565 ReadResult(trans2.get(), &result2); | 4563 ReadResult(trans2.get(), &result2); |
| 4566 // Read the response body. | 4564 // Read the response body. |
| 4567 std::string result; | 4565 std::string result; |
| 4568 ReadResult(trans, &result); | 4566 ReadResult(trans, &result); |
| 4569 | 4567 |
| 4570 // Verify that the received push data is same as the expected push data. | 4568 // Verify that the received push data is same as the expected push data. |
| 4571 EXPECT_EQ(expected_push_result, result2); | 4569 EXPECT_EQ(expected_push_result, result2); |
| 4572 | 4570 |
| 4573 // Verify the SYN_REPLY. | 4571 // Verify the response headers. |
| 4574 // Copy the response info, because trans goes away. | 4572 // Copy the response info, because trans goes away. |
| 4575 response = *trans->GetResponseInfo(); | 4573 response = *trans->GetResponseInfo(); |
| 4576 response2 = *trans2->GetResponseInfo(); | 4574 response2 = *trans2->GetResponseInfo(); |
| 4577 | 4575 |
| 4578 VerifyStreamsClosed(helper); | 4576 VerifyStreamsClosed(helper); |
| 4579 | 4577 |
| 4580 // Verify the SYN_REPLY. | 4578 // Verify the response headers. |
| 4581 EXPECT_TRUE(response.headers); | 4579 EXPECT_TRUE(response.headers); |
| 4582 EXPECT_EQ("HTTP/1.1 200", response.headers->GetStatusLine()); | 4580 EXPECT_EQ("HTTP/1.1 200", response.headers->GetStatusLine()); |
| 4583 | 4581 |
| 4584 // Verify the pushed stream. | 4582 // Verify the pushed stream. |
| 4585 EXPECT_TRUE(response2.headers); | 4583 EXPECT_TRUE(response2.headers); |
| 4586 EXPECT_EQ("HTTP/1.1 200", response2.headers->GetStatusLine()); | 4584 EXPECT_EQ("HTTP/1.1 200", response2.headers->GetStatusLine()); |
| 4587 | 4585 |
| 4588 // Verify we got all the headers from all header blocks. | 4586 // Verify we got all the headers from all header blocks. |
| 4589 EXPECT_TRUE(response2.headers->HasHeaderValue("hello", "bye")); | 4587 EXPECT_TRUE(response2.headers->HasHeaderValue("hello", "bye")); |
| 4590 EXPECT_TRUE(response2.headers->HasHeaderValue("status", "200")); | 4588 EXPECT_TRUE(response2.headers->HasHeaderValue("status", "200")); |
| 4591 | 4589 |
| 4592 // Read the final EOF (which will close the session) | 4590 // Read the final EOF (which will close the session) |
| 4593 data.Resume(); | 4591 data.Resume(); |
| 4594 base::RunLoop().RunUntilIdle(); | 4592 base::RunLoop().RunUntilIdle(); |
| 4595 | 4593 |
| 4596 // Verify that we consumed all test data. | 4594 // Verify that we consumed all test data. |
| 4597 EXPECT_TRUE(data.AllReadDataConsumed()); | 4595 EXPECT_TRUE(data.AllReadDataConsumed()); |
| 4598 EXPECT_TRUE(data.AllWriteDataConsumed()); | 4596 EXPECT_TRUE(data.AllWriteDataConsumed()); |
| 4599 } | 4597 } |
| 4600 | 4598 |
| 4601 TEST_F(SpdyNetworkTransactionTest, ServerPushWithNoStatusHeaderFrames) { | 4599 TEST_F(SpdyNetworkTransactionTest, ServerPushWithNoStatusHeaderFrames) { |
| 4602 // We push a stream and attempt to claim it before the headers come down. | 4600 // We push a stream and attempt to claim it before the headers come down. |
| 4603 SpdySerializedFrame stream1_syn( | 4601 SpdySerializedFrame stream1_syn( |
| 4604 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); | 4602 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); |
| 4605 MockWrite writes[] = { | 4603 MockWrite writes[] = { |
| 4606 CreateMockWrite(stream1_syn, 0, SYNCHRONOUS), | 4604 CreateMockWrite(stream1_syn, 0, SYNCHRONOUS), |
| 4607 }; | 4605 }; |
| 4608 | 4606 |
| 4609 SpdySerializedFrame stream1_reply( | 4607 SpdySerializedFrame stream1_reply( |
| 4610 spdy_util_.ConstructSpdyGetSynReply(nullptr, 0, 1)); | 4608 spdy_util_.ConstructSpdyGetReply(nullptr, 0, 1)); |
| 4611 | 4609 |
| 4612 SpdyHeaderBlock initial_headers; | 4610 SpdyHeaderBlock initial_headers; |
| 4613 spdy_util_.AddUrlToHeaderBlock(GetDefaultUrlWithPath("/foo.dat"), | 4611 spdy_util_.AddUrlToHeaderBlock(GetDefaultUrlWithPath("/foo.dat"), |
| 4614 &initial_headers); | 4612 &initial_headers); |
| 4615 SpdySerializedFrame stream2_syn(spdy_util_.ConstructInitialSpdyPushFrame( | 4613 SpdySerializedFrame stream2_syn(spdy_util_.ConstructInitialSpdyPushFrame( |
| 4616 std::move(initial_headers), 2, 1)); | 4614 std::move(initial_headers), 2, 1)); |
| 4617 | 4615 |
| 4618 SpdySerializedFrame stream1_body(spdy_util_.ConstructSpdyDataFrame(1, true)); | 4616 SpdySerializedFrame stream1_body(spdy_util_.ConstructSpdyDataFrame(1, true)); |
| 4619 | 4617 |
| 4620 SpdyHeaderBlock middle_headers; | 4618 SpdyHeaderBlock middle_headers; |
| (...skipping 19 matching lines...) Expand all Loading... |
| 4640 helper.AddData(&data); | 4638 helper.AddData(&data); |
| 4641 helper.RunPreTestSetup(); | 4639 helper.RunPreTestSetup(); |
| 4642 | 4640 |
| 4643 HttpNetworkTransaction* trans = helper.trans(); | 4641 HttpNetworkTransaction* trans = helper.trans(); |
| 4644 | 4642 |
| 4645 // Start the transaction. | 4643 // Start the transaction. |
| 4646 TestCompletionCallback callback; | 4644 TestCompletionCallback callback; |
| 4647 int rv = trans->Start( | 4645 int rv = trans->Start( |
| 4648 &CreateGetRequest(), callback.callback(), BoundNetLog()); | 4646 &CreateGetRequest(), callback.callback(), BoundNetLog()); |
| 4649 EXPECT_THAT(rv, IsError(ERR_IO_PENDING)); | 4647 EXPECT_THAT(rv, IsError(ERR_IO_PENDING)); |
| 4650 // Run until we've received the primary SYN_STREAM, the pushed SYN_STREAM, | 4648 // Run until we've received the primary HEADERS, the pushed HEADERS, |
| 4651 // the first HEADERS frame, and the body of the primary stream, but before | 4649 // the first HEADERS frame, and the body of the primary stream, but before |
| 4652 // we've received the final HEADERS for the pushed stream. | 4650 // we've received the final HEADERS for the pushed stream. |
| 4653 data.RunUntilPaused(); | 4651 data.RunUntilPaused(); |
| 4654 EXPECT_EQ(0, callback.WaitForResult()); | 4652 EXPECT_EQ(0, callback.WaitForResult()); |
| 4655 | 4653 |
| 4656 // Request the pushed path. At this point, we've received the push, but the | 4654 // Request the pushed path. At this point, we've received the push, but the |
| 4657 // headers are not yet complete. | 4655 // headers are not yet complete. |
| 4658 std::unique_ptr<HttpNetworkTransaction> trans2( | 4656 std::unique_ptr<HttpNetworkTransaction> trans2( |
| 4659 new HttpNetworkTransaction(DEFAULT_PRIORITY, helper.session())); | 4657 new HttpNetworkTransaction(DEFAULT_PRIORITY, helper.session())); |
| 4660 rv = trans2->Start( | 4658 rv = trans2->Start( |
| 4661 &CreateGetPushRequest(), callback.callback(), BoundNetLog()); | 4659 &CreateGetPushRequest(), callback.callback(), BoundNetLog()); |
| 4662 EXPECT_THAT(rv, IsError(ERR_IO_PENDING)); | 4660 EXPECT_THAT(rv, IsError(ERR_IO_PENDING)); |
| 4663 data.Resume(); | 4661 data.Resume(); |
| 4664 data.RunUntilPaused(); | 4662 data.RunUntilPaused(); |
| 4665 base::RunLoop().RunUntilIdle(); | 4663 base::RunLoop().RunUntilIdle(); |
| 4666 | 4664 |
| 4667 // Read the server push body. | 4665 // Read the server push body. |
| 4668 std::string result2; | 4666 std::string result2; |
| 4669 ReadResult(trans2.get(), &result2); | 4667 ReadResult(trans2.get(), &result2); |
| 4670 // Read the response body. | 4668 // Read the response body. |
| 4671 std::string result; | 4669 std::string result; |
| 4672 ReadResult(trans, &result); | 4670 ReadResult(trans, &result); |
| 4673 EXPECT_EQ("hello!", result); | 4671 EXPECT_EQ("hello!", result); |
| 4674 | 4672 |
| 4675 // Verify that we haven't received any push data. | 4673 // Verify that we haven't received any push data. |
| 4676 EXPECT_EQ("", result2); | 4674 EXPECT_EQ("", result2); |
| 4677 | 4675 |
| 4678 // Verify the SYN_REPLY. | 4676 // Verify the response headers. |
| 4679 // Copy the response info, because trans goes away. | 4677 // Copy the response info, because trans goes away. |
| 4680 HttpResponseInfo response = *trans->GetResponseInfo(); | 4678 HttpResponseInfo response = *trans->GetResponseInfo(); |
| 4681 | 4679 |
| 4682 VerifyStreamsClosed(helper); | 4680 VerifyStreamsClosed(helper); |
| 4683 | 4681 |
| 4684 // Verify the SYN_REPLY. | 4682 // Verify the response headers. |
| 4685 EXPECT_TRUE(response.headers); | 4683 EXPECT_TRUE(response.headers); |
| 4686 EXPECT_EQ("HTTP/1.1 200", response.headers->GetStatusLine()); | 4684 EXPECT_EQ("HTTP/1.1 200", response.headers->GetStatusLine()); |
| 4687 | 4685 |
| 4688 // Read the final EOF (which will close the session). | 4686 // Read the final EOF (which will close the session). |
| 4689 data.Resume(); | 4687 data.Resume(); |
| 4690 base::RunLoop().RunUntilIdle(); | 4688 base::RunLoop().RunUntilIdle(); |
| 4691 | 4689 |
| 4692 // Verify that we consumed all test data. | 4690 // Verify that we consumed all test data. |
| 4693 EXPECT_TRUE(data.AllReadDataConsumed()); | 4691 EXPECT_TRUE(data.AllReadDataConsumed()); |
| 4694 EXPECT_TRUE(data.AllWriteDataConsumed()); | 4692 EXPECT_TRUE(data.AllWriteDataConsumed()); |
| 4695 } | 4693 } |
| 4696 | 4694 |
| 4697 TEST_F(SpdyNetworkTransactionTest, SynReplyWithHeaders) { | 4695 TEST_F(SpdyNetworkTransactionTest, ResponseHeadersTwice) { |
| 4698 SpdySerializedFrame req( | 4696 SpdySerializedFrame req( |
| 4699 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); | 4697 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); |
| 4700 SpdySerializedFrame rst( | 4698 SpdySerializedFrame rst( |
| 4701 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_PROTOCOL_ERROR)); | 4699 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_PROTOCOL_ERROR)); |
| 4702 MockWrite writes[] = { | 4700 MockWrite writes[] = { |
| 4703 CreateMockWrite(req, 0), CreateMockWrite(rst, 4), | 4701 CreateMockWrite(req, 0), CreateMockWrite(rst, 4), |
| 4704 }; | 4702 }; |
| 4705 | 4703 |
| 4706 SpdySerializedFrame stream1_reply( | 4704 SpdySerializedFrame stream1_reply( |
| 4707 spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); | 4705 spdy_util_.ConstructSpdyGetReply(NULL, 0, 1)); |
| 4708 | 4706 |
| 4709 SpdyHeaderBlock late_headers; | 4707 SpdyHeaderBlock late_headers; |
| 4710 late_headers["hello"] = "bye"; | 4708 late_headers["hello"] = "bye"; |
| 4711 SpdySerializedFrame stream1_headers(spdy_util_.ConstructSpdyResponseHeaders( | 4709 SpdySerializedFrame stream1_headers(spdy_util_.ConstructSpdyResponseHeaders( |
| 4712 1, std::move(late_headers), false)); | 4710 1, std::move(late_headers), false)); |
| 4713 SpdySerializedFrame stream1_body(spdy_util_.ConstructSpdyDataFrame(1, true)); | 4711 SpdySerializedFrame stream1_body(spdy_util_.ConstructSpdyDataFrame(1, true)); |
| 4714 MockRead reads[] = { | 4712 MockRead reads[] = { |
| 4715 CreateMockRead(stream1_reply, 1), CreateMockRead(stream1_headers, 2), | 4713 CreateMockRead(stream1_reply, 1), CreateMockRead(stream1_headers, 2), |
| 4716 CreateMockRead(stream1_body, 3), MockRead(ASYNC, 0, 5) // EOF | 4714 CreateMockRead(stream1_body, 3), MockRead(ASYNC, 0, 5) // EOF |
| 4717 }; | 4715 }; |
| (...skipping 12 matching lines...) Expand all Loading... |
| 4730 TEST_F(SpdyNetworkTransactionTest, SyncReplyDataAfterTrailers) { | 4728 TEST_F(SpdyNetworkTransactionTest, SyncReplyDataAfterTrailers) { |
| 4731 SpdySerializedFrame req( | 4729 SpdySerializedFrame req( |
| 4732 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); | 4730 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); |
| 4733 SpdySerializedFrame rst( | 4731 SpdySerializedFrame rst( |
| 4734 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_PROTOCOL_ERROR)); | 4732 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_PROTOCOL_ERROR)); |
| 4735 MockWrite writes[] = { | 4733 MockWrite writes[] = { |
| 4736 CreateMockWrite(req, 0), CreateMockWrite(rst, 5), | 4734 CreateMockWrite(req, 0), CreateMockWrite(rst, 5), |
| 4737 }; | 4735 }; |
| 4738 | 4736 |
| 4739 SpdySerializedFrame stream1_reply( | 4737 SpdySerializedFrame stream1_reply( |
| 4740 spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); | 4738 spdy_util_.ConstructSpdyGetReply(NULL, 0, 1)); |
| 4741 SpdySerializedFrame stream1_body(spdy_util_.ConstructSpdyDataFrame(1, false)); | 4739 SpdySerializedFrame stream1_body(spdy_util_.ConstructSpdyDataFrame(1, false)); |
| 4742 | 4740 |
| 4743 SpdyHeaderBlock late_headers; | 4741 SpdyHeaderBlock late_headers; |
| 4744 late_headers["hello"] = "bye"; | 4742 late_headers["hello"] = "bye"; |
| 4745 SpdySerializedFrame stream1_headers(spdy_util_.ConstructSpdyResponseHeaders( | 4743 SpdySerializedFrame stream1_headers(spdy_util_.ConstructSpdyResponseHeaders( |
| 4746 1, std::move(late_headers), false)); | 4744 1, std::move(late_headers), false)); |
| 4747 SpdySerializedFrame stream1_body2(spdy_util_.ConstructSpdyDataFrame(1, true)); | 4745 SpdySerializedFrame stream1_body2(spdy_util_.ConstructSpdyDataFrame(1, true)); |
| 4748 MockRead reads[] = { | 4746 MockRead reads[] = { |
| 4749 CreateMockRead(stream1_reply, 1), CreateMockRead(stream1_body, 2), | 4747 CreateMockRead(stream1_reply, 1), CreateMockRead(stream1_body, 2), |
| 4750 CreateMockRead(stream1_headers, 3), CreateMockRead(stream1_body2, 4), | 4748 CreateMockRead(stream1_headers, 3), CreateMockRead(stream1_body2, 4), |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4790 spdy_test_util.ConstructSpdyGet(url_to_fetch, 1, LOWEST)); | 4788 spdy_test_util.ConstructSpdyGet(url_to_fetch, 1, LOWEST)); |
| 4791 SpdySerializedFrame stream1_body( | 4789 SpdySerializedFrame stream1_body( |
| 4792 spdy_test_util.ConstructSpdyDataFrame(1, true)); | 4790 spdy_test_util.ConstructSpdyDataFrame(1, true)); |
| 4793 SpdySerializedFrame push_rst( | 4791 SpdySerializedFrame push_rst( |
| 4794 spdy_test_util.ConstructSpdyRstStream(2, RST_STREAM_REFUSED_STREAM)); | 4792 spdy_test_util.ConstructSpdyRstStream(2, RST_STREAM_REFUSED_STREAM)); |
| 4795 MockWrite writes[] = { | 4793 MockWrite writes[] = { |
| 4796 CreateMockWrite(stream1_syn, 0), CreateMockWrite(push_rst, 3), | 4794 CreateMockWrite(stream1_syn, 0), CreateMockWrite(push_rst, 3), |
| 4797 }; | 4795 }; |
| 4798 | 4796 |
| 4799 SpdySerializedFrame stream1_reply( | 4797 SpdySerializedFrame stream1_reply( |
| 4800 spdy_test_util.ConstructSpdyGetSynReply(nullptr, 0, 1)); | 4798 spdy_test_util.ConstructSpdyGetReply(nullptr, 0, 1)); |
| 4801 SpdySerializedFrame stream2_syn( | 4799 SpdySerializedFrame stream2_syn( |
| 4802 spdy_test_util.ConstructSpdyPush(nullptr, 0, 2, 1, url_to_push)); | 4800 spdy_test_util.ConstructSpdyPush(nullptr, 0, 2, 1, url_to_push)); |
| 4803 const char kPushedData[] = "pushed"; | 4801 const char kPushedData[] = "pushed"; |
| 4804 SpdySerializedFrame stream2_body(spdy_test_util.ConstructSpdyDataFrame( | 4802 SpdySerializedFrame stream2_body(spdy_test_util.ConstructSpdyDataFrame( |
| 4805 2, kPushedData, strlen(kPushedData), true)); | 4803 2, kPushedData, strlen(kPushedData), true)); |
| 4806 SpdySerializedFrame rst( | 4804 SpdySerializedFrame rst( |
| 4807 spdy_test_util.ConstructSpdyRstStream(2, RST_STREAM_CANCEL)); | 4805 spdy_test_util.ConstructSpdyRstStream(2, RST_STREAM_CANCEL)); |
| 4808 | 4806 |
| 4809 MockRead reads[] = { | 4807 MockRead reads[] = { |
| 4810 CreateMockRead(stream1_reply, 1), | 4808 CreateMockRead(stream1_reply, 1), |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4845 rv = callback.WaitForResult(); | 4843 rv = callback.WaitForResult(); |
| 4846 | 4844 |
| 4847 // Read the response body. | 4845 // Read the response body. |
| 4848 std::string result; | 4846 std::string result; |
| 4849 ReadResult(trans, &result); | 4847 ReadResult(trans, &result); |
| 4850 | 4848 |
| 4851 // Verify that we consumed all test data. | 4849 // Verify that we consumed all test data. |
| 4852 EXPECT_TRUE(data.AllReadDataConsumed()); | 4850 EXPECT_TRUE(data.AllReadDataConsumed()); |
| 4853 EXPECT_TRUE(data.AllWriteDataConsumed()); | 4851 EXPECT_TRUE(data.AllWriteDataConsumed()); |
| 4854 | 4852 |
| 4855 // Verify the SYN_REPLY. | 4853 // Verify the response headers. |
| 4856 // Copy the response info, because trans goes away. | 4854 // Copy the response info, because trans goes away. |
| 4857 response = *trans->GetResponseInfo(); | 4855 response = *trans->GetResponseInfo(); |
| 4858 | 4856 |
| 4859 VerifyStreamsClosed(helper); | 4857 VerifyStreamsClosed(helper); |
| 4860 | 4858 |
| 4861 // Verify the SYN_REPLY. | 4859 // Verify the response headers. |
| 4862 EXPECT_TRUE(response.headers); | 4860 EXPECT_TRUE(response.headers); |
| 4863 EXPECT_EQ("HTTP/1.1 200", response.headers->GetStatusLine()); | 4861 EXPECT_EQ("HTTP/1.1 200", response.headers->GetStatusLine()); |
| 4864 } | 4862 } |
| 4865 } | 4863 } |
| 4866 | 4864 |
| 4867 // Verify that push works cross origin as long as the certificate is valid for | 4865 // Verify that push works cross origin as long as the certificate is valid for |
| 4868 // the pushed authority. | 4866 // the pushed authority. |
| 4869 TEST_F(SpdyNetworkTransactionTest, ServerPushValidCrossOrigin) { | 4867 TEST_F(SpdyNetworkTransactionTest, ServerPushValidCrossOrigin) { |
| 4870 // "spdy_pooling.pem" is valid for both www.example.org and mail.example.org. | 4868 // "spdy_pooling.pem" is valid for both www.example.org and mail.example.org. |
| 4871 const char* url_to_fetch = "https://www.example.org"; | 4869 const char* url_to_fetch = "https://www.example.org"; |
| 4872 const char* url_to_push = "https://mail.example.org"; | 4870 const char* url_to_push = "https://mail.example.org"; |
| 4873 | 4871 |
| 4874 SpdySerializedFrame headers( | 4872 SpdySerializedFrame headers( |
| 4875 spdy_util_.ConstructSpdyGet(url_to_fetch, 1, LOWEST)); | 4873 spdy_util_.ConstructSpdyGet(url_to_fetch, 1, LOWEST)); |
| 4876 MockWrite writes[] = { | 4874 MockWrite writes[] = { |
| 4877 CreateMockWrite(headers, 0), | 4875 CreateMockWrite(headers, 0), |
| 4878 }; | 4876 }; |
| 4879 | 4877 |
| 4880 SpdySerializedFrame reply(spdy_util_.ConstructSpdyGetSynReply(nullptr, 0, 1)); | 4878 SpdySerializedFrame reply(spdy_util_.ConstructSpdyGetReply(nullptr, 0, 1)); |
| 4881 SpdySerializedFrame push( | 4879 SpdySerializedFrame push( |
| 4882 spdy_util_.ConstructSpdyPush(nullptr, 0, 2, 1, url_to_push)); | 4880 spdy_util_.ConstructSpdyPush(nullptr, 0, 2, 1, url_to_push)); |
| 4883 SpdySerializedFrame body(spdy_util_.ConstructSpdyDataFrame(1, true)); | 4881 SpdySerializedFrame body(spdy_util_.ConstructSpdyDataFrame(1, true)); |
| 4884 const char kPushedData[] = "pushed"; | 4882 const char kPushedData[] = "pushed"; |
| 4885 SpdySerializedFrame pushed_body(spdy_util_.ConstructSpdyDataFrame( | 4883 SpdySerializedFrame pushed_body(spdy_util_.ConstructSpdyDataFrame( |
| 4886 2, kPushedData, strlen(kPushedData), true)); | 4884 2, kPushedData, strlen(kPushedData), true)); |
| 4887 MockRead reads[] = { | 4885 MockRead reads[] = { |
| 4888 CreateMockRead(reply, 1), | 4886 CreateMockRead(reply, 1), |
| 4889 CreateMockRead(push, 2), | 4887 CreateMockRead(push, 2), |
| 4890 CreateMockRead(body, 3), | 4888 CreateMockRead(body, 3), |
| (...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4963 const char* url_to_push = "https://mail.example.org/bar"; | 4961 const char* url_to_push = "https://mail.example.org/bar"; |
| 4964 | 4962 |
| 4965 SpdyTestUtil spdy_util_0; | 4963 SpdyTestUtil spdy_util_0; |
| 4966 | 4964 |
| 4967 SpdySerializedFrame headers0( | 4965 SpdySerializedFrame headers0( |
| 4968 spdy_util_0.ConstructSpdyGet(url_to_fetch0, 1, LOWEST)); | 4966 spdy_util_0.ConstructSpdyGet(url_to_fetch0, 1, LOWEST)); |
| 4969 MockWrite writes0[] = { | 4967 MockWrite writes0[] = { |
| 4970 CreateMockWrite(headers0, 0), | 4968 CreateMockWrite(headers0, 0), |
| 4971 }; | 4969 }; |
| 4972 | 4970 |
| 4973 SpdySerializedFrame reply0( | 4971 SpdySerializedFrame reply0(spdy_util_0.ConstructSpdyGetReply(nullptr, 0, 1)); |
| 4974 spdy_util_0.ConstructSpdyGetSynReply(nullptr, 0, 1)); | |
| 4975 const char kData0[] = "first"; | 4972 const char kData0[] = "first"; |
| 4976 SpdySerializedFrame body0( | 4973 SpdySerializedFrame body0( |
| 4977 spdy_util_0.ConstructSpdyDataFrame(1, kData0, strlen(kData0), true)); | 4974 spdy_util_0.ConstructSpdyDataFrame(1, kData0, strlen(kData0), true)); |
| 4978 MockRead reads0[] = {CreateMockRead(reply0, 1), CreateMockRead(body0, 2), | 4975 MockRead reads0[] = {CreateMockRead(reply0, 1), CreateMockRead(body0, 2), |
| 4979 MockRead(SYNCHRONOUS, ERR_IO_PENDING, 3)}; | 4976 MockRead(SYNCHRONOUS, ERR_IO_PENDING, 3)}; |
| 4980 | 4977 |
| 4981 SequencedSocketData data0(reads0, arraysize(reads0), writes0, | 4978 SequencedSocketData data0(reads0, arraysize(reads0), writes0, |
| 4982 arraysize(writes0)); | 4979 arraysize(writes0)); |
| 4983 | 4980 |
| 4984 SpdyTestUtil spdy_util_1; | 4981 SpdyTestUtil spdy_util_1; |
| 4985 | 4982 |
| 4986 SpdySerializedFrame headers1( | 4983 SpdySerializedFrame headers1( |
| 4987 spdy_util_1.ConstructSpdyGet(url_to_fetch1, 1, LOWEST)); | 4984 spdy_util_1.ConstructSpdyGet(url_to_fetch1, 1, LOWEST)); |
| 4988 MockWrite writes1[] = { | 4985 MockWrite writes1[] = { |
| 4989 CreateMockWrite(headers1, 0), | 4986 CreateMockWrite(headers1, 0), |
| 4990 }; | 4987 }; |
| 4991 | 4988 |
| 4992 SpdySerializedFrame reply1( | 4989 SpdySerializedFrame reply1(spdy_util_1.ConstructSpdyGetReply(nullptr, 0, 1)); |
| 4993 spdy_util_1.ConstructSpdyGetSynReply(nullptr, 0, 1)); | |
| 4994 SpdySerializedFrame push( | 4990 SpdySerializedFrame push( |
| 4995 spdy_util_1.ConstructSpdyPush(nullptr, 0, 2, 1, url_to_push)); | 4991 spdy_util_1.ConstructSpdyPush(nullptr, 0, 2, 1, url_to_push)); |
| 4996 const char kData1[] = "second"; | 4992 const char kData1[] = "second"; |
| 4997 SpdySerializedFrame body1( | 4993 SpdySerializedFrame body1( |
| 4998 spdy_util_1.ConstructSpdyDataFrame(1, kData1, strlen(kData1), true)); | 4994 spdy_util_1.ConstructSpdyDataFrame(1, kData1, strlen(kData1), true)); |
| 4999 const char kPushedData[] = "pushed"; | 4995 const char kPushedData[] = "pushed"; |
| 5000 SpdySerializedFrame pushed_body(spdy_util_1.ConstructSpdyDataFrame( | 4996 SpdySerializedFrame pushed_body(spdy_util_1.ConstructSpdyDataFrame( |
| 5001 2, kPushedData, strlen(kPushedData), true)); | 4997 2, kPushedData, strlen(kPushedData), true)); |
| 5002 | 4998 |
| 5003 MockRead reads1[] = { | 4999 MockRead reads1[] = { |
| (...skipping 126 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5130 const char* url_to_push = "https://invalid.example.org"; | 5126 const char* url_to_push = "https://invalid.example.org"; |
| 5131 | 5127 |
| 5132 SpdySerializedFrame headers( | 5128 SpdySerializedFrame headers( |
| 5133 spdy_util_.ConstructSpdyGet(url_to_fetch, 1, LOWEST)); | 5129 spdy_util_.ConstructSpdyGet(url_to_fetch, 1, LOWEST)); |
| 5134 SpdySerializedFrame rst( | 5130 SpdySerializedFrame rst( |
| 5135 spdy_util_.ConstructSpdyRstStream(2, RST_STREAM_REFUSED_STREAM)); | 5131 spdy_util_.ConstructSpdyRstStream(2, RST_STREAM_REFUSED_STREAM)); |
| 5136 MockWrite writes[] = { | 5132 MockWrite writes[] = { |
| 5137 CreateMockWrite(headers, 0), CreateMockWrite(rst, 3), | 5133 CreateMockWrite(headers, 0), CreateMockWrite(rst, 3), |
| 5138 }; | 5134 }; |
| 5139 | 5135 |
| 5140 SpdySerializedFrame reply(spdy_util_.ConstructSpdyGetSynReply(nullptr, 0, 1)); | 5136 SpdySerializedFrame reply(spdy_util_.ConstructSpdyGetReply(nullptr, 0, 1)); |
| 5141 SpdySerializedFrame push( | 5137 SpdySerializedFrame push( |
| 5142 spdy_util_.ConstructSpdyPush(nullptr, 0, 2, 1, url_to_push)); | 5138 spdy_util_.ConstructSpdyPush(nullptr, 0, 2, 1, url_to_push)); |
| 5143 SpdySerializedFrame body(spdy_util_.ConstructSpdyDataFrame(1, true)); | 5139 SpdySerializedFrame body(spdy_util_.ConstructSpdyDataFrame(1, true)); |
| 5144 const char kPushedData[] = "pushed"; | 5140 const char kPushedData[] = "pushed"; |
| 5145 SpdySerializedFrame pushed_body(spdy_util_.ConstructSpdyDataFrame( | 5141 SpdySerializedFrame pushed_body(spdy_util_.ConstructSpdyDataFrame( |
| 5146 2, kPushedData, strlen(kPushedData), true)); | 5142 2, kPushedData, strlen(kPushedData), true)); |
| 5147 MockRead reads[] = { | 5143 MockRead reads[] = { |
| 5148 CreateMockRead(reply, 1), | 5144 CreateMockRead(reply, 1), |
| 5149 CreateMockRead(push, 2), | 5145 CreateMockRead(push, 2), |
| 5150 CreateMockRead(body, 4), | 5146 CreateMockRead(body, 4), |
| (...skipping 23 matching lines...) Expand all Loading... |
| 5174 // Will be destroyed by the RST before stream 3 starts. | 5170 // Will be destroyed by the RST before stream 3 starts. |
| 5175 spdy_util_.UpdateWithStreamDestruction(1); | 5171 spdy_util_.UpdateWithStreamDestruction(1); |
| 5176 SpdySerializedFrame req2( | 5172 SpdySerializedFrame req2( |
| 5177 spdy_util_.ConstructSpdyGet(nullptr, 0, 3, LOWEST, true)); | 5173 spdy_util_.ConstructSpdyGet(nullptr, 0, 3, LOWEST, true)); |
| 5178 MockWrite writes[] = { | 5174 MockWrite writes[] = { |
| 5179 CreateMockWrite(req, 0), CreateMockWrite(req2, 2), | 5175 CreateMockWrite(req, 0), CreateMockWrite(req2, 2), |
| 5180 }; | 5176 }; |
| 5181 | 5177 |
| 5182 SpdySerializedFrame refused( | 5178 SpdySerializedFrame refused( |
| 5183 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_REFUSED_STREAM)); | 5179 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_REFUSED_STREAM)); |
| 5184 SpdySerializedFrame resp(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 3)); | 5180 SpdySerializedFrame resp(spdy_util_.ConstructSpdyGetReply(NULL, 0, 3)); |
| 5185 SpdySerializedFrame body(spdy_util_.ConstructSpdyDataFrame(3, true)); | 5181 SpdySerializedFrame body(spdy_util_.ConstructSpdyDataFrame(3, true)); |
| 5186 MockRead reads[] = { | 5182 MockRead reads[] = { |
| 5187 CreateMockRead(refused, 1), CreateMockRead(resp, 3), | 5183 CreateMockRead(refused, 1), CreateMockRead(resp, 3), |
| 5188 CreateMockRead(body, 4), MockRead(ASYNC, 0, 5) // EOF | 5184 CreateMockRead(body, 4), MockRead(ASYNC, 0, 5) // EOF |
| 5189 }; | 5185 }; |
| 5190 | 5186 |
| 5191 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); | 5187 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); |
| 5192 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY, | 5188 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY, |
| 5193 BoundNetLog(), NULL); | 5189 BoundNetLog(), NULL); |
| 5194 | 5190 |
| 5195 helper.RunPreTestSetup(); | 5191 helper.RunPreTestSetup(); |
| 5196 helper.AddData(&data); | 5192 helper.AddData(&data); |
| 5197 | 5193 |
| 5198 HttpNetworkTransaction* trans = helper.trans(); | 5194 HttpNetworkTransaction* trans = helper.trans(); |
| 5199 | 5195 |
| 5200 // Start the transaction with basic parameters. | 5196 // Start the transaction with basic parameters. |
| 5201 TestCompletionCallback callback; | 5197 TestCompletionCallback callback; |
| 5202 int rv = trans->Start( | 5198 int rv = trans->Start( |
| 5203 &CreateGetRequest(), callback.callback(), BoundNetLog()); | 5199 &CreateGetRequest(), callback.callback(), BoundNetLog()); |
| 5204 EXPECT_THAT(rv, IsError(ERR_IO_PENDING)); | 5200 EXPECT_THAT(rv, IsError(ERR_IO_PENDING)); |
| 5205 rv = callback.WaitForResult(); | 5201 rv = callback.WaitForResult(); |
| 5206 EXPECT_THAT(rv, IsOk()); | 5202 EXPECT_THAT(rv, IsOk()); |
| 5207 | 5203 |
| 5208 // Verify that we consumed all test data. | 5204 // Verify that we consumed all test data. |
| 5209 EXPECT_TRUE(data.AllReadDataConsumed()); | 5205 EXPECT_TRUE(data.AllReadDataConsumed()); |
| 5210 EXPECT_TRUE(data.AllWriteDataConsumed()); | 5206 EXPECT_TRUE(data.AllWriteDataConsumed()); |
| 5211 | 5207 |
| 5212 // Verify the SYN_REPLY. | 5208 // Verify the response headers. |
| 5213 HttpResponseInfo response = *trans->GetResponseInfo(); | 5209 HttpResponseInfo response = *trans->GetResponseInfo(); |
| 5214 EXPECT_TRUE(response.headers); | 5210 EXPECT_TRUE(response.headers); |
| 5215 EXPECT_EQ("HTTP/1.1 200", response.headers->GetStatusLine()); | 5211 EXPECT_EQ("HTTP/1.1 200", response.headers->GetStatusLine()); |
| 5216 } | 5212 } |
| 5217 | 5213 |
| 5218 TEST_F(SpdyNetworkTransactionTest, OutOfOrderSynStream) { | 5214 TEST_F(SpdyNetworkTransactionTest, OutOfOrderHeaders) { |
| 5219 // This first request will start to establish the SpdySession. | 5215 // This first request will start to establish the SpdySession. |
| 5220 // Then we will start the second (MEDIUM priority) and then third | 5216 // Then we will start the second (MEDIUM priority) and then third |
| 5221 // (HIGHEST priority) request in such a way that the third will actually | 5217 // (HIGHEST priority) request in such a way that the third will actually |
| 5222 // start before the second, causing the second to be numbered differently | 5218 // start before the second, causing the second to be numbered differently |
| 5223 // than the order they were created. | 5219 // than the order they were created. |
| 5224 // | 5220 // |
| 5225 // Note that the requests and responses created below are expectations | 5221 // Note that the requests and responses created below are expectations |
| 5226 // of what the above will produce on the wire, and hence are in the | 5222 // of what the above will produce on the wire, and hence are in the |
| 5227 // initial->HIGHEST->LOWEST priority. | 5223 // initial->HIGHEST->LOWEST priority. |
| 5228 // | 5224 // |
| 5229 // Frames are created by SpdySession just before the write associated | 5225 // Frames are created by SpdySession just before the write associated |
| 5230 // with the frame is attempted, so stream dependencies will be based | 5226 // with the frame is attempted, so stream dependencies will be based |
| 5231 // on the streams alive at the point of the request write attempt. Thus | 5227 // on the streams alive at the point of the request write attempt. Thus |
| 5232 // req1 is alive when req2 is attempted (during but not after the | 5228 // req1 is alive when req2 is attempted (during but not after the |
| 5233 // |data.RunFor(2);| statement below) but not when req3 is attempted. | 5229 // |data.RunFor(2);| statement below) but not when req3 is attempted. |
| 5234 // The call to spdy_util_.UpdateWithStreamDestruction() reflects this. | 5230 // The call to spdy_util_.UpdateWithStreamDestruction() reflects this. |
| 5235 SpdySerializedFrame req1( | 5231 SpdySerializedFrame req1( |
| 5236 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); | 5232 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); |
| 5237 SpdySerializedFrame req2( | 5233 SpdySerializedFrame req2( |
| 5238 spdy_util_.ConstructSpdyGet(nullptr, 0, 3, HIGHEST, true)); | 5234 spdy_util_.ConstructSpdyGet(nullptr, 0, 3, HIGHEST, true)); |
| 5239 spdy_util_.UpdateWithStreamDestruction(1); | 5235 spdy_util_.UpdateWithStreamDestruction(1); |
| 5240 SpdySerializedFrame req3( | 5236 SpdySerializedFrame req3( |
| 5241 spdy_util_.ConstructSpdyGet(nullptr, 0, 5, MEDIUM, true)); | 5237 spdy_util_.ConstructSpdyGet(nullptr, 0, 5, MEDIUM, true)); |
| 5242 MockWrite writes[] = { | 5238 MockWrite writes[] = { |
| 5243 MockWrite(ASYNC, ERR_IO_PENDING, 0), CreateMockWrite(req1, 1), | 5239 MockWrite(ASYNC, ERR_IO_PENDING, 0), CreateMockWrite(req1, 1), |
| 5244 CreateMockWrite(req2, 5), CreateMockWrite(req3, 6), | 5240 CreateMockWrite(req2, 5), CreateMockWrite(req3, 6), |
| 5245 }; | 5241 }; |
| 5246 | 5242 |
| 5247 SpdySerializedFrame resp1(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); | 5243 SpdySerializedFrame resp1(spdy_util_.ConstructSpdyGetReply(NULL, 0, 1)); |
| 5248 SpdySerializedFrame body1(spdy_util_.ConstructSpdyDataFrame(1, true)); | 5244 SpdySerializedFrame body1(spdy_util_.ConstructSpdyDataFrame(1, true)); |
| 5249 SpdySerializedFrame resp2(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 3)); | 5245 SpdySerializedFrame resp2(spdy_util_.ConstructSpdyGetReply(NULL, 0, 3)); |
| 5250 SpdySerializedFrame body2(spdy_util_.ConstructSpdyDataFrame(3, true)); | 5246 SpdySerializedFrame body2(spdy_util_.ConstructSpdyDataFrame(3, true)); |
| 5251 SpdySerializedFrame resp3(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 5)); | 5247 SpdySerializedFrame resp3(spdy_util_.ConstructSpdyGetReply(NULL, 0, 5)); |
| 5252 SpdySerializedFrame body3(spdy_util_.ConstructSpdyDataFrame(5, true)); | 5248 SpdySerializedFrame body3(spdy_util_.ConstructSpdyDataFrame(5, true)); |
| 5253 MockRead reads[] = { | 5249 MockRead reads[] = { |
| 5254 CreateMockRead(resp1, 2), MockRead(ASYNC, ERR_IO_PENDING, 3), | 5250 CreateMockRead(resp1, 2), MockRead(ASYNC, ERR_IO_PENDING, 3), |
| 5255 CreateMockRead(body1, 4), CreateMockRead(resp2, 7), | 5251 CreateMockRead(body1, 4), CreateMockRead(resp2, 7), |
| 5256 CreateMockRead(body2, 8), CreateMockRead(resp3, 9), | 5252 CreateMockRead(body2, 8), CreateMockRead(resp3, 9), |
| 5257 CreateMockRead(body3, 10), MockRead(ASYNC, 0, 11) // EOF | 5253 CreateMockRead(body3, 10), MockRead(ASYNC, 0, 11) // EOF |
| 5258 }; | 5254 }; |
| 5259 | 5255 |
| 5260 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); | 5256 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); |
| 5261 NormalSpdyTransactionHelper helper(CreateGetRequest(), LOWEST, BoundNetLog(), | 5257 NormalSpdyTransactionHelper helper(CreateGetRequest(), LOWEST, BoundNetLog(), |
| (...skipping 23 matching lines...) Expand all Loading... |
| 5285 base::RunLoop().RunUntilIdle(); | 5281 base::RunLoop().RunUntilIdle(); |
| 5286 | 5282 |
| 5287 HttpRequestInfo info3 = CreateGetRequest(); | 5283 HttpRequestInfo info3 = CreateGetRequest(); |
| 5288 TestCompletionCallback callback3; | 5284 TestCompletionCallback callback3; |
| 5289 std::unique_ptr<HttpNetworkTransaction> trans3( | 5285 std::unique_ptr<HttpNetworkTransaction> trans3( |
| 5290 new HttpNetworkTransaction(HIGHEST, helper.session())); | 5286 new HttpNetworkTransaction(HIGHEST, helper.session())); |
| 5291 rv = trans3->Start(&info3, callback3.callback(), BoundNetLog()); | 5287 rv = trans3->Start(&info3, callback3.callback(), BoundNetLog()); |
| 5292 EXPECT_THAT(rv, IsError(ERR_IO_PENDING)); | 5288 EXPECT_THAT(rv, IsError(ERR_IO_PENDING)); |
| 5293 base::RunLoop().RunUntilIdle(); | 5289 base::RunLoop().RunUntilIdle(); |
| 5294 | 5290 |
| 5295 // We now have two SYN_STREAM frames queued up which will be | 5291 // We now have two HEADERS frames queued up which will be |
| 5296 // dequeued only once the first write completes, which we | 5292 // dequeued only once the first write completes, which we |
| 5297 // now allow to happen. | 5293 // now allow to happen. |
| 5298 ASSERT_TRUE(data.IsPaused()); | 5294 ASSERT_TRUE(data.IsPaused()); |
| 5299 data.Resume(); | 5295 data.Resume(); |
| 5300 EXPECT_THAT(callback.WaitForResult(), IsOk()); | 5296 EXPECT_THAT(callback.WaitForResult(), IsOk()); |
| 5301 | 5297 |
| 5302 // And now we can allow everything else to run to completion. | 5298 // And now we can allow everything else to run to completion. |
| 5303 data.Resume(); | 5299 data.Resume(); |
| 5304 base::RunLoop().RunUntilIdle(); | 5300 base::RunLoop().RunUntilIdle(); |
| 5305 EXPECT_THAT(callback2.WaitForResult(), IsOk()); | 5301 EXPECT_THAT(callback2.WaitForResult(), IsOk()); |
| 5306 EXPECT_THAT(callback3.WaitForResult(), IsOk()); | 5302 EXPECT_THAT(callback3.WaitForResult(), IsOk()); |
| 5307 | 5303 |
| 5308 helper.VerifyDataConsumed(); | 5304 helper.VerifyDataConsumed(); |
| 5309 } | 5305 } |
| 5310 | 5306 |
| 5311 // The tests below are only for SPDY/3 and above. | |
| 5312 | |
| 5313 // Test that sent data frames and received WINDOW_UPDATE frames change | 5307 // Test that sent data frames and received WINDOW_UPDATE frames change |
| 5314 // the send_window_size_ correctly. | 5308 // the send_window_size_ correctly. |
| 5315 | 5309 |
| 5316 // WINDOW_UPDATE is different than most other frames in that it can arrive | 5310 // WINDOW_UPDATE is different than most other frames in that it can arrive |
| 5317 // while the client is still sending the request body. In order to enforce | 5311 // while the client is still sending the request body. In order to enforce |
| 5318 // this scenario, we feed a couple of dummy frames and give a delay of 0 to | 5312 // this scenario, we feed a couple of dummy frames and give a delay of 0 to |
| 5319 // socket data provider, so that initial read that is done as soon as the | 5313 // socket data provider, so that initial read that is done as soon as the |
| 5320 // stream is created, succeeds and schedules another read. This way reads | 5314 // stream is created, succeeds and schedules another read. This way reads |
| 5321 // and writes are interleaved; after doing a full frame write, SpdyStream | 5315 // and writes are interleaved; after doing a full frame write, SpdyStream |
| 5322 // will break out of DoLoop and will read and process a WINDOW_UPDATE. | 5316 // will break out of DoLoop and will read and process a WINDOW_UPDATE. |
| 5323 // Once our WINDOW_UPDATE is read, we cannot send SYN_REPLY right away | 5317 // Once our WINDOW_UPDATE is read, we cannot send HEADERS right away |
| 5324 // since request has not been completely written, therefore we feed | 5318 // since request has not been completely written, therefore we feed |
| 5325 // enough number of WINDOW_UPDATEs to finish the first read and cause a | 5319 // enough number of WINDOW_UPDATEs to finish the first read and cause a |
| 5326 // write, leading to a complete write of request body; after that we send | 5320 // write, leading to a complete write of request body; after that we send |
| 5327 // a reply with a body, to cause a graceful shutdown. | 5321 // a reply with a body, to cause a graceful shutdown. |
| 5328 | 5322 |
| 5329 // TODO(agayev): develop a socket data provider where both, reads and | 5323 // TODO(agayev): develop a socket data provider where both, reads and |
| 5330 // writes are ordered so that writing tests like these are easy and rewrite | 5324 // writes are ordered so that writing tests like these are easy and rewrite |
| 5331 // all these tests using it. Right now we are working around the | 5325 // all these tests using it. Right now we are working around the |
| 5332 // limitations as described above and it's not deterministic, tests may | 5326 // limitations as described above and it's not deterministic, tests may |
| 5333 // fail under specific circumstances. | 5327 // fail under specific circumstances. |
| (...skipping 12 matching lines...) Expand all Loading... |
| 5346 CreateMockWrite(req, 0), CreateMockWrite(body, 1), | 5340 CreateMockWrite(req, 0), CreateMockWrite(body, 1), |
| 5347 CreateMockWrite(body_end, 2), | 5341 CreateMockWrite(body_end, 2), |
| 5348 }; | 5342 }; |
| 5349 | 5343 |
| 5350 static const int32_t kDeltaWindowSize = 0xff; | 5344 static const int32_t kDeltaWindowSize = 0xff; |
| 5351 static const int kDeltaCount = 4; | 5345 static const int kDeltaCount = 4; |
| 5352 SpdySerializedFrame window_update( | 5346 SpdySerializedFrame window_update( |
| 5353 spdy_util_.ConstructSpdyWindowUpdate(1, kDeltaWindowSize)); | 5347 spdy_util_.ConstructSpdyWindowUpdate(1, kDeltaWindowSize)); |
| 5354 SpdySerializedFrame window_update_dummy( | 5348 SpdySerializedFrame window_update_dummy( |
| 5355 spdy_util_.ConstructSpdyWindowUpdate(2, kDeltaWindowSize)); | 5349 spdy_util_.ConstructSpdyWindowUpdate(2, kDeltaWindowSize)); |
| 5356 SpdySerializedFrame resp(spdy_util_.ConstructSpdyPostSynReply(NULL, 0)); | 5350 SpdySerializedFrame resp(spdy_util_.ConstructSpdyPostReply(NULL, 0)); |
| 5357 MockRead reads[] = { | 5351 MockRead reads[] = { |
| 5358 CreateMockRead(window_update_dummy, 3), | 5352 CreateMockRead(window_update_dummy, 3), |
| 5359 CreateMockRead(window_update_dummy, 4), | 5353 CreateMockRead(window_update_dummy, 4), |
| 5360 CreateMockRead(window_update_dummy, 5), | 5354 CreateMockRead(window_update_dummy, 5), |
| 5361 CreateMockRead(window_update, 6), // Four updates, therefore window | 5355 CreateMockRead(window_update, 6), // Four updates, therefore window |
| 5362 CreateMockRead(window_update, 7), // size should increase by | 5356 CreateMockRead(window_update, 7), // size should increase by |
| 5363 CreateMockRead(window_update, 8), // kDeltaWindowSize * 4 | 5357 CreateMockRead(window_update, 8), // kDeltaWindowSize * 4 |
| 5364 CreateMockRead(window_update, 9), | 5358 CreateMockRead(window_update, 9), |
| 5365 CreateMockRead(resp, 10), | 5359 CreateMockRead(resp, 10), |
| 5366 MockRead(ASYNC, ERR_IO_PENDING, 11), | 5360 MockRead(ASYNC, ERR_IO_PENDING, 11), |
| (...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5464 spdy_util_.ConstructSpdyWindowUpdate(1, stream_window_update_delta)); | 5458 spdy_util_.ConstructSpdyWindowUpdate(1, stream_window_update_delta)); |
| 5465 | 5459 |
| 5466 std::vector<MockWrite> writes; | 5460 std::vector<MockWrite> writes; |
| 5467 writes.push_back(MockWrite(ASYNC, kHttp2ConnectionHeaderPrefix, | 5461 writes.push_back(MockWrite(ASYNC, kHttp2ConnectionHeaderPrefix, |
| 5468 kHttp2ConnectionHeaderPrefixSize, 0)); | 5462 kHttp2ConnectionHeaderPrefixSize, 0)); |
| 5469 writes.push_back(CreateMockWrite(initial_settings_frame, writes.size())); | 5463 writes.push_back(CreateMockWrite(initial_settings_frame, writes.size())); |
| 5470 writes.push_back(CreateMockWrite(initial_window_update, writes.size())); | 5464 writes.push_back(CreateMockWrite(initial_window_update, writes.size())); |
| 5471 writes.push_back(CreateMockWrite(req, writes.size())); | 5465 writes.push_back(CreateMockWrite(req, writes.size())); |
| 5472 | 5466 |
| 5473 std::vector<MockRead> reads; | 5467 std::vector<MockRead> reads; |
| 5474 SpdySerializedFrame resp(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); | 5468 SpdySerializedFrame resp(spdy_util_.ConstructSpdyGetReply(NULL, 0, 1)); |
| 5475 reads.push_back(CreateMockRead(resp, writes.size() + reads.size())); | 5469 reads.push_back(CreateMockRead(resp, writes.size() + reads.size())); |
| 5476 | 5470 |
| 5477 std::vector<SpdySerializedFrame> body_frames; | 5471 std::vector<SpdySerializedFrame> body_frames; |
| 5478 const std::string body_data(kChunkSize, 'x'); | 5472 const std::string body_data(kChunkSize, 'x'); |
| 5479 for (size_t remaining = kTargetSize; remaining != 0;) { | 5473 for (size_t remaining = kTargetSize; remaining != 0;) { |
| 5480 size_t frame_size = std::min(remaining, body_data.size()); | 5474 size_t frame_size = std::min(remaining, body_data.size()); |
| 5481 body_frames.push_back(spdy_util_.ConstructSpdyDataFrame(1, body_data.data(), | 5475 body_frames.push_back(spdy_util_.ConstructSpdyDataFrame(1, body_data.data(), |
| 5482 frame_size, false)); | 5476 frame_size, false)); |
| 5483 reads.push_back( | 5477 reads.push_back( |
| 5484 CreateMockRead(body_frames.back(), writes.size() + reads.size())); | 5478 CreateMockRead(body_frames.back(), writes.size() + reads.size())); |
| (...skipping 213 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5698 1, kUploadDataSize + last_body.size())); | 5692 1, kUploadDataSize + last_body.size())); |
| 5699 | 5693 |
| 5700 reads.push_back(CreateMockRead(session_window_update, i++)); | 5694 reads.push_back(CreateMockRead(session_window_update, i++)); |
| 5701 reads.push_back(CreateMockRead(window_update, i++)); | 5695 reads.push_back(CreateMockRead(window_update, i++)); |
| 5702 | 5696 |
| 5703 // Stalled frames which can be sent after receiving window updates. | 5697 // Stalled frames which can be sent after receiving window updates. |
| 5704 if (last_body.size() > 0) | 5698 if (last_body.size() > 0) |
| 5705 writes.push_back(CreateMockWrite(body4, i++)); | 5699 writes.push_back(CreateMockWrite(body4, i++)); |
| 5706 writes.push_back(CreateMockWrite(body5, i++)); | 5700 writes.push_back(CreateMockWrite(body5, i++)); |
| 5707 | 5701 |
| 5708 SpdySerializedFrame reply(spdy_util_.ConstructSpdyPostSynReply(NULL, 0)); | 5702 SpdySerializedFrame reply(spdy_util_.ConstructSpdyPostReply(NULL, 0)); |
| 5709 reads.push_back(CreateMockRead(reply, i++)); | 5703 reads.push_back(CreateMockRead(reply, i++)); |
| 5710 reads.push_back(CreateMockRead(body2, i++)); | 5704 reads.push_back(CreateMockRead(body2, i++)); |
| 5711 reads.push_back(CreateMockRead(body5, i++)); | 5705 reads.push_back(CreateMockRead(body5, i++)); |
| 5712 reads.push_back(MockRead(ASYNC, 0, i++)); // EOF | 5706 reads.push_back(MockRead(ASYNC, 0, i++)); // EOF |
| 5713 | 5707 |
| 5714 SequencedSocketData data(reads.data(), reads.size(), writes.data(), | 5708 SequencedSocketData data(reads.data(), reads.size(), writes.data(), |
| 5715 writes.size()); | 5709 writes.size()); |
| 5716 | 5710 |
| 5717 std::vector<std::unique_ptr<UploadElementReader>> element_readers; | 5711 std::vector<std::unique_ptr<UploadElementReader>> element_readers; |
| 5718 std::string upload_data_string(kBufferSize * num_upload_buffers, 'a'); | 5712 std::string upload_data_string(kBufferSize * num_upload_buffers, 'a'); |
| (...skipping 132 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5851 reads.push_back(CreateMockRead(session_window_update, i++)); | 5845 reads.push_back(CreateMockRead(session_window_update, i++)); |
| 5852 | 5846 |
| 5853 SpdySerializedFrame settings_ack(spdy_util_.ConstructSpdySettingsAck()); | 5847 SpdySerializedFrame settings_ack(spdy_util_.ConstructSpdySettingsAck()); |
| 5854 writes.push_back(CreateMockWrite(settings_ack, i++)); | 5848 writes.push_back(CreateMockWrite(settings_ack, i++)); |
| 5855 | 5849 |
| 5856 // Stalled frames which can be sent after |settings_ack|. | 5850 // Stalled frames which can be sent after |settings_ack|. |
| 5857 if (last_body.size() > 0) | 5851 if (last_body.size() > 0) |
| 5858 writes.push_back(CreateMockWrite(body4, i++)); | 5852 writes.push_back(CreateMockWrite(body4, i++)); |
| 5859 writes.push_back(CreateMockWrite(body5, i++)); | 5853 writes.push_back(CreateMockWrite(body5, i++)); |
| 5860 | 5854 |
| 5861 SpdySerializedFrame reply(spdy_util_.ConstructSpdyPostSynReply(NULL, 0)); | 5855 SpdySerializedFrame reply(spdy_util_.ConstructSpdyPostReply(NULL, 0)); |
| 5862 reads.push_back(CreateMockRead(reply, i++)); | 5856 reads.push_back(CreateMockRead(reply, i++)); |
| 5863 reads.push_back(CreateMockRead(body2, i++)); | 5857 reads.push_back(CreateMockRead(body2, i++)); |
| 5864 reads.push_back(CreateMockRead(body5, i++)); | 5858 reads.push_back(CreateMockRead(body5, i++)); |
| 5865 reads.push_back(MockRead(ASYNC, 0, i++)); // EOF | 5859 reads.push_back(MockRead(ASYNC, 0, i++)); // EOF |
| 5866 | 5860 |
| 5867 // Force all writes to happen before any read, last write will not | 5861 // Force all writes to happen before any read, last write will not |
| 5868 // actually queue a frame, due to window size being 0. | 5862 // actually queue a frame, due to window size being 0. |
| 5869 SequencedSocketData data(reads.data(), reads.size(), writes.data(), | 5863 SequencedSocketData data(reads.data(), reads.size(), writes.data(), |
| 5870 writes.size()); | 5864 writes.size()); |
| 5871 | 5865 |
| (...skipping 143 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6015 reads.push_back(CreateMockRead(window_update_init_size, i++)); | 6009 reads.push_back(CreateMockRead(window_update_init_size, i++)); |
| 6016 | 6010 |
| 6017 SpdySerializedFrame settings_ack(spdy_util_.ConstructSpdySettingsAck()); | 6011 SpdySerializedFrame settings_ack(spdy_util_.ConstructSpdySettingsAck()); |
| 6018 writes.push_back(CreateMockWrite(settings_ack, i++)); | 6012 writes.push_back(CreateMockWrite(settings_ack, i++)); |
| 6019 | 6013 |
| 6020 // Stalled frames which can be sent after |settings_ack|. | 6014 // Stalled frames which can be sent after |settings_ack|. |
| 6021 if (last_body.size() > 0) | 6015 if (last_body.size() > 0) |
| 6022 writes.push_back(CreateMockWrite(body4, i++)); | 6016 writes.push_back(CreateMockWrite(body4, i++)); |
| 6023 writes.push_back(CreateMockWrite(body5, i++)); | 6017 writes.push_back(CreateMockWrite(body5, i++)); |
| 6024 | 6018 |
| 6025 SpdySerializedFrame reply(spdy_util_.ConstructSpdyPostSynReply(NULL, 0)); | 6019 SpdySerializedFrame reply(spdy_util_.ConstructSpdyPostReply(NULL, 0)); |
| 6026 reads.push_back(CreateMockRead(reply, i++)); | 6020 reads.push_back(CreateMockRead(reply, i++)); |
| 6027 reads.push_back(CreateMockRead(body2, i++)); | 6021 reads.push_back(CreateMockRead(body2, i++)); |
| 6028 reads.push_back(CreateMockRead(body5, i++)); | 6022 reads.push_back(CreateMockRead(body5, i++)); |
| 6029 reads.push_back(MockRead(ASYNC, 0, i++)); // EOF | 6023 reads.push_back(MockRead(ASYNC, 0, i++)); // EOF |
| 6030 | 6024 |
| 6031 // Force all writes to happen before any read, last write will not | 6025 // Force all writes to happen before any read, last write will not |
| 6032 // actually queue a frame, due to window size being 0. | 6026 // actually queue a frame, due to window size being 0. |
| 6033 SequencedSocketData data(reads.data(), reads.size(), writes.data(), | 6027 SequencedSocketData data(reads.data(), reads.size(), writes.data(), |
| 6034 writes.size()); | 6028 writes.size()); |
| 6035 | 6029 |
| (...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6142 const std::string kValue(1 << 15, 'z'); | 6136 const std::string kValue(1 << 15, 'z'); |
| 6143 | 6137 |
| 6144 HttpRequestInfo request; | 6138 HttpRequestInfo request; |
| 6145 request.method = "GET"; | 6139 request.method = "GET"; |
| 6146 request.url = default_url_; | 6140 request.url = default_url_; |
| 6147 request.extra_headers.SetHeader(kKey, kValue); | 6141 request.extra_headers.SetHeader(kKey, kValue); |
| 6148 | 6142 |
| 6149 SpdyHeaderBlock headers(spdy_util_.ConstructGetHeaderBlock(kDefaultUrl)); | 6143 SpdyHeaderBlock headers(spdy_util_.ConstructGetHeaderBlock(kDefaultUrl)); |
| 6150 headers[kKey] = kValue; | 6144 headers[kKey] = kValue; |
| 6151 SpdySerializedFrame req( | 6145 SpdySerializedFrame req( |
| 6152 spdy_util_.ConstructSpdySyn(1, std::move(headers), LOWEST, true)); | 6146 spdy_util_.ConstructSpdyHeaders(1, std::move(headers), LOWEST, true)); |
| 6153 MockWrite writes[] = { | 6147 MockWrite writes[] = { |
| 6154 CreateMockWrite(req, 0), | 6148 CreateMockWrite(req, 0), |
| 6155 }; | 6149 }; |
| 6156 | 6150 |
| 6157 SpdySerializedFrame resp(spdy_util_.ConstructSpdyGetSynReply(nullptr, 0, 1)); | 6151 SpdySerializedFrame resp(spdy_util_.ConstructSpdyGetReply(nullptr, 0, 1)); |
| 6158 SpdySerializedFrame body(spdy_util_.ConstructSpdyDataFrame(1, true)); | 6152 SpdySerializedFrame body(spdy_util_.ConstructSpdyDataFrame(1, true)); |
| 6159 MockRead reads[] = { | 6153 MockRead reads[] = { |
| 6160 CreateMockRead(resp, 1), CreateMockRead(body, 2), | 6154 CreateMockRead(resp, 1), CreateMockRead(body, 2), |
| 6161 MockRead(ASYNC, 0, 3) // EOF | 6155 MockRead(ASYNC, 0, 3) // EOF |
| 6162 }; | 6156 }; |
| 6163 | 6157 |
| 6164 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); | 6158 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); |
| 6165 NormalSpdyTransactionHelper helper(request, DEFAULT_PRIORITY, BoundNetLog(), | 6159 NormalSpdyTransactionHelper helper(request, DEFAULT_PRIORITY, BoundNetLog(), |
| 6166 nullptr); | 6160 nullptr); |
| 6167 helper.RunToCompletion(&data); | 6161 helper.RunToCompletion(&data); |
| 6168 TransactionHelperResult out = helper.output(); | 6162 TransactionHelperResult out = helper.output(); |
| 6169 | 6163 |
| 6170 EXPECT_THAT(out.rv, IsOk()); | 6164 EXPECT_THAT(out.rv, IsOk()); |
| 6171 EXPECT_EQ("HTTP/1.1 200", out.status_line); | 6165 EXPECT_EQ("HTTP/1.1 200", out.status_line); |
| 6172 EXPECT_EQ("hello!", out.response_data); | 6166 EXPECT_EQ("hello!", out.response_data); |
| 6173 } | 6167 } |
| 6174 | 6168 |
| 6175 // Regression test for https://crbug.com/535629: response header exceeds 16 kB. | 6169 // Regression test for https://crbug.com/535629: response header exceeds 16 kB. |
| 6176 TEST_F(SpdyNetworkTransactionTest, LargeResponseHeader) { | 6170 TEST_F(SpdyNetworkTransactionTest, LargeResponseHeader) { |
| 6177 SpdyHeaderBlock headers(spdy_util_.ConstructGetHeaderBlock(kDefaultUrl)); | 6171 SpdyHeaderBlock headers(spdy_util_.ConstructGetHeaderBlock(kDefaultUrl)); |
| 6178 SpdySerializedFrame req( | 6172 SpdySerializedFrame req( |
| 6179 spdy_util_.ConstructSpdySyn(1, std::move(headers), LOWEST, true)); | 6173 spdy_util_.ConstructSpdyHeaders(1, std::move(headers), LOWEST, true)); |
| 6180 MockWrite writes[] = { | 6174 MockWrite writes[] = { |
| 6181 CreateMockWrite(req, 0), | 6175 CreateMockWrite(req, 0), |
| 6182 }; | 6176 }; |
| 6183 | 6177 |
| 6184 // HPACK decoder implementation limits string literal length to 16 kB. | 6178 // HPACK decoder implementation limits string literal length to 16 kB. |
| 6185 const char* response_headers[2]; | 6179 const char* response_headers[2]; |
| 6186 const std::string kKey(16 * 1024, 'a'); | 6180 const std::string kKey(16 * 1024, 'a'); |
| 6187 response_headers[0] = kKey.data(); | 6181 response_headers[0] = kKey.data(); |
| 6188 const std::string kValue(16 * 1024, 'b'); | 6182 const std::string kValue(16 * 1024, 'b'); |
| 6189 response_headers[1] = kValue.data(); | 6183 response_headers[1] = kValue.data(); |
| 6190 | 6184 |
| 6191 SpdySerializedFrame resp( | 6185 SpdySerializedFrame resp( |
| 6192 spdy_util_.ConstructSpdyGetSynReply(response_headers, 1, 1)); | 6186 spdy_util_.ConstructSpdyGetReply(response_headers, 1, 1)); |
| 6193 SpdySerializedFrame body(spdy_util_.ConstructSpdyDataFrame(1, true)); | 6187 SpdySerializedFrame body(spdy_util_.ConstructSpdyDataFrame(1, true)); |
| 6194 MockRead reads[] = { | 6188 MockRead reads[] = { |
| 6195 CreateMockRead(resp, 1), CreateMockRead(body, 2), | 6189 CreateMockRead(resp, 1), CreateMockRead(body, 2), |
| 6196 MockRead(ASYNC, 0, 3) // EOF | 6190 MockRead(ASYNC, 0, 3) // EOF |
| 6197 }; | 6191 }; |
| 6198 | 6192 |
| 6199 HttpRequestInfo request; | 6193 HttpRequestInfo request; |
| 6200 request.method = "GET"; | 6194 request.method = "GET"; |
| 6201 request.url = default_url_; | 6195 request.url = default_url_; |
| 6202 NormalSpdyTransactionHelper helper(request, DEFAULT_PRIORITY, BoundNetLog(), | 6196 NormalSpdyTransactionHelper helper(request, DEFAULT_PRIORITY, BoundNetLog(), |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6245 TEST_F(SpdyNetworkTransactionTLSUsageCheckTest, TLSCipherSuiteSucky) { | 6239 TEST_F(SpdyNetworkTransactionTLSUsageCheckTest, TLSCipherSuiteSucky) { |
| 6246 std::unique_ptr<SSLSocketDataProvider> ssl_provider( | 6240 std::unique_ptr<SSLSocketDataProvider> ssl_provider( |
| 6247 new SSLSocketDataProvider(ASYNC, OK)); | 6241 new SSLSocketDataProvider(ASYNC, OK)); |
| 6248 // Set to TLS_RSA_WITH_NULL_MD5 | 6242 // Set to TLS_RSA_WITH_NULL_MD5 |
| 6249 SSLConnectionStatusSetCipherSuite(0x1, &ssl_provider->connection_status); | 6243 SSLConnectionStatusSetCipherSuite(0x1, &ssl_provider->connection_status); |
| 6250 | 6244 |
| 6251 RunTLSUsageCheckTest(std::move(ssl_provider)); | 6245 RunTLSUsageCheckTest(std::move(ssl_provider)); |
| 6252 } | 6246 } |
| 6253 | 6247 |
| 6254 } // namespace net | 6248 } // namespace net |
| OLD | NEW |