Hi,
I'm still looking at getting range requests working properly with
mod_perl:
http://www.gossamer-threads.com/lists/modperl/dev/104360
and have decided to go with an output filter to set the eos bucket.
Can anyone help with how order execution works? I have a simple conf
like:
PerlRequire /home/alex/modperl.pl
<Location /perl/>
SetHandler modperl
PerlResponseHandler VideoTest
PerlOutputFilterHandler VideoTest::test_output_handler
</Location>
and my modperl code looks like:
sub handler {
my $r = shift;
$r->sendfile('/tmp/video.mp4');
$r->pnotes("send_eos" => 1);
$r->add_output_filter(\&test_add_output_filter);
return Apache2::Const::OK;
}
sub test_add_output_filter {
# transparent filter
my ($f, $bb) = @_;
warn "in add_output_filter";
my $rv = $f->next->pass_brigade($bb);
return $rv unless $rv == APR::Const::SUCCESS;
warn "leaving add_output_filter";
return Apache2::Const::OK;
}
sub test_output_handler {
# sets eos depending pnotes
my ($f, $bb) = @_;
warn "in test_output_handler";
my $r = $f->r;
if ($r->pnotes("send_eos")) {
warn "adding eos";
my $ba = $bb->bucket_alloc;
my $b = APR::Bucket::eos_create($ba);
$bb->insert_tail($b);
}
else {
warn "skipping eos modifications";
}
my $rv = $f->next->pass_brigade($bb);
return $rv unless $rv == APR::Const::SUCCESS;
warn "leaving test_output_handler";
return Apache2::Const::OK;
}
and the debug looks like:
in test_output_handler at /home/alex/modperl.pl line 31.
skipping eos modifications at /home/alex/modperl.pl line 40.
[Tue May 29 09:05:20 2012] [debug] byterange_filter.c(256): [client
127.0.0.1] found unknown length: clength = 125569
leaving test_output_handler at /home/alex/modperl.pl line 46.
in test_output_handler at /home/alex/modperl.pl line 31.
adding eos at /home/alex/modperl.pl line 34.
in add_output_filter at /home/alex/modperl.pl line 21.
leaving add_output_filter at /home/alex/modperl.pl line 24.
leaving test_output_handler at /home/alex/modperl.pl line 46.
I know I have add_output_filter and perloutputfilterhandler, just trying
to see which option runs when (as ideally add_output_filter would work
best).
So my questions are:
1. Why does test_output_handler set by PerlOutputFilterHandler get
called twice?
2. Why does the first time called not know about pnotes, but the second
time it does?
3. Why does add_output_filter happen at the end, and is there a way to
have it happen at same position as perloutputfilterhandler?
Basically, in order for range requests to work, I need to set the eos
bucket before byterange_filter is called. If it happens after that, it's
too late and range requests won't work.
Any help is really appreciated, been struggling here for quite some time.
=)
Thanks!
Alex