On Mon 28 Apr 2008, Tim Gustafson wrote:
> I'm writing a mod_perl logging module, and I can't seem to find anywhere =

in
> the documentation that talks about how I can access the request body
> (basically, the POST data) of a request during the logging phase. =A0Is t=

his
> not possible?


It is but you'd have to use an input filter. Something like this:

use Apache2::Const -compile=3D>qw/M_POST OK/;
use APR::Const -compile=3D>qw/SUCCESS/;
use Apache2::Filter ();
use APR::Bucket ();
use APR::Brigade ();

if( $r->method_number=3D=3DApache2::Const::M_POST ) {
my @content;
my $cl=3D0;
my $rc=3D$r->add_input_filter( sub {
my ($f, $bb, $mode, $block, $readbytes) =3D @_;

my $rv =3D $f->next->get_brigade($bb, $mode, $block, $readbytes);
return $rv unless $rv =3D=3D APR::Const::SUCCESS;

for (my $b =3D $bb->first; $b; $b =3D $bb->next($b)) {
$b->read(my $bdata);
$cl+=3Dlength $bdata;
push @content, $bdata;
}

return Apache2::Const::OK;
} );
$r->discard_request_body;
$r->pnotes->{rbody}=3D\@content;
$r->pnotes->{rbody_length}=3D$cl;
}

Remember this is just an example not production code. For production you'd=
=20
want to put the data chunks into a temporary file / files. This way you'll=
=20
get the request body stripped of all transfer-encoding.

Torsten

=2D-
Need professional mod_perl support?
Just hire me: torsten.foertsch@gmx.net