Thanks Philippe,
It's now no longer failing, however the input filter is not returning any
data and I get the following error in error_log:
-e: Deep recursion on subroutine "ZCRM::OFilter::input" at
/opt/code/CRM/OFilter.pm line 42.
Here's the subroutine:
sub input {
my $f = shift;
my $r = $f->r;
my $bb = APR::Brigade->new( $r->pool, $r->connection->bucket_alloc );
my $data = '';
my $seen_eos = 0;
do {
$r->input_filters->get_brigade( $bb, Apache2::Const::MODE_READBYTES,
APR::Const::BLOCK_READ, IOBUFSIZE );
for ( my $b = $bb->first ; $b ; $b = $bb->next($b) ) {
if ( $b->is_eos ) {
$seen_eos++;
last;
}
if ( $b->read( my $buf ) ) {
$data .= $buf;
}
$b->remove; # optimization to reuse memory
}
} while ( !$seen_eos );
$bb->destroy;
return $data;
}
On Mon, Jun 20, 2016 at 1:49 AM, Philippe Chiasson <[email protected]>
wrote:
>
>
> Sent from my iPhone
>
> On Jun 19, 2016, at 19:10, Henry Combrinck <[email protected]>
> wrote:
>
> Greetings,
>
> I'm relatively new to mod_perl, so please forgive the ignorance.
>
> I've managed to create an output filter, but I'm having a problem with an
> input filter. The error I get is as per the subject line.
>
> Here's the code:
>
> apache config
>
> Perlrequire /opt/code/scripts/apache2-perl-startup.pl
> ...
> PerlOutputFilterHandler ZCRM::OFilter::output
> PerlInputFilterHandler ZCRM::OFilter::input
>
> And here's the perl code (output filter works fine, but the input filter
> results in the error below)
>
> package ZCRM::OFilter;
>
> use strict;
> use warnings;
>
> use Apache2::Filter ();
> use Apache2::RequestRec ();
> use Apache2::Const -compile => qw(OK DECLINED MODE_READBYTES);
> use APR::Const -compile => qw(SUCCESS BLOCK_READ);
> use Apache2::Connection ();
>
> use constant IOBUFSIZE => 8192;
>
> use strict;
>
> sub output {
> my $f = shift;
> my $r = $f->r;
>
> while ( $f->read( my $buffer, 1024 ) ) {
> # do work on $buffer...
> $f->print($buffer);
> }
>
> return Apache2::Const::OK;
> }
>
> sub input {
> my $r = shift;
>
> my $f = shift;
> my $r = $f->r;
>
> Just like in the output filter example above.
>
>
> my $bb = APR::Brigade->new( $r->pool, $r->connection->bucket_alloc); #
> <--- Line XX - ERROR here
>
> my $data = '';
> my $seen_eos = 0;
> do {
> $r->input_filters->get_brigade( $bb, Apache2::Const::MODE_READBYTES,
> APR::Const::BLOCK_READ, IOBUFSIZE );
>
> for ( my $b = $bb->first ; $b ; $b = $bb->next($b)) {
> if ( $b->is_eos ) {
> $seen_eos++;
> last;
> }
>
> if ( $b->read( my $buf ) ) {
> $data .= $buf;
> }
>
> $b->remove; # optimization to reuse memory
> }
> } while ( !$seen_eos );
>
> $bb->destroy;
>
> return $data;
> }
>
> 1;
>
> I would appreciate any pointers.
>
> Thanks
> Henk
>
>