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

cvs commit: httpd-2.0/modules/mappers mod_rewrite.c mod_rewrite.h

jwoolley    02/05/05 20:10:24

  Modified:    .        CHANGES
               modules/mappers mod_rewrite.c mod_rewrite.h
  Log:
  Added an optional function (ap_register_rewrite_mapfunc) which allows
  third-party modules to extend mod_rewrite's "int:" internal RewriteMap
  functionality.
  
  Concept by:  Tahiry Ramanamampanoharana <no...@hotmail.com>
  
  Revision  Changes    Path
  1.759     +4 -0      httpd-2.0/CHANGES
  
  Index: CHANGES
  ===================================================================
  RCS file: /home/cvs/httpd-2.0/CHANGES,v
  retrieving revision 1.758
  retrieving revision 1.759
  diff -u -d -u -r1.758 -r1.759
  --- CHANGES	4 May 2002 06:14:04 -0000	1.758
  +++ CHANGES	6 May 2002 03:10:22 -0000	1.759
  @@ -1,5 +1,9 @@
   Changes with Apache 2.0.37
   
  +  *) Allow mod_rewrite's set of "int:" internal RewriteMap functions
  +     to be extended by third-party modules via an optional function.
  +     [Tahiry Ramanamampanoharana <no...@hotmail.com>, Cliff Woolley]
  +
     *) Fix mod_include expression parser's handling of unquoted strings
        followed immediately by a closing paren.  PR 8462.  [Brian Pane]
   
  
  
  
  1.108     +36 -28    httpd-2.0/modules/mappers/mod_rewrite.c
  
  Index: mod_rewrite.c
  ===================================================================
  RCS file: /home/cvs/httpd-2.0/modules/mappers/mod_rewrite.c,v
  retrieving revision 1.107
  retrieving revision 1.108
  diff -u -d -u -r1.107 -r1.108
  --- mod_rewrite.c	22 Apr 2002 10:27:01 -0000	1.107
  +++ mod_rewrite.c	6 May 2002 03:10:24 -0000	1.108
  @@ -90,6 +90,7 @@
   
   #include "apr.h"
   #include "apr_strings.h"
  +#include "apr_hash.h"
   #include "apr_user.h"
   #include "apr_lib.h"
   #include "apr_signal.h"
  @@ -180,6 +181,9 @@
       /* the module (predeclaration) */
   module AP_MODULE_DECLARE_DATA rewrite_module;
   
  +    /* rewritemap int: handler function registry */
  +static apr_hash_t *mapfunc_hash;
  +
       /* the cache */
   static cache *cachep;
   
  @@ -458,19 +462,8 @@
           newmap->type      = MAPTYPE_INT;
           newmap->datafile  = NULL;
           newmap->checkfile = NULL;
  -        if (strcmp(a2+4, "tolower") == 0) {
  -            newmap->func = rewrite_mapfunc_tolower;
  -        }
  -        else if (strcmp(a2+4, "toupper") == 0) {
  -            newmap->func = rewrite_mapfunc_toupper;
  -        }
  -        else if (strcmp(a2+4, "escape") == 0) {
  -            newmap->func = rewrite_mapfunc_escape;
  -        }
  -        else if (strcmp(a2+4, "unescape") == 0) {
  -            newmap->func = rewrite_mapfunc_unescape;
  -        }
  -        else if (sconf->state == ENGINE_ENABLED) {
  +        newmap->func      = apr_hash_get(mapfunc_hash, a2+4, strlen(a2+4));
  +        if ((sconf->state == ENGINE_ENABLED) && (newmap->func == NULL)) {
               return apr_pstrcat(cmd->pool, "RewriteMap: internal map not found:",
                                 a2+4, NULL);
           }
  @@ -921,15 +914,31 @@
   /*
   **
   **  Global Module Initialization
  -**  [called from read_config() after all
  -**  config commands were already called]
   **
   */
   
  -static int init_module(apr_pool_t *p,
  -                        apr_pool_t *plog,
  -                        apr_pool_t *ptemp,
  -                        server_rec *s)
  +static int pre_config(apr_pool_t *pconf,
  +                      apr_pool_t *plog,
  +                      apr_pool_t *ptemp)
  +{
  +    APR_OPTIONAL_FN_TYPE(ap_register_rewrite_mapfunc) *map_pfn_register;
  +
  +    /* register int: rewritemap handlers */
  +    mapfunc_hash = apr_hash_make(pconf);
  +    map_pfn_register = APR_RETRIEVE_OPTIONAL_FN(ap_register_rewrite_mapfunc);
  +    if (map_pfn_register) {
  +        map_pfn_register("tolower", rewrite_mapfunc_tolower);
  +        map_pfn_register("toupper", rewrite_mapfunc_toupper);
  +        map_pfn_register("escape", rewrite_mapfunc_escape);
  +        map_pfn_register("unescape", rewrite_mapfunc_unescape);
  +    }
  +    return OK;
  +}
  +
  +static int post_config(apr_pool_t *p,
  +                       apr_pool_t *plog,
  +                       apr_pool_t *ptemp,
  +                       server_rec *s)
   {
       apr_status_t rv;
       void *data;
  @@ -2781,7 +2790,7 @@
                   }
               }
               else if (s->type == MAPTYPE_INT) {
  -                if ((value = lookup_map_internal(r, s->func, key)) != NULL) {
  +                if ((value = s->func(r, key)) != NULL) {
                       rewritelog(r, 5, "map lookup OK: map=%s key=%s -> val=%s",
                                  s->name, key, value);
                       return value;
  @@ -2982,13 +2991,9 @@
       }
   }
   
  -static char *lookup_map_internal(request_rec *r,
  -                                 char *(*func)(request_rec *, char *),
  -                                 char *key)
  +static void ap_register_rewrite_mapfunc(char *name, rewrite_mapfunc_t *func)
   {
  -    /* currently we just let the function convert
  -       the key to a corresponding value */
  -    return func(r, key);
  +    apr_hash_set(mapfunc_hash, name, strlen(name), (const void *)func);
   }
   
   static char *rewrite_mapfunc_toupper(request_rec *r, char *key)
  @@ -4187,8 +4192,11 @@
   
   static void register_hooks(apr_pool_t *p)
   {
  +    APR_REGISTER_OPTIONAL_FN(ap_register_rewrite_mapfunc);
  +
       ap_hook_handler(handler_redirect, NULL, NULL, APR_HOOK_MIDDLE);
  -    ap_hook_post_config(init_module, NULL, NULL, APR_HOOK_MIDDLE);
  +    ap_hook_pre_config(pre_config, NULL, NULL, APR_HOOK_MIDDLE);
  +    ap_hook_post_config(post_config, NULL, NULL, APR_HOOK_MIDDLE);
       ap_hook_child_init(init_child, NULL, NULL, APR_HOOK_MIDDLE);
   
       ap_hook_fixups(hook_fixup, NULL, NULL, APR_HOOK_FIRST);
  
  
  
  1.31      +15 -7     httpd-2.0/modules/mappers/mod_rewrite.h
  
  Index: mod_rewrite.h
  ===================================================================
  RCS file: /home/cvs/httpd-2.0/modules/mappers/mod_rewrite.h,v
  retrieving revision 1.30
  retrieving revision 1.31
  diff -u -d -u -r1.30 -r1.31
  --- mod_rewrite.h	5 Apr 2002 20:01:20 -0000	1.30
  +++ mod_rewrite.h	6 May 2002 03:10:24 -0000	1.31
  @@ -115,6 +115,7 @@
   #if APR_HAS_THREADS
   #include "apr_thread_mutex.h"
   #endif
  +#include "apr_optional.h"
   #include "ap_config.h"
   
       /* Include from the Apache server ... */
  @@ -384,10 +385,13 @@
                                              char *key, char *val);
   
       /* initialisation */
  -static int init_module(apr_pool_t *p,
  -                        apr_pool_t *plog,
  -                        apr_pool_t *ptemp,
  -                        server_rec *s);
  +static int pre_config(apr_pool_t *pconf,
  +                      apr_pool_t *plog,
  +                      apr_pool_t *ptemp);
  +static int post_config(apr_pool_t *pconf,
  +                       apr_pool_t *plog,
  +                       apr_pool_t *ptemp,
  +                       server_rec *s);
   static void init_child(apr_pool_t *p, server_rec *s);
   
       /* runtime hooks */
  @@ -425,13 +429,17 @@
   #endif
   static char *lookup_map_program(request_rec *r, apr_file_t *fpin,
                                   apr_file_t *fpout, char *key);
  -static char *lookup_map_internal(request_rec *r,
  -                                 char *(*func)(request_rec *r, char *key),
  -                                 char *key);
  +
  +typedef char *(rewrite_mapfunc_t)(request_rec *r, char *key);
  +static void ap_register_rewrite_mapfunc(char *name, rewrite_mapfunc_t *func);
  +APR_DECLARE_OPTIONAL_FN(void, ap_register_rewrite_mapfunc,
  +                        (char *name, rewrite_mapfunc_t *func));
  +
   static char *rewrite_mapfunc_toupper(request_rec *r, char *key);
   static char *rewrite_mapfunc_tolower(request_rec *r, char *key);
   static char *rewrite_mapfunc_escape(request_rec *r, char *key);
   static char *rewrite_mapfunc_unescape(request_rec *r, char *key);
  +
   static char *select_random_value_part(request_rec *r, char *value);
   static void  rewrite_rand_init(void);
   static int   rewrite_rand(int l, int h);