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