comparison h2_headers.t @ 1653:259dfb223f9a

Tests: compatibility with http2_max_header/field_size removal. Tests are adjusted to equally fit in limits set by both old and new ways: http2_max_header_size / http2_max_field_size and large_client_header_buffers.
author Sergey Kandaurov <pluknet@nginx.com>
date Wed, 10 Feb 2021 15:13:22 +0300
parents 5c96745988c4
children 5ac6efbe5552
comparison
equal deleted inserted replaced
1652:21f511a7f5c3 1653:259dfb223f9a
42 listen 127.0.0.1:8082 http2 sndbuf=128; 42 listen 127.0.0.1:8082 http2 sndbuf=128;
43 server_name localhost; 43 server_name localhost;
44 44
45 http2_max_field_size 128k; 45 http2_max_field_size 128k;
46 http2_max_header_size 128k; 46 http2_max_header_size 128k;
47 large_client_header_buffers 2 64k;
47 48
48 location / { 49 location / {
49 add_header X-Sent-Foo $http_x_foo; 50 add_header X-Sent-Foo $http_x_foo;
50 add_header X-Referer $http_referer; 51 add_header X-Referer $http_referer;
51 return 200; 52 return 200;
91 92
92 server { 93 server {
93 listen 127.0.0.1:8084 http2; 94 listen 127.0.0.1:8084 http2;
94 server_name localhost; 95 server_name localhost;
95 96
96 http2_max_field_size 22; 97 http2_max_field_size 512;
98 large_client_header_buffers 4 512;
97 } 99 }
98 100
99 server { 101 server {
100 listen 127.0.0.1:8085 http2; 102 listen 127.0.0.1:8085 http2;
101 server_name localhost; 103 server_name localhost;
102 104
103 http2_max_header_size 64; 105 http2_max_header_size 512;
106 large_client_header_buffers 1 512;
104 } 107 }
105 108
106 server { 109 server {
107 listen 127.0.0.1:8086 http2; 110 listen 127.0.0.1:8086 http2;
108 server_name localhost; 111 server_name localhost;
121 } 124 }
122 125
123 EOF 126 EOF
124 127
125 $t->run_daemon(\&http_daemon); 128 $t->run_daemon(\&http_daemon);
126 $t->run()->waitforsocket('127.0.0.1:' . port(8083)); 129
130 # suppress deprecation warning
131
132 open OLDERR, ">&", \*STDERR; close STDERR;
133 $t->run();
134 open STDERR, ">&", \*OLDERR;
135
136 $t->waitforsocket('127.0.0.1:' . port(8083));
127 137
128 # file size is slightly beyond initial window size: 2**16 + 80 bytes 138 # file size is slightly beyond initial window size: 2**16 + 80 bytes
129 139
130 $t->write_file('t1.html', 140 $t->write_file('t1.html',
131 join('', map { sprintf "X%04dXXX", $_ } (1 .. 8202))); 141 join('', map { sprintf "X%04dXXX", $_ } (1 .. 8202)));
712 $sid = $s->new_stream({ headers => [ 722 $sid = $s->new_stream({ headers => [
713 { name => ':method', value => 'GET', mode => 0 }, 723 { name => ':method', value => 'GET', mode => 0 },
714 { name => ':scheme', value => 'http', mode => 0 }, 724 { name => ':scheme', value => 'http', mode => 0 },
715 { name => ':path', value => '/t2.html', mode => 1 }, 725 { name => ':path', value => '/t2.html', mode => 1 },
716 { name => ':authority', value => 'localhost', mode => 1 }, 726 { name => ':authority', value => 'localhost', mode => 1 },
717 { name => 'longname10' x 2 . 'x', value => 'value', mode => 2 }]}); 727 { name => 'x' x 511, value => 'value', mode => 2 }]});
718 $frames = $s->read(all => [{ sid => $sid, fin => 1 }]); 728 $frames = $s->read(all => [{ sid => $sid, fin => 1 }]);
719 729
720 ($frame) = grep { $_->{type} eq 'DATA' } @$frames; 730 ($frame) = grep { $_->{type} eq 'DATA' } @$frames;
721 ok($frame, 'field name size less'); 731 ok($frame, 'field name size less');
722 732
723 $sid = $s->new_stream({ headers => [ 733 $sid = $s->new_stream({ headers => [
724 { name => ':method', value => 'GET', mode => 0 }, 734 { name => ':method', value => 'GET', mode => 0 },
725 { name => ':scheme', value => 'http', mode => 0 }, 735 { name => ':scheme', value => 'http', mode => 0 },
726 { name => ':path', value => '/t2.html', mode => 1 }, 736 { name => ':path', value => '/t2.html', mode => 1 },
727 { name => ':authority', value => 'localhost', mode => 1 }, 737 { name => ':authority', value => 'localhost', mode => 1 },
728 { name => 'longname10' x 2 . 'x', value => 'value', mode => 2 }]}); 738 { name => 'x' x 511, value => 'value', mode => 2 }]});
729 $frames = $s->read(all => [{ sid => $sid, fin => 1 }]); 739 $frames = $s->read(all => [{ sid => $sid, fin => 1 }]);
730 740
731 ($frame) = grep { $_->{type} eq 'DATA' } @$frames; 741 ($frame) = grep { $_->{type} eq 'DATA' } @$frames;
732 ok($frame, 'field name size second'); 742 ok($frame, 'field name size second');
733 743
735 $sid = $s->new_stream({ headers => [ 745 $sid = $s->new_stream({ headers => [
736 { name => ':method', value => 'GET', mode => 0 }, 746 { name => ':method', value => 'GET', mode => 0 },
737 { name => ':scheme', value => 'http', mode => 0 }, 747 { name => ':scheme', value => 'http', mode => 0 },
738 { name => ':path', value => '/t2.html', mode => 1 }, 748 { name => ':path', value => '/t2.html', mode => 1 },
739 { name => ':authority', value => 'localhost', mode => 1 }, 749 { name => ':authority', value => 'localhost', mode => 1 },
740 { name => 'longname10' x 2 . 'xx', value => 'value', mode => 2 }]}); 750 { name => 'x' x 512, value => 'value', mode => 2 }]});
741 $frames = $s->read(all => [{ sid => $sid, fin => 1 }]); 751 $frames = $s->read(all => [{ sid => $sid, fin => 1 }]);
742 752
743 ($frame) = grep { $_->{type} eq 'DATA' } @$frames; 753 ($frame) = grep { $_->{type} eq 'DATA' } @$frames;
744 ok($frame, 'field name size equal'); 754 ok($frame, 'field name size equal');
745 755
747 $sid = $s->new_stream({ headers => [ 757 $sid = $s->new_stream({ headers => [
748 { name => ':method', value => 'GET', mode => 0 }, 758 { name => ':method', value => 'GET', mode => 0 },
749 { name => ':scheme', value => 'http', mode => 0 }, 759 { name => ':scheme', value => 'http', mode => 0 },
750 { name => ':path', value => '/t2.html', mode => 1 }, 760 { name => ':path', value => '/t2.html', mode => 1 },
751 { name => ':authority', value => 'localhost', mode => 1 }, 761 { name => ':authority', value => 'localhost', mode => 1 },
752 { name => 'longname10' x 2 . 'xxx', value => 'value', mode => 2 }]}); 762 { name => 'x' x 513, value => 'value', mode => 2 }]});
753 $frames = $s->read(all => [{ sid => $sid, fin => 1 }]); 763 $frames = $s->read(all => [{ sid => $sid, fin => 1 }]);
754 764
755 ($frame) = grep { $_->{type} eq 'DATA' } @$frames; 765 ($frame) = grep { $_->{type} eq 'DATA' } @$frames;
756 is($frame, undef, 'field name size greater'); 766 is($frame, undef, 'field name size greater');
757 767
761 $sid = $s->new_stream({ headers => [ 771 $sid = $s->new_stream({ headers => [
762 { name => ':method', value => 'GET', mode => 0 }, 772 { name => ':method', value => 'GET', mode => 0 },
763 { name => ':scheme', value => 'http', mode => 0 }, 773 { name => ':scheme', value => 'http', mode => 0 },
764 { name => ':path', value => '/t2.html', mode => 1 }, 774 { name => ':path', value => '/t2.html', mode => 1 },
765 { name => ':authority', value => 'localhost', mode => 1 }, 775 { name => ':authority', value => 'localhost', mode => 1 },
766 { name => 'name', value => 'valu5' x 4 . 'x', mode => 2 }]}); 776 { name => 'name', value => 'x' x 511, mode => 2 }]});
767 $frames = $s->read(all => [{ sid => $sid, fin => 1 }]); 777 $frames = $s->read(all => [{ sid => $sid, fin => 1 }]);
768 778
769 ($frame) = grep { $_->{type} eq 'DATA' } @$frames; 779 ($frame) = grep { $_->{type} eq 'DATA' } @$frames;
770 ok($frame, 'field value size less'); 780 ok($frame, 'field value size less');
771 781
773 $sid = $s->new_stream({ headers => [ 783 $sid = $s->new_stream({ headers => [
774 { name => ':method', value => 'GET', mode => 0 }, 784 { name => ':method', value => 'GET', mode => 0 },
775 { name => ':scheme', value => 'http', mode => 0 }, 785 { name => ':scheme', value => 'http', mode => 0 },
776 { name => ':path', value => '/t2.html', mode => 1 }, 786 { name => ':path', value => '/t2.html', mode => 1 },
777 { name => ':authority', value => 'localhost', mode => 1 }, 787 { name => ':authority', value => 'localhost', mode => 1 },
778 { name => 'name', value => 'valu5' x 4 . 'xx', mode => 2 }]}); 788 { name => 'name', value => 'x' x 511, mode => 2 }]});
779 $frames = $s->read(all => [{ sid => $sid, fin => 1 }]); 789 $frames = $s->read(all => [{ sid => $sid, fin => 1 }]);
780 790
781 ($frame) = grep { $_->{type} eq 'DATA' } @$frames; 791 ($frame) = grep { $_->{type} eq 'DATA' } @$frames;
782 ok($frame, 'field value size equal'); 792 ok($frame, 'field value size equal');
783 793
785 $sid = $s->new_stream({ headers => [ 795 $sid = $s->new_stream({ headers => [
786 { name => ':method', value => 'GET', mode => 0 }, 796 { name => ':method', value => 'GET', mode => 0 },
787 { name => ':scheme', value => 'http', mode => 0 }, 797 { name => ':scheme', value => 'http', mode => 0 },
788 { name => ':path', value => '/t2.html', mode => 1 }, 798 { name => ':path', value => '/t2.html', mode => 1 },
789 { name => ':authority', value => 'localhost', mode => 1 }, 799 { name => ':authority', value => 'localhost', mode => 1 },
790 { name => 'name', value => 'valu5' x 4 . 'xxx', mode => 2 }]}); 800 { name => 'name', value => 'x' x 513, mode => 2 }]});
791 $frames = $s->read(all => [{ sid => $sid, fin => 1 }]); 801 $frames = $s->read(all => [{ sid => $sid, fin => 1 }]);
792 802
793 ($frame) = grep { $_->{type} eq 'DATA' } @$frames; 803 ($frame) = grep { $_->{type} eq 'DATA' } @$frames;
794 is($frame, undef, 'field value size greater'); 804 is($frame, undef, 'field value size greater');
795 805
799 $sid = $s->new_stream({ headers => [ 809 $sid = $s->new_stream({ headers => [
800 { name => ':method', value => 'GET', mode => 0 }, 810 { name => ':method', value => 'GET', mode => 0 },
801 { name => ':scheme', value => 'http', mode => 0 }, 811 { name => ':scheme', value => 'http', mode => 0 },
802 { name => ':path', value => '/t2.html', mode => 1 }, 812 { name => ':path', value => '/t2.html', mode => 1 },
803 { name => ':authority', value => 'localhost', mode => 1 }, 813 { name => ':authority', value => 'localhost', mode => 1 },
804 { name => 'longname9', value => 'x', mode => 2 }]}); 814 { name => 'longname', value => 'x' x 450, mode => 2 }]});
805 $frames = $s->read(all => [{ sid => $sid, fin => 1 }]); 815 $frames = $s->read(all => [{ sid => $sid, fin => 1 }]);
806 816
807 ($frame) = grep { $_->{type} eq 'DATA' } @$frames; 817 ($frame) = grep { $_->{type} eq 'DATA' } @$frames;
808 ok($frame, 'header size less'); 818 ok($frame, 'header size less');
809 819
810 $sid = $s->new_stream({ headers => [ 820 $sid = $s->new_stream({ headers => [
811 { name => ':method', value => 'GET', mode => 0 }, 821 { name => ':method', value => 'GET', mode => 0 },
812 { name => ':scheme', value => 'http', mode => 0 }, 822 { name => ':scheme', value => 'http', mode => 0 },
813 { name => ':path', value => '/t2.html', mode => 1 }, 823 { name => ':path', value => '/t2.html', mode => 1 },
814 { name => ':authority', value => 'localhost', mode => 1 }, 824 { name => ':authority', value => 'localhost', mode => 1 },
815 { name => 'longname9', value => 'x', mode => 2 }]}); 825 { name => 'longname', value => 'x' x 450, mode => 2 }]});
816 $frames = $s->read(all => [{ sid => $sid, fin => 1 }]); 826 $frames = $s->read(all => [{ sid => $sid, fin => 1 }]);
817 827
818 ($frame) = grep { $_->{type} eq 'DATA' } @$frames; 828 ($frame) = grep { $_->{type} eq 'DATA' } @$frames;
819 ok($frame, 'header size second'); 829 ok($frame, 'header size second');
820 830
822 $sid = $s->new_stream({ headers => [ 832 $sid = $s->new_stream({ headers => [
823 { name => ':method', value => 'GET', mode => 0 }, 833 { name => ':method', value => 'GET', mode => 0 },
824 { name => ':scheme', value => 'http', mode => 0 }, 834 { name => ':scheme', value => 'http', mode => 0 },
825 { name => ':path', value => '/t2.html', mode => 1 }, 835 { name => ':path', value => '/t2.html', mode => 1 },
826 { name => ':authority', value => 'localhost', mode => 1 }, 836 { name => ':authority', value => 'localhost', mode => 1 },
827 { name => 'longname9', value => 'xx', mode => 2 }]}); 837 { name => 'longname', value => 'x' x 451, mode => 2 }]});
828 $frames = $s->read(all => [{ sid => $sid, fin => 1 }]); 838 $frames = $s->read(all => [{ sid => $sid, fin => 1 }]);
829 839
830 ($frame) = grep { $_->{type} eq 'DATA' } @$frames; 840 ($frame) = grep { $_->{type} eq 'DATA' } @$frames;
831 ok($frame, 'header size equal'); 841 ok($frame, 'header size equal');
832 842
834 $sid = $s->new_stream({ headers => [ 844 $sid = $s->new_stream({ headers => [
835 { name => ':method', value => 'GET', mode => 0 }, 845 { name => ':method', value => 'GET', mode => 0 },
836 { name => ':scheme', value => 'http', mode => 0 }, 846 { name => ':scheme', value => 'http', mode => 0 },
837 { name => ':path', value => '/t2.html', mode => 1 }, 847 { name => ':path', value => '/t2.html', mode => 1 },
838 { name => ':authority', value => 'localhost', mode => 1 }, 848 { name => ':authority', value => 'localhost', mode => 1 },
839 { name => 'longname9', value => 'xxx', mode => 2 }]}); 849 { name => 'longname', value => 'x' x 452, mode => 2 }]});
840 $frames = $s->read(all => [{ sid => $sid, fin => 1 }]); 850 $frames = $s->read(all => [{ sid => $sid, fin => 1 }]);
841 851
842 ($frame) = grep { $_->{type} eq 'DATA' } @$frames; 852 ($frame) = grep { $_->{type} eq 'DATA' } @$frames;
843 is($frame, undef, 'header size greater'); 853 is($frame, undef, 'header size greater');
844 854
849 $sid = $s->new_stream({ headers => [ 859 $sid = $s->new_stream({ headers => [
850 { name => ':method', value => 'GET', mode => 0 }, 860 { name => ':method', value => 'GET', mode => 0 },
851 { name => ':scheme', value => 'http', mode => 0 }, 861 { name => ':scheme', value => 'http', mode => 0 },
852 { name => ':path', value => '/t2.html', mode => 1 }, 862 { name => ':path', value => '/t2.html', mode => 1 },
853 { name => ':authority', value => 'localhost', mode => 1 }, 863 { name => ':authority', value => 'localhost', mode => 1 },
854 { name => 'longname9', value => 'x', mode => 2 }]}); 864 { name => 'longname', value => 'x' x 400, mode => 2 }]});
855 $frames = $s->read(all => [{ sid => $sid, fin => 1 }]); 865 $frames = $s->read(all => [{ sid => $sid, fin => 1 }]);
856 866
857 ($frame) = grep { $_->{type} eq 'DATA' } @$frames; 867 ($frame) = grep { $_->{type} eq 'DATA' } @$frames;
858 ok($frame, 'header size new index'); 868 ok($frame, 'header size new index');
859 869
860 $sid = $s->new_stream({ headers => [ 870 $sid = $s->new_stream({ headers => [
861 { name => ':method', value => 'GET', mode => 0 }, 871 { name => ':method', value => 'GET', mode => 0 },
862 { name => ':scheme', value => 'http', mode => 0 }, 872 { name => ':scheme', value => 'http', mode => 0 },
863 { name => ':path', value => '/t2.html', mode => 1 }, 873 { name => ':path', value => '/t2.html', mode => 1 },
864 { name => ':authority', value => 'localhost', mode => 1 }, 874 { name => ':authority', value => 'localhost', mode => 1 },
865 { name => 'longname9', value => 'x', mode => 0 }]}); 875 { name => 'longname', value => 'x' x 400, mode => 0 }]});
866 $frames = $s->read(all => [{ sid => $sid, fin => 1 }]); 876 $frames = $s->read(all => [{ sid => $sid, fin => 1 }]);
867 877
868 ($frame) = grep { $_->{type} eq 'DATA' } @$frames; 878 ($frame) = grep { $_->{type} eq 'DATA' } @$frames;
869 ok($frame, 'header size indexed'); 879 ok($frame, 'header size indexed');
870 880
871 $sid = $s->new_stream({ headers => [ 881 $sid = $s->new_stream({ headers => [
872 { name => ':method', value => 'GET', mode => 0 }, 882 { name => ':method', value => 'GET', mode => 0 },
873 { name => ':scheme', value => 'http', mode => 0 }, 883 { name => ':scheme', value => 'http', mode => 0 },
874 { name => ':path', value => '/t2.html', mode => 1 }, 884 { name => ':path', value => '/t2.html', mode => 1 },
875 { name => ':authority', value => 'localhost', mode => 1 }, 885 { name => ':authority', value => 'localhost', mode => 1 },
876 { name => 'longname9', value => 'x', mode => 0 }, 886 { name => 'longname', value => 'x' x 400, mode => 0 },
877 { name => 'longname9', value => 'x', mode => 0 }]}); 887 { name => 'longname', value => 'x' x 400, mode => 0 }]});
878 $frames = $s->read(all => [{ sid => $sid, fin => 1 }]); 888 $frames = $s->read(all => [{ sid => $sid, fin => 1 }]);
879 889
880 ($frame) = grep { $_->{type} eq 'GOAWAY' } @$frames; 890 ($frame) = grep { $_->{type} eq 'GOAWAY' } @$frames;
881 is($frame->{code}, 0xb, 'header size indexed greater'); 891 is($frame->{code}, 0xb, 'header size indexed greater');
882 892