summaryrefslogtreecommitdiff
path: root/modules/caddyhttp/map
diff options
context:
space:
mode:
authorMatthew Holt <mholt@users.noreply.github.com>2020-10-02 15:23:52 -0600
committerMatthew Holt <mholt@users.noreply.github.com>2020-10-02 15:23:52 -0600
commit0fc47e8357af5ccd6f800819722229b1a279e5b5 (patch)
treec3b8e2fd7b9232a81ae05e545b32309d4b048a4b /modules/caddyhttp/map
parent25d2b4bf2927bf69ddce582d33339ef7d13cb6bf (diff)
map: Apply default if mapped output is nil
Diffstat (limited to 'modules/caddyhttp/map')
-rw-r--r--modules/caddyhttp/map/caddyfile.go9
-rw-r--r--modules/caddyhttp/map/map.go24
2 files changed, 21 insertions, 12 deletions
diff --git a/modules/caddyhttp/map/caddyfile.go b/modules/caddyhttp/map/caddyfile.go
index 67c148b..eb0c5ae 100644
--- a/modules/caddyhttp/map/caddyfile.go
+++ b/modules/caddyhttp/map/caddyfile.go
@@ -70,7 +70,10 @@ func parseCaddyfile(h httpcaddyfile.Helper) (caddyhttp.MiddlewareHandler, error)
// every other line maps one input to one or more outputs
in := h.Val()
- outs := h.RemainingArgs()
+ var outs []interface{}
+ for _, out := range h.RemainingArgs() {
+ outs = append(outs, out)
+ }
// cannot have more outputs than destinations
if len(outs) > len(handler.Destinations) {
@@ -78,9 +81,9 @@ func parseCaddyfile(h httpcaddyfile.Helper) (caddyhttp.MiddlewareHandler, error)
}
// for convenience, can have fewer outputs than destinations, but the
- // underlying handler won't accept that, so we fill in empty values
+ // underlying handler won't accept that, so we fill in nil values
for len(outs) < len(handler.Destinations) {
- outs = append(outs, "")
+ outs = append(outs, nil)
}
// create the mapping
diff --git a/modules/caddyhttp/map/map.go b/modules/caddyhttp/map/map.go
index 29aa19f..ba90e6f 100644
--- a/modules/caddyhttp/map/map.go
+++ b/modules/caddyhttp/map/map.go
@@ -16,7 +16,6 @@ package maphandler
import (
"fmt"
- "log"
"net/http"
"regexp"
"strings"
@@ -40,14 +39,15 @@ type Handler struct {
// Source is the placeholder from which to get the input value.
Source string `json:"source,omitempty"`
- // Destinations are the placeholders in which to store the outputs.
+ // Destinations are the names of placeholders in which to store the outputs.
Destinations []string `json:"destinations,omitempty"`
// Mappings from source values (inputs) to destination values (outputs).
// The first matching mapping will be applied.
Mappings []Mapping `json:"mappings,omitempty"`
- // If no mappings match, the default value will be applied (optional).
+ // If no mappings match or if the mapped output is null/nil, the associated
+ // default output will be applied (optional).
Defaults []string
}
@@ -125,20 +125,26 @@ func (h Handler) ServeHTTP(w http.ResponseWriter, r *http.Request, next caddyhtt
// find the first mapping matching the input and return
// the requested destination/output value
for _, m := range h.Mappings {
- log.Printf("MAPPING: %+v", m)
if m.re != nil {
if m.re.MatchString(input) {
- return m.Outputs[destIdx], true
+ if output := m.Outputs[destIdx]; output == nil {
+ break
+ } else {
+ return output, true
+ }
}
continue
}
if input == m.Input {
- log.Printf("RETURNING: %s", m.Outputs[destIdx])
- return m.Outputs[destIdx], true
+ if output := m.Outputs[destIdx]; output == nil {
+ break
+ } else {
+ return output, true
+ }
}
}
- // fall back to default if no match
+ // fall back to default if no match or if matched nil value
if len(h.Defaults) > destIdx {
return h.Defaults[destIdx], true
}
@@ -171,7 +177,7 @@ type Mapping struct {
// Upon a match with the input, each output is positionally correlated
// with each destination of the parent handler.
- Outputs []string `json:"outputs,omitempty"`
+ Outputs []interface{} `json:"outputs,omitempty"`
re *regexp.Regexp
}