]> git.ipfire.org Git - thirdparty/apache/httpd.git/commitdiff
clarification/fixes around the replace() function
authorEric Covener <covener@apache.org>
Tue, 3 Aug 2021 18:29:35 +0000 (18:29 +0000)
committerEric Covener <covener@apache.org>
Tue, 3 Aug 2021 18:29:35 +0000 (18:29 +0000)
git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@1891990 13f79535-47bb-0310-9956-ffa450edef68

docs/manual/expr.xml
include/ap_expr.h
server/util_expr_eval.c

index 87f56f1d7795d97572ae7d7ee1556350260d59c7..4afb5a99bfc6488f6ad343357a1a3136efa7f43e 100644 (file)
@@ -602,7 +602,8 @@ DIGIT       ::= &lt;any US-ASCII digit "0".."9"&gt;
             (RFC4514) and LDAP filter escaping (RFC4515).</td><td></td></tr>
     <tr><td><code>replace</code></td>
         <td>replace(string, "from", "to") replaces all occurrences of "from"
-            in the string with "to".</td><td></td></tr>
+            in the string with "to". The first parameter must not be a literal string.
+            </td><td></td></tr>
 
     </table>
 
@@ -752,9 +753,8 @@ DIGIT       ::= &lt;any US-ASCII digit "0".."9"&gt;
 &lt;If "md5('foo') == 'acbd18db4cc2f85cedef654fccc4a4d8'"&gt;
   Header set checksum-matched true
 &lt;/If&gt;
-&lt;If "md5('foo') == replace('md5:XXXd18db4cc2f85cedef654fccc4a4d8', 'md5:XXX', 'acb')"&gt;
-  Header set checksum-matched-2 true
-&lt;/If&gt;
+
+Requir expr replace(%{REQUEST_METHOD},  'E', 'O') == 'GET'"
 
 # Function example in string context
 Header set foo-checksum "expr=%{md5:foo}"
index 3e1eea0be2f36d7b1be24c7bd7f3485e89795016..8923de7db7964349dac6cbd10232ace6e6f2bb26 100644 (file)
@@ -287,8 +287,9 @@ typedef struct {
 
     /** arg for pre-parsing (only if a simple string).
      *  For binary ops, this is the right argument.
-     *  For functions with more arguments, this is the first string
-     *  argument. */
+     *  For AP_EXPR_FUNC_STRING functions with multiple arguments, this is the first 
+     *  simple/literal string argument. 
+     */
     const char *arg;
 } ap_expr_lookup_parms;
 
index 83741345eff388e273c7f253704419f8fa5901fe..823978d2f344d3614994fb424761c305fd6952d6 100644 (file)
@@ -286,7 +286,7 @@ static const char *ap_expr_eval_string_func(ap_expr_eval_ctx_t *ctx,
     if (arg->node_op == op_ListElement) {
         /* Evaluate the list elements and store them in apr_array_header. */
         ap_expr_string_list_func_t *func = (ap_expr_string_list_func_t *)info->node_arg1;
-        apr_array_header_t *args = ap_expr_list_make(ctx, arg->node_arg1);
+        apr_array_header_t *args = ap_expr_list_make(ctx, arg);
         return (*func)(ctx, data, args);
     }
     else {
@@ -735,10 +735,12 @@ static ap_expr_t *ap_expr_info_make(int type, const char *name,
                 parms.arg = arg->node_arg1;
                 break;
             case op_ListElement:
+                /* save the first literal/simple string argument */
                 do {
                     const ap_expr_t *val = arg->node_arg1;
-                    if (val->node_op == op_String) {
+                    if (val && val->node_op == op_String) {
                         parms.arg = val->node_arg1;
+                        break;
                     }
                     arg = arg->node_arg2;
                 } while (arg != NULL);
@@ -1424,10 +1426,10 @@ static int replace_func_parse_arg(ap_expr_lookup_parms *parms)
     const apr_strmatch_pattern *pattern;
 
     if (!parms->arg) {
-        *parms->err = apr_psprintf(parms->ptemp, "replace() function needs "
-                                   "exactly 3 arguments");
+        *parms->err = apr_psprintf(parms->ptemp, "replace() function needs an argument");
         return !OK;
     }
+
     pattern = apr_strmatch_precompile(parms->pool, original, 0);
     *parms->data = pattern;
     return OK;
@@ -1445,13 +1447,13 @@ static const char *replace_func(ap_expr_eval_ctx_t *ctx, const void *data,
     const apr_strmatch_pattern *pattern = data;
     if (args->nelts != 3) {
         *ctx->err = apr_psprintf(ctx->p, "replace() function needs "
-                                 "exactly 3 arguments");
+                                 "exactly 3 arguments, got %d", args->nelts);
         return "";
     }
 
-    buff = APR_ARRAY_IDX(args, 2, char *);
+    buff = APR_ARRAY_IDX(args, 0, char *);
     original = APR_ARRAY_IDX(args, 1, char *);
-    replacement = APR_ARRAY_IDX(args, 0, char *);
+    replacement = APR_ARRAY_IDX(args, 2, char *);
     repl_len = strlen(replacement);
     orig_len = strlen(original);
     bytes = strlen(buff);