mirror of
https://github.com/xjasonlyu/tun2socks.git
synced 2025-10-06 01:07:03 +08:00
Feature: add simple-obfs support for ss
This commit is contained in:
@@ -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
|
||||
}
|
||||
|
Reference in New Issue
Block a user