You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@httpd.apache.org by rb...@covalent.net on 2000/11/19 08:45:53 UTC

[PATCH] Filtering based on Mime-Type

Here is a patch that implements mime-based filtering.  In the config file,
the adming puts:

SetFilter mime/type Filter1 Filter2 filter3 ...

When the server goes to serve something of a given type, the specified
filters are added.  I know there are some people who have very specific
ideas of how this should be done, and I didn't want to upset anybody by
committing this the day before the alpha was released.  If people want me
to add this before I roll tomorrow I will.  If not, this will be the first
commit after I tag.

Ryan

? build.log
? build.err
? lib/apr/test/build.log
? lib/apr/test/build.err
? modules/proxy/.libs
? modules/proxy/libapachemod_proxy.la
Index: CHANGES
===================================================================
RCS file: /home/cvs/apache-2.0/src/CHANGES,v
retrieving revision 1.341
diff -u -d -b -w -u -r1.341 CHANGES
--- CHANGES	2000/11/18 20:52:28	1.341
+++ CHANGES	2000/11/19 07:34:51
@@ -1,4 +1,8 @@
 Changes with Apache 2.0a8
+  *) Add a directive to mod_mime so that filters can be associated with
+     a given mime-type.
+     [Ryan Bloom]
+
   *) Get multi-views working again.  We were setting the path_info
      field incorrectly if we couldn't find the specified file.
      [Ryan Bloom]
Index: modules/standard/mod_mime.c
===================================================================
RCS file: /home/cvs/apache-2.0/src/modules/standard/mod_mime.c,v
retrieving revision 1.28
diff -u -d -b -w -u -r1.28 mod_mime.c
--- modules/standard/mod_mime.c	2000/10/16 06:05:06	1.28
+++ modules/standard/mod_mime.c	2000/11/19 07:35:57
@@ -101,11 +101,11 @@
     apr_table_t *language_types;      /* Added with AddLanguage... */
     apr_table_t *handlers;            /* Added with AddHandler...  */
     apr_table_t *charset_types;       /* Added with AddCharset... */       
+    apr_table_t *filter_names;        /* Added with SetFilterStack... */       
     apr_array_header_t *handlers_remove;     /* List of handlers to remove */
     apr_array_header_t *types_remove;       /* List of MIME types to remove */
     apr_array_header_t *encodings_remove; /* List of encodings to remove */
 
-
     char *type;                 /* Type forced with ForceType  */
     char *handler;              /* Handler forced with SetHandler */
     char *default_language;     /* Language if no AddLanguage ext found */
@@ -142,6 +142,7 @@
     new->encoding_types = apr_make_table(p, 4);
     new->charset_types = apr_make_table(p, 4);
     new->language_types = apr_make_table(p, 4);
+    new->filter_names = apr_make_table(p, 4);
     new->handlers = apr_make_table(p, 4);
     new->handlers_remove = apr_make_array(p, 4, sizeof(attrib_info));
     new->types_remove = apr_make_array(p, 4, sizeof(attrib_info));
@@ -171,6 +172,8 @@
 					   base->charset_types);
     new->language_types = apr_overlay_tables(p, add->language_types,
                                          base->language_types);
+    new->filter_names = apr_overlay_tables(p, add->filter_names,
+                                   base->filter_names);
     new->handlers = apr_overlay_tables(p, add->handlers,
                                    base->handlers);
 
@@ -266,6 +269,17 @@
     return NULL;
 }
 
