mirror of
https://github.com/bestnite/sub2clash.git
synced 2025-06-17 12:43:18 +08:00
refactor
This commit is contained in:
@ -6,25 +6,40 @@ import (
|
||||
"strconv"
|
||||
"strings"
|
||||
|
||||
"github.com/nitezs/sub2clash/constant"
|
||||
"github.com/nitezs/sub2clash/model"
|
||||
E "github.com/bestnite/sub2clash/error"
|
||||
P "github.com/bestnite/sub2clash/model/proxy"
|
||||
)
|
||||
|
||||
func ParseVmess(proxy string) (model.Proxy, error) {
|
||||
if !strings.HasPrefix(proxy, constant.VMessPrefix) {
|
||||
return model.Proxy{}, &ParseError{Type: ErrInvalidPrefix, Raw: proxy}
|
||||
type VmessParser struct{}
|
||||
|
||||
func (p *VmessParser) GetPrefixes() []string {
|
||||
return []string{"vmess://"}
|
||||
}
|
||||
|
||||
func (p *VmessParser) GetType() string {
|
||||
return "vmess"
|
||||
}
|
||||
|
||||
func (p *VmessParser) Parse(proxy string) (P.Proxy, error) {
|
||||
if !hasPrefix(proxy, p.GetPrefixes()) {
|
||||
return P.Proxy{}, &E.ParseError{Type: E.ErrInvalidPrefix, Raw: proxy}
|
||||
}
|
||||
|
||||
proxy = strings.TrimPrefix(proxy, constant.VMessPrefix)
|
||||
for _, prefix := range p.GetPrefixes() {
|
||||
if strings.HasPrefix(proxy, prefix) {
|
||||
proxy = strings.TrimPrefix(proxy, prefix)
|
||||
break
|
||||
}
|
||||
}
|
||||
base64, err := DecodeBase64(proxy)
|
||||
if err != nil {
|
||||
return model.Proxy{}, &ParseError{Type: ErrInvalidBase64, Raw: proxy, Message: err.Error()}
|
||||
return P.Proxy{}, &E.ParseError{Type: E.ErrInvalidBase64, Raw: proxy, Message: err.Error()}
|
||||
}
|
||||
|
||||
var vmess model.VmessJson
|
||||
var vmess P.VmessJson
|
||||
err = json.Unmarshal([]byte(base64), &vmess)
|
||||
if err != nil {
|
||||
return model.Proxy{}, &ParseError{Type: ErrInvalidStruct, Raw: proxy, Message: err.Error()}
|
||||
return P.Proxy{}, &E.ParseError{Type: E.ErrInvalidStruct, Raw: proxy, Message: err.Error()}
|
||||
}
|
||||
|
||||
var port int
|
||||
@ -32,8 +47,8 @@ func ParseVmess(proxy string) (model.Proxy, error) {
|
||||
case string:
|
||||
port, err = ParsePort(vmess.Port.(string))
|
||||
if err != nil {
|
||||
return model.Proxy{}, &ParseError{
|
||||
Type: ErrInvalidPort,
|
||||
return P.Proxy{}, &E.ParseError{
|
||||
Type: E.ErrInvalidPort,
|
||||
Message: err.Error(),
|
||||
Raw: proxy,
|
||||
}
|
||||
@ -47,7 +62,7 @@ func ParseVmess(proxy string) (model.Proxy, error) {
|
||||
case string:
|
||||
aid, err = strconv.Atoi(vmess.Aid.(string))
|
||||
if err != nil {
|
||||
return model.Proxy{}, &ParseError{Type: ErrInvalidStruct, Raw: proxy, Message: err.Error()}
|
||||
return P.Proxy{}, &E.ParseError{Type: E.ErrInvalidStruct, Raw: proxy, Message: err.Error()}
|
||||
}
|
||||
case float64:
|
||||
aid = int(vmess.Aid.(float64))
|
||||
@ -62,9 +77,9 @@ func ParseVmess(proxy string) (model.Proxy, error) {
|
||||
name = vmess.Ps
|
||||
}
|
||||
|
||||
result := model.Proxy{
|
||||
result := P.Proxy{
|
||||
Name: name,
|
||||
Type: "vmess",
|
||||
Type: p.GetType(),
|
||||
Server: vmess.Add,
|
||||
Port: port,
|
||||
UUID: vmess.Id,
|
||||
@ -93,7 +108,7 @@ func ParseVmess(proxy string) (model.Proxy, error) {
|
||||
vmess.Host = vmess.Add
|
||||
}
|
||||
result.Network = "ws"
|
||||
result.WSOpts = model.WSOptions{
|
||||
result.WSOpts = P.WSOptions{
|
||||
Path: vmess.Path,
|
||||
Headers: map[string]string{
|
||||
"Host": vmess.Host,
|
||||
@ -102,14 +117,14 @@ func ParseVmess(proxy string) (model.Proxy, error) {
|
||||
}
|
||||
|
||||
if vmess.Net == "grpc" {
|
||||
result.GrpcOpts = model.GrpcOptions{
|
||||
result.GrpcOpts = P.GrpcOptions{
|
||||
GrpcServiceName: vmess.Path,
|
||||
}
|
||||
result.Network = "grpc"
|
||||
}
|
||||
|
||||
if vmess.Net == "h2" {
|
||||
result.HTTP2Opts = model.HTTP2Options{
|
||||
result.HTTP2Opts = P.HTTP2Options{
|
||||
Host: strings.Split(vmess.Host, ","),
|
||||
Path: vmess.Path,
|
||||
}
|
||||
@ -118,3 +133,7 @@ func ParseVmess(proxy string) (model.Proxy, error) {
|
||||
|
||||
return result, nil
|
||||
}
|
||||
|
||||
func init() {
|
||||
RegisterParser(&VmessParser{})
|
||||
}
|
||||
|
Reference in New Issue
Block a user