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

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