You are viewing a plain text version of this content. The canonical link for it is here.
Posted to cvs@httpd.apache.org by ni...@apache.org on 2010/09/29 01:26:45 UTC

svn commit: r1002415 - in /httpd/httpd/trunk: include/ap_expr.h server/util_expr.c

Author: niq
Date: Tue Sep 28 23:26:44 2010
New Revision: 1002415

URL: http://svn.apache.org/viewvc?rev=1002415&view=rev
Log:
Add "IN" operator to expression parser, to evaluate membership of
a list of tokens.  Couldn't resist after sf's comment on r1002363!

This means expressions like
<If %{REQUEST_METHOD} IN GET,HEAD,OPTIONS,...>
will work as a drop-in substitute for <Limit>

Also fix off-by-one bug in variable evaluation

Modified:
    httpd/httpd/trunk/include/ap_expr.h
    httpd/httpd/trunk/server/util_expr.c

Modified: httpd/httpd/trunk/include/ap_expr.h
URL: http://svn.apache.org/viewvc/httpd/httpd/trunk/include/ap_expr.h?rev=1002415&r1=1002414&r2=1002415&view=diff
==============================================================================
--- httpd/httpd/trunk/include/ap_expr.h (original)
+++ httpd/httpd/trunk/include/ap_expr.h Tue Sep 28 23:26:44 2010
@@ -45,7 +45,8 @@ typedef enum {
     TOKEN_LE,
     TOKEN_GT,
     TOKEN_LT,
-    TOKEN_ACCESS
+    TOKEN_ACCESS,
+    TOKEN_IN
 } token_type_t;
 
 typedef struct {

Modified: httpd/httpd/trunk/server/util_expr.c
URL: http://svn.apache.org/viewvc/httpd/httpd/trunk/server/util_expr.c?rev=1002415&r1=1002414&r2=1002415&view=diff
==============================================================================
--- httpd/httpd/trunk/server/util_expr.c (original)
+++ httpd/httpd/trunk/server/util_expr.c Tue Sep 28 23:26:44 2010
@@ -389,6 +389,13 @@ static int get_ptoken(apr_pool_t *pool, 
             return 0;
         }
         break;
+    case 'I':
+        if (**parse == 'N') {
+            TYPE_TOKEN(token, TOKEN_IN);
+            ++*parse;
+            return 0;
+        }
+        break;
     }
 
     /* It's a string or regex token
@@ -604,6 +611,7 @@ AP_DECLARE(ap_parse_node_t*) ap_expr_par
         case TOKEN_GT:
         case TOKEN_LE:
         case TOKEN_LT:
+        case TOKEN_IN:
             if (current->token.type == TOKEN_STRING) {
                 current = current->parent;
 
@@ -819,6 +827,27 @@ static int expr_eval(request_rec *r, ap_
             default: current->value = 0; break; /* should not happen */
             }
             break;
+        case TOKEN_IN:
+            if (!current->left || !current->right ||
+                current->left->token.type != TOKEN_STRING ||
+                current->right->token.type != TOKEN_STRING) {
+                ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r,
+                              "Invalid expression in file %s", r->filename);
+                *was_error = 1;
+                return 0;
+            }
+
+            lval = PARSE_STRING(r, current->left->token.value);
+            rval = PARSE_STRING(r, current->right->token.value);
+            val = strstr(rval, lval);
+            /* should be included as a complete word, not a subword
+             * as in regexp /\bLVAL\b/
+             */
+            current->value = (val != NULL
+                              && (val == rval || !isalnum(val[-1]))
+                              && !isalnum(val[strlen(val)]))
+                ? 1 : 0;
+            break;
 
         case TOKEN_NOT:
         case TOKEN_GROUP:
@@ -941,7 +970,7 @@ AP_DECLARE_NONSTD(const char*) ap_expr_s
         char *ch, *var;
         apr_time_exp_t tm;
 
-        var = apr_pstrndup(r->pool, str+2, p-str-3);
+        var = apr_pstrndup(r->pool, str+2, p-str-2);
         for (ch = var; *ch; ++ch) {
             *ch = apr_toupper(*ch);
         }