Access to Request Body
am 28.04.2008 20:12:59 von Tim Gustafson
Hello,
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. Is this
not possible?
I'm using mod_perl 2.0 and Apache 2.2 on a CentOS 5.1 box.
Thanks!
Tim Gustafson
SOE Webmaster
UC Santa Cruz
tjg@soe.ucsc.edu
(831) 459-5354
Re: Access to Request Body
am 28.04.2008 22:46:47 von Adam Prime
Quoting Tim Gustafson :
> Hello,
>
> 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. Is this
> not possible?
do you want access to the unmodified post data, or do you want access
to the content? Apache2::Request parses the POST data, and makes it
available though $r->body. (and possibly $r->upload) If you want the
unparsed body, i'm not sure what you'd have to do offhand.
Adam
RE: Access to Request Body
am 28.04.2008 23:05:22 von Tim Gustafson
Hrmm, that doesn't seem to work. In my code, I have:
print $fh $r->body . "\n";
And in my error log, I get:
Can't locate object method "body" via package "Apache2::RequestRec" at
/var/www/lib/Log.pm line 31.
Tim Gustafson
SOE Webmaster
UC Santa Cruz
tjg@soe.ucsc.edu
(831) 459-5354
-----Original Message-----
From: adam.prime@utoronto.ca [mailto:adam.prime@utoronto.ca]
Sent: Monday, April 28, 2008 1:47 PM
To: modperl@perl.apache.org
Subject: Re: Access to Request Body
Quoting Tim Gustafson :
> Hello,
>
> 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. Is this
> not possible?
do you want access to the unmodified post data, or do you want access
to the content? Apache2::Request parses the POST data, and makes it
available though $r->body. (and possibly $r->upload) If you want the
unparsed body, i'm not sure what you'd have to do offhand.
Adam
RE: Access to Request Body
am 28.04.2008 23:18:10 von Adam Prime
Quoting Tim Gustafson :
> Hrmm, that doesn't seem to work. In my code, I have:
>
> print $fh $r->body . "\n";
>
> And in my error log, I get:
>
> Can't locate object method "body" via package "Apache2::RequestRec" at
> /var/www/lib/Log.pm line 31.
It's part of Apache2::Request, see the documentation below
http://httpd.apache.org/apreq/docs/libapreq2/group__apreq__x s__request.html#body
It gives you access to the content through an APR::Table derived
class, so you can do stuff like:
my $name = $r->body("name");
or
my $table = $r->body();
It doesn't give you access to the whole, unaltered POST data (afaik).
Adam
Re: Access to Request Body
am 29.04.2008 09:21:17 von torsten.foertsch
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==Apache2::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 == 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