113 lines
2.9 KiB
Go
113 lines
2.9 KiB
Go
package listener
|
|
|
|
import (
|
|
"fmt"
|
|
|
|
"github.com/metacubex/mihomo/common/structure"
|
|
C "github.com/metacubex/mihomo/constant"
|
|
IN "github.com/metacubex/mihomo/listener/inbound"
|
|
)
|
|
|
|
func ParseListener(mapping map[string]any) (C.InboundListener, error) {
|
|
decoder := structure.NewDecoder(structure.Option{TagName: "inbound", WeaklyTypedInput: true, KeyReplacer: structure.DefaultKeyReplacer})
|
|
proxyType, existType := mapping["type"].(string)
|
|
if !existType {
|
|
return nil, fmt.Errorf("missing type")
|
|
}
|
|
|
|
var (
|
|
listener C.InboundListener
|
|
err error
|
|
)
|
|
switch proxyType {
|
|
case "socks":
|
|
socksOption := &IN.SocksOption{UDP: true}
|
|
err = decoder.Decode(mapping, socksOption)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
listener, err = IN.NewSocks(socksOption)
|
|
case "http":
|
|
httpOption := &IN.HTTPOption{}
|
|
err = decoder.Decode(mapping, httpOption)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
listener, err = IN.NewHTTP(httpOption)
|
|
case "tproxy":
|
|
tproxyOption := &IN.TProxyOption{UDP: true}
|
|
err = decoder.Decode(mapping, tproxyOption)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
listener, err = IN.NewTProxy(tproxyOption)
|
|
case "redir":
|
|
redirOption := &IN.RedirOption{}
|
|
err = decoder.Decode(mapping, redirOption)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
listener, err = IN.NewRedir(redirOption)
|
|
case "mixed":
|
|
mixedOption := &IN.MixedOption{UDP: true}
|
|
err = decoder.Decode(mapping, mixedOption)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
listener, err = IN.NewMixed(mixedOption)
|
|
case "tunnel":
|
|
tunnelOption := &IN.TunnelOption{}
|
|
err = decoder.Decode(mapping, tunnelOption)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
listener, err = IN.NewTunnel(tunnelOption)
|
|
case "tun":
|
|
tunOption := &IN.TunOption{
|
|
Stack: C.TunGvisor.String(),
|
|
DNSHijack: []string{"0.0.0.0:53"}, // default hijack all dns query
|
|
}
|
|
err = decoder.Decode(mapping, tunOption)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
listener, err = IN.NewTun(tunOption)
|
|
case "shadowsocks":
|
|
shadowsocksOption := &IN.ShadowSocksOption{UDP: true}
|
|
err = decoder.Decode(mapping, shadowsocksOption)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
listener, err = IN.NewShadowSocks(shadowsocksOption)
|
|
case "vmess":
|
|
vmessOption := &IN.VmessOption{}
|
|
err = decoder.Decode(mapping, vmessOption)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
listener, err = IN.NewVmess(vmessOption)
|
|
case "hysteria2":
|
|
hysteria2Option := &IN.Hysteria2Option{}
|
|
err = decoder.Decode(mapping, hysteria2Option)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
listener, err = IN.NewHysteria2(hysteria2Option)
|
|
case "tuic":
|
|
tuicOption := &IN.TuicOption{
|
|
MaxIdleTime: 15000,
|
|
AuthenticationTimeout: 1000,
|
|
ALPN: []string{"h3"},
|
|
MaxUdpRelayPacketSize: 1500,
|
|
CongestionController: "bbr",
|
|
}
|
|
err = decoder.Decode(mapping, tuicOption)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
listener, err = IN.NewTuic(tuicOption)
|
|
default:
|
|
return nil, fmt.Errorf("unsupport proxy type: %s", proxyType)
|
|
}
|
|
return listener, err
|
|
}
|