Quoting Stas Bekman <[EMAIL PROTECTED]>:
allan juul wrote: [...]
Use must use $r->set_content_length(). See the mp2 test suite for examples.
(i don't have that method available in my mod_perl2)
You sure do :)
% lookup set_content_length
To use method 'set_content_length' add:
use Apache2::Response ();
http://perl.apache.org/docs/2.0/api/Apache2/Response.html#C_set_content_length_
ok maybe i have a screwed installiation or a missing use/namespace . "method not found" message in my error.log.
but about collecting data in a buffer variable. it seems i can actually $f->print that buffer, but not actually calculate the length of it. or rather: i can calculate the length but when i set any header the value is 0 (whether i set it before the $f->print statement or after).
it seems i must admit that i don't quite get what is going on and when.
can anyone supply a simple example i then can check on our reverse proxy ?
Try: t/response/TestApache/content_length_header.pm
Though I haven't tried to call it from the filter, so may be Jeff's suggestion will work.
Jeff's suggestion does indeed work. oddly enough ;
It just happens to work in certain conditions. The correct solution is to use a bucket brigade-based filter, which gives you a complete control. What's happening is that streaming filter API passes FLUSH buckets through, and you can't control that. We have to do that to conform to the FLUSH requests, to be a well-behaved filter by default.
I've revealed that using 2 debug filters plugged before and after the filter in question. This is a very useful debugging tool:
http://search.cpan.org/dist/Apache-DebugFilter/
So the following solution works just fine, it'll be added shortly to the mp2 test suite as a pair of tests: t/filter/out_str_buffer.t t/filter/TestFilter/out_str_buffer.pm
and I'll document it too.
sub flatten_bb { my ($bb) = shift;
my $seen_eos = 0;
my @data; for (my $b = $bb->first; $b; $b = $bb->next($b)) { $seen_eos++, last if $b->is_eos; $b->read(my $bdata); push @data, $bdata; } return (join('', @data), $seen_eos); }
sub handler { my($filter, $bb) = @_;
my $ctx = $filter->ctx;
# no need to unset the C-L header, since this filter makes sure to # correct it before any headers go out. #unless ($ctx) { # $filter->r->headers_out->unset('Content-Length'); #}
my $data = exists $ctx->{data} ? $ctx->{data} : ''; $ctx->{invoked}++; my($bdata, $seen_eos) = flatten_bb($bb); $bdata =~ s/-//g; $data .= $bdata if $bdata;
if ($seen_eos) { my $len = length $data; $filter->r->headers_out->set('Content-Length', $len); $filter->print($data) if $data; } else { # store context for all but the last invocation $ctx->{data} = $data; $filter->ctx($ctx); }
return Apache2::Const::OK; }
-- __________________________________________________________________ Stas Bekman JAm_pH ------> Just Another mod_perl Hacker http://stason.org/ mod_perl Guide ---> http://perl.apache.org mailto:[EMAIL PROTECTED] http://use.perl.org http://apacheweek.com http://modperlbook.org http://apache.org http://ticketmaster.com