Stas et all,

Here's the code that I was using to grab POSTed values and
put them into a hash 0 sorry for the verbosity of this post,
I won't pretend to fully understand this code, Stas wrote
the majority of it way back when libapreq wouldn't compile
on NetBSD, and I've been using it ever since.

If there's a better way to do this with libapreq, I'd
preobably like to move my code over to using it!

Code attached, which no longer works :

I call this to fill a simple hash, eg :

my %posted_data = CB::hash_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->is_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 $string;
}


sub hash_post { # this has to get called instead of read_post, as read_post() # gobbles up the POST arguments and they're no longer available... # and this calls read_post() :)

    # returns a hash of all the POST values

    my ($r) = shift;

    my $post_string = CB::read_post($r);
    my %rethash = {};

    my @bits = split(/&/, $post_string);
    foreach my $bit (@bits) {
        $bit =~ /^(.*)=(.*)$/;
        my $key = CGI::Util::unescape($1);
        my $value = CGI::Util::unescape($2);
        $rethash{$key} = $value;
    }
    return %rethash;
}





--
Report problems: http://perl.apache.org/bugs/
Mail list info: http://perl.apache.org/maillist/modperl.html
List etiquette: http://perl.apache.org/maillist/email-etiquette.html



Reply via email to