Mercurial > hg > nginx-tests
changeset 1828:835630547d35
Tests: dav tests with UTF-8.
author | Sergey Kandaurov <pluknet@nginx.com> |
---|---|
date | Tue, 21 Mar 2023 14:20:54 +0400 |
parents | 1b53142f7fdc |
children | a78c32419f02 |
files | dav_utf8.t |
diffstat | 1 files changed, 170 insertions(+), 0 deletions(-) [+] |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/dav_utf8.t Tue Mar 21 14:20:54 2023 +0400 @@ -0,0 +1,170 @@ +#!/usr/bin/perl + +# (C) Sergey Kandaurov +# (C) Nginx, Inc. + +# Tests for nginx dav module with utf8 encoded names. + +############################################################################### + +use warnings; +use strict; + +use Test::More; + +use Encode qw/ encode /; + +BEGIN { use FindBin; chdir($FindBin::Bin); } + +use lib 'lib'; +use Test::Nginx; + +############################################################################### + +select STDERR; $| = 1; +select STDOUT; $| = 1; + +eval { require Win32API::File if $^O eq 'MSWin32'; }; +plan(skip_all => 'Win32API::File not installed') if $@; + +my $t = Test::Nginx->new()->has(qw/http dav/)->plan(16); + +$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; + + location / { + dav_methods PUT DELETE MKCOL COPY MOVE; + } + } +} + +EOF + +$t->run(); + +############################################################################### + +local $TODO = 'not yet' if $^O eq 'MSWin32' and !$t->has_version('1.23.4'); + +my $d = $t->testdir(); +my $r; + +my $file = "file-%D0%BC%D0%B8"; +my $file_path = "file-\x{043c}\x{0438}"; + +$r = http(<<EOF . '0123456789'); +PUT /$file HTTP/1.1 +Host: localhost +Connection: close +Content-Length: 10 + +EOF + +like($r, qr/201 Created.*(Content-Length|\x0d\0a0\x0d\x0a)/ms, 'put file'); +ok(fileexists("$d/$file_path"), 'put file exist'); + +$r = http(<<EOF); +COPY /$file HTTP/1.1 +Host: localhost +Destination: /$file-moved +Connection: close + +EOF + +like($r, qr/204 No Content/, 'copy file'); +ok(fileexists("$d/$file_path-moved"), 'copy file exist'); + +$r = http(<<EOF); +MOVE /$file HTTP/1.1 +Host: localhost +Destination: /$file-moved +Connection: close + +EOF + +like($r, qr/204 No Content/, 'move file'); +ok(!fileexists("$d/$file_path"), 'file moved'); + +$r = http(<<EOF); +DELETE /$file-moved HTTP/1.1 +Host: localhost +Connection: close +Content-Length: 0 + +EOF + +like($r, qr/204 No Content/, 'delete file'); +ok(!fileexists("$d/$file_path-moved"), 'file deleted'); + +my $dir = "dir-%D0%BC%D0%B8"; +my $dir_path = "dir-\x{043c}\x{0438}"; + +$r = http(<<EOF); +MKCOL /$dir/ HTTP/1.1 +Host: localhost +Connection: close + +EOF + +like($r, qr/201 Created.*(Content-Length|\x0d\0a0\x0d\x0a)/ms, 'mkcol'); +ok(fileexists("$d/$dir_path"), 'mkcol exist'); + +$r = http(<<EOF); +COPY /$dir/ HTTP/1.1 +Host: localhost +Destination: /$dir-moved/ +Connection: close + +EOF + +like($r, qr/201 Created.*(Content-Length|\x0d\0a0\x0d\x0a)/ms, 'copy dir'); +ok(fileexists("$d/$dir_path-moved"), 'copy dir exist'); + +$r = http(<<EOF); +MOVE /$dir/ HTTP/1.1 +Host: localhost +Destination: /$dir-moved/ +Connection: close + +EOF + +like($r, qr/201 Created.*(Content-Length|\x0d\0a0\x0d\x0a)/ms, 'move dir'); +ok(!fileexists("$d/$dir_path"), 'dir moved'); + +$r = http(<<EOF); +DELETE /$dir-moved/ HTTP/1.1 +Host: localhost +Connection: close + +EOF + +unlike($r, qr/200 OK.*Content-Length|Transfer-Encoding/ms, 'delete dir'); +ok(!fileexists("$d/$dir_path-moved"), 'dir deleted'); + +############################################################################### + +sub fileexists { + my ($path) = @_; + + return -e $path if $^O ne 'MSWin32'; + + $path = encode("UTF-16LE", $path . "\0"); + my $attr = Win32API::File::GetFileAttributesW($path); + return 0 if $attr == Win32API::File::INVALID_HANDLE_VALUE(); + return $attr; +} + +###############################################################################