2011/3/22 Torsten Förtsch <torsten.foert...@gmx.net>:
> 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.

Reply via email to