blob: a6a6e4ae0769f72ed2f7259f87ffcf6a5e8323a5 [file] [log] [blame]
#!/usr/bin/perl
# (C) Maxim Dounin
# (C) Nginx, Inc.
# Tests for charset filter.
###############################################################################
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 charset gzip_static/)->plan(13)
->write_file_expand('nginx.conf', <<'EOF')->run();
%%TEST_GLOBALS%%
daemon off;
events {
}
http {
%%TEST_GLOBALS_HTTP%%
types {
text/html html;
}
charset_map B A {
58 59; # X -> Y
}
server {
listen 127.0.0.1:8080;
server_name localhost;
location /t1 {
charset utf-8;
gzip_static on;
}
location /t2 {
gzip_static on;
charset A;
source_charset B;
}
location /t {
gzip_static on;
}
location /p/ {
charset utf-8;
proxy_pass http://127.0.0.1:8080/;
proxy_http_version 1.1;
}
location /p.ab/ {
charset A;
source_charset B;
proxy_pass http://127.0.0.1:8080/;
proxy_http_version 1.1;
}
location /p.aa/ {
charset A;
source_charset A;
proxy_pass http://127.0.0.1:8080/;
proxy_http_version 1.1;
}
}
}
EOF
$t->write_file('t1.html', '');
$t->write_file('t1.html.gz', '');
my $in = 'X' x 99;
my $out = '';
eval {
require IO::Compress::Gzip;
IO::Compress::Gzip::gzip(\$in => \$out);
};
$t->write_file('t2.html', $in);
$t->write_file('t2.html.gz', $out);
$t->write_file('t.html', '');
$t->write_file('t.html.gz', '');
###############################################################################
# charset filter currently ignores responses with Content-Encoding set
# (except ones with r->ignore_content_encoding used by gzip_static)
# as it can't convert such content; there are two problems though:
#
# - it make sense to indicate charset
# if conversion isn't needed
#
# - gzip_static may need conversion, too
#
# proper solution seems to be to always allow charset indication, but
# don't try to do anything if recoding is needed
like(http_get('/t1.html'), qr!text/html; charset=!, 'plain');
like(http_gzip_request('/t1.html'), qr!text/html; charset=.*gzip!ms, 'gzip');
like(http_get('/t2.html'), qr!text/html; charset=A.*Y{99}!ms, 'recode plain');
like(http_gzip_request('/t2.html'), qr!text/html\x0d.*gzip!ms, 'recode gzip');
http_gzip_like(http_gzip_request('/t2.html'), qr!X{99}!, 'recode content');
like(http_get('/t.html'), qr!text/html\x0d!, 'nocharset plain');
like(http_gzip_request('/t.html'), qr!text/html\x0d.*gzip!ms, 'nocharset gzip');
like(http_get('/p/t.html'), qr!text/html; charset=!, 'proxy plain');
like(http_gzip_request('/p/t.html'), qr!text/html; charset=.*gzip!ms,
'proxy gzip');
like(http_get('/p.ab/t.html'), qr!text/html; charset=A!ms,
'proxy recode plain');
like(http_gzip_request('/p.ab/t.html'), qr!text/html\x0d.*gzip!ms,
'proxy recode gzip');
like(http_get('/p.aa/t.html'), qr!text/html; charset=A!ms,
'proxy nullrecode plain');
like(http_gzip_request('/p.aa/t.html'), qr!text/html; charset=A.*gzip!ms,
'proxy nullrecode gzip');
###############################################################################