+1

Excellent summary, Graham.

Maybe we could ask on the mod_pyhon mailing list who is stacking
non-content handlers, especially if registered dynamically, and for
what purpose ? This way we could make sure that no one actually relies
on the current cludgy behaviour.

But I agree with you, it's pretty sure that changing mod_python to
align with the standard Apache behaviour should not meet popular
disagreement, especially given the corner cases in which it really
matters :).

Regards,
Nicolas

2006/2/22, Graham Dumpleton <[EMAIL PROTECTED]>:
> Grisha wrote ..
> >
> > If I understand this correctly, then +1.
> >
> > ...though I'm wondering if anyone will actually try to do something as
> > arcane as dynamicaly registering non-content handers? :-)
>
> I agree, it might not be a totally realistic scenario, but then now that
> I have checked in a change to make req.handler writable, the system
> is becoming flexible enough that it may actually be reasonable to do
> it for some reason.
>
> Specifically, with the change to make req.handler writable, instead of
> using SetHandler/AddHandler to have mod_mime internally set
> req.handler to "mod_python", you could define your own type handler
> which did it.
>
>   def typehandler(req):
>     if os.path.splitext(req.filename)[1] == ".py":
>       req.handler = "mod_python"
>       req.add_handler("PythonHandler","mod_python.publisher")
>       return apache.OK
>     return apache.DECLINED
>
> You might even at the same time want to register a fixup handler
> to do stuff prior to the response phase being run:
>
>   def typehandler(req):
>     if os.path.splitext(req.filename)[1] == ".py":
>       req.handler = "mod_python"
>       req.add_handler("PythonFixupHandler","manage_session_object")
>       req.add_handler("PythonHandler","mod_python.publisher")
>       return apache.OK
>     return apache.DECLINED
>
> For example, you might introduce a fixup handler which ensures that
> a session object is created and put in req.session. This is a lot cleaner
> than what most people do, which is to put a call to the session manager
> code in every single published function.
>
> Graham
>
> > On Tue, 21 Feb 2006, Jim Gallacher wrote:
> >
> > > Nice summary.
> > > +1 for the change.
> > >
> > > Jim
> > >
> > > Graham Dumpleton wrote:
> > >> Jim Gallacher wrote ..
> > >>
> > >>> I don't have alot more to say on these last 2 emails. I think you are
> > on
> > >>> the right path here.
> > >>
> > >>
> > >> Okay, I think I have a good plan now.
> > >>
> > >> To summarise the whole issue, the way Apache treats multiple handlers
> > in
> > >> a single phase for non content handler phases is as follows:
> > >>
> > >>   PostReadRequestHandler   RUN_ALL
> > >>   TransHandler             RUN_FIRST
> > >>   MapToStorageHandler      RUN_FIRST
> > >>   InitHandler              RUN_ALL
> > >>   HeaderParserHandler      RUN_ALL
> > >>   AccessHandler            RUN_ALL
> > >>   AuthenHandler            RUN_FIRST
> > >>   AuthzHandler             RUN_FIRST
> > >>   TypeHandler              RUN_FIRST
> > >>   FixupHandler             RUN_ALL
> > >>
> > >>   LogHandler               RUN_ALL
> > >>
> > >> RUN_ALL means run all handlers until one returns something other than
> > OK
> > >> or DECLINED. Thus, handler needs to return DONE or an error to have
> > it
> > >> stop
> > >> processing for that phase.
> > >>
> > >> RUN_FIRST means run all handlers while they return DECLINED. Thus, needs
> > >> handler to return OK, DONE or error to have it stop processing for that
> > >> phase.
> > >>
> > >> Where multiple handlers are registered within mod_python for a single
> > >> phase it doesn't behave like either of these. In mod_python it will
> > keep
> > >> running the handlers only while OK is returned. Returning DECLINED
> > >> causes it to stop. This existing behaviour can be described (like
> > >> mod_perl)
> > >> as stacked handlers.
> > >>
> > >> Having non content handler phases behave differently to how Apache does
> > >> it causes problems. For example things like a string of authentication
> > >> handlers which only say OK when they handle the authentication type,
> > >> can't be implemented properly. In Apache, it should stop the first time
> > >> one returns OK, but in mod_python it will keep running the handlers
> > >> in that phase.
> > >>
> > >> In summary, it needs to behave more like Apache for the non content
> > >> handler phases.
> > >>
> > >> In respect of the content handler phase itself, in practice only one
> > >> handler
> > >> module is supposed to implement it. At the Apache level there is no
> > >> concept of different Apache modules having goes at the content handler
> > >> phase and returning DECLINED if they don't want to handle it. This is
> > >> reflected in how in the type handler phase, selection of the module
> > to
> > >> deliver content is usually done by setting the single valued req.handler
> > >> string. Although, when using mod_python this is done implicitly by
> > >> setting the SetHandler/AddHandler directives and mod_negotiation then
> > >> in turn setting req.handler to be mod_python for you.
> > >>
> > >> Because mod_python when executed for the content handler phase is
> > >> the only thing generating the content, the existing mechanism of
> > >> stacked handlers and how the status is handled is fine within just
> > >> the content handler phase. Can thus keep that as is and no chance of
> > >> stuffing up existing systems.
> > >>
> > >> Where another phase calls req.add_handler() to add a handler or multiple
> > >> handlers for the "PythonHandler" (content) phase, these will be added
> > in
> > >> a stacked manner within that phase. This also is the same as it works
> > now.
> > >> There would be non need to have a new function to add stacked handlers
> > >> as that behaviour would be dictated by phase being "PythonHandler".
> > >>
> > >> For all the non content handler phases though, the current stacked
> > >> handlers algorithm used by mod_python would be replaced with how
> > >> Apache does it. That is, within multiple handlers registered with
> > >> mod_python
> > >> for non content handler phase, it would use RUN_FIRST or RUN_ALL
> > >> algorithm as appropriate for the phase.
> > >>
> > >> For those which use RUN_ALL, this wouldn't be much different than what
> > >> mod_python does now except that returning DECLINED would cause it
> > >> to go to next mod_python handler in that phase instead of stopping.
> > >> It is highly unlikely that this change would have an impact as returning
> > >> DECLINED in RUN_ALL phases for how mod_python currently implements
> > >> it, tends not to be useful and can't see that anyone would have been
> > using
> > >> it.
> > >>
> > >> For those which use RUN_FIRST, the difference would be significant as
> > >> reurning OK will now cause it to stop instead of going to next mod_python
> > >> handler in the phase. Personally I don't think this would be a drama
> > as
> > >> not many people would be using these phases and highly unlikely that
> > >> someone would have listed multiple handlers for such phases. If they
> > had
> > >> and knew what they were doing, they should have long ago realised that
> > >> the current behaviour was a bit broken and it even probably stopped
> > them
> > >> from doing what they wanted unless they fudged it.
> > >>
> > >> As to use of req.add_handler() for non content handler phases, each
> > call
> > >> would create a distinct handler, ie., no stacking of handlers at all.
> > No
> > >> separate function is required though, as slight change in behaviour
> > >> determine form phase specified.
> > >>
> > >> To sum up, I think these changes would have minimal if no impact as
> > >> where changes are significant, it isn't likely to overlap with existing
> > >> code
> > >> as shortcomings in current system would have mean't people wouldn't
> > >> have been doing the sorts of things that may have been impacted.
> > >>
> > >> Therefore, I don't see a need for this to be switch enabled and the
> > >> change could just be made and merely documented.
> > >>
> > >> Luckily the changes to make it work like above should be fairly easy.
> > All
> > >> it will entail is changing CallBack.HandlerDispatch() to treat status
> > >> differently dependent on phase. No changes to req.add_handler() or
> > >> code processing directives will be required.
> > >>
> > >> Graham
> > >>
> > >>
> > >
>

Reply via email to