Login | Register For Free | Help
Search for: (Advanced)

Mailing List Archive: ModPerl: ModPerl

[mp2 ] Request output filters and directories

 

 

ModPerl modperl RSS feed   Index | Next | Previous | View Threaded


clem.oudot at gmail

Mar 22, 2011, 7:43 AM

Post #1 of 3 (365 views)
Permalink
[mp2 ] Request output filters and directories

Hi all,

I am one of the developer of LemonLDAP::NG (http://lemonldap-ng.org),
a free WebSSO using mod_perl. So to begin, thanks to the mod_perl team
for this great product!

In our code, we are injecting request output filters with the
add_output_filter method. This works well, but we noticed that the
filter is never called on directories, only on files:
* http://test1.example.com/ -> filter not called
* http://test1.example.com/index.pl -> filter called

I use ModPerl 2.0.4 for my tests. My Apache configuration is the following:

---------------

<VirtualHost *:80>
ServerName test1.example.com
ServerAlias test2.example.com

# SSO protection
PerlHeaderParserHandler My::Package


# DocumentRoot
DocumentRoot /usr/local/lemonldap-ng/htdocs/test/
<Directory /usr/local/lemonldap-ng/htdocs/test/>
Order deny,allow
Allow from all
Options +ExecCGI
</Directory>

# Perl script (application test is written in Perl)
<Files *.pl>
SetHandler perl-script
PerlResponseHandler ModPerl::Registry
</Files>

# Directory index
<IfModule mod_dir.c>
DirectoryIndex index.pl index.html
</IfModule>

</VirtualHost>

---------------


Can this behaviour comes from the DirectoryIndex and mod_dir?


Thanks for your help,

Clément OUDOT.


torsten.foertsch at gmx

Mar 22, 2011, 11:12 AM

Post #2 of 3 (336 views)
Permalink
Re: [mp2 ] Request output filters and directories [In reply to]

On Tuesday, March 22, 2011 15:43:07 Clément OUDOT wrote:
> Can this behaviour comes from the DirectoryIndex and mod_dir?

I assume you call add_output_filter in My::Package?

Now, mod_dir uses subrequests for all of your DirectoryIndex documents. The
first it finds, it redirects to using ap_internal_fast_redirect(). This is a
very hackish function that tries to magically turn the subreq into the main
request. It copies a bunch of values from the subreq into the main req. One of
these values is the output filter list. So, after the operation your main req
looks mostly like the subreq.

Another detail that hits you here is that the HeaderParser phase is called
only for the main request.

Now put these two together, you start a request for dir/. My::Package installs
the output filter in its header parser phase. mod_dir jumps in and issues a
subreq for dir/index.pl. The subreq skips the header parser phase.
ap_internal_fast_redirect copies the output filter chain (without your filter)
from the subreq to the main one. Your registry script index.pl is evaluated
but the output filter is gone.

What could be done? I think the cleanest way would be to either move
My::Package to another phase, fixup for example. If that's not possible you
can set a flag in $r->pnotes when the filter in installed. Then you need a
fixup handler that looks if the flag is set in $r->main->pnotes and reinstalls
the filter if so.

Torsten Förtsch

--
Need professional modperl support? Hire me! (http://foertsch.name)

Like fantasy? http://kabatinte.net


clem.oudot at gmail

Mar 22, 2011, 2:14 PM

Post #3 of 3 (330 views)
Permalink
Re: [mp2 ] Request output filters and directories [In reply to]

2011/3/22 Torsten Förtsch <torsten.foertsch [at] gmx>:
> On Tuesday, March 22, 2011 15:43:07 Clément OUDOT wrote:
>> Can this behaviour comes from the DirectoryIndex and mod_dir?
>
> I assume you call add_output_filter in My::Package?

Hi,

thanks for the answer. Indeed, My::Package call a module like the
following, and the add_output_filter method is called in the run()
subroutine :
http://websvn.ow2.org/filedetails.php?repname=lemonldap&path=%2Ftrunk%2Fmodules%2Flemonldap-ng-handler%2Flib%2FLemonldap%2FNG%2FHandler%2FSecureToken.pm


>
> Now, mod_dir uses subrequests for all of your DirectoryIndex documents. The
> first it finds, it redirects to using ap_internal_fast_redirect(). This is a
> very hackish function that tries to magically turn the subreq into the main
> request. It copies a bunch of values from the subreq into the main req. One of
> these values is the output filter list. So, after the operation your main req
> looks mostly like the subreq.
>
> Another detail that hits you here is that the HeaderParser phase is called
> only for the main request.
>
> Now put these two together, you start a request for dir/. My::Package installs
> the output filter in its header parser phase. mod_dir jumps in and issues a
> subreq for dir/index.pl. The subreq skips the header parser phase.
> ap_internal_fast_redirect copies the output filter chain (without your filter)
> from the subreq to the main one. Your registry script index.pl is evaluated
> but the output filter is gone.
>
> What could be done? I think the cleanest way would be to either move
> My::Package to another phase, fixup for example. If that's not possible you
> can set a flag in $r->pnotes when the filter in installed. Then you need a
> fixup handler that looks if the flag is set in $r->main->pnotes and reinstalls
> the filter if so.


I tried to use PerlFixupHandler instead of PerlHeaderParserHandler,
but this changes nothing. I will try to create a specific FixupHandler
like you suggested.

Clément.

ModPerl modperl RSS feed   Index | Next | Previous | View Threaded
 
 


Interested in having your list archived? Contact Gossamer Threads
 
  Web Applications & Managed Hosting Powered by Gossamer Threads Inc.