use ptr instead of value
This commit is contained in:
@@ -7,7 +7,7 @@ import (
|
||||
)
|
||||
|
||||
type Getter interface {
|
||||
Get() []proxy.Proxy
|
||||
Get() []*proxy.Proxy
|
||||
}
|
||||
|
||||
func String2Proxy(link string) proxy.Proxy {
|
||||
@@ -27,8 +27,8 @@ func String2Proxy(link string) proxy.Proxy {
|
||||
func StringArray2ProxyArray(origin []string) []proxy.Proxy {
|
||||
var err error
|
||||
results := make([]proxy.Proxy, 0)
|
||||
var data proxy.Proxy
|
||||
for _, link := range origin {
|
||||
var data proxy.Proxy
|
||||
if strings.HasPrefix(link, "ssr://") {
|
||||
data, err = proxy.ParseSSRLink(link)
|
||||
} else if strings.HasPrefix(link, "vmess://") {
|
||||
|
||||
@@ -25,13 +25,13 @@ func (c Clash) Provide() string {
|
||||
|
||||
func checkClashSupport(p proxy.Proxy) bool {
|
||||
switch p.(type) {
|
||||
case proxy.ShadowsocksR:
|
||||
ssr := p.(proxy.ShadowsocksR)
|
||||
case *proxy.ShadowsocksR:
|
||||
ssr := p.(*proxy.ShadowsocksR)
|
||||
if checkInList(ssrCipherList, ssr.Cipher) && checkInList(ssrProtocolList, ssr.Protocol) && checkInList(ssrObfsList, ssr.Obfs) {
|
||||
return true
|
||||
}
|
||||
case proxy.Vmess:
|
||||
vmess := p.(proxy.Vmess)
|
||||
case *proxy.Vmess:
|
||||
vmess := p.(*proxy.Vmess)
|
||||
if checkInList(vmessCipherList, vmess.Cipher) {
|
||||
return true
|
||||
}
|
||||
|
||||
@@ -53,32 +53,32 @@ func (ssr ShadowsocksR) ToClash() string {
|
||||
return "- " + string(data)
|
||||
}
|
||||
|
||||
func (ssr ShadowsocksR) SetName(name string) {
|
||||
func (ssr *ShadowsocksR) SetName(name string) {
|
||||
ssr.Name = name
|
||||
}
|
||||
|
||||
func ParseSSRLink(link string) (ShadowsocksR, error) {
|
||||
func ParseSSRLink(link string) (*ShadowsocksR, error) {
|
||||
if !strings.HasPrefix(link, "ssr") {
|
||||
return ShadowsocksR{}, ErrorNotSSRLink
|
||||
return nil, ErrorNotSSRLink
|
||||
}
|
||||
|
||||
ssrmix := strings.SplitN(link, "://", 2)
|
||||
if len(ssrmix) < 2 {
|
||||
return ShadowsocksR{}, ErrorNotSSRLink
|
||||
return nil, ErrorNotSSRLink
|
||||
}
|
||||
linkPayloadBase64 := ssrmix[1]
|
||||
payload, err := tool.Base64DecodeString(linkPayloadBase64)
|
||||
if err != nil {
|
||||
return ShadowsocksR{}, ErrorMissingQuery
|
||||
return nil, ErrorMissingQuery
|
||||
}
|
||||
|
||||
infoPayload := strings.SplitN(payload, "/?", 2)
|
||||
if len(infoPayload) < 2 {
|
||||
return ShadowsocksR{}, ErrorNotSSRLink
|
||||
return nil, ErrorNotSSRLink
|
||||
}
|
||||
ssrpath := strings.Split(infoPayload[0], ":")
|
||||
if len(ssrpath) < 6 {
|
||||
return ShadowsocksR{}, ErrorPathNotComplete
|
||||
return nil, ErrorPathNotComplete
|
||||
}
|
||||
// base info
|
||||
server := strings.ToLower(ssrpath[0])
|
||||
@@ -88,7 +88,7 @@ func ParseSSRLink(link string) (ShadowsocksR, error) {
|
||||
obfs := strings.ToLower(ssrpath[4])
|
||||
password, err := tool.Base64DecodeString(ssrpath[5])
|
||||
if err != nil {
|
||||
return ShadowsocksR{}, ErrorPasswordParseFail
|
||||
return nil, ErrorPasswordParseFail
|
||||
}
|
||||
|
||||
moreInfo, _ := url.ParseQuery(infoPayload[1])
|
||||
@@ -110,7 +110,7 @@ func ParseSSRLink(link string) (ShadowsocksR, error) {
|
||||
// protocol param
|
||||
protocolParam, err := tool.Base64DecodeString(moreInfo.Get("protoparam"))
|
||||
if err != nil {
|
||||
return ShadowsocksR{}, ErrorProtocolParamParseFail
|
||||
return nil, ErrorProtocolParamParseFail
|
||||
}
|
||||
if strings.HasSuffix(protocolParam, "_compatible") {
|
||||
protocolParam = strings.ReplaceAll(protocolParam, "_compatible", "")
|
||||
@@ -119,7 +119,7 @@ func ParseSSRLink(link string) (ShadowsocksR, error) {
|
||||
// obfs param
|
||||
obfsParam, err := tool.Base64DecodeString(moreInfo.Get("obfsparam"))
|
||||
if err != nil {
|
||||
return ShadowsocksR{}, ErrorObfsParamParseFail
|
||||
return nil, ErrorObfsParamParseFail
|
||||
}
|
||||
if strings.HasSuffix(obfsParam, "_compatible") {
|
||||
obfsParam = strings.ReplaceAll(obfsParam, "_compatible", "")
|
||||
@@ -131,7 +131,7 @@ func ParseSSRLink(link string) (ShadowsocksR, error) {
|
||||
//}
|
||||
group := ""
|
||||
|
||||
return ShadowsocksR{
|
||||
return &ShadowsocksR{
|
||||
Base: Base{
|
||||
Name: remarks + "_" + strconv.Itoa(rand.Int()),
|
||||
Server: server,
|
||||
|
||||
@@ -17,11 +17,6 @@ import (
|
||||
var (
|
||||
ErrorNotVmessLink = errors.New("not a correct vmess link")
|
||||
ErrorVmessPayloadParseFail = errors.New("vmess link payload parse failed")
|
||||
//ErrorPasswordParseFail = errors.New("password parse failed")
|
||||
//ErrorPathNotComplete = errors.New("path not complete")
|
||||
//ErrorMissingQuery = errors.New("link missing query")
|
||||
//ErrorProtocolParamParseFail = errors.New("protocol param parse failed")
|
||||
//ErrorObfsParamParseFail = errors.New("obfs param parse failed")
|
||||
)
|
||||
|
||||
type Vmess struct {
|
||||
@@ -64,7 +59,7 @@ func (v Vmess) ToClash() string {
|
||||
return "- " + string(data)
|
||||
}
|
||||
|
||||
func (v Vmess) SetName(name string) {
|
||||
func (v *Vmess) SetName(name string) {
|
||||
v.Name = name
|
||||
}
|
||||
|
||||
@@ -82,14 +77,14 @@ type vmessLinkJson struct {
|
||||
Tls string `json:"tls"`
|
||||
}
|
||||
|
||||
func ParseVmessLink(link string) (Vmess, error) {
|
||||
func ParseVmessLink(link string) (*Vmess, error) {
|
||||
if !strings.HasPrefix(link, "vmess") {
|
||||
return Vmess{}, ErrorNotVmessLink
|
||||
return nil, ErrorNotVmessLink
|
||||
}
|
||||
|
||||
vmessmix := strings.SplitN(link, "://", 2)
|
||||
if len(vmessmix) < 2 {
|
||||
return Vmess{}, ErrorNotVmessLink
|
||||
return nil, ErrorNotVmessLink
|
||||
}
|
||||
linkPayload := vmessmix[1]
|
||||
if strings.Contains(linkPayload, "?") {
|
||||
@@ -101,30 +96,30 @@ func ParseVmessLink(link string) (Vmess, error) {
|
||||
infoPayloads = strings.SplitN(linkPayload, "?", 2)
|
||||
}
|
||||
if len(infoPayloads) < 2 {
|
||||
return Vmess{}, ErrorNotVmessLink
|
||||
return nil, ErrorNotVmessLink
|
||||
}
|
||||
|
||||
baseInfo, err := tool.Base64DecodeString(infoPayloads[0])
|
||||
if err != nil {
|
||||
return Vmess{}, ErrorVmessPayloadParseFail
|
||||
return nil, ErrorVmessPayloadParseFail
|
||||
}
|
||||
fmt.Println(baseInfo)
|
||||
baseInfoPath := strings.Split(baseInfo, ":")
|
||||
if len(baseInfoPath) < 3 {
|
||||
return Vmess{}, ErrorPathNotComplete
|
||||
return nil, ErrorPathNotComplete
|
||||
}
|
||||
// base info
|
||||
cipher := baseInfoPath[0]
|
||||
mixInfo := strings.SplitN(baseInfoPath[1], "@", 2)
|
||||
if len(mixInfo) < 2 {
|
||||
return Vmess{}, ErrorVmessPayloadParseFail
|
||||
return nil, ErrorVmessPayloadParseFail
|
||||
}
|
||||
uuid := mixInfo[0]
|
||||
server := mixInfo[1]
|
||||
portStr := baseInfoPath[2]
|
||||
port, err := strconv.Atoi(portStr)
|
||||
if err != nil {
|
||||
return Vmess{}, ErrorVmessPayloadParseFail
|
||||
return nil, ErrorVmessPayloadParseFail
|
||||
}
|
||||
|
||||
moreInfo, _ := url.ParseQuery(infoPayloads[1])
|
||||
@@ -140,7 +135,7 @@ func ParseVmessLink(link string) (Vmess, error) {
|
||||
tls := moreInfo.Get("tls") == "1"
|
||||
|
||||
wsHeaders := make(map[string]string)
|
||||
return Vmess{
|
||||
return &Vmess{
|
||||
Base: Base{
|
||||
Name: remarks + "_" + strconv.Itoa(rand.Int()),
|
||||
Server: server,
|
||||
@@ -162,12 +157,12 @@ func ParseVmessLink(link string) (Vmess, error) {
|
||||
} else {
|
||||
payload, err := tool.Base64DecodeString(linkPayload)
|
||||
if err != nil {
|
||||
return Vmess{}, ErrorVmessPayloadParseFail
|
||||
return nil, ErrorVmessPayloadParseFail
|
||||
}
|
||||
vmessJson := vmessLinkJson{}
|
||||
err = json.Unmarshal([]byte(payload), &vmessJson)
|
||||
if err != nil {
|
||||
return Vmess{}, err
|
||||
return nil, err
|
||||
}
|
||||
port := 443
|
||||
portInterface := vmessJson.Port
|
||||
@@ -186,7 +181,7 @@ func ParseVmessLink(link string) (Vmess, error) {
|
||||
wsHeaders := make(map[string]string)
|
||||
wsHeaders["HOST"] = vmessJson.Host
|
||||
|
||||
return Vmess{
|
||||
return &Vmess{
|
||||
Base: Base{
|
||||
Name: vmessJson.Ps + "_" + strconv.Itoa(rand.Int()),
|
||||
Server: vmessJson.Add,
|
||||
|
||||
Reference in New Issue
Block a user