map: Evaluate placeholders in output vals (#4650)

This commit is contained in:
Matthew Holt 2022-03-21 17:05:38 -06:00
parent 2196c92c0e
commit 55b4c12e04
No known key found for this signature in database
GPG key ID: 2A349DD577D586A5
2 changed files with 21 additions and 0 deletions

View file

@ -145,6 +145,10 @@ func (h Handler) ServeHTTP(w http.ResponseWriter, r *http.Request, next caddyhtt
return string(result), true return string(result), true
} }
if input == m.Input { 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 return output, true
} }
} }

View file

@ -82,6 +82,22 @@ func TestHandler(t *testing.T) {
"output": "3", "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 { if err := tc.handler.Provision(caddy.Context{}); err != nil {
t.Fatalf("Test %d: Provisioning handler: %v", i, err) 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) t.Fatalf("Test %d: Creating request: %v", i, err)
} }
repl := caddyhttp.NewTestReplacer(req) repl := caddyhttp.NewTestReplacer(req)
repl.Set("testvar", "testing")
ctx := context.WithValue(req.Context(), caddy.ReplacerCtxKey, repl) ctx := context.WithValue(req.Context(), caddy.ReplacerCtxKey, repl)
req = req.WithContext(ctx) req = req.WithContext(ctx)