stas 2004/03/15 16:59:45
Modified: src/modules/perl modperl_filter.c . Changes Added: t/filter in_str_bin_data.t t/filter/TestFilter in_str_bin_data.pm Log: The filter streaming API print() function, now correctly handles a binary data Revision Changes Path 1.1 modperl-2.0/t/filter/in_str_bin_data.t Index: in_str_bin_data.t =================================================================== use strict; use warnings FATAL => 'all'; use Apache::Test; use Apache::TestRequest; use Apache::TestUtil; plan tests => 4; my $base = "/TestFilter__in_str_bin_data"; my @locations = map {$base . $_ } ('', '_filter'); my $expected = "123\001456\000789"; # test the binary data read/print w/ and w/o pass through filter for my $location (@locations) { my $received = POST_BODY_ASSERT $location, content => $expected; ok t_cmp(length($expected), length($received), "$location binary response length"); ok t_cmp($expected, $received, "$location binary response data"); open my $fh, ">>/tmp/dat" or die $!; print $fh "$received\n"; close $fh; } 1.1 modperl-2.0/t/filter/TestFilter/in_str_bin_data.pm Index: in_str_bin_data.pm =================================================================== package TestFilter::in_str_bin_data; # test that $r->print correctly handles binary data (e.g. doesn't # truncate on "\0" if there is more data after it) use strict; use warnings FATAL => 'all'; use Apache::RequestIO (); use Apache::RequestRec (); use Apache::Filter (); use Apache::TestTrace; use Apache::Const -compile => qw(OK M_POST); sub pass_through { my $f = shift; while ($f->read(my $buffer, 1024)) { debug "read: " . length ($buffer) . "b [$buffer]"; $f->print($buffer); } return Apache::OK; } sub handler { my $r = shift; if ($r->method_number == Apache::M_POST) { my $data = ModPerl::Test::read_post($r); my $length = length $data; debug "pass through $length bytes of $data\n"; $r->print($data); } Apache::OK; } 1; __END__ <NoAutoConfig> PerlModule TestFilter::in_str_bin_data <Location /TestFilter__in_str_bin_data_filter> PerlInputFilterHandler TestFilter::in_str_bin_data::pass_through SetHandler modperl PerlResponseHandler TestFilter::in_str_bin_data </Location> <Location /TestFilter__in_str_bin_data> SetHandler modperl PerlResponseHandler TestFilter::in_str_bin_data </Location> </NoAutoConfig> 1.87 +1 -1 modperl-2.0/src/modules/perl/modperl_filter.c Index: modperl_filter.c =================================================================== RCS file: /home/cvs/modperl-2.0/src/modules/perl/modperl_filter.c,v retrieving revision 1.86 retrieving revision 1.87 diff -u -u -r1.86 -r1.87 --- modperl_filter.c 4 Mar 2004 06:01:07 -0000 1.86 +++ modperl_filter.c 16 Mar 2004 00:59:45 -0000 1.87 @@ -783,7 +783,7 @@ apr_size_t *len) { apr_bucket_alloc_t *ba = filter->f->c->bucket_alloc; - char *copy = apr_pstrndup(filter->pool, buf, *len); + char *copy = apr_pmemdup(filter->pool, buf, *len); apr_bucket *bucket = apr_bucket_transient_create(copy, *len, ba); /* MP_TRACE_f(MP_FUNC, "writing %d bytes: %s\n", *len, copy); */ MP_TRACE_f(MP_FUNC, MP_FILTER_NAME_FORMAT 1.348 +3 -0 modperl-2.0/Changes Index: Changes =================================================================== RCS file: /home/cvs/modperl-2.0/Changes,v retrieving revision 1.347 retrieving revision 1.348 diff -u -u -r1.347 -r1.348 --- Changes 10 Mar 2004 23:19:44 -0000 1.347 +++ Changes 16 Mar 2004 00:59:45 -0000 1.348 @@ -12,6 +12,9 @@ =item 1.99_14-dev +The filter streaming API print() function, now correctly handles a +binary data [Stas] + Fix Registry handlers, not to lose the execution errors, when they include END blocks [Stas]