diff --git a/main/shareurls/parser.go b/main/shareurls/parser.go index ea36433..442630b 100644 --- a/main/shareurls/parser.go +++ b/main/shareurls/parser.go @@ -47,6 +47,16 @@ func parseShadowsocks(ssUrl string) (ShareUrl, error) { methodAndPassword := strings.Split(info, ":") ss.Method = methodAndPassword[0] ss.Password = methodAndPassword[1] + ssQuery, err := url.ParseQuery(ssParse.RawQuery) + if err != nil { + return nil, e.New("shadowsocks url parse query err, ", err).WithPrefix(tagParser) + } + //parse shadowsocks SIP003 plugin + if plugins, ok := ssQuery["plugin"]; ok && len(plugins) == 1 { + plugin := strings.Split(plugins[0], ";") + ss.Plugin = plugin[0] + ss.PluginOpt = strings.TrimPrefix(plugins[0], plugin[0]+";") + } } return ss, nil } diff --git a/main/shareurls/shadowsocks/shadowsocks.go b/main/shareurls/shadowsocks/shadowsocks.go index 980c24d..94bddd9 100644 --- a/main/shareurls/shadowsocks/shadowsocks.go +++ b/main/shareurls/shadowsocks/shadowsocks.go @@ -9,11 +9,13 @@ import ( const tagShadowsocks = "shadowsocks" type Shadowsocks struct { - Remarks string - Server string - Port string - Method string - Password string + Remarks string + Server string + Port string + Method string + Password string + Plugin string + PluginOpt string } func (this *Shadowsocks) GetNodeInfo() string { @@ -38,6 +40,12 @@ func (this *Shadowsocks) ToOutboundWithTag(coreType string, tag string) (interfa outboundObject["server_port"], _ = strconv.Atoi(this.Port) outboundObject["method"] = this.Method outboundObject["password"] = this.Password + if len(this.Plugin) > 0 { + outboundObject["plugin"] = this.Plugin + } + if len(this.PluginOpt) > 0 { + outboundObject["plugin_opts"] = this.PluginOpt + } return outboundObject, nil default: return nil, e.New("unsupported core type " + coreType).WithPrefix(tagShadowsocks).WithPathObj(*this)