forked from v2fly/v2ray-core
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
1 parent
9412523
commit 2a07838
Showing
6 changed files
with
129 additions
and
117 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,87 @@ | ||
package core | ||
|
||
import ( | ||
"io" | ||
"strings" | ||
|
||
"github.com/golang/protobuf/proto" | ||
"v2ray.com/core/common" | ||
"v2ray.com/core/common/buf" | ||
) | ||
|
||
type ConfigFormat struct { | ||
Name string | ||
Extension []string | ||
Loader ConfigLoader | ||
} | ||
|
||
// ConfigLoader is an utility to load V2Ray config from external source. | ||
type ConfigLoader func(input io.Reader) (*Config, error) | ||
|
||
var ( | ||
configLoaderByName = make(map[string]*ConfigFormat) | ||
configLoaderByExt = make(map[string]*ConfigFormat) | ||
) | ||
|
||
// RegisterConfigLoader add a new ConfigLoader. | ||
func RegisterConfigLoader(format *ConfigFormat) error { | ||
name := strings.ToLower(format.Name) | ||
if _, found := configLoaderByName[name]; found { | ||
return newError(format.Name, " already registered.") | ||
} | ||
configLoaderByName[name] = format | ||
|
||
for _, ext := range format.Extension { | ||
lext := strings.ToLower(ext) | ||
if f, found := configLoaderByExt[lext]; found { | ||
return newError(ext, " already registered to ", f.Name) | ||
} | ||
configLoaderByExt[lext] = format | ||
} | ||
|
||
return nil | ||
} | ||
|
||
func getExtension(filename string) string { | ||
idx := strings.LastIndexByte(filename, '.') | ||
if idx == -1 { | ||
return "" | ||
} | ||
return filename[idx+1:] | ||
} | ||
|
||
// LoadConfig loads config with given format from given source. | ||
func LoadConfig(formatName string, filename string, input io.Reader) (*Config, error) { | ||
ext := getExtension(filename) | ||
if len(ext) > 0 { | ||
if f, found := configLoaderByExt[ext]; found { | ||
return f.Loader(input) | ||
} | ||
} | ||
|
||
if f, found := configLoaderByName[formatName]; found { | ||
return f.Loader(input) | ||
} | ||
|
||
return nil, newError("Unable to load config in ", formatName).AtWarning() | ||
} | ||
|
||
func loadProtobufConfig(input io.Reader) (*Config, error) { | ||
config := new(Config) | ||
data, err := buf.ReadAllToBytes(input) | ||
if err != nil { | ||
return nil, err | ||
} | ||
if err := proto.Unmarshal(data, config); err != nil { | ||
return nil, err | ||
} | ||
return config, nil | ||
} | ||
|
||
func init() { | ||
common.Must(RegisterConfigLoader(&ConfigFormat{ | ||
Name: "Protobuf", | ||
Extension: []string{"pb"}, | ||
Loader: loadProtobufConfig, | ||
})) | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters