diff options
| author | Matthew Holt <mholt@users.noreply.github.com> | 2020-10-02 15:23:52 -0600 | 
|---|---|---|
| committer | Matthew Holt <mholt@users.noreply.github.com> | 2020-10-02 15:23:52 -0600 | 
| commit | 0fc47e8357af5ccd6f800819722229b1a279e5b5 (patch) | |
| tree | c3b8e2fd7b9232a81ae05e545b32309d4b048a4b /modules/caddyhttp/map/map.go | |
| parent | 25d2b4bf2927bf69ddce582d33339ef7d13cb6bf (diff) | |
map: Apply default if mapped output is nil
Diffstat (limited to 'modules/caddyhttp/map/map.go')
| -rw-r--r-- | modules/caddyhttp/map/map.go | 24 | 
1 files changed, 15 insertions, 9 deletions
| 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  } | 
