diff --git a/common.go b/common.go index 6010b48..a86eb86 100644 --- a/common.go +++ b/common.go @@ -711,18 +711,35 @@ func createTrojanOutboundDetourConfig(profile *Vmess) conf.OutboundDetourConfig }) outboundsSettingsMsg := json.RawMessage(outboundsSettings) transportProtocol := conf.TransportProtocol("tcp") - trojanOutboundDetourConfig := conf.OutboundDetourConfig{ - Protocol: "trojan", - Tag: "proxy", - Settings: &outboundsSettingsMsg, - StreamSetting: &conf.StreamConfig{ + streamSetting := &conf.StreamConfig{ + Security: "tls", + Network: &transportProtocol, + TLSSettings: &conf.TLSConfig{ + Insecure: config.SkipCertVerify, + ServerName: config.SNI, + }, + } + if config.Net == "ws" { + transportProtocol := conf.TransportProtocol(config.Net) + streamSetting = &conf.StreamConfig{ Security: "tls", Network: &transportProtocol, TLSSettings: &conf.TLSConfig{ Insecure: config.SkipCertVerify, ServerName: config.SNI, }, - }, + WSSettings: &conf.WebSocketConfig{Path: config.Path}, + } + if len(config.Host) < 1 { + config.Host = config.SNI + } + streamSetting.WSSettings.Headers = map[string]string{"Host": config.Host} + } + trojanOutboundDetourConfig := conf.OutboundDetourConfig{ + Protocol: "trojan", + Tag: "proxy", + Settings: &outboundsSettingsMsg, + StreamSetting: streamSetting, } return trojanOutboundDetourConfig } @@ -1136,3 +1153,8 @@ func profile2Option(profile *Vmess) (interface{}, error) { } return nil, newError("not support protocol") } + +type latencyResult struct { + elapsed int64 + err error +} diff --git a/features/trojan.go b/features/trojan.go index f7c9ae9..31d620d 100644 --- a/features/trojan.go +++ b/features/trojan.go @@ -6,10 +6,22 @@ type Trojan struct { Password string SNI string SkipCertVerify bool + Net string + Path string // ws path + Host string // ws host / http host VmessOptions } -func NewTrojan(Add string, Port int, Password string, SNI string, SkipCertVerify bool, opt []byte) *Trojan { +func NewTrojan( + Add string, + Port int, + Password string, + SNI string, + SkipCertVerify bool, + Net string, + Path string, + Host string, + opt []byte) *Trojan { options := NewVmessOptions(opt) return &Trojan{ Add: Add, @@ -17,6 +29,9 @@ func NewTrojan(Add string, Port int, Password string, SNI string, SkipCertVerify Password: Password, SNI: SNI, SkipCertVerify: SkipCertVerify, + Net: Net, + Path: Path, + Host: Host, VmessOptions: options, } } diff --git a/tun2socks.go b/tun2socks.go index dc259f6..b10b630 100644 --- a/tun2socks.go +++ b/tun2socks.go @@ -91,8 +91,8 @@ type Vmess features.Vmess type Vless features.Vless type Shadowsocks features.Shadowsocks -func NewTrojan(Add string, Port int, Password string, SNI string, SkipCertVerify bool, opt []byte) *Trojan { - t := Trojan(*features.NewTrojan(Add, Port, Password, SNI, SkipCertVerify, opt)) +func NewTrojan(Add string, Port int, Password string, SNI string, SkipCertVerify bool, Net string, Path string, Host string, opt []byte) *Trojan { + t := Trojan(*features.NewTrojan(Add, Port, Password, SNI, SkipCertVerify, Net, Path, Host, opt)) return &t }