-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 Hi,
the attached patch makes Apache::Filter::remove work also for nativ filters. Why do I need this? First, from a users point of view it is not very understandable why a mod_perl filter can be removed but a native filter (eg. INCLUDES) cannot. My actual problem is the following. I have got some CGI and mod_perl scripts that generate HTML and images. The HTML output should be filtered by INCLUDES and a mod_perl filter, the images should be filtered only by my mod_perl filter. The mod_perl filter must be called _after_ INCLUDES. If I "AddOutputFilterByType INCLUDES text/html" the INCLUDES filter is called _before_ the mod_perl filter. If I use PerlSetOutputFilter the filters are called in the right order but INCLUDES is called for all documents. There are multiple solutions. I could patch mod_include or add a PerlAddOutputFilterByType directive or just use the existing PerlSetOutputFilter and write a little filter that checks the requests content-type and removes the next filter in the chain if needed: PerlOutputFilterHandler Apache::Opis::RemoveNextFilterIfNotTextHtml PerlSetOutputFilter INCLUDES PerlOutputFilterHandler Apache::Opis::MyFilter where Apache::Opis::MyFilter is the filter that needs to be called after INCLUDES. The removing filter looks like: - -------------------------------------------------------------------- package Apache::Opis::RemoveNextFilterIfNotTextHtml; use strict; use Apache::Filter (); use Apache::FilterRec (); use Apache::RequestRec (); use Apache::Const -compile => qw(OK DECLINED); sub handler { my $f = shift; my $r = $f->r; unless( $r->content_type =~ m!text/html!i ) { eval { $f->next->remove; }; warn $@ if $@; } $f->remove; return Apache::DECLINED; } 1; - -------------------------------------------------------------------- This code fails with INCLUDES because mod_include is not a mod_perl filter. Hence I had to patch Apache::Filter::remove. Torsten -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.2.4 (GNU/Linux) iD8DBQFBeAxWwicyCTir8T4RAnqyAJ0UW7ky8Z4ApZND9SDpX+LMNzijuACfZwkM fQvJW0WchvJo9MsUvJmCoos= =mizK -----END PGP SIGNATURE-----
--- mod_perl-1.99_16/xs/Apache/Filter/Apache__Filter.h~ 2004-07-12 09:32:07.000000000 +0200 +++ mod_perl-1.99_16/xs/Apache/Filter/Apache__Filter.h 2004-10-21 13:52:13.243774248 +0200 @@ -277,12 +277,85 @@ } static MP_INLINE +void mpxs_Apache__Filter_remove_native_filter(pTHX_ ap_filter_t* f) +{ + ap_filter_t *list; + + if( f->c ) { + for( list=f->c->input_filters; list; list=list->next ) { + if( list==f ) { + ap_remove_input_filter(f); + return; + } + } + } + + if( f->r ) { + for( list=f->r->proto_input_filters; list; list=list->next ) { + if( list==f ) { + ap_remove_input_filter(f); + return; + } + } + } + + if( f->r ) { + for( list=f->r->input_filters; list; list=list->next ) { + if( list==f ) { + ap_remove_input_filter(f); + return; + } + } + } + + if( f->c ) { + for( list=f->c->output_filters; list; list=list->next ) { + if( list==f ) { + ap_remove_output_filter(f); + return; + } + } + } + + if( f->r ) { + for( list=f->r->proto_output_filters; list; list=list->next ) { + if( list==f ) { + ap_remove_output_filter(f); + return; + } + } + } + + if( f->r ) { + for( list=f->r->output_filters; list; list=list->next ) { + if( list==f ) { + ap_remove_output_filter(f); + return; + } + } + } + + Perl_croak(aTHX_ "filter=%d not removed", f); + return; +} + +static MP_INLINE void mpxs_Apache__Filter_remove(pTHX_ I32 items, SV **MARK, SV **SP) { modperl_filter_t *modperl_filter; ap_filter_t *f; - mpxs_usage_va_1(modperl_filter, "$filter->remove()"); + if (items < 1) { + Perl_croak(aTHX_ "usage: $filter->remove()"); + } + + modperl_filter = mp_xs_sv2_modperl_filter(*MARK); + + if( !modperl_filter ) { /* native filter */ + mpxs_Apache__Filter_remove_native_filter(aTHX_ (ap_filter_t*)SvIV(SvRV(*MARK))); + return; + } + f = modperl_filter->f; MP_TRACE_f(MP_FUNC, " %s\n\n\tfilter removes itself\n",
-- Report problems: http://perl.apache.org/bugs/ Mail list info: http://perl.apache.org/maillist/modperl.html List etiquette: http://perl.apache.org/maillist/email-etiquette.html