[mod_python] Difference between filter.pass_on() and filter.disable()?

Graham Dumpleton graham.dumpleton at gmail.com
Wed Dec 10 05:13:54 EST 2008


2008/12/10 Jean Lagarde <jean.lagarde at gmail.com>:
> Hi all,
> The subject says it all. The documentation seems a little sparse on the
> topic. The description of pass_on is:
> Passes all data through the filter without any processing.
>
> The description of disable is:
> Tells mod_python to ignore the provided handler and just pass the data on.
> (which also states that mod_python uses that one internally).
> "passes all data through" and "just pass the data on" sound like the same
> thing to me. What is the additional functionality to "ignore the provided
> handler"? I assume that there is a difference between the two methods and I
> would like to know what it is no matter how subtle. I'm looking for the most
> CPU efficient way to decide early on in the execution of a filter that we
> don't want to filter a particular request in any way, but maybe
> understanding the difference would help me to make a better use of
> mod_python filters in other ways.
> I did try to use both in code, and on one server with one version of Apache
> 2 (and other components) it seemed to make no functional difference
> (although I did not attempt to closely measure CPU usage), whereas on
> another server with an earlier version of Apache 2 (and other components),
> using disable() caused no error, but dropped values from POST forms passed
> on to PHP scripts.
> Thanks for any info. I did search the lists, but only found one comment on
> someone's code from Graham that "Normally 'filter.pass_on()' would be used
> here, not 'filter.disable()'", but without explaining why.

If you use disable(), your filter will never be called for that
request (input or output as appropriate) again.

If you use pass_on(), then it is passing on data available to that
specific call to your filter function.

The distinction exists because your filter function can be called
multiple times for a request. The latter is allowing you to pass on
the data for that call, but still allowing you the option to process
data in a subsequent call of the filter function.

The disable() call is used internally to mod_python to ensure that
filter function is never called again for a specific request if the
filter function itself raises an exception of some sort. If it doesn't
do this you could end up with a loop if the error in filter function
actually generates output, for which it would then call the filter
function again, etc etc.

FWIW, if you are concerned about performance in any way, then you
shouldn't be using mod_python to implement Apache input/output
filters. Yes you can write filters with mod_python, but it will impact
performance. For best performance you should write filters in C code
as proper Apache module.

Graham


More information about the Mod_python mailing list