| #!/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'}; |
| } |
| |
| ############################################################################### |