Feature: add simple-obfs support for ss

This commit is contained in:
xjasonlyu
2021-02-06 13:41:44 +08:00
parent 44e47cc86c
commit e0956ce58c
5 changed files with 357 additions and 10 deletions

View File

@@ -1,6 +1,7 @@
package engine
import (
"encoding/base64"
"fmt"
"net/url"
"strings"
@@ -50,20 +51,56 @@ func parseProxy(s string) (proxy.Dialer, error) {
return nil, err
}
addr := u.Host
user := u.User.Username()
pass, _ := u.User.Password()
proto := strings.ToLower(u.Scheme)
switch proto {
case "direct":
return proxy.NewDirect(), nil
case "socks5":
return proxy.NewSocks5(addr, user, pass)
case "ss", "shadowsocks":
method, password := user, pass
return proxy.NewShadowSocks(addr, method, password)
return proxy.NewSocks5(parseSocks(u))
case "ss":
return proxy.NewShadowSocks(parseShadowSocks(u))
}
return nil, fmt.Errorf("unsupported protocol: %s", proto)
}
func parseSocks(u *url.URL) (address, username, password string) {
address = u.Host
username = u.User.Username()
password, _ = u.User.Password()
return
}
func parseShadowSocks(u *url.URL) (address, method, password, obfsMode, obfsHost string) {
address = u.Host
if pass, set := u.User.Password(); set {
method = u.User.Username()
password = pass
} else {
data, _ := base64.RawURLEncoding.DecodeString(u.User.String())
userInfo := strings.SplitN(string(data), ":", 2)
method = userInfo[0]
password = userInfo[1]
}
rawQuery, _ := url.QueryUnescape(u.RawQuery)
for _, s := range strings.Split(rawQuery, ";") {
data := strings.SplitN(s, "=", 2)
if len(data) != 2 {
continue
}
key := data[0]
value := data[1]
switch key {
case "obfs":
obfsMode = value
case "obfs-host":
obfsHost = value
}
}
return
}