view charset_gzip_static.t @ 605:a77f19282f63

Tests: switched to using headers to test variables in userid.t. Tests might behave incorrectly due to the delay in writing to log. Made tests stricter for different endianness. While here, improved style.
author Andrey Zelenkov <zelenkov@nginx.com>
date Thu, 11 Jun 2015 20:56:19 +0300
parents 907e89fba9c3
children 3ac4036b139d
line wrap: on
line source

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

###############################################################################