+static const char *set_filter(cmd_parms *cmd, void *m_, const char *ct_,
+                            const char *filt)
+{
+    mime_dir_config *m=m_;
+    char *ct=apr_pstrdup(cmd->pool,ct_);
+
+    ap_str_tolower(ct);
+    apr_table_addn(m->filter_names, ct, filt);
+    return NULL;
+}
+
 /*
  * Note handler names that should be un-added for this location.  This
  * will keep the association from being inherited, as well, but not
@@ -342,6 +356,8 @@
      "a language (e.g., fr), followed by one or more file extensions"),
 AP_INIT_ITERATE2("AddHandler", add_handler, NULL, OR_FILEINFO,
      "a handler name followed by one or more file extensions"),
+AP_INIT_ITERATE2("SetFilter", set_filter, NULL, OR_FILEINFO, 
+     "a mime type followed by one or more filters"),
 AP_INIT_TAKE1("ForceType", ap_set_string_slot_lower, 
      (void *)XtOffsetOf(mime_dir_config, type), OR_FILEINFO,
      "a media type"),
@@ -808,10 +824,27 @@
     return OK;
 }
 
+static int filter_chain(void *input, const char *key, const char *val)
+{
+    request_rec *r = input;
+
+    ap_add_output_filter(val, NULL, r, r->connection);
+    return 1;
+}
+
+static void mime_insert_filter(request_rec *r)
+{
+    mime_dir_config *conf =
+    (mime_dir_config *) ap_get_module_config(r->per_dir_config, &mime_module);
+
+    apr_table_do(filter_chain, r, conf->filter_names, r->content_type, NULL);
+}
+
 static void register_hooks(void)
 {
     ap_hook_type_checker(find_ct,NULL,NULL,AP_HOOK_MIDDLE);
     ap_hook_post_config(mime_post_config,NULL,NULL,AP_HOOK_MIDDLE);
+    ap_hook_insert_filter(mime_insert_filter, NULL, NULL, AP_HOOK_MIDDLE);
 }
 
 module AP_MODULE_DECLARE_DATA mime_module = {


_______________________________________________________________________________
Ryan Bloom                        	rbb@apache.org
406 29th St.
San Francisco, CA 94131
-------------------------------------------------------------------------------


Re: [PATCH] Filtering based on Mime-Type

Posted by Bill Stoddard <bi...@wstoddard.com>.
+1
----- Original Message ----- 
From: <rb...@covalent.net>
To: <ne...@apache.org>
Sent: Sunday, November 19, 2000 2:45 AM
Subject: [PATCH] Filtering based on Mime-Type


> 
> Here is a patch that implements mime-based filtering.  In the config file,
> the adming puts:
> 
> SetFilter mime/type Filter1 Filter2 filter3 ...
> 
> When the server goes to serve something of a given type, the specified
> filters are added.  I know there are some people who have very specific
> ideas of how this should be done, and I didn't want to upset anybody by
> committing this the day before the alpha was released.  If people want me
> to add this before I roll tomorrow I will.  If not, this will be the first
> commit after I tag.
> 
> Ryan
> 
> ? build.log
> ? build.err
> ? lib/apr/test/build.log
> ? lib/apr/test/build.err
> ? modules/proxy/.libs
> ? modules/proxy/libapachemod_proxy.la
> Index: CHANGES
> ===================================================================
> RCS file: /home/cvs/apache-2.0/src/CHANGES,v
> retrieving revision 1.341
> diff -u -d -b -w -u -r1.341 CHANGES
> --- CHANGES 2000/11/18 20:52:28 1.341
> +++ CHANGES 2000/11/19 07:34:51
> @@ -1,4 +1,8 @@
>  Changes with Apache 2.0a8
> +  *) Add a directive to mod_mime so that filters can be associated with
> +     a given mime-type.
> +     [Ryan Bloom]
> +
>    *) Get multi-views working again.  We were setting the path_info
>       field incorrectly if we couldn't find the specified file.
>       [Ryan Bloom]
> Index: modules/standard/mod_mime.c
> ===================================================================
> RCS file: /home/cvs/apache-2.0/src/modules/standard/mod_mime.c,v
> retrieving revision 1.28
> diff -u -d -b -w -u -r1.28 mod_mime.c
> --- modules/standard/mod_mime.c 2000/10/16 06:05:06 1.28
> +++ modules/standard/mod_mime.c 2000/11/19 07:35:57
> @@ -101,11 +101,11 @@
>      apr_table_t *language_types;      /* Added with AddLanguage... */
>      apr_table_t *handlers;            /* Added with AddHandler...  */
>      apr_table_t *charset_types;       /* Added with AddCharset... */       
> +    apr_table_t *filter_names;        /* Added with SetFilterStack... */       
>      apr_array_header_t *handlers_remove;     /* List of handlers to remove */
>      apr_array_header_t *types_remove;       /* List of MIME types to remove */
>      apr_array_header_t *encodings_remove; /* List of encodings to remove */
>  
> -
>      char *type;                 /* Type forced with ForceType  */
>      char *handler;              /* Handler forced with SetHandler */
>      char *default_language;     /* Language if no AddLanguage ext found */
> @@ -142,6 +142,7 @@
>      new->encoding_types = apr_make_table(p, 4);
>      new->charset_types = apr_make_table(p, 4);
>      new->language_types = apr_make_table(p, 4);
> +    new->filter_names = apr_make_table(p, 4);
>      new->handlers = apr_make_table(p, 4);
>      new->handlers_remove = apr_make_array(p, 4, sizeof(attrib_info));
>      new->types_remove = apr_make_array(p, 4, sizeof(attrib_info));
> @@ -171,6 +172,8 @@
>      base->charset_types);
>      new->language_types = apr_overlay_tables(p, add->language_types,
>                                           base->language_types);
> +    new->filter_names = apr_overlay_tables(p, add->filter_names,
> +                                   base->filter_names);
>      new->handlers = apr_overlay_tables(p, add->handlers,
>                                     base->handlers);
>  
> @@ -266,6 +269,17 @@
>      return NULL;
>  }
>  
> +static const char *set_filter(cmd_parms *cmd, void *m_, const char *ct_,
> +                            const char *filt)
> +{
> +    mime_dir_config *m=m_;
> +    char *ct=apr_pstrdup(cmd->pool,ct_);
> +
> +    ap_str_tolower(ct);
> +    apr_table_addn(m->filter_names, ct, filt);
> +    return NULL;
> +}
> +
>  /*
>   * Note handler names that should be un-added for this location.  This
>   * will keep the association from being inherited, as well, but not
> @@ -342,6 +356,8 @@
>       "a language (e.g., fr), followed by one or more file extensions"),
>  AP_INIT_ITERATE2("AddHandler", add_handler, NULL, OR_FILEINFO,
>       "a handler name followed by one or more file extensions"),
> +AP_INIT_ITERATE2("SetFilter", set_filter, NULL, OR_FILEINFO, 
> +     "a mime type followed by one or more filters"),
>  AP_INIT_TAKE1("ForceType", ap_set_string_slot_lower, 
>       (void *)XtOffsetOf(mime_dir_config, type), OR_FILEINFO,
>       "a media type"),
> @@ -808,10 +824,27 @@
>      return OK;
>  }
>  
> +static int filter_chain(void *input, const char *key, const char *val)
> +{
> +    request_rec *r = input;
> +
> +    ap_add_output_filter(val, NULL, r, r->connection);
> +    return 1;
> +}
> +
> +static void mime_insert_filter(request_rec *r)
> +{
> +    mime_dir_config *conf =
> +    (mime_dir_config *) ap_get_module_config(r->per_dir_config, &mime_module);
> +
> +    apr_table_do(filter_chain, r, conf->filter_names, r->content_type, NULL);
> +}
> +
>  static void register_hooks(void)
>  {
>      ap_hook_type_checker(find_ct,NULL,NULL,AP_HOOK_MIDDLE);
>      ap_hook_post_config(mime_post_config,NULL,NULL,AP_HOOK_MIDDLE);
> +    ap_hook_insert_filter(mime_insert_filter, NULL, NULL, AP_HOOK_MIDDLE);
>  }
>  
>  module AP_MODULE_DECLARE_DATA mime_module = {
> 
> 
> _______________________________________________________________________________
> Ryan Bloom                        rbb@apache.org
> 406 29th St.
> San Francisco, CA 94131
> -------------------------------------------------------------------------------
> 


Re: [PATCH] Filtering based on Mime-Type

Posted by Jeff Trawick <tr...@bellsouth.net>.
rbb@covalent.net writes:

> Here is a patch that implements mime-based filtering.  In the config file,
> the adming puts:
> 
> SetFilter mime/type Filter1 Filter2 filter3 ...
> 
> When the server goes to serve something of a given type, the specified
> filters are added.  I know there are some people who have very specific
> ideas of how this should be done, and I didn't want to upset anybody by
> committing this the day before the alpha was released.  If people want me
> to add this before I roll tomorrow I will.  If not, this will be the first
> commit after I tag.

+1 for committing before the alpha.  If something bad happens, you can
always comment it out.

-- 
Jeff Trawick | trawick@ibm.net | PGP public key at web site:
     http://www.geocities.com/SiliconValley/Park/9289/
          Born in Roswell... married an alien...