dgaudet     98/02/23 02:53:35

  Modified:    src      CHANGES
               src/modules/standard mod_setenvif.c
  Log:
  BrowserMatch didn't handle spaces in the regex properly.  I redid Ronald's
  patch because it would have required proper quoting to work right.
  
  While I was in there I removed the need for the cmd->info cast, and cleaned
  up a few other things.
  
  PR:           1825
  Submitted by: Ronald Tschalaer <[EMAIL PROTECTED]>
  
  Revision  Changes    Path
  1.661     +3 -0      apache-1.3/src/CHANGES
  
  Index: CHANGES
  ===================================================================
  RCS file: /export/home/cvs/apache-1.3/src/CHANGES,v
  retrieving revision 1.660
  retrieving revision 1.661
  diff -u -r1.660 -r1.661
  --- CHANGES   1998/02/23 08:34:56     1.660
  +++ CHANGES   1998/02/23 10:53:27     1.661
  @@ -1,5 +1,8 @@
   Changes with Apache 1.3b6
   
  +  *) The mod_setenvif BrowserMatch backwards compatibility command did not
  +     work properly with spaces in the regex.  [Ronald Tschalaer] PR#1825
  +
     *) Add new RewriteMap types: First, `rnd' which is equivalent to the `txt'
        type but with a special post-processing for the looked-up value: It
        parses it into alternatives according to `|' chars and then only one
  
  
  
  1.16      +35 -35    apache-1.3/src/modules/standard/mod_setenvif.c
  
  Index: mod_setenvif.c
  ===================================================================
  RCS file: /export/home/cvs/apache-1.3/src/modules/standard/mod_setenvif.c,v
  retrieving revision 1.15
  retrieving revision 1.16
  diff -u -r1.15 -r1.16
  --- mod_setenvif.c    1998/01/31 15:34:50     1.15
  +++ mod_setenvif.c    1998/02/23 10:53:31     1.16
  @@ -146,35 +146,27 @@
       return a;
   }
   
  -static const char *add_setenvif(cmd_parms *cmd, void *mconfig, const char 
*args)
  +/* any non-NULL magic constant will do... used to indicate if REG_ICASE 
should be
  + * used */
  +#define ICASE_MAGIC  ((void *)(&setenvif_module))
  +
  +static const char *add_setenvif_core(cmd_parms *cmd, void *mconfig,
  +    char *fname, const char *args)
   {
  -    char *fname;
       char *regex;
       const char *feature;
  -    const char *cmdline = args;
       sei_cfg_rec *sconf = get_module_config(cmd->server->module_config,
                                              &setenvif_module);
       sei_entry *new, *entries = (sei_entry *) sconf->conditionals->elts;
       char *var;
       int i;
  -    int cflags = (int) (long) cmd->info;
  -    char *error;
       int beenhere = 0;
   
  -    /*
  -     * Pull in the invariant pieces from the command line.
  -     */
  -    fname = getword_conf(cmd->pool, &cmdline);
  -    if (!*fname) {
  -        error = pstrcat(cmd->pool, "Missing header-field name for ",
  -                        cmd->cmd->name, NULL);
  -        return error;
  -    }
  -    regex = getword_conf(cmd->pool, &cmdline);
  +    /* get regex */
  +    regex = getword_conf(cmd->pool, &args);
       if (!*regex) {
  -        error = pstrcat(cmd->pool, "Missing regular expression for ",
  +        return pstrcat(cmd->pool, "Missing regular expression for ",
                           cmd->cmd->name, NULL);
  -        return error;
       }
   
       /*
  @@ -195,17 +187,17 @@
       new->name = fname;
       new->regex = regex;
       new->preg = pregcomp(cmd->pool, regex,
  -                         (REG_EXTENDED | REG_NOSUB | cflags));
  +                         (REG_EXTENDED | REG_NOSUB
  +                      | (cmd->info == ICASE_MAGIC ? REG_ICASE : 0)));
       if (new->preg == NULL) {
  -        error = pstrcat(cmd->pool, cmd->cmd->name,
  +        return pstrcat(cmd->pool, cmd->cmd->name,
                           " regex could not be compiled.", NULL);
  -        return error;
       }
       new->features = make_table(cmd->pool, 5);
   
   gotit:
       for( ; ; ) {
  -     feature = getword_conf(cmd->pool, &cmdline);
  +     feature = getword_conf(cmd->pool, &args);
        if(!*feature)
            break;
           beenhere++;
  @@ -223,38 +215,46 @@
       }
   
       if (!beenhere) {
  -        error = pstrcat(cmd->pool, "Missing envariable expression for ",
  +        return pstrcat(cmd->pool, "Missing envariable expression for ",
                           cmd->cmd->name, NULL);
  -        return error;
       }
   
       return NULL;
   }
   
  +static const char *add_setenvif(cmd_parms *cmd, void *mconfig, const char 
*args)
  +{
  +    char *fname;
  +
  +    /* get header name */
  +    fname = getword_conf(cmd->pool, &args);
  +    if (!*fname) {
  +        return pstrcat(cmd->pool, "Missing header-field name for ",
  +                        cmd->cmd->name, NULL);
  +    }
  +    return add_setenvif_core(cmd, mconfig, fname, args);
  +}
  +
   /*
    * This routine handles the BrowserMatch* directives.  It simply turns around
    * and feeds them, with the appropriate embellishments, to the 
general-purpose
    * command handler.
    */
  -static const char *add_browser(cmd_parms *cmd, void *mconfig, char *word1,
  -                               char *word2)
  +static const char *add_browser(cmd_parms *cmd, void *mconfig, const char 
*args)
   {
  -    const char *match_command;
  -
  -    match_command = pstrcat(cmd->pool, "User-Agent ", word1, " ", word2, 
NULL);
  -    return add_setenvif(cmd, mconfig, match_command);
  +    return add_setenvif_core(cmd, mconfig, "User-Agent", args);
   }
   
   static command_rec setenvif_module_cmds[] =
   {
  -    {"SetEnvIf", add_setenvif, (void *) 0,
  +    {"SetEnvIf", add_setenvif, NULL,
        RSRC_CONF, RAW_ARGS, "A header-name, regex and a list of variables."},
  -    {"SetEnvIfNoCase", add_setenvif, (void *) REG_ICASE,
  +    {"SetEnvIfNoCase", add_setenvif, ICASE_MAGIC,
        RSRC_CONF, RAW_ARGS, "a header-name, regex and a list of variables."},
  -    {"BrowserMatch", add_browser, (void *) 0,
  -     RSRC_CONF, ITERATE2, "A browser regex and a list of variables."},
  -    {"BrowserMatchNoCase", add_browser, (void *) REG_ICASE,
  -     RSRC_CONF, ITERATE2, "A browser regex and a list of variables."},
  +    {"BrowserMatch", add_browser, NULL,
  +     RSRC_CONF, RAW_ARGS, "A browser regex and a list of variables."},
  +    {"BrowserMatchNoCase", add_browser, ICASE_MAGIC,
  +     RSRC_CONF, RAW_ARGS, "A browser regex and a list of variables."},
       {NULL},
   };
   
  
  
  

Reply via email to