You are viewing a plain text version of this content. The canonical link for it is here.
Posted to cvs@httpd.apache.org by je...@apache.org on 2002/06/28 10:40:25 UTC

cvs commit: httpd-2.0/server config.c core.c util_filter.c

jerenkrantz    2002/06/28 01:40:25

  Modified:    .        CHANGES
               include  ap_mmn.h util_filter.h
               modules/experimental mod_cache.c mod_case_filter.c
                        mod_case_filter_in.c mod_charset_lite.c
                        mod_ext_filter.c
               modules/filters mod_deflate.c mod_include.c
               modules/http http_core.c
               modules/metadata mod_headers.c
               modules/proxy proxy_ftp.c
               modules/ssl ssl_engine_io.c
               modules/test mod_bucketeer.c
               server   config.c core.c util_filter.c
  Log:
  Add a filter_init function to the filters so that a filter can execute
  arbitrary code before the handlers are invoked.
  
  This resolves an issue with incorrect 304s on If-Modified-Since mod_include
  requests since ap_meets_conditions() is not aware that this is a dynamic
  request and it is not possible to satisfy 304 for these requests (unless
  xbithack full is on, of course).  When mod_include runs as a filter, it is
  too late to set any flag since the handler is responsible for calling
  ap_meets_conditions(), which it should do before generating any data.
  
  If a module doesn't need to run such arbitrary code, it can just pass NULL
  as the argument and all is well.
  
  PR:	9673
  Reviewed by:	Ryan Bloom and others
  
  Revision  Changes    Path
  1.854     +5 -0      httpd-2.0/CHANGES
  
  Index: CHANGES
  ===================================================================
  RCS file: /home/cvs/httpd-2.0/CHANGES,v
  retrieving revision 1.853
  retrieving revision 1.854
  diff -u -r1.853 -r1.854
  --- CHANGES	27 Jun 2002 06:07:57 -0000	1.853
  +++ CHANGES	28 Jun 2002 08:40:23 -0000	1.854
  @@ -1,5 +1,10 @@
   Changes with Apache 2.0.40
   
  +  *) Add a filter_init parameter to the filter registration functions
  +     so that a filter can execute arbitrary code before the handlers
  +     are invoked.  This resolves a problem where mod_include requests
  +     would incorrectly return a 304.  [Justin Erenkrantz]
  +
     *) Fix a long-standing bug in 2.0, CGI scripts were being called
        with relative paths instead of absolute paths.  Apache 1.3 used
        absolute paths for everything except for SuExec, this brings back
  
  
  
  1.51      +2 -1      httpd-2.0/include/ap_mmn.h
  
  Index: ap_mmn.h
  ===================================================================
  RCS file: /home/cvs/httpd-2.0/include/ap_mmn.h,v
  retrieving revision 1.50
  retrieving revision 1.51
  diff -u -r1.50 -r1.51
  --- ap_mmn.h	26 Jun 2002 19:45:06 -0000	1.50
  +++ ap_mmn.h	28 Jun 2002 08:40:23 -0000	1.51
  @@ -109,12 +109,13 @@
    * 20020602 (2.0.37-dev) Bucket API change (metadata buckets)
    * 20020612 (2.0.38-dev) Changed server_rec->[keep_alive_]timeout to apr time
    * 20020625 (2.0.40-dev) Changed conn_rec->keepalive to an enumeration
  + * 20020628 (2.0.40-dev) Added filter_init to filter registration functions
    */
   
   #define MODULE_MAGIC_COOKIE 0x41503230UL /* "AP20" */
   
   #ifndef MODULE_MAGIC_NUMBER_MAJOR
  -#define MODULE_MAGIC_NUMBER_MAJOR 20020625
  +#define MODULE_MAGIC_NUMBER_MAJOR 20020628
   #endif
   #define MODULE_MAGIC_NUMBER_MINOR 0                     /* 0...n */
   
  
  
  
  1.74      +15 -3     httpd-2.0/include/util_filter.h
  
  Index: util_filter.h
  ===================================================================
  RCS file: /home/cvs/httpd-2.0/include/util_filter.h,v
  retrieving revision 1.73
  retrieving revision 1.74
  diff -u -r1.73 -r1.74
  --- util_filter.h	27 Jun 2002 05:32:20 -0000	1.73
  +++ util_filter.h	28 Jun 2002 08:40:23 -0000	1.74
  @@ -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);
   
   /**
  
  
  
  1.46      +3 -0      httpd-2.0/modules/experimental/mod_cache.c
  
  Index: mod_cache.c
  ===================================================================
  RCS file: /home/cvs/httpd-2.0/modules/experimental/mod_cache.c,v
  retrieving revision 1.45
  retrieving revision 1.46
  diff -u -r1.45 -r1.46
  --- mod_cache.c	23 Jun 2002 06:10:00 -0000	1.45
  +++ mod_cache.c	28 Jun 2002 08:40:23 -0000	1.46
  @@ -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);
   }
  
  
  
  1.14      +1 -1      httpd-2.0/modules/experimental/mod_case_filter.c
  
  Index: mod_case_filter.c
  ===================================================================
  RCS file: /home/cvs/httpd-2.0/modules/experimental/mod_case_filter.c,v
  retrieving revision 1.13
  retrieving revision 1.14
  diff -u -r1.13 -r1.14
  --- mod_case_filter.c	24 Jun 2002 07:17:36 -0000	1.13
  +++ mod_case_filter.c	28 Jun 2002 08:40:23 -0000	1.14
  @@ -98,7 +98,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);
       }
   
  
  
  
  1.18      +1 -1      httpd-2.0/modules/experimental/mod_case_filter_in.c
  
  Index: mod_case_filter_in.c
  ===================================================================
  RCS file: /home/cvs/httpd-2.0/modules/experimental/mod_case_filter_in.c,v
  retrieving revision 1.17
  retrieving revision 1.18
  diff -u -r1.17 -r1.18
  --- mod_case_filter_in.c	24 Jun 2002 07:17:36 -0000	1.17
  +++ mod_case_filter_in.c	28 Jun 2002 08:40:24 -0000	1.18
  @@ -182,7 +182,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);
   }
   
  
  
  
  1.63      +2 -2      httpd-2.0/modules/experimental/mod_charset_lite.c
  
  Index: mod_charset_lite.c
  ===================================================================
  RCS file: /home/cvs/httpd-2.0/modules/experimental/mod_charset_lite.c,v
  retrieving revision 1.62
  retrieving revision 1.63
  diff -u -r1.62 -r1.63
  --- mod_charset_lite.c	17 May 2002 11:33:09 -0000	1.62
  +++ mod_charset_lite.c	28 Jun 2002 08:40:24 -0000	1.63
  @@ -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);
   }
   
  
  
  
  1.31      +2 -2      httpd-2.0/modules/experimental/mod_ext_filter.c
  
  Index: mod_ext_filter.c
  ===================================================================
  RCS file: /home/cvs/httpd-2.0/modules/experimental/mod_ext_filter.c,v
  retrieving revision 1.30
  retrieving revision 1.31
  diff -u -r1.30 -r1.31
  --- mod_ext_filter.c	26 Jun 2002 13:01:50 -0000	1.30
  +++ mod_ext_filter.c	28 Jun 2002 08:40:24 -0000	1.31
  @@ -312,12 +312,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 {
  
  
  
  1.21      +2 -2      httpd-2.0/modules/filters/mod_deflate.c
  
  Index: mod_deflate.c
  ===================================================================
  RCS file: /home/cvs/httpd-2.0/modules/filters/mod_deflate.c,v
  retrieving revision 1.20
  retrieving revision 1.21
  diff -u -r1.20 -r1.21
  --- mod_deflate.c	14 Jun 2002 17:16:59 -0000	1.20
  +++ mod_deflate.c	28 Jun 2002 08:40:24 -0000	1.21
  @@ -760,9 +760,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);
   }
   
  
  
  
  1.230     +22 -1     httpd-2.0/modules/filters/mod_include.c
  
  Index: mod_include.c
  ===================================================================
  RCS file: /home/cvs/httpd-2.0/modules/filters/mod_include.c,v
  retrieving revision 1.229
  retrieving revision 1.230
  diff -u -r1.229 -r1.230
  --- mod_include.c	20 Jun 2002 03:45:21 -0000	1.229
  +++ mod_include.c	28 Jun 2002 08:40:24 -0000	1.230
  @@ -3323,6 +3323,26 @@
       return NULL;
   }
   
  +static int includes_setup(ap_filter_t *f)
  +{
  +    include_dir_config *conf = 
  +               (include_dir_config *)ap_get_module_config(f->r->per_dir_config,
  +                                                          &include_module);
  +
  +    /* When our xbithack value isn't set to full or our platform isn't
  +     * providing group-level protection bits or our group-level bits do not
  +     * have group-execite on, we will set the no_local_copy value to 1 so
  +     * that we will not send 304s.
  +     */
  +    if ((*conf->xbithack != xbithack_full)
  +        || !(f->r->finfo.valid & APR_FINFO_GPROT)
  +        || !(f->r->finfo.protection & APR_GEXECUTE)) {
  +        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;
  @@ -3556,7 +3576,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 =
  
  
  
  1.305     +5 -4      httpd-2.0/modules/http/http_core.c
  
  Index: http_core.c
  ===================================================================
  RCS file: /home/cvs/httpd-2.0/modules/http/http_core.c,v
  retrieving revision 1.304
  retrieving revision 1.305
  diff -u -r1.304 -r1.305
  --- http_core.c	26 Jun 2002 19:45:06 -0000	1.304
  +++ http_core.c	28 Jun 2002 08:40:24 -0000	1.305
  @@ -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);
   }
   
  
  
  
  1.40      +2 -1      httpd-2.0/modules/metadata/mod_headers.c
  
  Index: mod_headers.c
  ===================================================================
  RCS file: /home/cvs/httpd-2.0/modules/metadata/mod_headers.c,v
  retrieving revision 1.39
  retrieving revision 1.40
  diff -u -r1.39 -r1.40
  --- mod_headers.c	17 May 2002 11:33:10 -0000	1.39
  +++ mod_headers.c	28 Jun 2002 08:40:24 -0000	1.40
  @@ -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 =
  
  
  
  1.124     +2 -1      httpd-2.0/modules/proxy/proxy_ftp.c
  
  Index: proxy_ftp.c
  ===================================================================
  RCS file: /home/cvs/httpd-2.0/modules/proxy/proxy_ftp.c,v
  retrieving revision 1.123
  retrieving revision 1.124
  diff -u -r1.123 -r1.124
  --- proxy_ftp.c	23 Jun 2002 06:06:25 -0000	1.123
  +++ proxy_ftp.c	28 Jun 2002 08:40:24 -0000	1.124
  @@ -1926,7 +1926,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 = {
  
  
  
  1.79      +2 -2      httpd-2.0/modules/ssl/ssl_engine_io.c
  
  Index: ssl_engine_io.c
  ===================================================================
  RCS file: /home/cvs/httpd-2.0/modules/ssl/ssl_engine_io.c,v
  retrieving revision 1.78
  retrieving revision 1.79
  diff -u -r1.78 -r1.79
  --- ssl_engine_io.c	4 Jun 2002 07:12:26 -0000	1.78
  +++ ssl_engine_io.c	28 Jun 2002 08:40:25 -0000	1.79
  @@ -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;
   }
   
  
  
  
  1.14      +1 -1      httpd-2.0/modules/test/mod_bucketeer.c
  
  Index: mod_bucketeer.c
  ===================================================================
  RCS file: /home/cvs/httpd-2.0/modules/test/mod_bucketeer.c,v
  retrieving revision 1.13
  retrieving revision 1.14
  diff -u -r1.13 -r1.14
  --- mod_bucketeer.c	31 May 2002 20:52:28 -0000	1.13
  +++ mod_bucketeer.c	28 Jun 2002 08:40:25 -0000	1.14
  @@ -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[] = {
  
  
  
  1.153     +27 -0     httpd-2.0/server/config.c
  
  Index: config.c
  ===================================================================
  RCS file: /home/cvs/httpd-2.0/server/config.c,v
  retrieving revision 1.152
  retrieving revision 1.153
  diff -u -r1.152 -r1.153
  --- config.c	12 Jun 2002 23:59:31 -0000	1.152
  +++ config.c	28 Jun 2002 08:40:25 -0000	1.153
  @@ -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);
  
  
  
  1.188     +8 -7      httpd-2.0/server/core.c
  
  Index: core.c
  ===================================================================
  RCS file: /home/cvs/httpd-2.0/server/core.c,v
  retrieving revision 1.187
  retrieving revision 1.188
  diff -u -r1.187 -r1.188
  --- core.c	27 Jun 2002 05:18:19 -0000	1.187
  +++ core.c	28 Jun 2002 08:40:25 -0000	1.188
  @@ -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 = {
  
  
  
  1.92      +8 -2      httpd-2.0/server/util_filter.c
  
  Index: util_filter.c
  ===================================================================
  RCS file: /home/cvs/httpd-2.0/server/util_filter.c,v
  retrieving revision 1.91
  retrieving revision 1.92
  diff -u -r1.91 -r1.92
  --- util_filter.c	17 May 2002 11:11:37 -0000	1.91
  +++ util_filter.c	28 Jun 2002 08:40:25 -0000	1.92
  @@ -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, 
  
  
  

Re: Committed ap_init_filter_func code

Posted by Ian Holsman <ia...@apache.org>.
Justin Erenkrantz wrote:
> On Fri, Jun 28, 2002 at 08:40:25AM -0000, jerenkrantz@apache.org wrote:
> 
>>jerenkrantz    2002/06/28 01:40:25
>>
>>  Modified:    .        CHANGES
> 
> <snip, snip>
> 
>>  Log:
>>  Add a filter_init function to the filters so that a filter can execute
>>  arbitrary code before the handlers are invoked.
> 
> 
> I went and committed this as no one has suggested a *viable*
> alternative to this approach that doesn't have design flaws.
> 
> I know Greg is uneasy with this approach, but perhaps now that it is
> in the repository, it'll spark him to come up with an approach that
> is better.  
> 
> The one caveat of the filter_init function is that it can not
> play with the headers because the handlers are responsible for
> setting the headers (such as L-M and C-L...).  If/when we revamp
> handlers again, perhaps it would be nice to separate out the headers
> from the entity generation (i.e. two distinct phases) - so that this
> filter initialization could execute once the headers are set in
> stone but before the content is created.  I don't think we could do
> this in a 2.0 construct, so this might be something to add for a 2.1
> (or 3.0).  NBD in any case.  -- justin
> 
Can you put this caveat in a doxygen comment near the hook declaration.

Thanks



Committed ap_init_filter_func code

Posted by Justin Erenkrantz <je...@apache.org>.
On Fri, Jun 28, 2002 at 08:40:25AM -0000, jerenkrantz@apache.org wrote:
> jerenkrantz    2002/06/28 01:40:25
> 
>   Modified:    .        CHANGES
<snip, snip>
>   Log:
>   Add a filter_init function to the filters so that a filter can execute
>   arbitrary code before the handlers are invoked.

I went and committed this as no one has suggested a *viable*
alternative to this approach that doesn't have design flaws.

I know Greg is uneasy with this approach, but perhaps now that it is
in the repository, it'll spark him to come up with an approach that
is better.  

The one caveat of the filter_init function is that it can not
play with the headers because the handlers are responsible for
setting the headers (such as L-M and C-L...).  If/when we revamp
handlers again, perhaps it would be nice to separate out the headers
from the entity generation (i.e. two distinct phases) - so that this
filter initialization could execute once the headers are set in
stone but before the content is created.  I don't think we could do
this in a 2.0 construct, so this might be something to add for a 2.1
(or 3.0).  NBD in any case.  -- justin