mirror of
https://gitclone.com/github.com/MetaCubeX/Clash.Meta
synced 2024-11-14 21:31:16 +08:00
Compare commits
3 Commits
518e9bdb0b
...
d79423a4fa
Author | SHA1 | Date | |
---|---|---|---|
|
d79423a4fa | ||
|
9cf3eb39f5 | ||
|
81756fc927 |
2
.github/workflows/build.yml
vendored
2
.github/workflows/build.yml
vendored
@ -207,6 +207,8 @@ jobs:
|
|||||||
if: ${{ matrix.jobs.test == 'test' }}
|
if: ${{ matrix.jobs.test == 'test' }}
|
||||||
run: |
|
run: |
|
||||||
go test ./...
|
go test ./...
|
||||||
|
echo "---test with_gvisor---"
|
||||||
|
go test ./... -tags "with_gvisor" -count=1
|
||||||
|
|
||||||
- name: Update CA
|
- name: Update CA
|
||||||
run: |
|
run: |
|
||||||
|
@ -7,6 +7,7 @@ import (
|
|||||||
"fmt"
|
"fmt"
|
||||||
"net"
|
"net"
|
||||||
"net/netip"
|
"net/netip"
|
||||||
|
"runtime"
|
||||||
"strconv"
|
"strconv"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
@ -14,6 +15,7 @@ import (
|
|||||||
"github.com/metacubex/quic-go/congestion"
|
"github.com/metacubex/quic-go/congestion"
|
||||||
M "github.com/sagernet/sing/common/metadata"
|
M "github.com/sagernet/sing/common/metadata"
|
||||||
|
|
||||||
|
CN "github.com/metacubex/mihomo/common/net"
|
||||||
"github.com/metacubex/mihomo/component/ca"
|
"github.com/metacubex/mihomo/component/ca"
|
||||||
"github.com/metacubex/mihomo/component/dialer"
|
"github.com/metacubex/mihomo/component/dialer"
|
||||||
"github.com/metacubex/mihomo/component/proxydialer"
|
"github.com/metacubex/mihomo/component/proxydialer"
|
||||||
@ -43,6 +45,8 @@ type Hysteria struct {
|
|||||||
|
|
||||||
option *HysteriaOption
|
option *HysteriaOption
|
||||||
client *core.Client
|
client *core.Client
|
||||||
|
|
||||||
|
closeCh chan struct{} // for test
|
||||||
}
|
}
|
||||||
|
|
||||||
func (h *Hysteria) DialContext(ctx context.Context, metadata *C.Metadata, opts ...dialer.Option) (C.Conn, error) {
|
func (h *Hysteria) DialContext(ctx context.Context, metadata *C.Metadata, opts ...dialer.Option) (C.Conn, error) {
|
||||||
@ -51,7 +55,7 @@ func (h *Hysteria) DialContext(ctx context.Context, metadata *C.Metadata, opts .
|
|||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
return NewConn(tcpConn, h), nil
|
return NewConn(CN.NewRefConn(tcpConn, h), h), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (h *Hysteria) ListenPacketContext(ctx context.Context, metadata *C.Metadata, opts ...dialer.Option) (C.PacketConn, error) {
|
func (h *Hysteria) ListenPacketContext(ctx context.Context, metadata *C.Metadata, opts ...dialer.Option) (C.PacketConn, error) {
|
||||||
@ -59,7 +63,7 @@ func (h *Hysteria) ListenPacketContext(ctx context.Context, metadata *C.Metadata
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
return newPacketConn(&hyPacketConn{udpConn}, h), nil
|
return newPacketConn(CN.NewRefPacketConn(&hyPacketConn{udpConn}, h), h), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (h *Hysteria) genHdc(ctx context.Context, opts ...dialer.Option) utils.PacketDialer {
|
func (h *Hysteria) genHdc(ctx context.Context, opts ...dialer.Option) utils.PacketDialer {
|
||||||
@ -218,7 +222,7 @@ func NewHysteria(option HysteriaOption) (*Hysteria, error) {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("hysteria %s create error: %w", addr, err)
|
return nil, fmt.Errorf("hysteria %s create error: %w", addr, err)
|
||||||
}
|
}
|
||||||
return &Hysteria{
|
outbound := &Hysteria{
|
||||||
Base: &Base{
|
Base: &Base{
|
||||||
name: option.Name,
|
name: option.Name,
|
||||||
addr: addr,
|
addr: addr,
|
||||||
@ -231,7 +235,19 @@ func NewHysteria(option HysteriaOption) (*Hysteria, error) {
|
|||||||
},
|
},
|
||||||
option: &option,
|
option: &option,
|
||||||
client: client,
|
client: client,
|
||||||
}, nil
|
}
|
||||||
|
runtime.SetFinalizer(outbound, closeHysteria)
|
||||||
|
|
||||||
|
return outbound, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func closeHysteria(h *Hysteria) {
|
||||||
|
if h.client != nil {
|
||||||
|
_ = h.client.Close()
|
||||||
|
}
|
||||||
|
if h.closeCh != nil {
|
||||||
|
close(h.closeCh)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
type hyPacketConn struct {
|
type hyPacketConn struct {
|
||||||
|
@ -38,6 +38,8 @@ type Hysteria2 struct {
|
|||||||
option *Hysteria2Option
|
option *Hysteria2Option
|
||||||
client *hysteria2.Client
|
client *hysteria2.Client
|
||||||
dialer proxydialer.SingDialer
|
dialer proxydialer.SingDialer
|
||||||
|
|
||||||
|
closeCh chan struct{} // for test
|
||||||
}
|
}
|
||||||
|
|
||||||
type Hysteria2Option struct {
|
type Hysteria2Option struct {
|
||||||
@ -89,6 +91,9 @@ func closeHysteria2(h *Hysteria2) {
|
|||||||
if h.client != nil {
|
if h.client != nil {
|
||||||
_ = h.client.CloseWithError(errors.New("proxy removed"))
|
_ = h.client.CloseWithError(errors.New("proxy removed"))
|
||||||
}
|
}
|
||||||
|
if h.closeCh != nil {
|
||||||
|
close(h.closeCh)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewHysteria2(option Hysteria2Option) (*Hysteria2, error) {
|
func NewHysteria2(option Hysteria2Option) (*Hysteria2, error) {
|
||||||
|
38
adapter/outbound/hysteria2_test.go
Normal file
38
adapter/outbound/hysteria2_test.go
Normal file
@ -0,0 +1,38 @@
|
|||||||
|
package outbound
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"runtime"
|
||||||
|
"testing"
|
||||||
|
"time"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestHysteria2GC(t *testing.T) {
|
||||||
|
option := Hysteria2Option{}
|
||||||
|
option.Server = "127.0.0.1"
|
||||||
|
option.Ports = "200,204,401-429,501-503"
|
||||||
|
option.HopInterval = 30
|
||||||
|
option.Password = "password"
|
||||||
|
option.Obfs = "salamander"
|
||||||
|
option.ObfsPassword = "password"
|
||||||
|
option.SNI = "example.com"
|
||||||
|
option.ALPN = []string{"h3"}
|
||||||
|
hy, err := NewHysteria2(option)
|
||||||
|
if err != nil {
|
||||||
|
t.Error(err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
closeCh := make(chan struct{})
|
||||||
|
hy.closeCh = closeCh
|
||||||
|
ctx, cancel := context.WithTimeout(context.Background(), time.Second*5)
|
||||||
|
defer cancel()
|
||||||
|
|
||||||
|
hy = nil
|
||||||
|
runtime.GC()
|
||||||
|
select {
|
||||||
|
case <-closeCh:
|
||||||
|
return
|
||||||
|
case <-ctx.Done():
|
||||||
|
t.Error("timeout not GC")
|
||||||
|
}
|
||||||
|
}
|
39
adapter/outbound/hysteria_test.go
Normal file
39
adapter/outbound/hysteria_test.go
Normal file
@ -0,0 +1,39 @@
|
|||||||
|
package outbound
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"runtime"
|
||||||
|
"testing"
|
||||||
|
"time"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestHysteriaGC(t *testing.T) {
|
||||||
|
option := HysteriaOption{}
|
||||||
|
option.Server = "127.0.0.1"
|
||||||
|
option.Ports = "200,204,401-429,501-503"
|
||||||
|
option.Protocol = "udp"
|
||||||
|
option.Up = "1Mbps"
|
||||||
|
option.Down = "1Mbps"
|
||||||
|
option.HopInterval = 30
|
||||||
|
option.Obfs = "salamander"
|
||||||
|
option.SNI = "example.com"
|
||||||
|
option.ALPN = []string{"h3"}
|
||||||
|
hy, err := NewHysteria(option)
|
||||||
|
if err != nil {
|
||||||
|
t.Error(err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
closeCh := make(chan struct{})
|
||||||
|
hy.closeCh = closeCh
|
||||||
|
ctx, cancel := context.WithTimeout(context.Background(), time.Second*5)
|
||||||
|
defer cancel()
|
||||||
|
|
||||||
|
hy = nil
|
||||||
|
runtime.GC()
|
||||||
|
select {
|
||||||
|
case <-closeCh:
|
||||||
|
return
|
||||||
|
case <-ctx.Done():
|
||||||
|
t.Error("timeout not GC")
|
||||||
|
}
|
||||||
|
}
|
@ -26,7 +26,6 @@ import (
|
|||||||
|
|
||||||
wireguard "github.com/metacubex/sing-wireguard"
|
wireguard "github.com/metacubex/sing-wireguard"
|
||||||
|
|
||||||
"github.com/sagernet/sing/common"
|
|
||||||
"github.com/sagernet/sing/common/debug"
|
"github.com/sagernet/sing/common/debug"
|
||||||
E "github.com/sagernet/sing/common/exceptions"
|
E "github.com/sagernet/sing/common/exceptions"
|
||||||
M "github.com/sagernet/sing/common/metadata"
|
M "github.com/sagernet/sing/common/metadata"
|
||||||
@ -456,7 +455,6 @@ func closeWireGuard(w *WireGuard) {
|
|||||||
if w.device != nil {
|
if w.device != nil {
|
||||||
w.device.Close()
|
w.device.Close()
|
||||||
}
|
}
|
||||||
_ = common.Close(w.tunDevice)
|
|
||||||
if w.closeCh != nil {
|
if w.closeCh != nil {
|
||||||
close(w.closeCh)
|
close(w.closeCh)
|
||||||
}
|
}
|
||||||
|
@ -29,6 +29,7 @@ func TestWireGuardGC(t *testing.T) {
|
|||||||
err = wg.init(ctx)
|
err = wg.init(ctx)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Error(err)
|
t.Error(err)
|
||||||
|
return
|
||||||
}
|
}
|
||||||
// must do a small sleep before test GC
|
// must do a small sleep before test GC
|
||||||
// because it maybe deadlocks if w.device.Close call too fast after w.device.Start
|
// because it maybe deadlocks if w.device.Close call too fast after w.device.Start
|
||||||
|
2
go.mod
2
go.mod
@ -27,7 +27,7 @@ require (
|
|||||||
github.com/metacubex/sing-shadowsocks2 v0.2.2
|
github.com/metacubex/sing-shadowsocks2 v0.2.2
|
||||||
github.com/metacubex/sing-tun v0.2.7-0.20240729131039-ed03f557dee1
|
github.com/metacubex/sing-tun v0.2.7-0.20240729131039-ed03f557dee1
|
||||||
github.com/metacubex/sing-vmess v0.1.9-0.20240719134745-1df6fb20bbf9
|
github.com/metacubex/sing-vmess v0.1.9-0.20240719134745-1df6fb20bbf9
|
||||||
github.com/metacubex/sing-wireguard v0.0.0-20240618022557-a6efaa37127a
|
github.com/metacubex/sing-wireguard v0.0.0-20240826061955-1e4e67afe5cd
|
||||||
github.com/metacubex/tfo-go v0.0.0-20240821025650-e9be0afd5e7d
|
github.com/metacubex/tfo-go v0.0.0-20240821025650-e9be0afd5e7d
|
||||||
github.com/metacubex/utls v1.6.6
|
github.com/metacubex/utls v1.6.6
|
||||||
github.com/miekg/dns v1.1.62
|
github.com/miekg/dns v1.1.62
|
||||||
|
4
go.sum
4
go.sum
@ -120,8 +120,8 @@ github.com/metacubex/sing-tun v0.2.7-0.20240729131039-ed03f557dee1 h1:ypfofGDZbP
|
|||||||
github.com/metacubex/sing-tun v0.2.7-0.20240729131039-ed03f557dee1/go.mod h1:olbEx9yVcaw5tHTNlRamRoxmMKcvDvcVS1YLnQGzvWE=
|
github.com/metacubex/sing-tun v0.2.7-0.20240729131039-ed03f557dee1/go.mod h1:olbEx9yVcaw5tHTNlRamRoxmMKcvDvcVS1YLnQGzvWE=
|
||||||
github.com/metacubex/sing-vmess v0.1.9-0.20240719134745-1df6fb20bbf9 h1:OAXiCosqY8xKDp3pqTW3qbrCprZ1l6WkrXSFSCwyY4I=
|
github.com/metacubex/sing-vmess v0.1.9-0.20240719134745-1df6fb20bbf9 h1:OAXiCosqY8xKDp3pqTW3qbrCprZ1l6WkrXSFSCwyY4I=
|
||||||
github.com/metacubex/sing-vmess v0.1.9-0.20240719134745-1df6fb20bbf9/go.mod h1:olVkD4FChQ5gKMHG4ZzuD7+fMkJY1G8vwOKpRehjrmY=
|
github.com/metacubex/sing-vmess v0.1.9-0.20240719134745-1df6fb20bbf9/go.mod h1:olVkD4FChQ5gKMHG4ZzuD7+fMkJY1G8vwOKpRehjrmY=
|
||||||
github.com/metacubex/sing-wireguard v0.0.0-20240618022557-a6efaa37127a h1:NpSGclHJUYndUwBmyIpFBSoBVg8PoVX7QQKhYg0DjM0=
|
github.com/metacubex/sing-wireguard v0.0.0-20240826061955-1e4e67afe5cd h1:r7alry8u4qlUFLNMwGvG1A8ZcfPM6AMSmrm6E2yKdB4=
|
||||||
github.com/metacubex/sing-wireguard v0.0.0-20240618022557-a6efaa37127a/go.mod h1:uY+BYb0UEknLrqvbGcwi9i++KgrKxsurysgI6G1Pveo=
|
github.com/metacubex/sing-wireguard v0.0.0-20240826061955-1e4e67afe5cd/go.mod h1:uY+BYb0UEknLrqvbGcwi9i++KgrKxsurysgI6G1Pveo=
|
||||||
github.com/metacubex/tfo-go v0.0.0-20240821025650-e9be0afd5e7d h1:j9LtzkYstLFoNvXW824QQeN7Y26uPL5249kzWKbzO9U=
|
github.com/metacubex/tfo-go v0.0.0-20240821025650-e9be0afd5e7d h1:j9LtzkYstLFoNvXW824QQeN7Y26uPL5249kzWKbzO9U=
|
||||||
github.com/metacubex/tfo-go v0.0.0-20240821025650-e9be0afd5e7d/go.mod h1:c7bVFM9f5+VzeZ/6Kg77T/jrg1Xp8QpqlSHvG/aXVts=
|
github.com/metacubex/tfo-go v0.0.0-20240821025650-e9be0afd5e7d/go.mod h1:c7bVFM9f5+VzeZ/6Kg77T/jrg1Xp8QpqlSHvG/aXVts=
|
||||||
github.com/metacubex/utls v1.6.6 h1:3D12YKHTf2Z41UPhQU2dWerNWJ5TVQD9gKoQ+H+iLC8=
|
github.com/metacubex/utls v1.6.6 h1:3D12YKHTf2Z41UPhQU2dWerNWJ5TVQD9gKoQ+H+iLC8=
|
||||||
|
@ -101,6 +101,7 @@ func ApplyConfig(cfg *config.Config, force bool) {
|
|||||||
updateNTP(cfg.NTP)
|
updateNTP(cfg.NTP)
|
||||||
updateDNS(cfg.DNS, cfg.General.IPv6)
|
updateDNS(cfg.DNS, cfg.General.IPv6)
|
||||||
updateListeners(cfg.General, cfg.Listeners, force)
|
updateListeners(cfg.General, cfg.Listeners, force)
|
||||||
|
updateTun(cfg.General) // tun should not care "force"
|
||||||
updateIPTables(cfg)
|
updateIPTables(cfg)
|
||||||
updateTunnels(cfg.Tunnels)
|
updateTunnels(cfg.Tunnels)
|
||||||
|
|
||||||
@ -198,6 +199,9 @@ func updateListeners(general *config.General, listeners map[string]C.InboundList
|
|||||||
listener.ReCreateShadowSocks(general.ShadowSocksConfig, tunnel.Tunnel)
|
listener.ReCreateShadowSocks(general.ShadowSocksConfig, tunnel.Tunnel)
|
||||||
listener.ReCreateVmess(general.VmessConfig, tunnel.Tunnel)
|
listener.ReCreateVmess(general.VmessConfig, tunnel.Tunnel)
|
||||||
listener.ReCreateTuic(general.TuicServer, tunnel.Tunnel)
|
listener.ReCreateTuic(general.TuicServer, tunnel.Tunnel)
|
||||||
|
}
|
||||||
|
|
||||||
|
func updateTun(general *config.General) {
|
||||||
listener.ReCreateTun(general.Tun, tunnel.Tunnel)
|
listener.ReCreateTun(general.Tun, tunnel.Tunnel)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -289,7 +289,10 @@ func (c *Client) DialUDP(dialer utils.PacketDialer) (UDPConn, error) {
|
|||||||
func (c *Client) Close() error {
|
func (c *Client) Close() error {
|
||||||
c.reconnectMutex.Lock()
|
c.reconnectMutex.Lock()
|
||||||
defer c.reconnectMutex.Unlock()
|
defer c.reconnectMutex.Unlock()
|
||||||
err := c.quicSession.CloseWithError(closeErrorCodeGeneric, "")
|
var err error
|
||||||
|
if c.quicSession != nil {
|
||||||
|
err = c.quicSession.CloseWithError(closeErrorCodeGeneric, "")
|
||||||
|
}
|
||||||
c.closed = true
|
c.closed = true
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user