httpd-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Justin Erenkrantz <jerenkra...@apache.org>
Subject [PATCH] Add filter init function
Date Sat, 08 Jun 2002 04:47:25 GMT
As described earlier, this allows a filter to register a function
that allows it to do "something" before the data is generated.

I haven't tested it throughly, but plan on doing so later tonight.
If someone tests it and it works for them, feel free to commit if
you want.  Otherwise, I'll commit it soon-ish.  -- justin

Index: include/ap_mmn.h
===================================================================
RCS file: /home/cvs/httpd-2.0/include/ap_mmn.h,v
retrieving revision 1.48
diff -u -r1.48 ap_mmn.h
--- include/ap_mmn.h	2 Jun 2002 22:29:16 -0000	1.48
+++ include/ap_mmn.h	8 Jun 2002 04:40:38 -0000
@@ -107,14 +107,15 @@
  * 20020506 (2.0.37-dev) Removed r->boundary in request_rec.
  * 20020529 (2.0.37-dev) Standardized the names of some apr_pool_*_set funcs
  * 20020602 (2.0.37-dev) Bucket API change (metadata buckets)
+ * 20020607 (2.0.37-dev) Added filter_init param to filter reg calls.
  */
 
 #define MODULE_MAGIC_COOKIE 0x41503230UL /* "AP20" */
 
 #ifndef MODULE_MAGIC_NUMBER_MAJOR
-#define MODULE_MAGIC_NUMBER_MAJOR 20020602
+#define MODULE_MAGIC_NUMBER_MAJOR 20020607
 #endif
-#define MODULE_MAGIC_NUMBER_MINOR 1                     /* 0...n */
+#define MODULE_MAGIC_NUMBER_MINOR 0                     /* 0...n */
 
 /**
  * Determine if the server's current MODULE_MAGIC_NUMBER is at least a
Index: include/util_filter.h
===================================================================
RCS file: /home/cvs/httpd-2.0/include/util_filter.h,v
retrieving revision 1.72
diff -u -r1.72 util_filter.h
--- include/util_filter.h	8 Jun 2002 03:05:06 -0000	1.72
+++ include/util_filter.h	8 Jun 2002 04:40:39 -0000
@@ -153,12 +153,19 @@
  * for setting the association between a name for a filter and its 
  * associated callback (and other information).
  *
+ * If the initialization function argument passed to the registration
+ * functions is non-NULL, it will be called iff the filter is in the input
+ * or output filter chains and before any data is generated to allow the
+ * filter to prepare for processing.
+ *
  * The *bucket structure (and all those referenced by ->next and ->prev)
  * should be considered "const". The filter is allowed to modify the
  * next/prev to insert/remove/replace elements in the bucket list, but
  * the types and values of the individual buckets should not be altered.
  *
- * The return value of a filter should be an APR status value.
+ * For the input and output filters, the return value of a filter should be
+ * an APR status value.  For the init function, the return value should
+ * be an HTTP error code or OK if it was successful.
  * 
  * @ingroup filter
  * @{
@@ -170,6 +177,7 @@
                                           ap_input_mode_t mode,
                                           apr_read_type_e block,
                                           apr_off_t readbytes);
+typedef int (*ap_init_filter_func)(ap_filter_t *f);
 
 typedef union ap_filter_func {
     ap_out_filter_func out_func;
@@ -242,6 +250,8 @@
     const char *name;
     /** The function to call when this filter is invoked. */
     ap_filter_func filter_func;
