This adds AddOutputFilterByType directive. In our mod_deflate conversations, I think we kept coming back to this as a real good idea.
So, a mod_deflate admin could do: AddOutputFilterByType DEFLATE text/html and mod_deflate would only work on text/html requests. Notice that it sticks the content-type info in extension_mappings. I'm not really that what it's intended for, but hey, it works. ;-) I think this patch is fine in and of itself, but it doesn't work as expected due to the mod_dir/mod_negotiation showstopper (yeah, it's a showstopper for the next release). I've got some hacky code that fixes up ap_internal_fast_redirect() to propogate the filters on a redirect. But, it just showcases how badly broken fast_redirect is, so I'd rather we just toss it. -- justin Index: modules/http/mod_mime.c =================================================================== RCS file: /home/cvs/httpd-2.0/modules/http/mod_mime.c,v retrieving revision 1.76 diff -u -r1.76 mod_mime.c --- modules/http/mod_mime.c 8 Dec 2001 02:04:51 -0000 1.76 +++ modules/http/mod_mime.c 18 Feb 2002 06:48:09 -0000 @@ -392,6 +392,9 @@ AP_INIT_ITERATE2("AddOutputFilter", add_extension_info, (void *)APR_XtOffsetOf(extension_info, output_filters), OR_FILEINFO, "output filter name (or ; delimited names) followed by one or more file extensions"), +AP_INIT_ITERATE2("AddOutputFilterByType", add_extension_info, + (void *)APR_XtOffsetOf(extension_info, output_filters), OR_FILEINFO, + "output filter name (or ; delimited names) followed by one or more file +extensions"), AP_INIT_ITERATE2("AddType", add_extension_info, (void *)APR_XtOffsetOf(extension_info, forced_type), OR_FILEINFO, "a mime type followed by one or more file extensions"), @@ -873,8 +876,25 @@ } if (r->content_type) { - content_type *ctp; - int override = 0; + content_type *ctp; + int override = 0; + const extension_info *ctinfo = NULL; + + /* Do content-type specific info before we add language + * decoration. + */ + ctinfo = (extension_info*)apr_hash_get(conf->extension_mappings, + r->content_type, + APR_HASH_KEY_STRING); + if (ctinfo) { + if (ctinfo->output_filters && r->proxyreq == PROXYREQ_NONE) { + const char *filter, *filters = ctinfo->output_filters; + while (*filters + && (filter = ap_getword(r->pool, &filters, ';'))) { + ap_add_output_filter(filter, NULL, r, r->connection); + } + } + } if ((ctp = analyze_ct(r, r->content_type))) { param *pp = ctp->param;