Mercurial > hg > nginx-tests
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 |