Stas Bekman wrote:
Carl Brewer wrote:
I'm using Stas's read_post() call from the test
directory in mp1.99-10-dev, and am using it
to grab POST data of the form of an email
address ..
this is giving me this :
read_post returned : username=carl%40somewhere&password=foo
Escaped the @ ... of course.
I'm curios, where's the best place to unescape it?
Should I do it in the read_post function, or afterwards?
Recommendations?
Look at CGI.pm, you could easily prototype your code after it, as it's
written in pure perl. Hint: look at the function param().
For the archives, if anyone's interested, I used CGI::Util::unescape()
My read_lines() subroutine is now (cribbed extensively from
Stas's test scripts) :
$post_params = read_post($r);
sub read_post {
use Apache::Filter ();
use APR::Bucket ();
use APR::Brigade ();
use constant IOBUFSIZE => 8192;
use Apache::Const -compile => qw(MODE_READBYTES);
use APR::Const-compile => qw(SUCCESS BLOCK_READ);
use CGI::Util;
my $r = shift;
my $debug = shift || 0;
my @data = ();
my $seen_eos = 0;
my $filters = $r->input_filters();
my $ba = $r->connection->bucket_alloc;
my $bb = APR::Brigade->new($r->pool, $ba);
do {
my $rv = $filters->get_brigade($bb,
Apache::MODE_READBYTES, APR::BLOCK_READ, IOBUFSIZE);
if ($rv != APR::SUCCESS) {
return $rv;
}
while (!$bb->empty) {
my $buf;
my $b = $bb->first;
$b->remove;
if ($b->is_eos) {
warn "EOS bucket:\n" if $debug;
$seen_eos++;
last;
}
my $status = $b->read($buf);
warn "DATA bucket: [$buf]\n" if $debug;
if ($status != APR::SUCCESS) {
return $status;
}
push @data, $buf;
}
$bb->destroy;
} while (!$seen_eos);
my $string = join '', @data;
return CGI::Util::unescape($string);
}
Seems to work ok in lieu of Apache::Request being available.
Carl