Merge pull request #331 from 9seconds/go1.26

Chore updates for golang 1.26
This commit is contained in:
Sergei Arkhipov
2026-02-18 11:04:23 +01:00
committed by GitHub
31 changed files with 97 additions and 144 deletions
+2 -2
View File
@@ -2,7 +2,7 @@ package events
import ( import (
"context" "context"
"math/rand" "math/rand/v2"
"runtime" "runtime"
"github.com/9seconds/mtg/v2/mtglib" "github.com/9seconds/mtg/v2/mtglib"
@@ -64,7 +64,7 @@ func NewEventStream(observerFactories []ObserverFactory) EventStream {
chans: make([]chan mtglib.Event, runtime.NumCPU()), chans: make([]chan mtglib.Event, runtime.NumCPU()),
} }
for i := 0; i < runtime.NumCPU(); i++ { for i := range runtime.NumCPU() {
rv.chans[i] = make(chan mtglib.Event, 1) rv.chans[i] = make(chan mtglib.Event, 1)
if len(observerFactories) == 1 { if len(observerFactories) == 1 {
+27 -54
View File
@@ -12,14 +12,11 @@ type multiObserver struct {
func (m multiObserver) EventStart(evt mtglib.EventStart) { func (m multiObserver) EventStart(evt mtglib.EventStart) {
wg := &sync.WaitGroup{} wg := &sync.WaitGroup{}
wg.Add(len(m.observers))
for _, v := range m.observers { for _, v := range m.observers {
go func(obs Observer) { wg.Go(func() {
defer wg.Done() v.EventStart(evt)
})
obs.EventStart(evt)
}(v)
} }
wg.Wait() wg.Wait()
@@ -27,14 +24,11 @@ func (m multiObserver) EventStart(evt mtglib.EventStart) {
func (m multiObserver) EventConnectedToDC(evt mtglib.EventConnectedToDC) { func (m multiObserver) EventConnectedToDC(evt mtglib.EventConnectedToDC) {
wg := &sync.WaitGroup{} wg := &sync.WaitGroup{}
wg.Add(len(m.observers))
for _, v := range m.observers { for _, v := range m.observers {
go func(obs Observer) { wg.Go(func() {
defer wg.Done() v.EventConnectedToDC(evt)
})
obs.EventConnectedToDC(evt)
}(v)
} }
wg.Wait() wg.Wait()
@@ -42,14 +36,11 @@ func (m multiObserver) EventConnectedToDC(evt mtglib.EventConnectedToDC) {
func (m multiObserver) EventDomainFronting(evt mtglib.EventDomainFronting) { func (m multiObserver) EventDomainFronting(evt mtglib.EventDomainFronting) {
wg := &sync.WaitGroup{} wg := &sync.WaitGroup{}
wg.Add(len(m.observers))
for _, v := range m.observers { for _, v := range m.observers {
go func(obs Observer) { wg.Go(func() {
defer wg.Done() v.EventDomainFronting(evt)
})
obs.EventDomainFronting(evt)
}(v)
} }
wg.Wait() wg.Wait()
@@ -57,14 +48,11 @@ func (m multiObserver) EventDomainFronting(evt mtglib.EventDomainFronting) {
func (m multiObserver) EventTraffic(evt mtglib.EventTraffic) { func (m multiObserver) EventTraffic(evt mtglib.EventTraffic) {
wg := &sync.WaitGroup{} wg := &sync.WaitGroup{}
wg.Add(len(m.observers))
for _, v := range m.observers { for _, v := range m.observers {
go func(obs Observer) { wg.Go(func() {
defer wg.Done() v.EventTraffic(evt)
})
obs.EventTraffic(evt)
}(v)
} }
wg.Wait() wg.Wait()
@@ -72,14 +60,11 @@ func (m multiObserver) EventTraffic(evt mtglib.EventTraffic) {
func (m multiObserver) EventFinish(evt mtglib.EventFinish) { func (m multiObserver) EventFinish(evt mtglib.EventFinish) {
wg := &sync.WaitGroup{} wg := &sync.WaitGroup{}
wg.Add(len(m.observers))
for _, v := range m.observers { for _, v := range m.observers {
go func(obs Observer) { wg.Go(func() {
defer wg.Done() v.EventFinish(evt)
})
obs.EventFinish(evt)
}(v)
} }
wg.Wait() wg.Wait()
@@ -87,14 +72,11 @@ func (m multiObserver) EventFinish(evt mtglib.EventFinish) {
func (m multiObserver) EventConcurrencyLimited(evt mtglib.EventConcurrencyLimited) { func (m multiObserver) EventConcurrencyLimited(evt mtglib.EventConcurrencyLimited) {
wg := &sync.WaitGroup{} wg := &sync.WaitGroup{}
wg.Add(len(m.observers))
for _, v := range m.observers { for _, v := range m.observers {
go func(obs Observer) { wg.Go(func() {
defer wg.Done() v.EventConcurrencyLimited(evt)
})
obs.EventConcurrencyLimited(evt)
}(v)
} }
wg.Wait() wg.Wait()
@@ -102,14 +84,11 @@ func (m multiObserver) EventConcurrencyLimited(evt mtglib.EventConcurrencyLimite
func (m multiObserver) EventIPBlocklisted(evt mtglib.EventIPBlocklisted) { func (m multiObserver) EventIPBlocklisted(evt mtglib.EventIPBlocklisted) {
wg := &sync.WaitGroup{} wg := &sync.WaitGroup{}
wg.Add(len(m.observers))
for _, v := range m.observers { for _, v := range m.observers {
go func(obs Observer) { wg.Go(func() {
defer wg.Done() v.EventIPBlocklisted(evt)
})
obs.EventIPBlocklisted(evt)
}(v)
} }
wg.Wait() wg.Wait()
@@ -117,14 +96,11 @@ func (m multiObserver) EventIPBlocklisted(evt mtglib.EventIPBlocklisted) {
func (m multiObserver) EventReplayAttack(evt mtglib.EventReplayAttack) { func (m multiObserver) EventReplayAttack(evt mtglib.EventReplayAttack) {
wg := &sync.WaitGroup{} wg := &sync.WaitGroup{}
wg.Add(len(m.observers))
for _, v := range m.observers { for _, v := range m.observers {
go func(obs Observer) { wg.Go(func() {
defer wg.Done() v.EventReplayAttack(evt)
})
obs.EventReplayAttack(evt)
}(v)
} }
wg.Wait() wg.Wait()
@@ -132,14 +108,11 @@ func (m multiObserver) EventReplayAttack(evt mtglib.EventReplayAttack) {
func (m multiObserver) EventIPListSize(evt mtglib.EventIPListSize) { func (m multiObserver) EventIPListSize(evt mtglib.EventIPListSize) {
wg := &sync.WaitGroup{} wg := &sync.WaitGroup{}
wg.Add(len(m.observers))
for _, v := range m.observers { for _, v := range m.observers {
go func(obs Observer) { wg.Go(func() {
defer wg.Done() v.EventIPListSize(evt)
})
obs.EventIPListSize(evt)
}(v)
} }
wg.Wait() wg.Wait()
+4 -10
View File
@@ -61,11 +61,8 @@ func (a *Access) Run(cli *CLI, version string) error {
} }
wg := &sync.WaitGroup{} wg := &sync.WaitGroup{}
wg.Add(2)
go func() {
defer wg.Done()
wg.Go(func() {
ip := a.PublicIPv4 ip := a.PublicIPv4
if ip == nil { if ip == nil {
ip = a.getIP(ntw, "tcp4") ip = a.getIP(ntw, "tcp4")
@@ -76,11 +73,8 @@ func (a *Access) Run(cli *CLI, version string) error {
} }
resp.IPv4 = a.makeURLs(conf, ip) resp.IPv4 = a.makeURLs(conf, ip)
}() })
wg.Go(func() {
go func() {
defer wg.Done()
ip := a.PublicIPv6 ip := a.PublicIPv6
if ip == nil { if ip == nil {
ip = a.getIP(ntw, "tcp6") ip = a.getIP(ntw, "tcp6")
@@ -91,7 +85,7 @@ func (a *Access) Run(cli *CLI, version string) error {
} }
resp.IPv6 = a.makeURLs(conf, ip) resp.IPv6 = a.makeURLs(conf, ip)
}() })
wg.Wait() wg.Wait()
+2 -2
View File
@@ -20,7 +20,7 @@ type TypeBoolTestSuite struct {
} }
func (suite *TypeBoolTestSuite) TestUnmarshalFail() { func (suite *TypeBoolTestSuite) TestUnmarshalFail() {
testData := []interface{}{ testData := []any{
"", "",
"np", "np",
"нет", "нет",
@@ -29,7 +29,7 @@ func (suite *TypeBoolTestSuite) TestUnmarshalFail() {
} }
for _, v := range testData { for _, v := range testData {
data, err := json.Marshal(map[string]interface{}{ data, err := json.Marshal(map[string]any{
"value": v, "value": v,
}) })
suite.NoError(err) suite.NoError(err)
+4 -7
View File
@@ -112,18 +112,15 @@ func (f *Firehol) update() {
defer cancel() defer cancel()
wg := &sync.WaitGroup{} wg := &sync.WaitGroup{}
wg.Add(len(f.blocklists))
mutex := &sync.Mutex{} mutex := &sync.Mutex{}
ranger := cidranger.NewPCTrieRanger() ranger := cidranger.NewPCTrieRanger()
for _, v := range f.blocklists { for _, v := range f.blocklists {
go func(file files.File) { wg.Go(func() {
defer wg.Done() logger := f.logger.BindStr("filename", v.String())
logger := f.logger.BindStr("filename", file.String()) fileContent, err := v.Open(ctx)
fileContent, err := file.Open(ctx)
if err != nil { if err != nil {
logger.WarningError("update has failed", err) logger.WarningError("update has failed", err)
@@ -135,7 +132,7 @@ func (f *Firehol) update() {
if err := f.updateFromFile(mutex, ranger, bufio.NewScanner(fileContent)); err != nil { if err := f.updateFromFile(mutex, ranger, bufio.NewScanner(fileContent)); err != nil {
logger.WarningError("update has failed", err) logger.WarningError("update has failed", err)
} }
}(v) })
} }
wg.Wait() wg.Wait()
+1 -1
View File
@@ -8,5 +8,5 @@ package logger
// commonly used by many 3pp tools. While mtglib itself does not need it, it is // commonly used by many 3pp tools. While mtglib itself does not need it, it is
// always a good idea to support it and have a transient end to end logging. // always a good idea to support it and have a transient end to end logging.
type StdLikeLogger interface { type StdLikeLogger interface {
Printf(format string, args ...interface{}) Printf(format string, args ...any)
} }
+1 -1
View File
@@ -8,7 +8,7 @@ func (n noopLogger) Named(_ string) mtglib.Logger { return n }
func (n noopLogger) BindInt(_ string, _ int) mtglib.Logger { return n } func (n noopLogger) BindInt(_ string, _ int) mtglib.Logger { return n }
func (n noopLogger) BindStr(_, _ string) mtglib.Logger { return n } func (n noopLogger) BindStr(_, _ string) mtglib.Logger { return n }
func (n noopLogger) BindJSON(_, _ string) mtglib.Logger { return n } func (n noopLogger) BindJSON(_, _ string) mtglib.Logger { return n }
func (n noopLogger) Printf(_ string, _ ...interface{}) {} func (n noopLogger) Printf(_ string, _ ...any) {}
func (n noopLogger) Info(_ string) {} func (n noopLogger) Info(_ string) {}
func (n noopLogger) Warning(_ string) {} func (n noopLogger) Warning(_ string) {}
func (n noopLogger) Debug(_ string) {} func (n noopLogger) Debug(_ string) {}
+1 -1
View File
@@ -78,7 +78,7 @@ func (z *zeroLogContext) BindJSON(name, value string) mtglib.Logger {
} }
} }
func (z *zeroLogContext) Printf(format string, args ...interface{}) { func (z *zeroLogContext) Printf(format string, args ...any) {
z.Debug(fmt.Sprintf(format, args...)) z.Debug(fmt.Sprintf(format, args...))
} }
+7 -7
View File
@@ -12,7 +12,7 @@ version = "latest"
backend = "go:golang.org/x/pkgsite/cmd/pkgsite" backend = "go:golang.org/x/pkgsite/cmd/pkgsite"
[[tools."go:golang.org/x/tools/gopls"]] [[tools."go:golang.org/x/tools/gopls"]]
version = "0.21.0" version = "0.21.1"
backend = "go:golang.org/x/tools/gopls" backend = "go:golang.org/x/tools/gopls"
[[tools."go:mvdan.cc/gofumpt"]] [[tools."go:mvdan.cc/gofumpt"]]
@@ -20,13 +20,13 @@ version = "0.9.2"
backend = "go:mvdan.cc/gofumpt" backend = "go:mvdan.cc/gofumpt"
[[tools.golangci-lint]] [[tools.golangci-lint]]
version = "2.9.0" version = "2.10.1"
backend = "aqua:golangci/golangci-lint" backend = "aqua:golangci/golangci-lint"
"platforms.linux-arm64" = { checksum = "sha256:94e80cdb51c73c20a313bd3afa1fb23137728813c19fd730248a1e8678fcc46d", url = "https://github.com/golangci/golangci-lint/releases/download/v2.9.0/golangci-lint-2.9.0-linux-arm64.tar.gz"} "platforms.linux-arm64" = { checksum = "sha256:6652b42ae02915eb2f9cb2a2e0cac99514c8eded8388d88ae3e06e1a52c00de8", url = "https://github.com/golangci/golangci-lint/releases/download/v2.10.1/golangci-lint-2.10.1-linux-arm64.tar.gz"}
"platforms.linux-x64" = { checksum = "sha256:493aaaca2eba6c8bcef847d92716bbd91bbac4b22cdbb0ab5b6a581b32946091", url = "https://github.com/golangci/golangci-lint/releases/download/v2.9.0/golangci-lint-2.9.0-linux-amd64.tar.gz"} "platforms.linux-x64" = { checksum = "sha256:dfa775874cf0561b404a02a8f4481fc69b28091da95aa697259820d429b09c99", url = "https://github.com/golangci/golangci-lint/releases/download/v2.10.1/golangci-lint-2.10.1-linux-amd64.tar.gz"}
"platforms.macos-arm64" = { checksum = "sha256:a86eabba3507deddd21f2a01a1df2a0ee5bc5c8178d4165cdcaaad8597358760", url = "https://github.com/golangci/golangci-lint/releases/download/v2.9.0/golangci-lint-2.9.0-darwin-arm64.tar.gz"} "platforms.macos-arm64" = { checksum = "sha256:03bfadf67e52b441b7ec21305e501c717df93c959836d66c7f97312654acb297", url = "https://github.com/golangci/golangci-lint/releases/download/v2.10.1/golangci-lint-2.10.1-darwin-arm64.tar.gz"}
"platforms.macos-x64" = { checksum = "sha256:ba29a353be54a74c45946763983808dc8305eeeca73db1761b5ab112f87f8157", url = "https://github.com/golangci/golangci-lint/releases/download/v2.9.0/golangci-lint-2.9.0-darwin-amd64.tar.gz"} "platforms.macos-x64" = { checksum = "sha256:66fb0da81b8033b477f97eea420d4b46b230ca172b8bb87c6610109f3772b6b6", url = "https://github.com/golangci/golangci-lint/releases/download/v2.10.1/golangci-lint-2.10.1-darwin-amd64.tar.gz"}
"platforms.windows-x64" = { checksum = "sha256:130fca8fa959eb840267c5e231f030a948e0de1e768bf6a31785505d1061632c", url = "https://github.com/golangci/golangci-lint/releases/download/v2.9.0/golangci-lint-2.9.0-windows-amd64.zip"} "platforms.windows-x64" = { checksum = "sha256:c60c87695e79db8e320f0e5be885059859de52bb5ee5f11be5577828570bc2a3", url = "https://github.com/golangci/golangci-lint/releases/download/v2.10.1/golangci-lint-2.10.1-windows-amd64.zip"}
[[tools.goreleaser]] [[tools.goreleaser]]
version = "2.13.3" version = "2.13.3"
+1 -1
View File
@@ -249,7 +249,7 @@ type Logger interface {
BindJSON(name, value string) Logger BindJSON(name, value string) Logger
// Printf is to support log.Logger behavior. // Printf is to support log.Logger behavior.
Printf(format string, args ...interface{}) Printf(format string, args ...any)
// Info puts a message about some normal situation. // Info puts a message about some normal situation.
Info(msg string) Info(msg string)
+1 -1
View File
@@ -12,7 +12,7 @@ func (n NoopLogger) Named(_ string) Logger { return n }
func (n NoopLogger) BindInt(_ string, _ int) Logger { return n } func (n NoopLogger) BindInt(_ string, _ int) Logger { return n }
func (n NoopLogger) BindStr(_, _ string) Logger { return n } func (n NoopLogger) BindStr(_, _ string) Logger { return n }
func (n NoopLogger) BindJSON(_, _ string) Logger { return n } func (n NoopLogger) BindJSON(_, _ string) Logger { return n }
func (n NoopLogger) Printf(_ string, _ ...interface{}) {} func (n NoopLogger) Printf(_ string, _ ...any) {}
func (n NoopLogger) Info(_ string) {} func (n NoopLogger) Info(_ string) {}
func (n NoopLogger) Warning(_ string) {} func (n NoopLogger) Warning(_ string) {}
func (n NoopLogger) Debug(_ string) {} func (n NoopLogger) Debug(_ string) {}
+1 -1
View File
@@ -76,7 +76,7 @@ func ParseClientHello(secret, handshake []byte) (ClientHello, error) {
computedRandom := mac.Sum(nil) computedRandom := mac.Sum(nil)
for i := 0; i < RandomLen; i++ { for i := range RandomLen {
computedRandom[i] ^= hello.Random[i] computedRandom[i] ^= hello.Random[i]
} }
+2 -2
View File
@@ -3,7 +3,7 @@ package faketls
import ( import (
"bytes" "bytes"
"fmt" "fmt"
"math/rand" "math/rand/v2"
"github.com/9seconds/mtg/v2/essentials" "github.com/9seconds/mtg/v2/essentials"
"github.com/9seconds/mtg/v2/mtglib/internal/faketls/record" "github.com/9seconds/mtg/v2/mtglib/internal/faketls/record"
@@ -53,7 +53,7 @@ func (c *Conn) Write(p []byte) (int, error) {
lenP := len(p) lenP := len(p)
for len(p) > 0 { for len(p) > 0 {
chunkSize := rand.Intn(record.TLSMaxRecordSize) chunkSize := rand.IntN(record.TLSMaxRecordSize)
if chunkSize > len(p) || chunkSize == 0 { if chunkSize > len(p) || chunkSize == 0 {
chunkSize = len(p) chunkSize = len(p)
} }
+2 -2
View File
@@ -2,9 +2,9 @@ package faketls_test
import ( import (
"bytes" "bytes"
"crypto/rand"
"errors" "errors"
"io" "io"
"math/rand"
"testing" "testing"
"github.com/9seconds/mtg/v2/internal/testlib" "github.com/9seconds/mtg/v2/internal/testlib"
@@ -123,7 +123,7 @@ func (suite *ConnTestSuite) TestWrite() {
suite.connMock.On("Write", mock.Anything).Return(0, nil) suite.connMock.On("Write", mock.Anything).Return(0, nil)
dataToRec := make([]byte, record.TLSMaxRecordSize*2) dataToRec := make([]byte, record.TLSMaxRecordSize*2)
rand.Read(dataToRec) //nolint: staticcheck rand.Read(dataToRec) //nolint: staticcheck, errcheck
n, err := suite.c.Write(dataToRec) n, err := suite.c.Write(dataToRec)
suite.NoError(err) suite.NoError(err)
+1 -1
View File
@@ -6,7 +6,7 @@ import (
) )
var bytesBufferPool = sync.Pool{ var bytesBufferPool = sync.Pool{
New: func() interface{} { New: func() any {
return &bytes.Buffer{} return &bytes.Buffer{}
}, },
} }
+1 -1
View File
@@ -5,7 +5,7 @@ import (
) )
var recordPool = sync.Pool{ var recordPool = sync.Pool{
New: func() interface{} { New: func() any {
return &Record{} return &Record{}
}, },
} }
+2 -2
View File
@@ -6,7 +6,7 @@ import (
"crypto/sha256" "crypto/sha256"
"encoding/binary" "encoding/binary"
"io" "io"
mrand "math/rand" mrand "math/rand/v2"
"github.com/9seconds/mtg/v2/mtglib/internal/faketls/record" "github.com/9seconds/mtg/v2/mtglib/internal/faketls/record"
"golang.org/x/crypto/curve25519" "golang.org/x/crypto/curve25519"
@@ -36,7 +36,7 @@ func SendWelcomePacket(writer io.Writer, secret []byte, clientHello ClientHello)
rec.Type = record.TypeApplicationData rec.Type = record.TypeApplicationData
rec.Version = record.Version12 rec.Version = record.Version12
if _, err := io.CopyN(&rec.Payload, rand.Reader, int64(1024+mrand.Intn(3092))); err != nil { if _, err := io.CopyN(&rec.Payload, rand.Reader, int64(1024+mrand.IntN(3092))); err != nil {
panic(err) panic(err)
} }
+1 -1
View File
@@ -3,8 +3,8 @@ package faketls_test
import ( import (
"bytes" "bytes"
"crypto/hmac" "crypto/hmac"
"crypto/rand"
"crypto/sha256" "crypto/sha256"
"math/rand"
"testing" "testing"
"time" "time"
@@ -63,7 +63,7 @@ func (h *handshakeFrame) connectionType() []byte {
func (h *handshakeFrame) invert() handshakeFrame { func (h *handshakeFrame) invert() handshakeFrame {
copyFrame := *h copyFrame := *h
for i := 0; i < handshakeFrameLenKey+handshakeFrameLenIV; i++ { for i := range handshakeFrameLenKey + handshakeFrameLenIV {
copyFrame.data[handshakeFrameOffsetKey+i] = h.data[handshakeFrameOffsetConnectionType-1-i] copyFrame.data[handshakeFrameOffsetKey+i] = h.data[handshakeFrameOffsetConnectionType-1-i]
} }
+1 -1
View File
@@ -117,7 +117,7 @@ func NewServerHandshakeTestData(t *testing.T) ServerHandshakeTestData {
serverEncryptedReverted := make([]byte, len(serverEncrypted)) serverEncryptedReverted := make([]byte, len(serverEncrypted))
for i := 0; i < 32+16; i++ { for i := range 32 + 16 {
serverEncryptedReverted[8+i] = serverEncrypted[8+32+16-1-i] serverEncryptedReverted[8+i] = serverEncrypted[8+32+16-1-i]
} }
+2 -2
View File
@@ -9,12 +9,12 @@ import (
var ( var (
sha256HasherPool = sync.Pool{ sha256HasherPool = sync.Pool{
New: func() interface{} { New: func() any {
return sha256.New() return sha256.New()
}, },
} }
bytesBufferPool = sync.Pool{ bytesBufferPool = sync.Pool{
New: func() interface{} { New: func() any {
return &bytes.Buffer{} return &bytes.Buffer{}
}, },
} }
+1 -1
View File
@@ -5,5 +5,5 @@ const (
) )
type Logger interface { type Logger interface {
Printf(msg string, args ...interface{}) Printf(msg string, args ...any)
} }
+1 -1
View File
@@ -2,4 +2,4 @@ package relay_test
type loggerMock struct{} type loggerMock struct{}
func (l loggerMock) Printf(format string, args ...interface{}) {} func (l loggerMock) Printf(format string, args ...any) {}
+1 -1
View File
@@ -3,7 +3,7 @@ package relay
import "sync" import "sync"
var copyBufferPool = sync.Pool{ var copyBufferPool = sync.Pool{
New: func() interface{} { New: func() any {
rv := make([]byte, copyBufferSize) rv := make([]byte, copyBufferSize)
return &rv return &rv
+1 -1
View File
@@ -323,7 +323,7 @@ func NewProxy(opts ProxyOpts) (*Proxy, error) {
} }
pool, err := ants.NewPoolWithFunc(opts.getConcurrency(), pool, err := ants.NewPoolWithFunc(opts.getConcurrency(),
func(arg interface{}) { func(arg any) {
proxy.ServeConn(arg.(essentials.Conn)) //nolint: forcetypeassert proxy.ServeConn(arg.(essentials.Conn)) //nolint: forcetypeassert
}, },
ants.WithLogger(opts.getLogger("ants")), ants.WithLogger(opts.getLogger("ants")),
+1 -1
View File
@@ -32,7 +32,7 @@ func (s *streamContext) Err() error {
return s.ctx.Err() //nolint: wrapcheck return s.ctx.Err() //nolint: wrapcheck
} }
func (s *streamContext) Value(key interface{}) interface{} { func (s *streamContext) Value(key any) any {
return s.ctx.Value(key) return s.ctx.Value(key)
} }
+8 -11
View File
@@ -52,17 +52,9 @@ func (suite *CircuitBreakerTestSuite) TestMultipleRunsOk() {
Return(suite.connMock, nil) Return(suite.connMock, nil)
wg := &sync.WaitGroup{} wg := &sync.WaitGroup{}
wg.Add(5)
go func() {
wg.Wait()
suite.ctxCancel()
}()
for i := 0; i < 5; i++ {
go func() {
defer wg.Done()
for range 5 {
wg.Go(func() {
conn, err := suite.d.DialContext(suite.ctx, "tcp", "127.0.0.1") conn, err := suite.d.DialContext(suite.ctx, "tcp", "127.0.0.1")
suite.mutex.Lock() suite.mutex.Lock()
@@ -70,9 +62,14 @@ func (suite *CircuitBreakerTestSuite) TestMultipleRunsOk() {
suite.NoError(err) suite.NoError(err)
suite.Equal("127.0.0.1:3128", conn.RemoteAddr().String()) suite.Equal("127.0.0.1:3128", conn.RemoteAddr().String())
}() })
} }
go func() {
wg.Wait()
suite.ctxCancel()
}()
suite.Eventually(func() bool { suite.Eventually(func() bool {
_, ok := <-suite.ctx.Done() _, ok := <-suite.ctx.Done()
+2 -2
View File
@@ -3,7 +3,7 @@ package network
import ( import (
"context" "context"
"fmt" "fmt"
"math/rand" "math/rand/v2"
"net/url" "net/url"
"github.com/9seconds/mtg/v2/essentials" "github.com/9seconds/mtg/v2/essentials"
@@ -19,7 +19,7 @@ func (l loadBalancedSocks5Dialer) Dial(network, address string) (essentials.Conn
func (l loadBalancedSocks5Dialer) DialContext(ctx context.Context, network, address string) (essentials.Conn, error) { func (l loadBalancedSocks5Dialer) DialContext(ctx context.Context, network, address string) (essentials.Conn, error) {
length := len(l.dialers) length := len(l.dialers)
start := rand.Intn(length) start := rand.IntN(length)
moved := false moved := false
for i := start; i != start || !moved; i = (i + 1) % length { for i := start; i != start || !moved; i = (i + 1) % length {
+1 -1
View File
@@ -64,7 +64,7 @@ func (suite *LoadBalancedSocks5TestSuite) TestCannotDial() {
}) })
suite.NoError(err) suite.NoError(err)
for i := 0; i < network.ProxyDialerOpenThreshold*2; i++ { for range network.ProxyDialerOpenThreshold * 2 {
_, err = lbDialer.Dial("tcp", "127.1.1.1:80") _, err = lbDialer.Dial("tcp", "127.1.1.1:80")
suite.True(errors.Is(err, network.ErrCannotDialWithAllProxies)) suite.True(errors.Is(err, network.ErrCannotDialWithAllProxies))
} }
+5 -13
View File
@@ -3,7 +3,7 @@ package network
import ( import (
"context" "context"
"fmt" "fmt"
"math/rand" "math/rand/v2"
"net" "net"
"net/http" "net/http"
"sync" "sync"
@@ -81,32 +81,24 @@ func (n *network) dnsResolve(protocol, address string) ([]string, error) {
switch protocol { switch protocol {
case "tcp", "tcp4": case "tcp", "tcp4":
wg.Add(1) wg.Go(func() {
go func() {
defer wg.Done()
resolved := n.dns.LookupA(address) resolved := n.dns.LookupA(address)
mutex.Lock() mutex.Lock()
ips = append(ips, resolved...) ips = append(ips, resolved...)
mutex.Unlock() mutex.Unlock()
}() })
} }
switch protocol { switch protocol {
case "tcp", "tcp6": case "tcp", "tcp6":
wg.Add(1) wg.Go(func() {
go func() {
defer wg.Done()
resolved := n.dns.LookupAAAA(address) resolved := n.dns.LookupAAAA(address)
mutex.Lock() mutex.Lock()
ips = append(ips, resolved...) ips = append(ips, resolved...)
mutex.Unlock() mutex.Unlock()
}() })
} }
wg.Wait() wg.Wait()
+1 -1
View File
@@ -3,7 +3,7 @@ package stats
import "sync" import "sync"
var streamInfoPool = sync.Pool{ var streamInfoPool = sync.Pool{
New: func() interface{} { New: func() any {
return &streamInfo{ return &streamInfo{
tags: make(map[string]string), tags: make(map[string]string),
} }