diff --git a/core/config.go b/core/config.go index aa9b63c93be9..e101c9205e51 100644 --- a/core/config.go +++ b/core/config.go @@ -19,14 +19,19 @@ type ConfigFormat struct { Loader ConfigLoader } +type ConfigSource struct { + Name string + Format string +} + // ConfigLoader is a utility to load Xray config from external source. type ConfigLoader func(input interface{}) (*Config, error) // ConfigBuilder is a builder to build core.Config from filenames and formats -type ConfigBuilder func(files []string, formats []string) (*Config, error) +type ConfigBuilder func(files []*ConfigSource) (*Config, error) // ConfigsMerger merge multiple json configs into on config -type ConfigsMerger func(files []string, formats []string) (string, error) +type ConfigsMerger func(files []*ConfigSource) (string, error) var ( configLoaderByName = make(map[string]*ConfigFormat) @@ -55,20 +60,21 @@ func RegisterConfigLoader(format *ConfigFormat) error { } func GetMergedConfig(args cmdarg.Arg) (string, error) { - files := make([]string, 0) - formats := make([]string, 0) + var files []*ConfigSource supported := []string{"json", "yaml", "toml"} for _, file := range args { format := getFormat(file) for _, s := range supported { if s == format { - files = append(files, file) - formats = append(formats, format) + files = append(files, &ConfigSource{ + Name: file, + Format: format, + }) break } } } - return ConfigMergedFormFiles(files, formats) + return ConfigMergedFormFiles(files) } func GetFormatByExtension(ext string) string { @@ -101,7 +107,7 @@ func getFormat(filename string) string { func LoadConfig(formatName string, input interface{}) (*Config, error) { switch v := input.(type) { case cmdarg.Arg: - formats := make([]string, len(v)) + files := make([]*ConfigSource, len(v)) hasProtobuf := false for i, file := range v { var f string @@ -123,7 +129,10 @@ func LoadConfig(formatName string, input interface{}) (*Config, error) { if f == "protobuf" { hasProtobuf = true } - formats[i] = f + files[i] = &ConfigSource{ + Name: file, + Format: f, + } } // only one protobuf config file is allowed @@ -136,8 +145,7 @@ func LoadConfig(formatName string, input interface{}) (*Config, error) { } // to avoid import cycle - return ConfigBuilderForFiles(v, formats) - + return ConfigBuilderForFiles(files) case io.Reader: if f, found := configLoaderByName[formatName]; found { return f.Loader(v) diff --git a/infra/conf/serial/builder.go b/infra/conf/serial/builder.go index a51648a86da8..3ae980251ea5 100644 --- a/infra/conf/serial/builder.go +++ b/infra/conf/serial/builder.go @@ -11,8 +11,8 @@ import ( "github.com/xtls/xray-core/main/confloader" ) -func MergeConfigFromFiles(files []string, formats []string) (string, error) { - c, err := mergeConfigs(files, formats) +func MergeConfigFromFiles(files []*core.ConfigSource) (string, error) { + c, err := mergeConfigs(files) if err != nil { return "", err } @@ -23,15 +23,15 @@ func MergeConfigFromFiles(files []string, formats []string) (string, error) { return "", errors.New("marshal to json failed.").AtError() } -func mergeConfigs(files []string, formats []string) (*conf.Config, error) { +func mergeConfigs(files []*core.ConfigSource) (*conf.Config, error) { cf := &conf.Config{} for i, file := range files { errors.LogInfo(context.Background(), "Reading config: ", file) - r, err := confloader.LoadConfig(file) + r, err := confloader.LoadConfig(file.Name) if err != nil { return nil, errors.New("failed to read config: ", file).Base(err) } - c, err := ReaderDecoderByFormat[formats[i]](r) + c, err := ReaderDecoderByFormat[file.Format](r) if err != nil { return nil, errors.New("failed to decode config: ", file).Base(err) } @@ -39,13 +39,13 @@ func mergeConfigs(files []string, formats []string) (*conf.Config, error) { *cf = *c continue } - cf.Override(c, file) + cf.Override(c, file.Name) } return cf, nil } -func BuildConfig(files []string, formats []string) (*core.Config, error) { - config, err := mergeConfigs(files, formats) +func BuildConfig(files []*core.ConfigSource) (*core.Config, error) { + config, err := mergeConfigs(files) if err != nil { return nil, err }