+    /** The function to call before the handlers are invoked. */
+    ap_init_filter_func filter_init_func;
     /** The type of filter, either AP_FTYPE_CONTENT or AP_FTYPE_CONNECTION.  
      * An AP_FTYPE_CONTENT filter modifies the data based on information 
      * found in the content.  An AP_FTYPE_CONNECTION filter modifies the 
@@ -259,8 +269,8 @@
  * requests get an exact copy of the main requests filter chain.
  */
 struct ap_filter_t {
-     /** The internal representation of this filter.  This includes
-      *  the filter's name, type, and the actual function pointer.
+    /** The internal representation of this filter.  This includes
+     *  the filter's name, type, and the actual function pointer.
      */
     ap_filter_rec_t *frec;
 
@@ -324,6 +334,7 @@
  */
 AP_DECLARE(ap_filter_rec_t *) ap_register_input_filter(const char *name,
                                           ap_in_filter_func filter_func,
+                                          ap_init_filter_func filter_init,
                                           ap_filter_type ftype);
 /**
  * This function is used to register an output filter with the system. 
@@ -339,6 +350,7 @@
  */
 AP_DECLARE(ap_filter_rec_t *) ap_register_output_filter(const char *name,
                                             ap_out_filter_func filter_func,
+                                            ap_init_filter_func filter_init,
                                             ap_filter_type ftype);
 
 /**
Index: modules/experimental/mod_cache.c
===================================================================
RCS file: /home/cvs/httpd-2.0/modules/experimental/mod_cache.c,v
retrieving revision 1.44
diff -u -r1.44 mod_cache.c
--- modules/experimental/mod_cache.c	5 Jun 2002 21:49:16 -0000	1.44
+++ modules/experimental/mod_cache.c	8 Jun 2002 04:40:45 -0000
@@ -981,6 +981,7 @@
      */
     ap_register_output_filter("CACHE_IN", 
                               cache_in_filter, 
+                              NULL,
                               AP_FTYPE_CONTENT_SET);
     /* CACHE_OUT must go into the filter chain before SUBREQ_CORE to
      * handle subrequsts. Decrementing filter type by 1 ensures this 
@@ -988,9 +989,11 @@
      */
     ap_register_output_filter("CACHE_OUT", 
                               cache_out_filter, 
+                              NULL,
                               AP_FTYPE_CONTENT_SET-1);
     ap_register_output_filter("CACHE_CONDITIONAL", 
                               cache_conditional_filter, 
+                              NULL,
                               AP_FTYPE_CONTENT_SET);
     ap_hook_post_config(cache_post_config, NULL, NULL, APR_HOOK_REALLY_FIRST);
 }
