diff --git a/adapter/outbound/trojan.go b/adapter/outbound/trojan.go index 93ef7d96..b691ff00 100644 --- a/adapter/outbound/trojan.go +++ b/adapter/outbound/trojan.go @@ -27,9 +27,8 @@ type Trojan struct { hexPassword [trojan.KeyLength]byte // for gun mux - gunTLSConfig *vmess.TLSConfig gunConfig *gun.Config - transport *gun.TransportWrap + gunTransport *gun.TransportWrap realityConfig *tlsC.RealityConfig echConfig *ech.Config @@ -66,7 +65,6 @@ type TrojanSSOption struct { Password string `proxy:"password,omitempty"` } -// StreamConnContext implements C.ProxyAdapter func (t *Trojan) StreamConnContext(ctx context.Context, c net.Conn, metadata *C.Metadata) (_ net.Conn, err error) { switch t.option.Network { case "ws": @@ -118,7 +116,7 @@ func (t *Trojan) StreamConnContext(ctx context.Context, c net.Conn, metadata *C. c, err = vmess.StreamWebsocketConn(ctx, c, wsOpts) case "grpc": - c, err = gun.StreamGunWithConn(c, t.gunTLSConfig, t.gunConfig) + break // already handle in gun transport default: // default tcp network // handle TLS @@ -179,27 +177,14 @@ func (t *Trojan) writeHeaderContext(ctx context.Context, c net.Conn, metadata *C func (t *Trojan) DialContext(ctx context.Context, metadata *C.Metadata) (_ C.Conn, err error) { var c net.Conn // gun transport - if t.transport != nil { - c, err = gun.StreamGunWithTransport(t.transport, t.gunConfig) - if err != nil { - return nil, err - } - defer func(c net.Conn) { - safeConnClose(c, err) - }(c) - - c, err = t.streamConnContext(ctx, c, metadata) - if err != nil { - return nil, err - } - - return NewConn(c, t), nil + if t.gunTransport != nil { + c, err = gun.StreamGunWithTransport(t.gunTransport, t.gunConfig) + } else { + c, err = t.dialer.DialContext(ctx, "tcp", t.addr) } - c, err = t.dialer.DialContext(ctx, "tcp", t.addr) if err != nil { return nil, fmt.Errorf("%s connect error: %w", t.addr, err) } - defer func(c net.Conn) { safeConnClose(c, err) }(c) @@ -219,35 +204,19 @@ func (t *Trojan) ListenPacketContext(ctx context.Context, metadata *C.Metadata) } var c net.Conn - // grpc transport - if t.transport != nil { - c, err = gun.StreamGunWithTransport(t.transport, t.gunConfig) - if err != nil { - return nil, fmt.Errorf("%s connect error: %w", t.addr, err) - } - defer func(c net.Conn) { - safeConnClose(c, err) - }(c) - - c, err = t.streamConnContext(ctx, c, metadata) - if err != nil { - return nil, err - } - - pc := trojan.NewPacketConn(c) - return newPacketConn(pc, t), err + if t.gunTransport != nil { + c, err = gun.StreamGunWithTransport(t.gunTransport, t.gunConfig) + } else { + c, err = t.dialer.DialContext(ctx, "tcp", t.addr) } - if err = t.ResolveUDP(ctx, metadata); err != nil { - return nil, err - } - c, err = t.dialer.DialContext(ctx, "tcp", t.addr) if err != nil { return nil, fmt.Errorf("%s connect error: %w", t.addr, err) } defer func(c net.Conn) { safeConnClose(c, err) }(c) + c, err = t.StreamConnContext(ctx, c, metadata) if err != nil { return nil, err @@ -271,8 +240,8 @@ func (t *Trojan) ProxyInfo() C.ProxyInfo { // Close implements C.ProxyAdapter func (t *Trojan) Close() error { - if t.transport != nil { - return t.transport.Close() + if t.gunTransport != nil { + return t.gunTransport.Close() } return nil } @@ -348,9 +317,8 @@ func NewTrojan(option TrojanOption) (*Trojan, error) { Reality: t.realityConfig, } - t.transport = gun.NewHTTP2Client(dialFn, tlsConfig) + t.gunTransport = gun.NewHTTP2Client(dialFn, tlsConfig) - t.gunTLSConfig = tlsConfig t.gunConfig = &gun.Config{ ServiceName: option.GrpcOpts.GrpcServiceName, UserAgent: option.GrpcOpts.GrpcUserAgent, diff --git a/adapter/outbound/vless.go b/adapter/outbound/vless.go index db316482..bd060b18 100644 --- a/adapter/outbound/vless.go +++ b/adapter/outbound/vless.go @@ -33,9 +33,8 @@ type Vless struct { encryption *encryption.ClientInstance // for gun mux - gunTLSConfig *vmess.TLSConfig gunConfig *gun.Config - transport *gun.TransportWrap + gunTransport *gun.TransportWrap realityConfig *tlsC.RealityConfig echConfig *ech.Config @@ -151,7 +150,7 @@ func (v *Vless) StreamConnContext(ctx context.Context, c net.Conn, metadata *C.M c, err = vmess.StreamH2Conn(ctx, c, h2Opts) case "grpc": - c, err = gun.StreamGunWithConn(c, v.gunTLSConfig, v.gunConfig) + break // already handle in gun transport default: // default tcp network // handle TLS @@ -234,23 +233,11 @@ func (v *Vless) streamTLSConn(ctx context.Context, conn net.Conn, isH2 bool) (ne func (v *Vless) DialContext(ctx context.Context, metadata *C.Metadata) (_ C.Conn, err error) { var c net.Conn // gun transport - if v.transport != nil { - c, err = gun.StreamGunWithTransport(v.transport, v.gunConfig) - if err != nil { - return nil, err - } - defer func(c net.Conn) { - safeConnClose(c, err) - }(c) - - c, err = v.streamConnContext(ctx, c, metadata) - if err != nil { - return nil, err - } - - return NewConn(c, v), nil + if v.gunTransport != nil { + c, err = gun.StreamGunWithTransport(v.gunTransport, v.gunConfig) + } else { + c, err = v.dialer.DialContext(ctx, "tcp", v.addr) } - c, err = v.dialer.DialContext(ctx, "tcp", v.addr) if err != nil { return nil, fmt.Errorf("%s connect error: %s", v.addr, err.Error()) } @@ -272,28 +259,11 @@ func (v *Vless) ListenPacketContext(ctx context.Context, metadata *C.Metadata) ( } var c net.Conn // gun transport - if v.transport != nil { - c, err = gun.StreamGunWithTransport(v.transport, v.gunConfig) - if err != nil { - return nil, err - } - defer func(c net.Conn) { - safeConnClose(c, err) - }(c) - - c, err = v.streamConnContext(ctx, c, metadata) - if err != nil { - return nil, fmt.Errorf("new vless client error: %v", err) - } - - return v.ListenPacketOnStreamConn(ctx, c, metadata) + if v.gunTransport != nil { + c, err = gun.StreamGunWithTransport(v.gunTransport, v.gunConfig) + } else { + c, err = v.dialer.DialContext(ctx, "tcp", v.addr) } - - if err = v.ResolveUDP(ctx, metadata); err != nil { - return nil, err - } - - c, err = v.dialer.DialContext(ctx, "tcp", v.addr) if err != nil { return nil, fmt.Errorf("%s connect error: %s", v.addr, err.Error()) } @@ -348,8 +318,8 @@ func (v *Vless) ProxyInfo() C.ProxyInfo { // Close implements C.ProxyAdapter func (v *Vless) Close() error { - if v.transport != nil { - return v.transport.Close() + if v.gunTransport != nil { + return v.gunTransport.Close() } return nil } @@ -487,10 +457,9 @@ func NewVless(option VlessOption) (*Vless, error) { } } - v.gunTLSConfig = tlsConfig v.gunConfig = gunConfig - v.transport = gun.NewHTTP2Client(dialFn, tlsConfig) + v.gunTransport = gun.NewHTTP2Client(dialFn, tlsConfig) } return v, nil diff --git a/adapter/outbound/vmess.go b/adapter/outbound/vmess.go index 5093752e..29ed63fd 100644 --- a/adapter/outbound/vmess.go +++ b/adapter/outbound/vmess.go @@ -34,9 +34,8 @@ type Vmess struct { option *VmessOption // for gun mux - gunTLSConfig *mihomoVMess.TLSConfig gunConfig *gun.Config - transport *gun.TransportWrap + gunTransport *gun.TransportWrap realityConfig *tlsC.RealityConfig echConfig *ech.Config @@ -98,7 +97,6 @@ type WSOptions struct { V2rayHttpUpgradeFastOpen bool `proxy:"v2ray-http-upgrade-fast-open,omitempty"` } -// StreamConnContext implements C.ProxyAdapter func (v *Vmess) StreamConnContext(ctx context.Context, c net.Conn, metadata *C.Metadata) (_ net.Conn, err error) { switch v.option.Network { case "ws": @@ -205,7 +203,7 @@ func (v *Vmess) StreamConnContext(ctx context.Context, c net.Conn, metadata *C.M c, err = mihomoVMess.StreamH2Conn(ctx, c, h2Opts) case "grpc": - c, err = gun.StreamGunWithConn(c, v.gunTLSConfig, v.gunConfig) + break // already handle in gun transport default: // handle TLS if v.option.TLS { @@ -296,23 +294,11 @@ func (v *Vmess) streamConnContext(ctx context.Context, c net.Conn, metadata *C.M func (v *Vmess) DialContext(ctx context.Context, metadata *C.Metadata) (_ C.Conn, err error) { var c net.Conn // gun transport - if v.transport != nil { - c, err = gun.StreamGunWithTransport(v.transport, v.gunConfig) - if err != nil { - return nil, err - } - defer func(c net.Conn) { - safeConnClose(c, err) - }(c) - - c, err = v.streamConnContext(ctx, c, metadata) - if err != nil { - return nil, err - } - - return NewConn(c, v), nil + if v.gunTransport != nil { + c, err = gun.StreamGunWithTransport(v.gunTransport, v.gunConfig) + } else { + c, err = v.dialer.DialContext(ctx, "tcp", v.addr) } - c, err = v.dialer.DialContext(ctx, "tcp", v.addr) if err != nil { return nil, fmt.Errorf("%s connect error: %s", v.addr, err.Error()) } @@ -331,27 +317,11 @@ func (v *Vmess) ListenPacketContext(ctx context.Context, metadata *C.Metadata) ( } var c net.Conn // gun transport - if v.transport != nil { - c, err = gun.StreamGunWithTransport(v.transport, v.gunConfig) - if err != nil { - return nil, err - } - defer func(c net.Conn) { - safeConnClose(c, err) - }(c) - - c, err = v.streamConnContext(ctx, c, metadata) - if err != nil { - return nil, fmt.Errorf("new vmess client error: %v", err) - } - return v.ListenPacketOnStreamConn(ctx, c, metadata) + if v.gunTransport != nil { + c, err = gun.StreamGunWithTransport(v.gunTransport, v.gunConfig) + } else { + c, err = v.dialer.DialContext(ctx, "tcp", v.addr) } - - if err = v.ResolveUDP(ctx, metadata); err != nil { - return nil, err - } - - c, err = v.dialer.DialContext(ctx, "tcp", v.addr) if err != nil { return nil, fmt.Errorf("%s connect error: %s", v.addr, err.Error()) } @@ -375,8 +345,8 @@ func (v *Vmess) ProxyInfo() C.ProxyInfo { // Close implements C.ProxyAdapter func (v *Vmess) Close() error { - if v.transport != nil { - return v.transport.Close() + if v.gunTransport != nil { + return v.gunTransport.Close() } return nil } @@ -493,10 +463,9 @@ func NewVmess(option VmessOption) (*Vmess, error) { } } - v.gunTLSConfig = tlsConfig v.gunConfig = gunConfig - v.transport = gun.NewHTTP2Client(dialFn, tlsConfig) + v.gunTransport = gun.NewHTTP2Client(dialFn, tlsConfig) } return v, nil