Tx for your quick reply. The handler is eventually involved, but the result
is weird.

If my handler is :
     while ($f->read(my $buffer, BUFF_LEN)) {
           $buffer =~ s/\s+/ /g;
         $f->print($buffer);
     }
than the output is shown in IE as a empty HTML doc.


If my handler includes a split statement, as in :

      while ($f->read(my $buffer, 8192)) {
                for (split "\n", $buffer) {
                 s/\s+/ /;
                 $f->print($_);
             }
       }

Than the output is garbaged. After digging into it a bit, I realized that
if the input is UTF-8 encoded (google) than it fails. It the input is ascii,
it's ok. Am I facing an encoding problem ? The recent thread
http://www.gossamer-threads.com/archive/mod_perl_C1/modperl_F7/%5Bmp2%5D_OutputFilter_with_UTF-8_characters_P88526

seems  to push in that direction, although I see no clear solution. The first
handler (on top of this document) works on pure ascii files. Are there any
workarounds for this ?

Tx for you help once again,

Cheers,

        Bruno.


> -----Message d'origine-----
> De : Stas Bekman [mailto:[EMAIL PROTECTED]
> Envoye : mardi 25 novembre 2003 00:55
> A : Bruno Pommerel
> Cc : [EMAIL PROTECTED]
> Objet : Re: Chaining mod_perl handlers with mod_* handlers ?
> 
> 
> 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

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

Reply via email to