Index: modules/experimental/mod_case_filter.c
===================================================================
RCS file: /home/cvs/httpd-2.0/modules/experimental/mod_case_filter.c,v
retrieving revision 1.11
diff -u -r1.11 mod_case_filter.c
--- modules/experimental/mod_case_filter.c	29 Mar 2002 08:17:21 -0000	1.11
+++ modules/experimental/mod_case_filter.c	8 Jun 2002 04:40:45 -0000
@@ -97,7 +97,7 @@
 static void CaseFilterRegisterHooks(apr_pool_t *p)
     {
     ap_hook_insert_filter(CaseFilterInsertFilter,NULL,NULL,APR_HOOK_MIDDLE);
-    ap_register_output_filter(s_szCaseFilterName,CaseFilterOutFilter,
+    ap_register_output_filter(s_szCaseFilterName,CaseFilterOutFilter,NULL,
 			      AP_FTYPE_RESOURCE);
     }
 
Index: modules/experimental/mod_case_filter_in.c
===================================================================
RCS file: /home/cvs/httpd-2.0/modules/experimental/mod_case_filter_in.c,v
retrieving revision 1.15
diff -u -r1.15 mod_case_filter_in.c
--- modules/experimental/mod_case_filter_in.c	29 Mar 2002 08:17:21 -0000	1.15
+++ modules/experimental/mod_case_filter_in.c	8 Jun 2002 04:40:49 -0000
@@ -181,7 +181,7 @@
 {
     ap_hook_insert_filter(CaseFilterInInsertFilter, NULL, NULL, 
                           APR_HOOK_MIDDLE);
-    ap_register_input_filter(s_szCaseFilterName, CaseFilterInFilter,
+    ap_register_input_filter(s_szCaseFilterName, CaseFilterInFilter, NULL,
                              AP_FTYPE_RESOURCE);
 }
 
Index: modules/experimental/mod_charset_lite.c
===================================================================
RCS file: /home/cvs/httpd-2.0/modules/experimental/mod_charset_lite.c,v
retrieving revision 1.62
diff -u -r1.62 mod_charset_lite.c
--- modules/experimental/mod_charset_lite.c	17 May 2002 11:33:09 -0000	1.62
+++ modules/experimental/mod_charset_lite.c	8 Jun 2002 04:40:53 -0000
@@ -1105,9 +1105,9 @@
 {
     ap_hook_fixups(find_code_page, NULL, NULL, APR_HOOK_MIDDLE);
     ap_hook_insert_filter(xlate_insert_filter, NULL, NULL, APR_HOOK_REALLY_LAST);
-    ap_register_output_filter(XLATEOUT_FILTER_NAME, xlate_out_filter, 
+    ap_register_output_filter(XLATEOUT_FILTER_NAME, xlate_out_filter, NULL,
                               AP_FTYPE_RESOURCE);
-    ap_register_input_filter(XLATEIN_FILTER_NAME, xlate_in_filter, 
+    ap_register_input_filter(XLATEIN_FILTER_NAME, xlate_in_filter, NULL,
                              AP_FTYPE_RESOURCE);
 }
 
Index: modules/experimental/mod_ext_filter.c
===================================================================
RCS file: /home/cvs/httpd-2.0/modules/experimental/mod_ext_filter.c,v
retrieving revision 1.28
diff -u -r1.28 mod_ext_filter.c
--- modules/experimental/mod_ext_filter.c	17 May 2002 11:33:09 -0000	1.28
+++ modules/experimental/mod_ext_filter.c	8 Jun 2002 04:40:54 -0000
@@ -311,12 +311,12 @@
      */
     if (filter->mode == OUTPUT_FILTER) {
         /* XXX need a way to ensure uniqueness among all filters */
-        ap_register_output_filter(filter->name, ef_output_filter, AP_FTYPE_RESOURCE);
+        ap_register_output_filter(filter->name, ef_output_filter, NULL, AP_FTYPE_RESOURCE);
     }
 #if 0              /* no input filters yet */
     else if (filter->mode == INPUT_FILTER) {
         /* XXX need a way to ensure uniqueness among all filters */
-        ap_register_input_filter(filter->name, ef_input_filter, AP_FTYPE_RESOURCE);
+        ap_register_input_filter(filter->name, ef_input_filter, NULL, AP_FTYPE_RESOURCE);
     }
 #endif
     else {
Index: modules/filters/mod_deflate.c
===================================================================
RCS file: /home/cvs/httpd-2.0/modules/filters/mod_deflate.c,v
retrieving revision 1.17
diff -u -r1.17 mod_deflate.c
--- modules/filters/mod_deflate.c	6 Jun 2002 15:25:21 -0000	1.17
+++ modules/filters/mod_deflate.c	8 Jun 2002 04:40:54 -0000
@@ -740,9 +740,9 @@
 
 static void register_hooks(apr_pool_t *p)
 {
-    ap_register_output_filter(deflateFilterName, deflate_out_filter,
+    ap_register_output_filter(deflateFilterName, deflate_out_filter, NULL,
                               AP_FTYPE_CONTENT_SET);
-    ap_register_input_filter(deflateFilterName, deflate_in_filter,
+    ap_register_input_filter(deflateFilterName, deflate_in_filter, NULL,
                               AP_FTYPE_CONTENT_SET);
 }
 
Index: modules/filters/mod_include.c
===================================================================
RCS file: /home/cvs/httpd-2.0/modules/filters/mod_include.c,v
retrieving revision 1.225
diff -u -r1.225 mod_include.c
--- modules/filters/mod_include.c	6 Jun 2002 21:49:59 -0000	1.225
+++ modules/filters/mod_include.c	8 Jun 2002 04:41:08 -0000
@@ -3296,6 +3296,16 @@
     return NULL;
 }
 
+static int includes_setup(ap_filter_t *f)
+{
+    /* Indicate that this request can't participate in If-Modified-Since
+     * requests because there is no true local copy of this file on disk.
+     */
+    f->r->no_local_copy = 1;
+    
+    return OK;
+}
+
 static apr_status_t includes_filter(ap_filter_t *f, apr_bucket_brigade *b)
 {
     request_rec *r = f->r;
@@ -3529,7 +3539,8 @@
     APR_REGISTER_OPTIONAL_FN(ap_register_include_handler);
     ap_hook_post_config(include_post_config, NULL, NULL, APR_HOOK_REALLY_FIRST);
     ap_hook_fixups(include_fixup, NULL, NULL, APR_HOOK_LAST);
-    ap_register_output_filter("INCLUDES", includes_filter, AP_FTYPE_RESOURCE);
+    ap_register_output_filter("INCLUDES", includes_filter, includes_setup,
+                              AP_FTYPE_RESOURCE);
 }
 
 module AP_MODULE_DECLARE_DATA include_module =
Index: modules/http/http_core.c
===================================================================
RCS file: /home/cvs/httpd-2.0/modules/http/http_core.c,v
retrieving revision 1.302
diff -u -r1.302 http_core.c
--- modules/http/http_core.c	5 Apr 2002 20:55:00 -0000	1.302
+++ modules/http/http_core.c	8 Jun 2002 04:41:08 -0000
@@ -330,15 +330,16 @@
     ap_hook_create_request(http_create_request, NULL, NULL, APR_HOOK_REALLY_LAST);
     ap_http_input_filter_handle =
         ap_register_input_filter("HTTP_IN", ap_http_filter,
-                                 AP_FTYPE_PROTOCOL);
+                                 NULL, AP_FTYPE_PROTOCOL);
     ap_http_header_filter_handle =
         ap_register_output_filter("HTTP_HEADER", ap_http_header_filter, 
-                                  AP_FTYPE_PROTOCOL);
+                                  NULL, AP_FTYPE_PROTOCOL);
     ap_chunk_filter_handle =
-        ap_register_output_filter("CHUNK", chunk_filter, AP_FTYPE_TRANSCODE);
+        ap_register_output_filter("CHUNK", chunk_filter,
+                                  NULL, AP_FTYPE_TRANSCODE);
     ap_byterange_filter_handle =
         ap_register_output_filter("BYTERANGE", ap_byterange_filter,
-                                  AP_FTYPE_PROTOCOL);
+                                  NULL, AP_FTYPE_PROTOCOL);
     ap_method_registry_init(p);
 }
 
Index: modules/metadata/mod_headers.c
===================================================================
RCS file: /home/cvs/httpd-2.0/modules/metadata/mod_headers.c,v
retrieving revision 1.39
diff -u -r1.39 mod_headers.c
--- modules/metadata/mod_headers.c	17 May 2002 11:33:10 -0000	1.39
+++ modules/metadata/mod_headers.c	8 Jun 2002 04:41:12 -0000
@@ -620,7 +620,8 @@
     ap_hook_pre_config(header_pre_config,NULL,NULL,APR_HOOK_MIDDLE);
     ap_hook_insert_filter(ap_headers_insert_output_filter, NULL, NULL, APR_HOOK_LAST);
     ap_hook_fixups(ap_headers_fixup, NULL, NULL, APR_HOOK_LAST);
-    ap_register_output_filter("FIXUP_HEADERS_OUT", ap_headers_output_filter, AP_FTYPE_CONTENT_SET);
+    ap_register_output_filter("FIXUP_HEADERS_OUT", ap_headers_output_filter,
+                              NULL, AP_FTYPE_CONTENT_SET);
 }
 
 module AP_MODULE_DECLARE_DATA headers_module =
Index: modules/proxy/proxy_ftp.c
===================================================================
RCS file: /home/cvs/httpd-2.0/modules/proxy/proxy_ftp.c,v
retrieving revision 1.120
diff -u -r1.120 proxy_ftp.c
--- modules/proxy/proxy_ftp.c	17 May 2002 11:24:16 -0000	1.120
+++ modules/proxy/proxy_ftp.c	8 Jun 2002 04:41:14 -0000
@@ -1929,7 +1929,8 @@
     proxy_hook_scheme_handler(ap_proxy_ftp_handler, NULL, NULL, APR_HOOK_MIDDLE);
     proxy_hook_canon_handler(ap_proxy_ftp_canon, NULL, NULL, APR_HOOK_MIDDLE);
     /* filters */
-    ap_register_output_filter("PROXY_SEND_DIR", ap_proxy_send_dir_filter, AP_FTYPE_RESOURCE);
+    ap_register_output_filter("PROXY_SEND_DIR", ap_proxy_send_dir_filter,
+                              NULL, AP_FTYPE_RESOURCE);
 }
 
 module AP_MODULE_DECLARE_DATA proxy_ftp_module = {
Index: modules/ssl/ssl_engine_io.c
===================================================================
RCS file: /home/cvs/httpd-2.0/modules/ssl/ssl_engine_io.c,v
retrieving revision 1.78
diff -u -r1.78 ssl_engine_io.c
--- modules/ssl/ssl_engine_io.c	4 Jun 2002 07:12:26 -0000	1.78
+++ modules/ssl/ssl_engine_io.c	8 Jun 2002 04:41:15 -0000
@@ -943,8 +943,8 @@
 
 void ssl_io_filter_register(apr_pool_t *p)
 {
-    ap_register_input_filter  (ssl_io_filter, ssl_io_filter_Input,  AP_FTYPE_CONNECTION +
5);
-    ap_register_output_filter (ssl_io_filter, ssl_io_filter_Output, AP_FTYPE_CONNECTION +
5);
+    ap_register_input_filter  (ssl_io_filter, ssl_io_filter_Input,  NULL, AP_FTYPE_CONNECTION
+ 5);
+    ap_register_output_filter (ssl_io_filter, ssl_io_filter_Output, NULL, AP_FTYPE_CONNECTION
+ 5);
     return;
 }
 
Index: modules/test/mod_bucketeer.c
===================================================================
RCS file: /home/cvs/httpd-2.0/modules/test/mod_bucketeer.c,v
retrieving revision 1.13
diff -u -r1.13 mod_bucketeer.c
--- modules/test/mod_bucketeer.c	31 May 2002 20:52:28 -0000	1.13
+++ modules/test/mod_bucketeer.c	8 Jun 2002 04:41:15 -0000
@@ -201,7 +201,7 @@
 static void register_hooks(apr_pool_t * p)
 {
     ap_register_output_filter(bucketeerFilterName, bucketeer_out_filter,
-                              AP_FTYPE_RESOURCE-1);
+                              NULL, AP_FTYPE_RESOURCE-1);
 }
 
 static const command_rec bucketeer_filter_cmds[] = {
Index: server/config.c
===================================================================
RCS file: /home/cvs/httpd-2.0/server/config.c,v
retrieving revision 1.151
diff -u -r1.151 config.c
--- server/config.c	20 May 2002 15:05:43 -0000	1.151
+++ server/config.c	8 Jun 2002 04:41:50 -0000
@@ -335,6 +335,20 @@
     return create_empty_config(p);
 }
 
