| #!/usr/bin/perl | |
| # (C) Andrey Zelenkov | |
| # (C) Nginx, Inc. | |
| # Tests for HTTP/2 protocol with server_tokens directive. | |
| ############################################################################### | |
| use warnings; | |
| use strict; | |
| use Test::More; | |
| BEGIN { use FindBin; chdir($FindBin::Bin); } | |
| use lib 'lib'; | |
| use Test::Nginx; | |
| use Test::Nginx::HTTP2; | |
| ############################################################################### | |
| select STDERR; $| = 1; | |
| select STDOUT; $| = 1; | |
| my $t = Test::Nginx->new()->has(qw/http http_v2 rewrite/) | |
| ->write_file_expand('nginx.conf', <<'EOF'); | |
| %%TEST_GLOBALS%% | |
| daemon off; | |
| events { | |
| } | |
| http { | |
| %%TEST_GLOBALS_HTTP%% | |
| server { | |
| listen 127.0.0.1:8080 http2; | |
| server_name localhost; | |
| location /200 { | |
| return 200; | |
| } | |
| location /404 { | |
| return 404; | |
| } | |
| location /off { | |
| server_tokens off; | |
| location /off/200 { | |
| return 200; | |
| } | |
| location /off/404 { | |
| return 404; | |
| } | |
| } | |
| location /on { | |
| server_tokens on; | |
| location /on/200 { | |
| return 200; | |
| } | |
| location /on/404 { | |
| return 404; | |
| } | |
| } | |
| location /b { | |
| server_tokens build; | |
| location /b/200 { | |
| return 200; | |
| } | |
| location /b/404 { | |
| return 404; | |
| } | |
| } | |
| } | |
| } | |
| EOF | |
| $t->run()->plan(12); | |
| ############################################################################### | |
| my $re = qr/nginx\/\d+\.\d+\.\d+/; | |
| like(header_server('/200'), qr/^$re$/, 'http2 tokens default 200'); | |
| like(header_server('/404'), qr/^$re$/, 'http2 tokens default 404'); | |
| like(body('/404'), qr/$re/, 'http2 tokens default 404 body'); | |
| is(header_server('/off/200'), 'nginx', 'http2 tokens off 200'); | |
| is(header_server('/off/404'), 'nginx', 'http2 tokens off 404'); | |
| like(body('/off/404'), qr/nginx(?!\/)/, 'http2 tokens off 404 body'); | |
| like(header_server('/on/200'), qr/^$re$/, 'http2 tokens on 200'); | |
| like(header_server('/on/404'), qr/^$re$/, 'http2 tokens on 404'); | |
| like(body('/on/404'), $re, 'http2 tokens on 404 body'); | |
| $re = qr/$re \Q($1)\E/ if $t->{_configure_args} =~ /--build=(\S+)/; | |
| like(header_server('/b/200'), qr/^$re$/, 'http2 tokens build 200'); | |
| like(header_server('/b/404'), qr/^$re$/, 'http2 tokens build 404'); | |
| like(body('/b/404'), qr/$re/, 'http2 tokens build 404 body'); | |
| ############################################################################### | |
| sub header_server { | |
| my ($path) = shift; | |
| my $s = Test::Nginx::HTTP2->new(); | |
| my $sid = $s->new_stream({ path => $path }); | |
| my $frames = $s->read(all => [{ sid => $sid, fin => 1 }]); | |
| my ($frame) = grep { $_->{type} eq "HEADERS" } @$frames; | |
| return $frame->{headers}->{'server'}; | |
| } | |
| sub body { | |
| my ($path) = shift; | |
| my $s = Test::Nginx::HTTP2->new(); | |
| my $sid = $s->new_stream({ path => $path }); | |
| my $frames = $s->read(all => [{ sid => $sid, fin => 1 }]); | |
| my ($frame) = grep { $_->{type} eq "DATA" } @$frames; | |
| return $frame->{'data'}; | |
| } | |
| ############################################################################### |