Files
tun2socks/engine/parse.go
xjasonlyu 90d7d2dfe6 Refactor
2021-02-05 20:02:29 +08:00

70 lines
1.3 KiB
Go

package engine
import (
"fmt"
"net/url"
"strings"
"github.com/xjasonlyu/tun2socks/device"
"github.com/xjasonlyu/tun2socks/device/tun"
"github.com/xjasonlyu/tun2socks/proxy"
)
func parseDevice(s string, mtu uint32) (device.Device, error) {
const defaultDriver = "tun"
if !strings.Contains(s, "://") {
s = defaultDriver + "://" + s
}
u, err := url.Parse(s)
if err != nil {
return nil, err
}
name := u.Host
driver := u.Scheme
var d device.Device
switch driver {
case "tun":
d, err = tun.Open(tun.WithName(name), tun.WithMTU(mtu))
default:
err = fmt.Errorf("unsupported driver: %s", driver)
}
if err != nil {
return nil, err
}
return d, nil
}
func parseProxy(s string) (proxy.Dialer, error) {
const defaultProto = "socks5"
if !strings.Contains(s, "://") {
s = defaultProto + "://" + s
}
u, err := url.Parse(s)
if err != nil {
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 nil, fmt.Errorf("unsupported protocol: %s", proto)
}