Bruno Pommerel wrote:
[...]
It seems that when one handler gets called, the second one does not get into
play. How can I stack the handlers in the correct order ? What pre-requisite
must the perl handler comply with ?

That's correct. Your mistake is very simple:


> <Location /google>
>     SetHandler modperl
      ^^^^^^^^^^^^^^^^^^
>     PerlSetVar Filter On
>     PerlOutputFilterHandler FilterGoogle
> </Location>

Filters have nothing to do with response handlers as the configuration goes. And SetHandler sets a response handler. So what you do is setting /google to be handled by proxy, but then you override it to be handled by modperl (and you don't specify PerlResponseHandler). Neither you need 'PerlSetVar Filter On'. Neither you need to load 'Apache::Filter' from httpd.conf - You do miss this module in your filter. mp2 filters have nothing to do with mp1's Apache::Filter.

All you need is:

<Location /google>
    PerlOutputFilterHandler FilterGoogle
</Location>

BTW, it was an interesting example, so I've just added a new test that filters incoming POST body before it hits the proxy and outgoing reponse body when it comes back from proxy.

Also you need to check for mod_access in your config to be complete.

Here are the client and server sides of the test I'm about to commit

# t/filter/both_str_proxy.t
use strict;
use warnings FATAL => 'all';

use Apache::Test;
use Apache::TestRequest;
use Apache::TestUtil;

plan tests => 1, (have_module('proxy') && have_access);

my $data = join ' ', 'A'..'Z', 0..9;
my $expected = lc $data; # that's what the input filter does
$expected =~ s/\s+//g;   # that's what the output filter does
my $location = '/TestFilter__both_str_proxy/foo';
my $response = POST_BODY $location, content => $data;
ok t_cmp($expected, $response, "lc input and reverse output filters");


#t/filter/TestFilter/both_str_proxy.pm package TestFilter::both_str_proxy;

# very similar to TestFilter::both_str_req_add, but the request is
# proxified. we filter the POSTed body before it goes via the proxy and
# we filter the response after it returned from the proxy

use strict;
use warnings FATAL => 'all';

use Apache::RequestRec ();
use Apache::RequestIO ();
use Apache::Filter ();

use Apache::TestTrace;

use Apache::Const -compile => qw(OK M_POST);

sub in_filter {
    my $filter = shift;

debug "input filter";

    while ($filter->read(my $buffer, 1024)) {
        $filter->print(lc $buffer);
    }

    Apache::OK;
}

sub out_filter {
    my $filter = shift;

debug "output filter";

    while ($filter->read(my $buffer, 1024)) {
        $buffer =~ s/\s+//g;
        $filter->print($buffer);
    }

    Apache::OK;
}

sub handler {
    my $r = shift;

debug "response handler";

$r->content_type('text/plain');

    if ($r->method_number == Apache::M_POST) {
        $r->print(ModPerl::Test::read_post($r));
    }

    return Apache::OK;
}

1;
__DATA__
<NoAutoConfig>
    <IfModule mod_proxy.c>
        <IfModule mod_access.c>
            <Proxy http://@servername@:@port@/*>
                Order Deny,Allow
                Deny from all
                Allow from @servername@
            </Proxy>
            ProxyRequests Off
            RewriteEngine On

            ProxyPass        /TestFilter__both_str_proxy/ \
                http://@servername@:@port@/TestFilter__both_str_proxy_content/
            ProxyPassReverse /TestFilter__both_str_proxy/ \
                http://@servername@:@port@/TestFilter__both_str_proxy_content/
        </IfModule>
    </IfModule>

    PerlModule TestFilter::both_str_proxy
    <Location /TestFilter__both_str_proxy>
        PerlInputFilterHandler  TestFilter::both_str_proxy::in_filter
        PerlOutputFilterHandler TestFilter::both_str_proxy::out_filter
    </Location>
    <Location /TestFilter__both_str_proxy_content>
        SetHandler modperl
        PerlResponseHandler     TestFilter::both_str_proxy
    </Location>
</NoAutoConfig>


__________________________________________________________________ Stas Bekman JAm_pH ------> Just Another mod_perl Hacker http://stason.org/ mod_perl Guide ---> http://perl.apache.org mailto:[EMAIL PROTECTED] http://use.perl.org http://apacheweek.com http://modperlbook.org http://apache.org http://ticketmaster.com


-- Reporting bugs: http://perl.apache.org/bugs/ Mail list info: http://perl.apache.org/maillist/modperl.html



Reply via email to