use ptr instead of value

This commit is contained in:
zu1k
2020-08-12 08:31:11 +08:00
parent 5ca9da8b82
commit e9d3ef948c
4 changed files with 30 additions and 35 deletions

View File

@@ -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://") {

View File

@@ -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
}

View File

@@ -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,

View File

@@ -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,