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

Side by Side Diff: net/spdy/spdy_stream_unittest.cc

Issue 2526003002: Disallow multiple HEADERS frames on pushed streams. (Closed)
Patch Set: Rename enum, enum entry, and member. Created 4 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « net/spdy/spdy_stream_test_util.cc ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2013 The Chromium Authors. All rights reserved. 1 // Copyright 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "net/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
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
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
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
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
OLDNEW
« no previous file with comments | « net/spdy/spdy_stream_test_util.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698