stas 2003/03/05 01:13:18
Modified: t/filter out_str_reverse.t t/filter/TestFilter out_str_reverse.pm Log: the reverse filter is now resistant to upstream filters splitting the data in multiply chunks. (the test now exercises f->ctx and can be used as a good example) Revision Changes Path 1.2 +2 -1 modperl-2.0/t/filter/out_str_reverse.t Index: out_str_reverse.t =================================================================== RCS file: /home/cvs/modperl-2.0/t/filter/out_str_reverse.t,v retrieving revision 1.1 retrieving revision 1.2 diff -u -r1.1 -r1.2 --- out_str_reverse.t 15 Jan 2003 06:47:15 -0000 1.1 +++ out_str_reverse.t 5 Mar 2003 09:13:18 -0000 1.2 @@ -10,9 +10,10 @@ my @data = (join('', 'a'..'z'), join('', 0..9)); my $reversed_data = join '', map { scalar(reverse $_) . "\n" } @data; +my $normal_data = join '', map { $_ . "\n" } @data; #t_debug($reversed_data); my $sig = "Reversed by mod_perl 2.0\n"; -my $expected = join "\n", @data, $sig; +my $expected = $normal_data . $sig; { # test the filtering of the mod_perl response handler 1.2 +26 -9 modperl-2.0/t/filter/TestFilter/out_str_reverse.pm Index: out_str_reverse.pm =================================================================== RCS file: /home/cvs/modperl-2.0/t/filter/TestFilter/out_str_reverse.pm,v retrieving revision 1.1 retrieving revision 1.2 diff -u -r1.1 -r1.2 --- out_str_reverse.pm 15 Jan 2003 06:47:15 -0000 1.1 +++ out_str_reverse.pm 5 Mar 2003 09:13:18 -0000 1.2 @@ -1,5 +1,9 @@ package TestFilter::out_str_reverse; +# this filter tests how the data can be set-aside between filter +# invocations. here we collect a single line (which terminates with a +# new line) before we apply the reversing transformation. + use strict; use warnings FATAL => 'all'; @@ -9,18 +13,29 @@ use Apache::Const -compile => qw(OK M_POST); +use constant BUFF_LEN => 2; + sub handler { - my $filter = shift; + my $f = shift; + #warn "called\n"; - while ($filter->read(my $buffer, 1024)) { - for (split "\n", $buffer) { - $filter->print(scalar reverse $_); - $filter->print("\n"); + my $leftover = $f->ctx; + while ($f->read(my $buffer, BUFF_LEN)) { + #warn "buffer: [$buffer]\n"; + $buffer = $leftover . $buffer if defined $leftover; + $leftover = undef; + while ($buffer =~ /([^\r\n]*)([\r\n]*)/g) { + $leftover = $1, last unless $2; + $f->print(scalar(reverse $1), $2); } } - if ($filter->seen_eos) { - $filter->print("Reversed by mod_perl 2.0\n"); + if ($f->seen_eos) { + $f->print(scalar reverse $leftover) if defined $leftover; + $f->print("Reversed by mod_perl 2.0\n"); + } + else { + $f->ctx($leftover) if defined $leftover; } return Apache::OK; @@ -31,9 +46,11 @@ $r->content_type('text/plain'); + # unbuffer stdout, so we get the data split across several bbs + local $_ = 1; if ($r->method_number == Apache::M_POST) { - my $data = ModPerl::Test::read_post($r); - $r->puts($data); + my $data = ModPerl::Test::read_post($r); + $r->print($_) for grep length $_, split /(.{5})/, $data; } return Apache::OK;