blob: 06733e593740de1d347fe90e138aa52986408337 [file] [log] [blame]
#!/usr/bin/env perl
# (C) Maxim Dounin
# Tests for location selection on win32.
###############################################################################
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 => 'not win32')
if $^O ne 'MSWin32' && $^O ne 'msys';
my $t = Test::Nginx->new()->has(qw/http rewrite/)->plan(19)
->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;
location / {
add_header X-Location root;
return 204;
}
location /directory/ {
add_header X-Location directory;
return 204;
}
location /direct~1 {
}
location = /file {
add_header X-Location file;
return 204;
}
}
}
EOF
$t->run();
my $d = $t->testdir();
mkdir("$d/directory");
$t->write_file('directory/file', 'SEE-THIS');
###############################################################################
like(http_get('/x'), qr/X-Location: root/, 'root');
# these all are mapped to "/directory/"
like(http_get('/directory/'), qr/X-Location: directory/, 'directory');
like(http_get('/Directory/'), qr/X-Location: directory/, 'directory caseless');
like(http_get('/directory./'), qr/X-Location: directory/, 'directory dot');
like(http_get('/directory.%2ffile'), qr/X-Location: directory/,
'directory dot encoded slash');
like(http_get('/directory::$index_allocation/'),
qr/X-Location: directory|400 Bad/,
'directory stream');
like(http_get('/directory::$index_allocation./'),
qr/X-Location: directory|400 Bad/,
'directory stream dot');
like(http_get('/directory:$i30:$index_allocation./'),
qr/X-Location: directory|400 Bad/,
'directory i30 stream dot');
# these looks similar, but shouldn't be mapped to "/directory/"
like(http_get('/directory../'), qr/X-Location: root/, 'directory dot dot');
like(http_get('/directory.::$index_allocation/'), qr/X-Location: root|400 Bad/,
'directory dot stream');
# short name, should be rejected
unlike(http_get('/direct~1/file'), qr/SEE-THIS/, 'short name');
unlike(http_get('/direct~1./file'), qr/SEE-THIS/, 'short name dot');
unlike(http_get('/direct~1::$index_allocation./file'), qr/SEE-THIS/,
'short name stream dot');
unlike(http_get('/direct~1.::$index_allocation/file'), qr/SEE-THIS/,
'short name dot stream');
# these should be mapped to /file
like(http_get('/file'), qr/X-Location: file/, 'file');
like(http_get('/file.'), qr/X-Location: file/, 'file dot');
like(http_get('/file..'), qr/X-Location: file/, 'file dot dot');
like(http_get('/file%20.%20.'), qr/X-Location: file/, 'file dots and spaces');
like(http_get('/file::$data..'), qr/X-Location: file|400 Bad/,
'file stream dot dot');
###############################################################################