-
Notifications
You must be signed in to change notification settings - Fork 69
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
37 changed files
with
6,684 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,111 @@ | ||
#!/usr/bin/perl | ||
|
||
# (C) Andrey Zelenkov | ||
# (C) Nginx, Inc. | ||
# (C) 2023 Web Server LLC | ||
|
||
# Tests for http proxy_bind directive. | ||
|
||
############################################################################### | ||
|
||
use warnings; | ||
use strict; | ||
|
||
use Test::More; | ||
|
||
BEGIN { use FindBin; chdir($FindBin::Bin); } | ||
|
||
use lib 'lib'; | ||
use Test::Nginx; | ||
|
||
############################################################################### | ||
|
||
select STDERR; $| = 1; | ||
select STDOUT; $| = 1; | ||
|
||
plan(skip_all => 'win32') if $^O eq 'MSWin32'; | ||
plan(skip_all => '127.0.0.2 local address required') | ||
unless defined IO::Socket::INET->new( LocalAddr => '127.0.0.2' ); | ||
|
||
my $t = Test::Nginx->new()->has(qw/http proxy http_v3/) | ||
->has_daemon("openssl")->plan(5); | ||
|
||
$t->prepare_ssl(); | ||
|
||
$t->write_file_expand('nginx.conf', <<'EOF'); | ||
%%TEST_GLOBALS%% | ||
daemon off; | ||
events { | ||
} | ||
http { | ||
%%TEST_GLOBALS_HTTP%% | ||
server { | ||
listen 127.0.0.1:8080; | ||
server_name localhost; | ||
proxy_bind 127.0.0.2; | ||
location / { | ||
proxy_bind 127.0.0.1; | ||
proxy_pass https://127.0.0.1:%%PORT_8999_UDP%%/; | ||
proxy_http_version 3; | ||
} | ||
location /inherit { | ||
proxy_pass https://127.0.0.1:%%PORT_8999_UDP%%/; | ||
proxy_http_version 3; | ||
} | ||
location /off { | ||
proxy_bind off; | ||
proxy_pass https://127.0.0.1:%%PORT_8999_UDP%%/; | ||
proxy_http_version 3; | ||
} | ||
location /var { | ||
proxy_bind $arg_b; | ||
proxy_pass https://127.0.0.1:%%PORT_8999_UDP%%/; | ||
proxy_http_version 3; | ||
} | ||
location /port { | ||
proxy_bind 127.0.0.2:$remote_port; | ||
proxy_pass https://127.0.0.1:%%PORT_8999_UDP%%/; | ||
proxy_http_version 3; | ||
add_header X-Client-Port $remote_port; | ||
} | ||
} | ||
server { | ||
ssl_certificate_key localhost.key; | ||
ssl_certificate localhost.crt; | ||
listen 127.0.0.1:%%PORT_8999_UDP%% quic; | ||
server_name localhost; | ||
location / { | ||
add_header X-IP $remote_addr; | ||
add_header X-Port $remote_port; | ||
} | ||
} | ||
} | ||
EOF | ||
|
||
$t->write_file('index.html', ''); | ||
$t->run(); | ||
|
||
############################################################################### | ||
|
||
like(http_get('/'), qr/x-ip: 127.0.0.1/, 'bind'); | ||
like(http_get('/inherit'), qr/x-ip: 127.0.0.2/, 'bind inherit'); | ||
like(http_get('/off'), qr/x-ip: 127.0.0.1/, 'bind off'); | ||
like(http_get('/var?b=127.0.0.2'), qr/x-ip: 127.0.0.2/, 'bind var'); | ||
like(http_get('/port'), qr/port: (\d+)(?!\d).*Port: \1/s, 'bind port'); | ||
|
||
############################################################################### |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,153 @@ | ||
#!/usr/bin/perl | ||
|
||
# (C) Maxim Dounin | ||
# (C) 2023 Web Server LLC | ||
|
||
# Tests for http proxy cache. | ||
|
||
############################################################################### | ||
|
||
use warnings; | ||
use strict; | ||
|
||
use Test::More; | ||
|
||
BEGIN { use FindBin; chdir($FindBin::Bin); } | ||
|
||
use lib 'lib'; | ||
use Test::Nginx qw/ :DEFAULT :gzip /; | ||
|
||
############################################################################### | ||
|
||
select STDERR; $| = 1; | ||
select STDOUT; $| = 1; | ||
|
||
my $t = Test::Nginx->new()->has(qw/http proxy cache gzip http_v3/) | ||
->has_daemon("openssl")->plan(15); | ||
|
||
$t->prepare_ssl(); | ||
|
||
$t->write_file_expand('nginx.conf', <<'EOF'); | ||
%%TEST_GLOBALS%% | ||
daemon off; | ||
events { | ||
} | ||
http { | ||
%%TEST_GLOBALS_HTTP%% | ||
proxy_cache_path %%TESTDIR%%/cache levels=1:2 | ||
keys_zone=NAME:1m; | ||
server { | ||
listen 127.0.0.1:8080; | ||
server_name localhost; | ||
gzip on; | ||
gzip_min_length 0; | ||
location / { | ||
proxy_pass https://127.0.0.1:%%PORT_8999_UDP%%; | ||
proxy_http_version 3; | ||
proxy_cache NAME; | ||
proxy_cache_valid 200 302 2s; | ||
proxy_cache_valid 301 1d; | ||
proxy_cache_valid any 1m; | ||
proxy_cache_min_uses 1; | ||
proxy_cache_use_stale error timeout invalid_header http_500 | ||
http_404; | ||
proxy_no_cache $arg_e; | ||
add_header X-Cache-Status $upstream_cache_status; | ||
} | ||
} | ||
server { | ||
ssl_certificate_key localhost.key; | ||
ssl_certificate localhost.crt; | ||
listen 127.0.0.1:%%PORT_8999_UDP%% quic; | ||
server_name localhost; | ||
location / { | ||
limit_rate 512; | ||
} | ||
} | ||
} | ||
EOF | ||
|
||
$t->write_file('t.html', 'SEE-THIS'); | ||
$t->write_file('t2.html', 'SEE-THIS'); | ||
$t->write_file('empty.html', ''); | ||
$t->write_file('big.html', 'x' x 1024); | ||
|
||
$t->run(); | ||
|
||
############################################################################### | ||
|
||
like(http_get('/t.html'), qr/SEE-THIS/, 'proxy request'); | ||
|
||
$t->write_file('t.html', 'NOOP'); | ||
like(http_get('/t.html'), qr/SEE-THIS/, 'proxy request cached'); | ||
|
||
unlike(http_head('/t2.html'), qr/SEE-THIS/, 'head request'); | ||
like(http_get('/t2.html'), qr/SEE-THIS/, 'get after head'); | ||
unlike(http_head('/t2.html'), qr/SEE-THIS/, 'head after get'); | ||
|
||
like(http_head('/empty.html?head'), qr/MISS/, 'empty head first'); | ||
like(http_head('/empty.html?head'), qr/HIT/, 'empty head second'); | ||
|
||
like(http_get_range('/t.html', 'Range: bytes=4-'), qr/^THIS/m, 'cached range'); | ||
like(http_get_range('/t.html', 'Range: bytes=0-2,4-'), qr/^SEE.*^THIS/ms, | ||
'cached multipart range'); | ||
|
||
like(http_get('/empty.html'), qr/MISS/, 'empty get first'); | ||
like(http_get('/empty.html'), qr/HIT/, 'empty get second'); | ||
|
||
select(undef, undef, undef, 3.1); | ||
unlink $t->testdir() . '/t.html'; | ||
like(http_gzip_request('/t.html'), | ||
qr/HTTP.*STALE.*1c\x0d\x0a.{28}\x0d\x0a0\x0d\x0a\x0d\x0a\z/s, | ||
'non-empty get stale'); | ||
|
||
unlink $t->testdir() . '/empty.html'; | ||
like(http_gzip_request('/empty.html'), | ||
qr/HTTP.*STALE.*14\x0d\x0a.{20}\x0d\x0a0\x0d\x0a\x0d\x0a\z/s, | ||
'empty get stale'); | ||
|
||
# no client connection close with response on non-cacheable HEAD requests | ||
# see 545b5e4d83b2 in nginx for detailed explanation | ||
|
||
my $s = http(<<EOF, start => 1); | ||
HEAD /big.html?e=1 HTTP/1.1 | ||
Host: localhost | ||
EOF | ||
|
||
my $r = http_get('/t.html', socket => $s); | ||
|
||
like($r, qr/Connection: keep-alive/, 'non-cacheable head - keepalive'); | ||
like($r, qr/SEE-THIS/, 'non-cacheable head - second'); | ||
|
||
############################################################################### | ||
|
||
sub http_get_range { | ||
my ($url, $extra) = @_; | ||
return http(<<EOF); | ||
GET $url HTTP/1.1 | ||
Host: localhost | ||
Connection: close | ||
$extra | ||
EOF | ||
} | ||
|
||
############################################################################### |
Oops, something went wrong.