You are viewing a plain text version of this content. The canonical link for it is here.
Posted to modperl@perl.apache.org by dorian taylor <do...@gmail.com> on 2014/11/09 21:08:55 UTC

Filter sequence and runtime filter manipulation for non-mod_perl filters

I'm running into the perennial problem of not being able to mix
mod_perl and Apache C filters in the necessary order. Because I also
need the C filter (mod_transform) bound only to the right
Content-Type, I figure the easiest way to make it happen would be to
write a small no-op mod_perl filter that checks $f->r->content_type
and adds mod_transform to the chain.

Of course, Apache2::Filter->add_output_filter is only capable of
adding mod_perl filters.

Grepping the mod_perl source for instances of add_output_filter, I
found this: https://svn.apache.org/repos/asf/perl/modperl/trunk/todo/design_notes

Adding something like this to the bottom of modperl_filter_runtime_add
(in https://svn.apache.org/repos/asf/perl/modperl/trunk/src/modules/perl/modperl_filter.c
) should make the behaviour described there partially available:

    else if (SvPOK(callback)) {
        char *name = SvPVX(callback);
        ap_filter_t *f = addfunc(name, NULL, r, c);

        if (f) return;

        Perl_croak(aTHX_ "Apache filter %s could not be resolved\n", name);
    }

I say "partially" because that document calls for a $ctx to be passed
into the filter, but that makes no sense for filters written in C.

The behaviour I'm looking for is something like
$f->add_output_filter('XSLT') which is the handle for mod_transform.
I'm in the process of testing this code and importing the (1.6 million
rev) SVN repository into git so I can make a proper patch.

Any insights? Am I undertaking unnecessary yak-shaving?

(Note: I was hoping to be able to cargo-cult up a re-ordered sequence
with mod_filter, but that got me nowhere. Actually, it got me a
segfault.)

Thanks,

-- 
Dorian Taylor
http://doriantaylor.com/

Re: Filter sequence and runtime filter manipulation for non-mod_perl filters

Posted by dorian taylor <do...@gmail.com>.
Correction: add_output_filter is in Apache2::Filter but is a member of
$r (or $c). So I'd make a small FixupHandler, not another mod_perl
filter.


-- 
Dorian Taylor
http://doriantaylor.com/