| OLD | NEW |
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "net/spdy/spdy_stream.h" | 5 #include "net/spdy/spdy_stream.h" |
| 6 | 6 |
| 7 #include <stdint.h> | 7 #include <stdint.h> |
| 8 | 8 |
| 9 #include <cstddef> | 9 #include <cstddef> |
| 10 #include <limits> | 10 #include <limits> |
| (...skipping 535 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 546 EXPECT_TRUE(data.AllWriteDataConsumed()); | 546 EXPECT_TRUE(data.AllWriteDataConsumed()); |
| 547 } | 547 } |
| 548 | 548 |
| 549 // Receiving a header with uppercase ASCII should result in a protocol error. | 549 // Receiving a header with uppercase ASCII should result in a protocol error. |
| 550 TEST_F(SpdyStreamTest, UpperCaseHeaders) { | 550 TEST_F(SpdyStreamTest, UpperCaseHeaders) { |
| 551 SpdySerializedFrame req( | 551 SpdySerializedFrame req( |
| 552 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); | 552 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); |
| 553 AddWrite(req); | 553 AddWrite(req); |
| 554 | 554 |
| 555 const char* const kExtraHeaders[] = {"X-UpperCase", "yes"}; | 555 const char* const kExtraHeaders[] = {"X-UpperCase", "yes"}; |
| 556 SpdySerializedFrame reply( | 556 SpdySerializedFrame reply(spdy_util_.ConstructSpdyGetReply( |
| 557 spdy_util_.ConstructSpdyGetReply(kExtraHeaders, 1, 1)); | 557 kExtraHeaders, arraysize(kExtraHeaders) / 2, 1)); |
| 558 AddRead(reply); | 558 AddRead(reply); |
| 559 | 559 |
| 560 SpdySerializedFrame rst( | 560 SpdySerializedFrame rst( |
| 561 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_PROTOCOL_ERROR)); | 561 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_PROTOCOL_ERROR)); |
| 562 AddWrite(rst); | 562 AddWrite(rst); |
| 563 | 563 |
| 564 AddReadEOF(); | 564 AddReadEOF(); |
| 565 | 565 |
| 566 SequencedSocketData data(GetReads(), GetNumReads(), GetWrites(), | 566 SequencedSocketData data(GetReads(), GetNumReads(), GetWrites(), |
| 567 GetNumWrites()); | 567 GetNumWrites()); |
| (...skipping 14 matching lines...) Expand all Loading... |
| 582 | 582 |
| 583 EXPECT_TRUE(stream->GetUrlFromHeaders().is_empty()); | 583 EXPECT_TRUE(stream->GetUrlFromHeaders().is_empty()); |
| 584 | 584 |
| 585 SpdyHeaderBlock headers(spdy_util_.ConstructGetHeaderBlock(kDefaultUrl)); | 585 SpdyHeaderBlock headers(spdy_util_.ConstructGetHeaderBlock(kDefaultUrl)); |
| 586 EXPECT_THAT( | 586 EXPECT_THAT( |
| 587 stream->SendRequestHeaders(std::move(headers), NO_MORE_DATA_TO_SEND), | 587 stream->SendRequestHeaders(std::move(headers), NO_MORE_DATA_TO_SEND), |
| 588 IsError(ERR_IO_PENDING)); | 588 IsError(ERR_IO_PENDING)); |
| 589 EXPECT_EQ(kDefaultUrl, stream->GetUrlFromHeaders().spec()); | 589 EXPECT_EQ(kDefaultUrl, stream->GetUrlFromHeaders().spec()); |
| 590 | 590 |
| 591 EXPECT_THAT(delegate.WaitForClose(), IsError(ERR_SPDY_PROTOCOL_ERROR)); | 591 EXPECT_THAT(delegate.WaitForClose(), IsError(ERR_SPDY_PROTOCOL_ERROR)); |
| 592 |
| 593 EXPECT_TRUE(data.AllWriteDataConsumed()); |
| 594 EXPECT_TRUE(data.AllReadDataConsumed()); |
| 592 } | 595 } |
| 593 | 596 |
| 594 // Receiving a header with uppercase ASCII should result in a protocol error | 597 // Receiving a header with uppercase ASCII should result in a protocol error |
| 595 // even for a push stream. | 598 // even for a push stream. |
| 596 TEST_F(SpdyStreamTest, UpperCaseHeadersOnPush) { | 599 TEST_F(SpdyStreamTest, UpperCaseHeadersOnPush) { |
| 597 SpdySerializedFrame req( | 600 SpdySerializedFrame req( |
| 598 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); | 601 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); |
| 599 AddWrite(req); | 602 AddWrite(req); |
| 600 | 603 |
| 601 SpdySerializedFrame reply(spdy_util_.ConstructSpdyGetReply(nullptr, 0, 1)); | 604 SpdySerializedFrame reply(spdy_util_.ConstructSpdyGetReply(nullptr, 0, 1)); |
| 602 AddRead(reply); | 605 AddRead(reply); |
| 603 | 606 |
| 604 const char* const extra_headers[] = {"X-UpperCase", "yes"}; | 607 const char* const kExtraHeaders[] = {"X-UpperCase", "yes"}; |
| 605 SpdySerializedFrame push( | 608 SpdySerializedFrame push(spdy_util_.ConstructSpdyPush( |
| 606 spdy_util_.ConstructSpdyPush(extra_headers, 1, 2, 1, kPushUrl)); | 609 kExtraHeaders, arraysize(kExtraHeaders) / 2, 2, 1, kPushUrl)); |
| 607 AddRead(push); | 610 AddRead(push); |
| 608 | 611 |
| 609 SpdySerializedFrame rst( | 612 SpdySerializedFrame rst( |
| 610 spdy_util_.ConstructSpdyRstStream(2, RST_STREAM_PROTOCOL_ERROR)); | 613 spdy_util_.ConstructSpdyRstStream(2, RST_STREAM_PROTOCOL_ERROR)); |
| 611 AddWrite(rst); | 614 AddWrite(rst); |
| 612 | 615 |
| 613 AddReadPause(); | 616 AddReadPause(); |
| 614 | 617 |
| 615 AddReadEOF(); | 618 AddReadEOF(); |
| 616 | 619 |
| (...skipping 26 matching lines...) Expand all Loading... |
| 643 | 646 |
| 644 base::WeakPtr<SpdyStream> push_stream; | 647 base::WeakPtr<SpdyStream> push_stream; |
| 645 EXPECT_THAT( | 648 EXPECT_THAT( |
| 646 session->GetPushStream(GURL(kPushUrl), &push_stream, NetLogWithSource()), | 649 session->GetPushStream(GURL(kPushUrl), &push_stream, NetLogWithSource()), |
| 647 IsOk()); | 650 IsOk()); |
| 648 EXPECT_FALSE(push_stream); | 651 EXPECT_FALSE(push_stream); |
| 649 | 652 |
| 650 data.Resume(); | 653 data.Resume(); |
| 651 | 654 |
| 652 EXPECT_THAT(delegate.WaitForClose(), IsError(ERR_CONNECTION_CLOSED)); | 655 EXPECT_THAT(delegate.WaitForClose(), IsError(ERR_CONNECTION_CLOSED)); |
| 656 |
| 657 EXPECT_TRUE(data.AllWriteDataConsumed()); |
| 658 EXPECT_TRUE(data.AllReadDataConsumed()); |
| 653 } | 659 } |
| 654 | 660 |
| 655 // Receiving a header with uppercase ASCII in a HEADERS frame should result in a | 661 TEST_F(SpdyStreamTest, HeadersMustHaveStatus) { |
| 656 // protocol error. | 662 SpdySerializedFrame req( |
| 657 TEST_F(SpdyStreamTest, UpperCaseHeadersInHeadersFrame) { | 663 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); |
| 664 AddWrite(req); |
| 665 |
| 666 // Response headers without ":status" header field: protocol error. |
| 667 SpdyHeaderBlock header_block_without_status; |
| 668 header_block_without_status[spdy_util_.GetMethodKey()] = "GET"; |
| 669 header_block_without_status[spdy_util_.GetHostKey()] = "www.example.org"; |
| 670 header_block_without_status[spdy_util_.GetSchemeKey()] = "https"; |
| 671 header_block_without_status[spdy_util_.GetPathKey()] = "/"; |
| 672 SpdySerializedFrame reply( |
| 673 spdy_util_.ConstructSpdyReply(1, std::move(header_block_without_status))); |
| 674 AddRead(reply); |
| 675 |
| 676 SpdySerializedFrame rst( |
| 677 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_PROTOCOL_ERROR)); |
| 678 AddWrite(rst); |
| 679 |
| 680 AddReadEOF(); |
| 681 |
| 682 SequencedSocketData data(GetReads(), GetNumReads(), GetWrites(), |
| 683 GetNumWrites()); |
| 684 MockConnect connect_data(SYNCHRONOUS, OK); |
| 685 data.set_connect_data(connect_data); |
| 686 session_deps_.socket_factory->AddSocketDataProvider(&data); |
| 687 |
| 688 AddSSLSocketData(); |
| 689 |
| 690 base::WeakPtr<SpdySession> session(CreateDefaultSpdySession()); |
| 691 |
| 692 base::WeakPtr<SpdyStream> stream = CreateStreamSynchronously( |
| 693 SPDY_REQUEST_RESPONSE_STREAM, session, url_, LOWEST, NetLogWithSource()); |
| 694 ASSERT_TRUE(stream); |
| 695 |
| 696 StreamDelegateDoNothing delegate(stream); |
| 697 stream->SetDelegate(&delegate); |
| 698 |
| 699 EXPECT_TRUE(stream->GetUrlFromHeaders().is_empty()); |
| 700 |
| 701 SpdyHeaderBlock headers(spdy_util_.ConstructGetHeaderBlock(kDefaultUrl)); |
| 702 EXPECT_EQ(ERR_IO_PENDING, stream->SendRequestHeaders(std::move(headers), |
| 703 NO_MORE_DATA_TO_SEND)); |
| 704 EXPECT_EQ(kDefaultUrl, stream->GetUrlFromHeaders().spec()); |
| 705 |
| 706 EXPECT_THAT(delegate.WaitForClose(), IsError(ERR_SPDY_PROTOCOL_ERROR)); |
| 707 |
| 708 EXPECT_TRUE(data.AllWriteDataConsumed()); |
| 709 EXPECT_TRUE(data.AllReadDataConsumed()); |
| 710 } |
| 711 |
| 712 TEST_F(SpdyStreamTest, HeadersMustHaveStatusOnPushedStream) { |
| 658 SpdySerializedFrame req( | 713 SpdySerializedFrame req( |
| 659 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); | 714 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); |
| 660 AddWrite(req); | 715 AddWrite(req); |
| 661 | 716 |
| 662 SpdySerializedFrame reply(spdy_util_.ConstructSpdyGetReply(nullptr, 0, 1)); | 717 SpdySerializedFrame reply(spdy_util_.ConstructSpdyGetReply(nullptr, 0, 1)); |
| 663 AddRead(reply); | 718 AddRead(reply); |
| 664 | 719 |
| 665 SpdySerializedFrame push( | 720 SpdySerializedFrame push_promise(spdy_util_.ConstructInitialSpdyPushFrame( |
| 666 spdy_util_.ConstructSpdyPush(nullptr, 0, 2, 1, kPushUrl)); | 721 spdy_util_.ConstructGetHeaderBlock(kPushUrl), 2, 1)); |
| 667 AddRead(push); | 722 AddRead(push_promise); |
| 668 | 723 |
| 669 AddReadPause(); | 724 // Response headers without ":status" header field: protocol error. |
| 670 | 725 SpdyHeaderBlock header_block_without_status; |
| 671 SpdyHeaderBlock late_headers; | 726 header_block_without_status[spdy_util_.GetMethodKey()] = "GET"; |
| 672 late_headers["X-UpperCase"] = "yes"; | 727 header_block_without_status[spdy_util_.GetHostKey()] = "www.example.org"; |
| 673 SpdySerializedFrame headers_frame( | 728 header_block_without_status[spdy_util_.GetSchemeKey()] = "https"; |
| 674 spdy_util_.ConstructSpdyReply(2, std::move(late_headers))); | 729 header_block_without_status[spdy_util_.GetPathKey()] = "/"; |
| 675 AddRead(headers_frame); | 730 SpdySerializedFrame pushed_reply( |
| 676 | 731 spdy_util_.ConstructSpdyReply(2, std::move(header_block_without_status))); |
| 677 AddWritePause(); | 732 AddRead(pushed_reply); |
| 678 | 733 |
| 679 SpdySerializedFrame rst( | 734 SpdySerializedFrame rst( |
| 680 spdy_util_.ConstructSpdyRstStream(2, RST_STREAM_PROTOCOL_ERROR)); | 735 spdy_util_.ConstructSpdyRstStream(2, RST_STREAM_PROTOCOL_ERROR)); |
| 681 AddWrite(rst); | 736 AddWrite(rst); |
| 682 | 737 |
| 738 SpdySerializedFrame body( |
| 739 spdy_util_.ConstructSpdyDataFrame(1, kPostBody, kPostBodyLength, true)); |
| 740 AddRead(body); |
| 741 |
| 683 AddReadEOF(); | 742 AddReadEOF(); |
| 684 | 743 |
| 685 SequencedSocketData data(GetReads(), GetNumReads(), GetWrites(), | 744 SequencedSocketData data(GetReads(), GetNumReads(), GetWrites(), |
| 686 GetNumWrites()); | 745 GetNumWrites()); |
| 687 MockConnect connect_data(SYNCHRONOUS, OK); | 746 MockConnect connect_data(SYNCHRONOUS, OK); |
| 688 data.set_connect_data(connect_data); | 747 data.set_connect_data(connect_data); |
| 689 session_deps_.socket_factory->AddSocketDataProvider(&data); | 748 session_deps_.socket_factory->AddSocketDataProvider(&data); |
| 690 | 749 |
| 691 AddSSLSocketData(); | 750 AddSSLSocketData(); |
| 692 | 751 |
| 693 base::WeakPtr<SpdySession> session(CreateDefaultSpdySession()); | 752 base::WeakPtr<SpdySession> session(CreateDefaultSpdySession()); |
| 694 | 753 |
| 695 base::WeakPtr<SpdyStream> stream = CreateStreamSynchronously( | 754 base::WeakPtr<SpdyStream> stream = CreateStreamSynchronously( |
| 696 SPDY_REQUEST_RESPONSE_STREAM, session, url_, LOWEST, NetLogWithSource()); | 755 SPDY_REQUEST_RESPONSE_STREAM, session, url_, LOWEST, NetLogWithSource()); |
| 697 ASSERT_TRUE(stream); | 756 ASSERT_TRUE(stream); |
| 698 | 757 |
| 699 StreamDelegateDoNothing delegate(stream); | 758 StreamDelegateDoNothing delegate(stream); |
| 700 stream->SetDelegate(&delegate); | 759 stream->SetDelegate(&delegate); |
| 701 | 760 |
| 702 EXPECT_TRUE(stream->GetUrlFromHeaders().is_empty()); | 761 EXPECT_TRUE(stream->GetUrlFromHeaders().is_empty()); |
| 703 | 762 |
| 704 SpdyHeaderBlock headers(spdy_util_.ConstructGetHeaderBlock(kDefaultUrl)); | 763 SpdyHeaderBlock headers(spdy_util_.ConstructGetHeaderBlock(kDefaultUrl)); |
| 705 EXPECT_THAT( | 764 EXPECT_THAT( |
| 706 stream->SendRequestHeaders(std::move(headers), NO_MORE_DATA_TO_SEND), | 765 stream->SendRequestHeaders(std::move(headers), NO_MORE_DATA_TO_SEND), |
| 707 IsError(ERR_IO_PENDING)); | 766 IsError(ERR_IO_PENDING)); |
| 708 EXPECT_EQ(kDefaultUrl, stream->GetUrlFromHeaders().spec()); | 767 EXPECT_EQ(kDefaultUrl, stream->GetUrlFromHeaders().spec()); |
| 709 | 768 |
| 710 data.RunUntilPaused(); | 769 EXPECT_THAT(delegate.WaitForClose(), IsOk()); |
| 770 EXPECT_EQ("200", delegate.GetResponseHeaderValue(spdy_util_.GetStatusKey())); |
| 771 EXPECT_EQ(std::string(kPostBody, kPostBodyLength), |
| 772 delegate.TakeReceivedData()); |
| 711 | 773 |
| 712 base::WeakPtr<SpdyStream> push_stream; | 774 EXPECT_TRUE(data.AllWriteDataConsumed()); |
| 713 EXPECT_THAT( | 775 EXPECT_TRUE(data.AllReadDataConsumed()); |
| 714 session->GetPushStream(GURL(kPushUrl), &push_stream, NetLogWithSource()), | |
| 715 IsOk()); | |
| 716 EXPECT_TRUE(push_stream); | |
| 717 | |
| 718 data.Resume(); | |
| 719 data.RunUntilPaused(); | |
| 720 | |
| 721 EXPECT_THAT( | |
| 722 session->GetPushStream(GURL(kPushUrl), &push_stream, NetLogWithSource()), | |
| 723 IsOk()); | |
| 724 EXPECT_FALSE(push_stream); | |
| 725 | |
| 726 data.Resume(); | |
| 727 | |
| 728 EXPECT_THAT(delegate.WaitForClose(), IsError(ERR_CONNECTION_CLOSED)); | |
| 729 } | 776 } |
| 730 | 777 |
| 731 // Receiving a duplicate header in a HEADERS frame should result in a protocol | 778 TEST_F(SpdyStreamTest, HeadersMustPreceedData) { |
| 732 // error. | |
| 733 TEST_F(SpdyStreamTest, DuplicateHeaders) { | |
| 734 SpdySerializedFrame req( | 779 SpdySerializedFrame req( |
| 735 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); | 780 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); |
| 736 AddWrite(req); | 781 AddWrite(req); |
| 782 |
| 783 // Response body not preceeded by headers: protocol error. |
| 784 SpdySerializedFrame body( |
| 785 spdy_util_.ConstructSpdyDataFrame(1, kPostBody, kPostBodyLength, true)); |
| 786 AddRead(body); |
| 787 |
| 788 SpdySerializedFrame rst( |
| 789 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_PROTOCOL_ERROR)); |
| 790 AddWrite(rst); |
| 791 |
| 792 AddReadEOF(); |
| 793 |
| 794 SequencedSocketData data(GetReads(), GetNumReads(), GetWrites(), |
| 795 GetNumWrites()); |
| 796 MockConnect connect_data(SYNCHRONOUS, OK); |
| 797 data.set_connect_data(connect_data); |
| 798 session_deps_.socket_factory->AddSocketDataProvider(&data); |
| 799 |
| 800 AddSSLSocketData(); |
| 801 |
| 802 base::WeakPtr<SpdySession> session(CreateDefaultSpdySession()); |
| 803 |
| 804 base::WeakPtr<SpdyStream> stream = CreateStreamSynchronously( |
| 805 SPDY_REQUEST_RESPONSE_STREAM, session, url_, LOWEST, NetLogWithSource()); |
| 806 ASSERT_TRUE(stream); |
| 807 |
| 808 StreamDelegateDoNothing delegate(stream); |
| 809 stream->SetDelegate(&delegate); |
| 810 |
| 811 EXPECT_TRUE(stream->GetUrlFromHeaders().is_empty()); |
| 812 |
| 813 SpdyHeaderBlock headers(spdy_util_.ConstructGetHeaderBlock(kDefaultUrl)); |
| 814 EXPECT_EQ(ERR_IO_PENDING, stream->SendRequestHeaders(std::move(headers), |
| 815 NO_MORE_DATA_TO_SEND)); |
| 816 EXPECT_EQ(kDefaultUrl, stream->GetUrlFromHeaders().spec()); |
| 817 |
| 818 EXPECT_THAT(delegate.WaitForClose(), IsError(ERR_SPDY_PROTOCOL_ERROR)); |
| 819 } |
| 820 |
| 821 TEST_F(SpdyStreamTest, HeadersMustPreceedDataOnPushedStream) { |
| 822 SpdySerializedFrame req( |
| 823 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); |
| 824 AddWrite(req); |
| 737 | 825 |
| 738 SpdySerializedFrame reply(spdy_util_.ConstructSpdyGetReply(nullptr, 0, 1)); | 826 SpdySerializedFrame reply(spdy_util_.ConstructSpdyGetReply(nullptr, 0, 1)); |
| 739 AddRead(reply); | 827 AddRead(reply); |
| 740 | 828 |
| 741 SpdySerializedFrame push( | 829 SpdySerializedFrame push_promise(spdy_util_.ConstructInitialSpdyPushFrame( |
| 742 spdy_util_.ConstructSpdyPush(nullptr, 0, 2, 1, kPushUrl)); | 830 spdy_util_.ConstructGetHeaderBlock(kPushUrl), 2, 1)); |
| 743 AddRead(push); | 831 AddRead(push_promise); |
| 744 | 832 |
| 745 AddReadPause(); | 833 SpdySerializedFrame pushed_body( |
| 746 | 834 spdy_util_.ConstructSpdyDataFrame(2, kPostBody, kPostBodyLength, true)); |
| 747 SpdyHeaderBlock late_headers; | 835 AddRead(pushed_body); |
| 748 late_headers[spdy_util_.GetStatusKey()] = "500 Server Error"; | |
| 749 SpdySerializedFrame headers_frame( | |
| 750 spdy_util_.ConstructSpdyReply(2, std::move(late_headers))); | |
| 751 AddRead(headers_frame); | |
| 752 | |
| 753 AddReadPause(); | |
| 754 | 836 |
| 755 SpdySerializedFrame rst( | 837 SpdySerializedFrame rst( |
| 756 spdy_util_.ConstructSpdyRstStream(2, RST_STREAM_PROTOCOL_ERROR)); | 838 spdy_util_.ConstructSpdyRstStream(2, RST_STREAM_PROTOCOL_ERROR)); |
| 757 AddWrite(rst); | 839 AddWrite(rst); |
| 758 | 840 |
| 841 SpdySerializedFrame body( |
| 842 spdy_util_.ConstructSpdyDataFrame(1, kPostBody, kPostBodyLength, true)); |
| 843 AddRead(body); |
| 844 |
| 759 AddReadEOF(); | 845 AddReadEOF(); |
| 760 | 846 |
| 761 SequencedSocketData data(GetReads(), GetNumReads(), GetWrites(), | 847 SequencedSocketData data(GetReads(), GetNumReads(), GetWrites(), |
| 762 GetNumWrites()); | 848 GetNumWrites()); |
| 763 MockConnect connect_data(SYNCHRONOUS, OK); | 849 MockConnect connect_data(SYNCHRONOUS, OK); |
| 764 data.set_connect_data(connect_data); | 850 data.set_connect_data(connect_data); |
| 765 session_deps_.socket_factory->AddSocketDataProvider(&data); | 851 session_deps_.socket_factory->AddSocketDataProvider(&data); |
| 766 | 852 |
| 767 AddSSLSocketData(); | 853 AddSSLSocketData(); |
| 768 | 854 |
| 769 base::WeakPtr<SpdySession> session(CreateDefaultSpdySession()); | 855 base::WeakPtr<SpdySession> session(CreateDefaultSpdySession()); |
| 770 | 856 |
| 771 base::WeakPtr<SpdyStream> stream = CreateStreamSynchronously( | 857 base::WeakPtr<SpdyStream> stream = CreateStreamSynchronously( |
| 772 SPDY_REQUEST_RESPONSE_STREAM, session, url_, LOWEST, NetLogWithSource()); | 858 SPDY_REQUEST_RESPONSE_STREAM, session, url_, LOWEST, NetLogWithSource()); |
| 773 ASSERT_TRUE(stream); | 859 ASSERT_TRUE(stream); |
| 774 | 860 |
| 775 StreamDelegateDoNothing delegate(stream); | 861 StreamDelegateDoNothing delegate(stream); |
| 776 stream->SetDelegate(&delegate); | 862 stream->SetDelegate(&delegate); |
| 777 | 863 |
| 778 EXPECT_TRUE(stream->GetUrlFromHeaders().is_empty()); | 864 EXPECT_TRUE(stream->GetUrlFromHeaders().is_empty()); |
| 779 | 865 |
| 780 SpdyHeaderBlock headers(spdy_util_.ConstructGetHeaderBlock(kDefaultUrl)); | 866 SpdyHeaderBlock headers(spdy_util_.ConstructGetHeaderBlock(kDefaultUrl)); |
| 781 EXPECT_THAT( | 867 EXPECT_THAT( |
| 782 stream->SendRequestHeaders(std::move(headers), NO_MORE_DATA_TO_SEND), | 868 stream->SendRequestHeaders(std::move(headers), NO_MORE_DATA_TO_SEND), |
| 783 IsError(ERR_IO_PENDING)); | 869 IsError(ERR_IO_PENDING)); |
| 784 EXPECT_EQ(kDefaultUrl, stream->GetUrlFromHeaders().spec()); | 870 EXPECT_EQ(kDefaultUrl, stream->GetUrlFromHeaders().spec()); |
| 785 | 871 |
| 786 data.RunUntilPaused(); | 872 EXPECT_THAT(delegate.WaitForClose(), IsOk()); |
| 873 EXPECT_EQ("200", delegate.GetResponseHeaderValue(spdy_util_.GetStatusKey())); |
| 874 EXPECT_EQ(std::string(kPostBody, kPostBodyLength), |
| 875 delegate.TakeReceivedData()); |
| 787 | 876 |
| 788 base::WeakPtr<SpdyStream> push_stream; | 877 EXPECT_TRUE(data.AllWriteDataConsumed()); |
| 789 EXPECT_THAT( | 878 EXPECT_TRUE(data.AllReadDataConsumed()); |
| 790 session->GetPushStream(GURL(kPushUrl), &push_stream, NetLogWithSource()), | 879 } |
| 791 IsOk()); | |
| 792 EXPECT_TRUE(push_stream); | |
| 793 | 880 |
| 794 data.Resume(); | 881 TEST_F(SpdyStreamTest, TrailersMustNotFollowTrailers) { |
| 795 data.RunUntilPaused(); | 882 SpdySerializedFrame req( |
| 883 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); |
| 884 AddWrite(req); |
| 796 | 885 |
| 797 EXPECT_THAT( | 886 SpdySerializedFrame reply(spdy_util_.ConstructSpdyGetReply(nullptr, 0, 1)); |
| 798 session->GetPushStream(GURL(kPushUrl), &push_stream, NetLogWithSource()), | 887 AddRead(reply); |
| 799 IsOk()); | |
| 800 EXPECT_FALSE(push_stream); | |
| 801 | 888 |
| 802 data.Resume(); | 889 SpdySerializedFrame body( |
| 890 spdy_util_.ConstructSpdyDataFrame(1, kPostBody, kPostBodyLength, false)); |
| 891 AddRead(body); |
| 803 | 892 |
| 804 EXPECT_THAT(delegate.WaitForClose(), IsError(ERR_CONNECTION_CLOSED)); | 893 SpdyHeaderBlock trailers_block; |
| 894 trailers_block["foo"] = "bar"; |
| 895 SpdySerializedFrame first_trailers(spdy_util_.ConstructSpdyResponseHeaders( |
| 896 1, std::move(trailers_block), false)); |
| 897 AddRead(first_trailers); |
| 898 |
| 899 // Trailers following trailers: procotol error. |
| 900 SpdySerializedFrame second_trailers(spdy_util_.ConstructSpdyResponseHeaders( |
| 901 1, std::move(trailers_block), true)); |
| 902 AddRead(second_trailers); |
| 903 |
| 904 SpdySerializedFrame rst( |
| 905 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_PROTOCOL_ERROR)); |
| 906 AddWrite(rst); |
| 907 |
| 908 AddReadEOF(); |
| 909 |
| 910 SequencedSocketData data(GetReads(), GetNumReads(), GetWrites(), |
| 911 GetNumWrites()); |
| 912 MockConnect connect_data(SYNCHRONOUS, OK); |
| 913 data.set_connect_data(connect_data); |
| 914 session_deps_.socket_factory->AddSocketDataProvider(&data); |
| 915 |
| 916 AddSSLSocketData(); |
| 917 |
| 918 base::WeakPtr<SpdySession> session(CreateDefaultSpdySession()); |
| 919 |
| 920 base::WeakPtr<SpdyStream> stream = CreateStreamSynchronously( |
| 921 SPDY_REQUEST_RESPONSE_STREAM, session, url_, LOWEST, NetLogWithSource()); |
| 922 ASSERT_TRUE(stream); |
| 923 |
| 924 StreamDelegateDoNothing delegate(stream); |
| 925 stream->SetDelegate(&delegate); |
| 926 |
| 927 EXPECT_TRUE(stream->GetUrlFromHeaders().is_empty()); |
| 928 |
| 929 SpdyHeaderBlock headers(spdy_util_.ConstructGetHeaderBlock(kDefaultUrl)); |
| 930 EXPECT_EQ(ERR_IO_PENDING, stream->SendRequestHeaders(std::move(headers), |
| 931 NO_MORE_DATA_TO_SEND)); |
| 932 EXPECT_EQ(kDefaultUrl, stream->GetUrlFromHeaders().spec()); |
| 933 |
| 934 EXPECT_THAT(delegate.WaitForClose(), IsError(ERR_SPDY_PROTOCOL_ERROR)); |
| 935 |
| 936 EXPECT_TRUE(data.AllWriteDataConsumed()); |
| 937 EXPECT_TRUE(data.AllReadDataConsumed()); |
| 938 } |
| 939 |
| 940 TEST_F(SpdyStreamTest, DataMustNotFollowTrailers) { |
| 941 SpdySerializedFrame req( |
| 942 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); |
| 943 AddWrite(req); |
| 944 |
| 945 SpdySerializedFrame reply(spdy_util_.ConstructSpdyGetReply(nullptr, 0, 1)); |
| 946 AddRead(reply); |
| 947 |
| 948 SpdySerializedFrame body( |
| 949 spdy_util_.ConstructSpdyDataFrame(1, kPostBody, kPostBodyLength, false)); |
| 950 AddRead(body); |
| 951 |
| 952 SpdyHeaderBlock trailers_block; |
| 953 trailers_block["foo"] = "bar"; |
| 954 SpdySerializedFrame trailers(spdy_util_.ConstructSpdyResponseHeaders( |
| 955 1, std::move(trailers_block), false)); |
| 956 AddRead(trailers); |
| 957 |
| 958 // DATA frame following trailers: protocol error. |
| 959 AddRead(body); |
| 960 |
| 961 SpdySerializedFrame rst( |
| 962 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_PROTOCOL_ERROR)); |
| 963 AddWrite(rst); |
| 964 |
| 965 AddReadEOF(); |
| 966 |
| 967 SequencedSocketData data(GetReads(), GetNumReads(), GetWrites(), |
| 968 GetNumWrites()); |
| 969 MockConnect connect_data(SYNCHRONOUS, OK); |
| 970 data.set_connect_data(connect_data); |
| 971 session_deps_.socket_factory->AddSocketDataProvider(&data); |
| 972 |
| 973 AddSSLSocketData(); |
| 974 |
| 975 base::WeakPtr<SpdySession> session(CreateDefaultSpdySession()); |
| 976 |
| 977 base::WeakPtr<SpdyStream> stream = CreateStreamSynchronously( |
| 978 SPDY_REQUEST_RESPONSE_STREAM, session, url_, LOWEST, NetLogWithSource()); |
| 979 ASSERT_TRUE(stream); |
| 980 |
| 981 StreamDelegateDoNothing delegate(stream); |
| 982 stream->SetDelegate(&delegate); |
| 983 |
| 984 EXPECT_TRUE(stream->GetUrlFromHeaders().is_empty()); |
| 985 |
| 986 SpdyHeaderBlock headers(spdy_util_.ConstructGetHeaderBlock(kDefaultUrl)); |
| 987 EXPECT_EQ(ERR_IO_PENDING, stream->SendRequestHeaders(std::move(headers), |
| 988 NO_MORE_DATA_TO_SEND)); |
| 989 EXPECT_EQ(kDefaultUrl, stream->GetUrlFromHeaders().spec()); |
| 990 |
| 991 EXPECT_THAT(delegate.WaitForClose(), IsError(ERR_SPDY_PROTOCOL_ERROR)); |
| 992 |
| 993 EXPECT_TRUE(data.AllWriteDataConsumed()); |
| 994 EXPECT_TRUE(data.AllReadDataConsumed()); |
| 805 } | 995 } |
| 806 | 996 |
| 807 // Call IncreaseSendWindowSize on a stream with a large enough delta to overflow | 997 // Call IncreaseSendWindowSize on a stream with a large enough delta to overflow |
| 808 // an int32_t. The SpdyStream should handle that case gracefully. | 998 // an int32_t. The SpdyStream should handle that case gracefully. |
| 809 TEST_F(SpdyStreamTest, IncreaseSendWindowSizeOverflow) { | 999 TEST_F(SpdyStreamTest, IncreaseSendWindowSizeOverflow) { |
| 810 SpdySerializedFrame req(spdy_util_.ConstructSpdyPost( | 1000 SpdySerializedFrame req(spdy_util_.ConstructSpdyPost( |
| 811 kDefaultUrl, 1, kPostBodyLength, LOWEST, nullptr, 0)); | 1001 kDefaultUrl, 1, kPostBodyLength, LOWEST, nullptr, 0)); |
| 812 AddWrite(req); | 1002 AddWrite(req); |
| 813 | 1003 |
| 814 AddReadPause(); | 1004 AddReadPause(); |
| (...skipping 297 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1112 EXPECT_EQ(response_len, stream->raw_received_bytes()); | 1302 EXPECT_EQ(response_len, stream->raw_received_bytes()); |
| 1113 | 1303 |
| 1114 // FIN | 1304 // FIN |
| 1115 data.Resume(); | 1305 data.Resume(); |
| 1116 EXPECT_THAT(delegate.WaitForClose(), IsError(ERR_CONNECTION_CLOSED)); | 1306 EXPECT_THAT(delegate.WaitForClose(), IsError(ERR_CONNECTION_CLOSED)); |
| 1117 } | 1307 } |
| 1118 | 1308 |
| 1119 } // namespace test | 1309 } // namespace test |
| 1120 | 1310 |
| 1121 } // namespace net | 1311 } // namespace net |
| OLD | NEW |