comparison h2_headers.t @ 1522:d8684b300d22

Tests: ignore_invalid_headers, underscores_in_headers directives.
author Sergey Kandaurov <pluknet@nginx.com>
date Fri, 18 Oct 2019 13:33:34 +0300
parents 1220f0055135
children 6c9e3e20af97
comparison
equal deleted inserted replaced
1521:b6699ffd9ddd 1522:d8684b300d22
1 #!/usr/bin/perl 1 #!/usr/bin/perl
2 2
3 # (C) Sergey Kandaurov 3 # (C) Sergey Kandaurov
4 # (C) Nginx, Inc. 4 # (C) Nginx, Inc.
5 5
6 # Tests for HTTP/2 protocol with headers. 6 # Tests for HTTP/2 headers.
7 # various HEADERS compression/encoding, see hpack() for mode details.
8 7
9 ############################################################################### 8 ###############################################################################
10 9
11 use warnings; 10 use warnings;
12 use strict; 11 use strict;
22 ############################################################################### 21 ###############################################################################
23 22
24 select STDERR; $| = 1; 23 select STDERR; $| = 1;
25 select STDOUT; $| = 1; 24 select STDOUT; $| = 1;
26 25
27 my $t = Test::Nginx->new()->has(qw/http http_v2 proxy rewrite/)->plan(93) 26 my $t = Test::Nginx->new()->has(qw/http http_v2 proxy rewrite/)->plan(97)
28 ->write_file_expand('nginx.conf', <<'EOF'); 27 ->write_file_expand('nginx.conf', <<'EOF');
29 28
30 %%TEST_GLOBALS%% 29 %%TEST_GLOBALS%%
31 30
32 daemon off; 31 daemon off;
101 listen 127.0.0.1:8085 http2; 100 listen 127.0.0.1:8085 http2;
102 server_name localhost; 101 server_name localhost;
103 102
104 http2_max_header_size 64; 103 http2_max_header_size 64;
105 } 104 }
105
106 server {
107 listen 127.0.0.1:8086 http2;
108 server_name localhost;
109
110 underscores_in_headers on;
111 add_header X-Sent-Foo $http_x_foo always;
112 }
113
114 server {
115 listen 127.0.0.1:8087 http2;
116 server_name localhost;
117
118 ignore_invalid_headers off;
119 add_header X-Sent-Foo $http_x_foo always;
120 }
106 } 121 }
107 122
108 EOF 123 EOF
109 124
110 $t->run_daemon(\&http_daemon); 125 $t->run_daemon(\&http_daemon);
949 $frames = $s->read(all => [{ type => 'HEADERS' }]); 964 $frames = $s->read(all => [{ type => 'HEADERS' }]);
950 965
951 ($frame) = grep { $_->{type} eq "HEADERS" } @$frames; 966 ($frame) = grep { $_->{type} eq "HEADERS" } @$frames;
952 is($frame->{headers}->{'x-referer'}, 'see-this', 'after invalid header name'); 967 is($frame->{headers}->{'x-referer'}, 'see-this', 'after invalid header name');
953 968
969 # other invalid header name characters as seen with ':' result in RST_STREAM
970
971 $s = Test::Nginx::HTTP2->new();
972 $sid = $s->new_stream({ headers => [
973 { name => ':method', value => 'GET', mode => 0 },
974 { name => ':scheme', value => 'http', mode => 0 },
975 { name => ':path', value => '/', mode => 0 },
976 { name => ':authority', value => 'localhost', mode => 1 },
977 { name => 'x:foo', value => "x-bar", mode => 2 },
978 { name => 'referer', value => "see-this", mode => 1 }]});
979 $frames = $s->read(all => [{ type => 'RST_STREAM' }]);
980
981 ($frame) = grep { $_->{type} eq "RST_STREAM" } @$frames;
982 is($frame->{sid}, $sid, 'colon in header name - RST_STREAM sid');
983 is($frame->{code}, 1, 'colon in header name - RST_STREAM code');
984
985 # header name with underscore - underscores_in_headers on
986
987 $s = Test::Nginx::HTTP2->new(port(8086));
988 $sid = $s->new_stream({ headers => [
989 { name => ':method', value => 'GET', mode => 0 },
990 { name => ':scheme', value => 'http', mode => 0 },
991 { name => ':path', value => '/', mode => 0 },
992 { name => ':authority', value => 'localhost', mode => 1 },
993 { name => 'x_foo', value => "x-bar", mode => 2 },
994 { name => 'referer', value => "see-this", mode => 1 }]});
995 $frames = $s->read(all => [{ type => 'HEADERS' }]);
996
997 ($frame) = grep { $_->{type} eq "HEADERS" } @$frames;
998 is($frame->{headers}->{'x-sent-foo'}, 'x-bar',
999 'underscore in header name - underscores_in_headers');
1000
1001 # header name with underscore - ignore_invalid_headers off
1002
1003 $s = Test::Nginx::HTTP2->new(port(8087));
1004 $sid = $s->new_stream({ headers => [
1005 { name => ':method', value => 'GET', mode => 0 },
1006 { name => ':scheme', value => 'http', mode => 0 },
1007 { name => ':path', value => '/', mode => 0 },
1008 { name => ':authority', value => 'localhost', mode => 1 },
1009 { name => 'x_foo', value => "x-bar", mode => 2 },
1010 { name => 'referer', value => "see-this", mode => 1 }]});
1011 $frames = $s->read(all => [{ type => 'HEADERS' }]);
1012
1013 ($frame) = grep { $_->{type} eq "HEADERS" } @$frames;
1014 is($frame->{headers}->{'x-sent-foo'}, 'x-bar',
1015 'underscore in header name - ignore_invalid_headers');
1016
954 # missing mandatory request header ':scheme' 1017 # missing mandatory request header ':scheme'
955 1018
956 $s = Test::Nginx::HTTP2->new(); 1019 $s = Test::Nginx::HTTP2->new();
957 $sid = $s->new_stream({ headers => [ 1020 $sid = $s->new_stream({ headers => [
958 { name => ':method', value => 'GET', mode => 0 }, 1021 { name => ':method', value => 'GET', mode => 0 },