From 55b4c12e0404347828ed691594d1f8ae8228c598 Mon Sep 17 00:00:00 2001 From: Matthew Holt Date: Mon, 21 Mar 2022 17:05:38 -0600 Subject: [PATCH] map: Evaluate placeholders in output vals (#4650) --- modules/caddyhttp/map/map.go | 4 ++++ modules/caddyhttp/map/map_test.go | 17 +++++++++++++++++ 2 files changed, 21 insertions(+) diff --git a/modules/caddyhttp/map/map.go b/modules/caddyhttp/map/map.go index 83949550..0a27aab8 100644 --- a/modules/caddyhttp/map/map.go +++ b/modules/caddyhttp/map/map.go @@ -145,6 +145,10 @@ func (h Handler) ServeHTTP(w http.ResponseWriter, r *http.Request, next caddyhtt return string(result), true } if input == m.Input { + if outputStr, ok := output.(string); ok { + // NOTE: if the output has a placeholder that has the same key as the input, this is infinite recursion + return repl.ReplaceAll(outputStr, ""), true + } return output, true } } diff --git a/modules/caddyhttp/map/map_test.go b/modules/caddyhttp/map/map_test.go index 2789459b..26d6e85e 100644 --- a/modules/caddyhttp/map/map_test.go +++ b/modules/caddyhttp/map/map_test.go @@ -82,6 +82,22 @@ func TestHandler(t *testing.T) { "output": "3", }, }, + { + reqURI: "/foo", + handler: Handler{ + Source: "{http.request.uri.path}", + Destinations: []string{"{output}"}, + Mappings: []Mapping{ + { + Input: "/foo", + Outputs: []interface{}{"{testvar}"}, + }, + }, + }, + expect: map[string]interface{}{ + "output": "testing", + }, + }, } { if err := tc.handler.Provision(caddy.Context{}); err != nil { t.Fatalf("Test %d: Provisioning handler: %v", i, err) @@ -92,6 +108,7 @@ func TestHandler(t *testing.T) { t.Fatalf("Test %d: Creating request: %v", i, err) } repl := caddyhttp.NewTestReplacer(req) + repl.Set("testvar", "testing") ctx := context.WithValue(req.Context(), caddy.ReplacerCtxKey, repl) req = req.WithContext(ctx)