On 6/5/06, Philip M. Gollucci <[EMAIL PROTECTED]> wrote:

> I've defined a PerlAccessHandler which needs access to POST body. I've
> implemented a sub read_post {} which uses bucket brigades API to read
> the body (taken from mod_perl2 docs) and returns the data. However,
> the POST body is gone after I read it.

Can you show some code ?

Here is the code that describes the problem.

$ cat httpd.conf | grep PerlAccessHandler
PerlAccessHandler       input

$ echo -n 'modperl=1' | POST http://127.0.0.1/post.html

$ grep 'got:' error_log
got: modperl=1
got: undef

sub input {
        my $r = shift;
        
        # get the POST body the first time
        my $data = read_post($r) || "undef";
        print STDERR "got: $data\n";

        # get the POST body the second time
        $data = read_post($r) || "undef";
        print STDERR "got: $data\n";

        return Apache2::Const::OK;
}

sub read_post_body {
     my $r = shift;

     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::NONBLOCK_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;
}

Reply via email to