You are viewing a plain text version of this content. The canonical link for it is here.
Posted to modperl-cvs@perl.apache.org by st...@apache.org on 2003/03/05 10:13:18 UTC
cvs commit: modperl-2.0/t/filter/TestFilter out_str_reverse.pm
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;