Browse Source

Fix: config merger fixes (#2084)

Jebbs 3 years ago
parent
commit
9bbc3af6cd
3 changed files with 18 additions and 11 deletions
  1. 10 10
      infra/conf/merge/map.go
  2. 3 0
      infra/conf/mergers/merge.go
  3. 5 1
      infra/conf/mergers/merger_base.go

+ 10 - 10
infra/conf/merge/map.go

@@ -6,6 +6,7 @@ package merge
 
 import (
 	"fmt"
+	"reflect"
 )
 
 // mergeMaps merges source map into target
@@ -27,18 +28,17 @@ func mergeField(target interface{}, source interface{}) (interface{}, error) {
 	if target == nil {
 		return source, nil
 	}
+	if reflect.TypeOf(source) != reflect.TypeOf(target) {
+		return nil, fmt.Errorf("type mismatch, expect %T, incoming %T", target, source)
+	}
 	if slice, ok := source.([]interface{}); ok {
-		if tslice, ok := target.([]interface{}); ok {
-			tslice = append(tslice, slice...)
-			return tslice, nil
-		}
-		return nil, fmt.Errorf("value type mismatch, source is 'slice' but target not: %s", source)
+		tslice, _ := target.([]interface{})
+		tslice = append(tslice, slice...)
+		return tslice, nil
 	} else if smap, ok := source.(map[string]interface{}); ok {
-		if tmap, ok := target.(map[string]interface{}); ok {
-			err := mergeMaps(tmap, smap)
-			return tmap, err
-		}
-		return nil, fmt.Errorf("value type mismatch, source is 'map[string]interface{}' but target not: %s", source)
+		tmap, _ := target.(map[string]interface{})
+		err := mergeMaps(tmap, smap)
+		return tmap, err
 	}
 	return source, nil
 }

+ 3 - 0
infra/conf/mergers/merge.go

@@ -22,6 +22,9 @@ func MergeAs(formatName string, input interface{}, m map[string]interface{}) err
 // it detects extension for merger selecting, or try all mergers
 // if no extension found
 func Merge(input interface{}, m map[string]interface{}) error {
+	if input == nil {
+		return nil
+	}
 	switch v := input.(type) {
 	case string:
 		err := mergeSingleFile(v, m)

+ 5 - 1
infra/conf/mergers/merger_base.go

@@ -5,6 +5,7 @@ import (
 	"io"
 
 	"github.com/v2fly/v2ray-core/v5/common/cmdarg"
+	"github.com/v2fly/v2ray-core/v5/common/errors"
 	"github.com/v2fly/v2ray-core/v5/infra/conf/merge"
 )
 
@@ -22,8 +23,11 @@ func makeMerger(name string, extensions []string, converter jsonConverter) *Merg
 // makeToJSONMergeFunc makes a merge func who merge the format by converting it to JSON
 func makeToJSONMergeFunc(converter func(v []byte) ([]byte, error)) MergeFunc {
 	return func(input interface{}, target map[string]interface{}) error {
+		if input == nil {
+			return nil
+		}
 		if target == nil {
-			panic("merge target is nil")
+			return errors.New("merge target is nil")
 		}
 		switch v := input.(type) {
 		case string: