From 7f013d763f13719183741de18633b1f0f9f0a3ad Mon Sep 17 00:00:00 2001 From: armadi1809 Date: Sun, 10 Mar 2024 18:59:15 -0500 Subject: [PATCH] Modified replace operation to use regexes in caddyfile --- modules/caddyhttp/rewrite/caddyfile.go | 2 +- modules/caddyhttp/rewrite/rewrite.go | 21 +++++++++++++++++++-- 2 files changed, 20 insertions(+), 3 deletions(-) diff --git a/modules/caddyhttp/rewrite/caddyfile.go b/modules/caddyhttp/rewrite/caddyfile.go index f882b208cc39..0ce5c41d2176 100644 --- a/modules/caddyhttp/rewrite/caddyfile.go +++ b/modules/caddyhttp/rewrite/caddyfile.go @@ -214,7 +214,7 @@ func applyQueryOps(h httpcaddyfile.Helper, qo *queryOps, args []string) error { qo.Rename = append(qo.Rename, queryOpsArguments{Key: renameValKey[0], Val: renameValKey[1]}) case len(args) == 3: - qo.Replace = append(qo.Replace, queryOpsReplacement{Key: key, Search: args[1], Replace: args[2]}) + qo.Replace = append(qo.Replace, &queryOpsReplacement{Key: key, SearchRegexp: args[1], Replace: args[2]}) default: if len(args) != 2 { diff --git a/modules/caddyhttp/rewrite/rewrite.go b/modules/caddyhttp/rewrite/rewrite.go index ade8cdbb01ef..7acf651819e3 100644 --- a/modules/caddyhttp/rewrite/rewrite.go +++ b/modules/caddyhttp/rewrite/rewrite.go @@ -118,6 +118,12 @@ func (rewr *Rewrite) Provision(ctx caddy.Context) error { rep.re = re } + for _, replacementOp := range rewr.Query.Replace { + err := replacementOp.Provision(ctx) + if err != nil { + return fmt.Errorf("compiling regular expression %s in query rewrite replace operation: %v", replacementOp.SearchRegexp, err) + } + } return nil } @@ -491,15 +497,26 @@ type queryOps struct { Add []queryOpsArguments `json:"add,omitempty"` // Replaces query parameters. - Replace []queryOpsReplacement + Replace []*queryOpsReplacement // Deletes a given query key by name. Delete []string `json:"delete,omitempty"` } +// Provision compiles the query replace operation regex. +func (replacement *queryOpsReplacement) Provision(_ caddy.Context) error { + if replacement.SearchRegexp != "" { + re, err := regexp.Compile(replacement.SearchRegexp) + if err != nil { + return fmt.Errorf("replacement for query field '%s': %v", replacement.Key, err) + } + replacement.re = re + } + return nil +} + func (q *queryOps) do(r *http.Request, repl *caddy.Replacer) { query := r.URL.Query() - for _, renameParam := range q.Rename { key := repl.ReplaceAll(renameParam.Key, "") val := repl.ReplaceAll(renameParam.Val, "")