+static int ap_invoke_filter_init(ap_filter_t *filters)
+{
+    while (filters) {
+        if (filters->frec->filter_init_func) {
+            int result = filters->frec->filter_init_func(filters);
+            if (result != OK) {
+                return result;
+            }
+        }
+        filters = filters->next;
+    } 
+    return OK;
+}
+
 AP_CORE_DECLARE(int) ap_invoke_handler(request_rec *r)
 {
     const char *handler;
@@ -351,6 +365,19 @@
      * fail, either your modules inserts something or it doesn't.  rbb
      */
     ap_run_insert_filter(r);
+
+    /* Before continuing, allow each filter that is in the two chains to
+     * run their init function to let them do any magic before we could
+     * start generating data.
+     */
+    result = ap_invoke_filter_init(r->input_filters);
+    if (result != OK) {
+        return result;
+    }
+    result = ap_invoke_filter_init(r->output_filters);
+    if (result != OK) {
+        return result;
+    }
 
     if (!r->handler) {
         handler = r->content_type ? r->content_type : ap_default_type(r);
Index: server/core.c
===================================================================
RCS file: /home/cvs/httpd-2.0/server/core.c,v
retrieving revision 1.182
diff -u -r1.182 core.c
--- server/core.c	31 May 2002 20:52:28 -0000	1.182
+++ server/core.c	8 Jun 2002 04:42:01 -0000
@@ -4098,21 +4098,22 @@
 
     ap_core_input_filter_handle =
         ap_register_input_filter("CORE_IN", core_input_filter,
-                                 AP_FTYPE_NETWORK);
+                                 NULL, AP_FTYPE_NETWORK);
     ap_net_time_filter_handle =
         ap_register_input_filter("NET_TIME", net_time_filter,
-                                 AP_FTYPE_PROTOCOL);
+                                 NULL, AP_FTYPE_PROTOCOL);
     ap_content_length_filter_handle =
         ap_register_output_filter("CONTENT_LENGTH", ap_content_length_filter,
-                                  AP_FTYPE_PROTOCOL);
+                                  NULL, AP_FTYPE_PROTOCOL);
     ap_core_output_filter_handle =
         ap_register_output_filter("CORE", core_output_filter,
-                                  AP_FTYPE_NETWORK);
+                                  NULL, AP_FTYPE_NETWORK);
     ap_subreq_core_filter_handle =
         ap_register_output_filter("SUBREQ_CORE", ap_sub_req_output_filter,
-                                  AP_FTYPE_CONTENT_SET);
-    ap_old_write_func = ap_register_output_filter("OLD_WRITE",
-                                   ap_old_write_filter, AP_FTYPE_RESOURCE - 10);
+                                  NULL, AP_FTYPE_CONTENT_SET);
+    ap_old_write_func =
+        ap_register_output_filter("OLD_WRITE", ap_old_write_filter,
+                                  NULL, AP_FTYPE_RESOURCE - 10);
 }
 
 AP_DECLARE_DATA module core_module = {
Index: server/util_filter.c
===================================================================
RCS file: /home/cvs/httpd-2.0/server/util_filter.c,v
retrieving revision 1.91
diff -u -r1.91 util_filter.c
--- server/util_filter.c	17 May 2002 11:11:37 -0000	1.91
+++ server/util_filter.c	8 Jun 2002 04:42:01 -0000
@@ -234,6 +234,7 @@
 
 static ap_filter_rec_t *register_filter(const char *name,
                             ap_filter_func filter_func,
+                            ap_init_filter_func filter_init,
                             ap_filter_type ftype,
                             filter_trie_node **reg_filter_set)
 {
@@ -266,6 +267,7 @@
         frec->name = normalized_name;
     }
     frec->filter_func = filter_func;
+    frec->filter_init_func = filter_init;
     frec->ftype = ftype;
     
     apr_pool_cleanup_register(FILTER_POOL, NULL, filter_cleanup, 
@@ -275,20 +277,24 @@
 
 AP_DECLARE(ap_filter_rec_t *) ap_register_input_filter(const char *name,
                                           ap_in_filter_func filter_func,
+                                          ap_init_filter_func filter_init,
                                           ap_filter_type ftype)
 {
     ap_filter_func f;
     f.in_func = filter_func;
-    return register_filter(name, f, ftype, &registered_input_filters);
+    return register_filter(name, f, filter_init, ftype,
+                           &registered_input_filters);
 }                                                                    
 
 AP_DECLARE(ap_filter_rec_t *) ap_register_output_filter(const char *name,
                                            ap_out_filter_func filter_func,
+                                           ap_init_filter_func filter_init,
                                            ap_filter_type ftype)
 {
     ap_filter_func f;
     f.out_func = filter_func;
-    return register_filter(name, f, ftype, &registered_output_filters);
+    return register_filter(name, f, filter_init, ftype,
+                           &registered_output_filters);
 }
 
 static ap_filter_t *add_any_filter_handle(ap_filter_rec_t *frec, void *ctx, 

Mime
View raw message