Fix: wechat protocol is not working if no obfs string is configured

This commit is contained in:
gVisor bot 2022-09-11 15:24:56 +08:00
parent d6dc5ba19c
commit 575c25215e
2 changed files with 24 additions and 8 deletions

View file

@ -0,0 +1,18 @@
package obfs
type DummyObfuscator struct{}
func NewDummyObfuscator() *DummyObfuscator {
return &DummyObfuscator{}
}
func (x *DummyObfuscator) Deobfuscate(in []byte, out []byte) int {
if len(out) < len(in) {
return 0
}
return copy(out, in)
}
func (x *DummyObfuscator) Obfuscate(in []byte, out []byte) int {
return copy(out, in)
}

View file

@ -7,7 +7,7 @@ import (
"github.com/Dreamacro/clash/transport/hysteria/conns/faketcp" "github.com/Dreamacro/clash/transport/hysteria/conns/faketcp"
"github.com/Dreamacro/clash/transport/hysteria/conns/udp" "github.com/Dreamacro/clash/transport/hysteria/conns/udp"
"github.com/Dreamacro/clash/transport/hysteria/conns/wechat" "github.com/Dreamacro/clash/transport/hysteria/conns/wechat"
"github.com/Dreamacro/clash/transport/hysteria/obfs" obfsPkg "github.com/Dreamacro/clash/transport/hysteria/obfs"
"github.com/lucas-clemente/quic-go" "github.com/lucas-clemente/quic-go"
"net" "net"
) )
@ -16,7 +16,7 @@ type ClientTransport struct {
Dialer *net.Dialer Dialer *net.Dialer
} }
func (ct *ClientTransport) quicPacketConn(proto string, server string, obfs obfs.Obfuscator, dialer PacketDialer) (net.PacketConn, error) { func (ct *ClientTransport) quicPacketConn(proto string, server string, obfs obfsPkg.Obfuscator, dialer PacketDialer) (net.PacketConn, error) {
if len(proto) == 0 || proto == "udp" { if len(proto) == 0 || proto == "udp" {
conn, err := dialer.ListenPacket() conn, err := dialer.ListenPacket()
if err != nil { if err != nil {
@ -33,12 +33,10 @@ func (ct *ClientTransport) quicPacketConn(proto string, server string, obfs obfs
if err != nil { if err != nil {
return nil, err return nil, err
} }
if obfs != nil { if obfs == nil {
oc := wechat.NewObfsWeChatUDPConn(conn, obfs) obfs = obfsPkg.NewDummyObfuscator()
return oc, nil
} else {
return conn, nil
} }
return wechat.NewObfsWeChatUDPConn(conn, obfs), nil
} else if proto == "faketcp" { } else if proto == "faketcp" {
var conn *faketcp.TCPConn var conn *faketcp.TCPConn
conn, err := faketcp.Dial("tcp", server) conn, err := faketcp.Dial("tcp", server)
@ -62,7 +60,7 @@ type PacketDialer interface {
RemoteAddr(host string) (net.Addr, error) RemoteAddr(host string) (net.Addr, error)
} }
func (ct *ClientTransport) QUICDial(proto string, server string, tlsConfig *tls.Config, quicConfig *quic.Config, obfs obfs.Obfuscator, dialer PacketDialer) (quic.Connection, error) { func (ct *ClientTransport) QUICDial(proto string, server string, tlsConfig *tls.Config, quicConfig *quic.Config, obfs obfsPkg.Obfuscator, dialer PacketDialer) (quic.Connection, error) {
serverUDPAddr, err := dialer.RemoteAddr(server) serverUDPAddr, err := dialer.RemoteAddr(server)
if err != nil { if err != nil {
return nil, err return nil, err