diff --git a/internal/config/config.go b/internal/config/config.go index 4ca566c..dcc3186 100644 --- a/internal/config/config.go +++ b/internal/config/config.go @@ -52,10 +52,10 @@ type Config struct { Blocklist ListConfig `json:"blocklist"` Allowlist ListConfig `json:"allowlist"` Doppelganger struct { - URLs []TypeHttpsURL `json:"urls"` - Repeats TypeConcurrency `json:"repeats_per_raid"` - UpdateEach TypeDuration `json:"raid_each"` - DRS TypeBool `json:"drs"` + URLs []TypeHttpsURL `json:"urls"` + Repeats TypeConcurrency `json:"repeats_per_raid"` + UpdateEach TypeDuration `json:"raid_each"` + DRS TypeBool `json:"drs"` } `json:"doppelganger"` } `json:"defense"` Network struct { diff --git a/internal/config/parse.go b/internal/config/parse.go index fd60708..6bd16f7 100644 --- a/internal/config/parse.go +++ b/internal/config/parse.go @@ -47,10 +47,10 @@ type tomlConfig struct { UpdateEach string `toml:"update-each" json:"updateEach,omitempty"` } `toml:"allowlist" json:"allowlist,omitempty"` Doppelganger struct { - URLs []string `toml:"urls" json:"urls,omitempty"` - Repeats uint `toml:"repeats-per-raid" json:"repeats_per_raid,omitempty"` - UpdateEach string `toml:"raid-each" json:"raid_each,omitempty"` - DRS bool `toml:"drs" json:"drs,omitempty"` + URLs []string `toml:"urls" json:"urls,omitempty"` + Repeats uint `toml:"repeats-per-raid" json:"repeats_per_raid,omitempty"` + UpdateEach string `toml:"raid-each" json:"raid_each,omitempty"` + DRS bool `toml:"drs" json:"drs,omitempty"` } `toml:"doppelganger" json:"doppelganger,omitempty"` } `toml:"defense" json:"defense,omitempty"` Network struct { diff --git a/mtglib/conns.go b/mtglib/conns.go index 55d57ee..b271d5b 100644 --- a/mtglib/conns.go +++ b/mtglib/conns.go @@ -3,6 +3,7 @@ package mtglib import ( "bytes" "context" + "errors" "fmt" "io" "net" @@ -102,7 +103,7 @@ func newConnProxyProtocol(source, target essentials.Conn) *connProxyProtocol { // Both directions update the same timestamp so that activity in one direction // prevents the other (idle) direction from timing out. type idleTracker struct { - lastActive atomic.Int64 // unix nanos + lastActive atomic.Pointer[time.Time] timeout time.Duration } @@ -114,13 +115,12 @@ func newIdleTracker(timeout time.Duration) *idleTracker { } func (t *idleTracker) touch() { - t.lastActive.Store(time.Now().UnixNano()) + stamp := time.Now() + t.lastActive.Store(&stamp) } func (t *idleTracker) isIdle() bool { - last := time.Unix(0, t.lastActive.Load()) - - return time.Since(last) >= t.timeout + return time.Since(*t.lastActive.Load()) >= t.timeout } type connIdleTimeout struct { @@ -130,25 +130,22 @@ type connIdleTimeout struct { } func (c connIdleTimeout) Read(b []byte) (int, error) { + var netErr net.Error + for { c.SetReadDeadline(time.Now().Add(c.tracker.timeout)) //nolint: errcheck n, err := c.Conn.Read(b) - if n > 0 { + + switch { + case err == nil: c.tracker.touch() - - return n, err //nolint: wrapcheck + return n, nil + case errors.As(err, &netErr) && netErr.Timeout() && !c.tracker.isIdle(): + continue } - if err != nil { - if netErr, ok := err.(net.Error); ok && netErr.Timeout() && !c.tracker.isIdle() { //nolint: errorlint - continue - } - - return 0, err //nolint: wrapcheck - } - - return 0, nil + return n, err } } diff --git a/mtglib/proxy_opts.go b/mtglib/proxy_opts.go index 102b279..fd44783 100644 --- a/mtglib/proxy_opts.go +++ b/mtglib/proxy_opts.go @@ -160,7 +160,6 @@ type ProxyOpts struct { // DoppelGangerDRS defines if TLS Dynamic Record Sizing is active. DoppelGangerDRS bool - } func (p ProxyOpts) valid() error {