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