The London Perl and Raku Workshop takes place on 26th Oct 2024. If your company depends on Perl, please consider sponsoring and/or attending.
# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*-
package TestModperl::post_utf8;

use strict;
use warnings FATAL => 'all';

use Apache::Test;
use Apache::TestUtil;
use Apache::TestTrace;

use Apache2::RequestRec ();
use Apache2::RequestIO ();
use APR::Table ();

use TestCommon::Utils ();

use Apache2::Const -compile => 'OK';

my $expected_ascii = "I love you, (why lying?), but I belong to another";
my $expected_utf8  = "\x{042F} \x{0432}\x{0430}\x{0441} \x{043B}\x{044E}" .
    "\x{0431}\x{043B}\x{044E} (\x{043A} \x{0447}\x{0435}\x{043C}\x{0443} " .
    "\x{043B}\x{0443}\x{043A}\x{0430}\x{0432}\x{0438}\x{0442}\x{044C}?),\n" .
    "\x{041D}\x{043E} \x{044F} \x{0434}\x{0440}\x{0443}\x{0433}\x{043E}" .
    "\x{043C}\x{0443} \x{043E}\x{0442}\x{0434}\x{0430}\x{043D}\x{0430};";

sub handler {
    my $r = shift;

#    # visual debug, e.g. in lynx/mozilla
#    $r->content_type("text/plain; charset=utf-8");
#    $r->print("expected: $expected_utf8\n");

    # utf encode/decode was added only in 5.8.0
    # XXX: currently binmode is only available with perlio (used on the
    # server side on the tied/perlio STDOUT)
    plan $r, tests => 2,
        need need_min_perl_version(5.008), need_perl('perlio');

    my $received = TestCommon::Utils::read_post($r) || "";

    # workaround for perl-5.8.0, which doesn't decode correctly a
    # tainted variable
    require ModPerl::Util;
    ModPerl::Util::untaint($received) if $] == 5.008;

    # assume that we know that it's utf8
    require Encode; # since 5.8.0
    $received = Encode::decode('utf8', $received);
    # utf8::decode() doesn't work under -T
    my ($received_ascii, $received_utf8) = split /=/, $received;

    ok t_cmp($received_ascii, $expected_ascii, "ascii");

    ok $expected_utf8 eq $received_utf8;
    # if you want to see the utf8 data run with:
    # t/TEST -trace=debug -v modperl/post_utf8
    # and look for this data in t/logs/error_log
    # needed for sending utf-8 to STDERR for debug
    binmode(STDERR, ':utf8');
    debug "expected: $expected_utf8";
    debug "received: $received_utf8";

    Apache2::Const::OK;
}

1;
__END__
SetHandler perl-script