diff --git a/daemons.go b/daemons.go index 30b9387..cde9d62 100644 --- a/daemons.go +++ b/daemons.go @@ -3,11 +3,8 @@ package prox5 import ( "errors" "strconv" - "strings" "sync" "time" - - "git.tcp.direct/kayos/prox5/internal/pools" ) type swampMap struct { @@ -65,7 +62,6 @@ func (sm swampMap) clear() { } } - func (p5 *Swamp) recycling() int { if !p5.GetRecyclingStatus() { return 0 @@ -118,10 +114,10 @@ func (p5 *Swamp) jobSpawner() { default: time.Sleep(500 * time.Millisecond) count := p5.recycling() - buf := pools.CopABuffer.Get().(*strings.Builder) - buf.WriteString("recycled ") - buf.WriteString(strconv.Itoa(count)) - buf.WriteString(" proxies from our map") + buf := strs.Get() + buf.MustWriteString("recycled ") + buf.MustWriteString(strconv.Itoa(count)) + buf.MustWriteString(" proxies from our map") p5.dbgPrint(buf) } } diff --git a/debug.go b/debug.go index 2262bf7..cbbd9a5 100644 --- a/debug.go +++ b/debug.go @@ -2,11 +2,10 @@ package prox5 import ( "fmt" - "strings" "sync" "sync/atomic" - "git.tcp.direct/kayos/prox5/internal/pools" + "git.tcp.direct/kayos/common/pool" ) var ( @@ -30,8 +29,8 @@ type SocksLogger struct { // Printf is used to handle socks server logging. func (s SocksLogger) Printf(format string, a ...interface{}) { - buf := pools.CopABuffer.Get().(*strings.Builder) - buf.WriteString(fmt.Sprintf(format, a...)) + buf := strs.Get() + buf.MustWriteString(fmt.Sprintf(format, a...)) s.parent.dbgPrint(buf) } @@ -72,14 +71,14 @@ func (p5 *Swamp) DisableDebug() { atomic.StoreUint32(debugStatus, debugDisabled) } -func simpleString(s string) *strings.Builder { - buf := pools.CopABuffer.Get().(*strings.Builder) - buf.WriteString(s) +func simpleString(s string) *pool.String { + buf := strs.Get() + buf.MustWriteString(s) return buf } -func (p5 *Swamp) dbgPrint(builder *strings.Builder) { - defer pools.DiscardBuffer(builder) +func (p5 *Swamp) dbgPrint(builder *pool.String) { + defer strs.MustPut(builder) if !p5.DebugEnabled() { return } @@ -91,20 +90,20 @@ func (p5 *Swamp) msgUnableToReach(socksString, target string, err error) { if !p5.DebugEnabled() { return } - buf := pools.CopABuffer.Get().(*strings.Builder) - buf.WriteString("unable to reach ") + buf := strs.Get() + buf.MustWriteString("unable to reach ") if p5.swampopt.redact { - buf.WriteString("[redacted]") + buf.MustWriteString("[redacted]") } else { - buf.WriteString(target) + buf.MustWriteString(target) } - buf.WriteString(" with ") - buf.WriteString(socksString) + buf.MustWriteString(" with ") + buf.MustWriteString(socksString) if !p5.swampopt.redact { - buf.WriteString(": ") - buf.WriteString(err.Error()) + buf.MustWriteString(": ") + buf.MustWriteString(err.Error()) } - buf.WriteString(", cycling...") + buf.MustWriteString(", cycling...") p5.dbgPrint(buf) } @@ -112,9 +111,9 @@ func (p5 *Swamp) msgUsingProxy(socksString string) { if !p5.DebugEnabled() { return } - buf := pools.CopABuffer.Get().(*strings.Builder) - buf.WriteString("MysteryDialer using socks: ") - buf.WriteString(socksString) + buf := strs.Get() + buf.MustWriteString("MysteryDialer using socks: ") + buf.MustWriteString(socksString) p5.dbgPrint(buf) } @@ -122,10 +121,10 @@ func (p5 *Swamp) msgFailedMiddleware(socksString string) { if !p5.DebugEnabled() { return } - buf := pools.CopABuffer.Get().(*strings.Builder) - buf.WriteString("failed middleware check, ") - buf.WriteString(socksString) - buf.WriteString(", cycling...") + buf := strs.Get() + buf.MustWriteString("failed middleware check, ") + buf.MustWriteString(socksString) + buf.MustWriteString(", cycling...") p5.dbgPrint(buf) } @@ -133,9 +132,9 @@ func (p5 *Swamp) msgTry(socksString string) { if !p5.DebugEnabled() { return } - buf := pools.CopABuffer.Get().(*strings.Builder) - buf.WriteString("try dial with: ") - buf.WriteString(socksString) + buf := strs.Get() + buf.MustWriteString("try dial with: ") + buf.MustWriteString(socksString) p5.dbgPrint(buf) } @@ -143,11 +142,11 @@ func (p5 *Swamp) msgCantGetLock(socksString string, putback bool) { if !p5.DebugEnabled() { return } - buf := pools.CopABuffer.Get().(*strings.Builder) - buf.WriteString("can't get lock for ") - buf.WriteString(socksString) + buf := strs.Get() + buf.MustWriteString("can't get lock for ") + buf.MustWriteString(socksString) if putback { - buf.WriteString(", putting back in queue") + buf.MustWriteString(", putting back in queue") } p5.dbgPrint(buf) } @@ -156,9 +155,9 @@ func (p5 *Swamp) msgGotLock(socksString string) { if !p5.DebugEnabled() { return } - buf := pools.CopABuffer.Get().(*strings.Builder) - buf.WriteString("got lock for ") - buf.WriteString(socksString) + buf := strs.Get() + buf.MustWriteString("got lock for ") + buf.MustWriteString(socksString) p5.dbgPrint(buf) } @@ -166,18 +165,18 @@ func (p5 *Swamp) msgChecked(sock *Proxy, success bool) { if !p5.DebugEnabled() { return } - buf := pools.CopABuffer.Get().(*strings.Builder) + buf := strs.Get() if !success { - buf.WriteString("failed to verify: ") - buf.WriteString(sock.Endpoint) + buf.MustWriteString("failed to verify: ") + buf.MustWriteString(sock.Endpoint) p5.dbgPrint(buf) return } - buf.WriteString("verified ") - buf.WriteString(sock.Endpoint) - buf.WriteString(" as ") - buf.WriteString(sock.protocol.Get().String()) - buf.WriteString(" proxy") + buf.MustWriteString("verified ") + buf.MustWriteString(sock.Endpoint) + buf.MustWriteString(" as ") + buf.MustWriteString(sock.protocol.Get().String()) + buf.MustWriteString(" proxy") p5.dbgPrint(buf) } @@ -185,9 +184,9 @@ func (p5 *Swamp) msgBadProxRate(sock *Proxy) { if !p5.DebugEnabled() { return } - buf := pools.CopABuffer.Get().(*strings.Builder) - buf.WriteString("badProx ratelimited: ") - buf.WriteString(sock.Endpoint) + buf := strs.Get() + buf.MustWriteString("badProx ratelimited: ") + buf.MustWriteString(sock.Endpoint) p5.dbgPrint(buf) } diff --git a/defs.go b/defs.go index 6beeba5..e0cae11 100644 --- a/defs.go +++ b/defs.go @@ -2,7 +2,6 @@ package prox5 import ( "context" - "strings" "sync" "sync/atomic" "time" @@ -10,7 +9,6 @@ import ( "github.com/panjf2000/ants/v2" rl "github.com/yunginnanet/Rate5" - "git.tcp.direct/kayos/prox5/internal/pools" "git.tcp.direct/kayos/prox5/logger" ) @@ -185,9 +183,9 @@ func NewProxyEngine() *Swamp { })) if err != nil { - buf := pools.CopABuffer.Get().(*strings.Builder) - buf.WriteString("CRITICAL: ") - buf.WriteString(err.Error()) + buf := strs.Get() + buf.MustWriteString("CRITICAL: ") + buf.MustWriteString(err.Error()) pe.dbgPrint(buf) panic(err) } diff --git a/dispense.go b/dispense.go index a2a3cd7..1b74636 100644 --- a/dispense.go +++ b/dispense.go @@ -1,11 +1,8 @@ package prox5 import ( - "strings" "sync/atomic" "time" - - "git.tcp.direct/kayos/prox5/internal/pools" ) // Socks5Str gets a SOCKS5 proxy that we have fully verified (dialed and then retrieved our IP address from a what-is-my-ip endpoint. @@ -105,9 +102,9 @@ func (p5 *Swamp) stillGood(sock *Proxy) bool { defer atomic.StoreUint32(&sock.lock, stateUnlocked) if atomic.LoadInt64(&sock.timesBad) > int64(p5.GetRemoveAfter()) && p5.GetRemoveAfter() != -1 { - buf := pools.CopABuffer.Get().(*strings.Builder) - buf.WriteString("deleting from map (too many failures): ") - buf.WriteString(sock.Endpoint) + buf := strs.Get() + buf.MustWriteString("deleting from map (too many failures): ") + buf.MustWriteString(sock.Endpoint) p5.dbgPrint(buf) if err := p5.swampmap.delete(sock.Endpoint); err != nil { p5.dbgPrint(simpleString(err.Error())) @@ -115,17 +112,17 @@ func (p5 *Swamp) stillGood(sock *Proxy) bool { } if p5.badProx.Peek(sock) { - buf := pools.CopABuffer.Get().(*strings.Builder) - buf.WriteString("badProx dial ratelimited: ") - buf.WriteString(sock.Endpoint) + buf := strs.Get() + buf.MustWriteString("badProx dial ratelimited: ") + buf.MustWriteString(sock.Endpoint) p5.dbgPrint(buf) return false } if time.Since(sock.lastValidated) > p5.swampopt.stale { - buf := pools.CopABuffer.Get().(*strings.Builder) - buf.WriteString("proxy stale: ") - buf.WriteString(sock.Endpoint) + buf := strs.Get() + buf.MustWriteString("proxy stale: ") + buf.MustWriteString(sock.Endpoint) p5.dbgPrint(buf) go p5.stats.stale() return false diff --git a/internal/pools/strings.go b/internal/pools/strings.go deleted file mode 100644 index 6d55ef9..0000000 --- a/internal/pools/strings.go +++ /dev/null @@ -1,13 +0,0 @@ -package pools - -import ( - "strings" - "sync" -) - -var CopABuffer = &sync.Pool{New: func() interface{} { return &strings.Builder{} }} - -func DiscardBuffer(buf *strings.Builder) { - buf.Reset() - CopABuffer.Put(buf) -} diff --git a/mystery_dialer.go b/mystery_dialer.go index 67938c7..a1539d5 100644 --- a/mystery_dialer.go +++ b/mystery_dialer.go @@ -4,13 +4,10 @@ import ( "context" "fmt" "net" - "strings" "sync/atomic" "time" "git.tcp.direct/kayos/socks" - - "git.tcp.direct/kayos/prox5/internal/pools" ) // DialContext is a simple stub adapter to implement a net.Dialer. @@ -34,13 +31,13 @@ func (p5 *Swamp) DialTimeout(network, addr string, timeout time.Duration) (net.C } func (p5 *Swamp) addTimeout(socksString string) string { - tout := pools.CopABuffer.Get().(*strings.Builder) - tout.WriteString(socksString) - tout.WriteString("?timeout=") - tout.WriteString(p5.GetServerTimeoutStr()) - tout.WriteRune('s') + tout := strs.Get() + tout.MustWriteString(socksString) + tout.MustWriteString("?timeout=") + tout.MustWriteString(p5.GetServerTimeoutStr()) + _, _ = tout.WriteRune('s') socksString = tout.String() - pools.DiscardBuffer(tout) + strs.MustPut(tout) return socksString } diff --git a/parse.go b/parse.go index 63a6957..82c592e 100644 --- a/parse.go +++ b/parse.go @@ -6,8 +6,6 @@ import ( "github.com/miekg/dns" ipa "inet.af/netaddr" - - "git.tcp.direct/kayos/prox5/internal/pools" ) func filterv6(in string) (filtered string, ok bool) { @@ -44,22 +42,21 @@ func isNumber(s string) bool { } func buildProxyString(username, password, address, port string, v6 bool) (result string) { - builder := pools.CopABuffer.Get().(*strings.Builder) + builder := strs.Get() + defer strs.MustPut(builder) if username != "" && password != "" { - builder.WriteString(username) - builder.WriteString(":") - builder.WriteString(password) - builder.WriteString("@") + builder.MustWriteString(username) + builder.MustWriteString(":") + builder.MustWriteString(password) + builder.MustWriteString("@") } - builder.WriteString(address) + builder.MustWriteString(address) if v6 { - builder.WriteString("]") + builder.MustWriteString("]") } - builder.WriteString(":") - builder.WriteString(port) - result = builder.String() - pools.DiscardBuffer(builder) - return + builder.MustWriteString(":") + builder.MustWriteString(port) + return builder.String() } func filter(in string) (filtered string, ok bool) { //nolint:cyclop diff --git a/proxy.go b/proxy.go index 6022abf..9b5f734 100644 --- a/proxy.go +++ b/proxy.go @@ -1,12 +1,9 @@ package prox5 import ( - "strings" "time" rl "github.com/yunginnanet/Rate5" - - "git.tcp.direct/kayos/prox5/internal/pools" ) // https://pkg.go.dev/github.com/yunginnanet/Rate5#Policy @@ -57,23 +54,15 @@ func (sock *Proxy) GetProto() ProxyProtocol { // GetProto safely retrieves the protocol value of the Proxy. func (sock *Proxy) String() string { - tout := "" + buf := strs.Get() + defer strs.MustPut(buf) + buf.MustWriteString(sock.GetProto().String()) + buf.MustWriteString("://") + buf.MustWriteString(sock.Endpoint) if sock.parent.GetServerTimeoutStr() != "-1" { - tbuf := pools.CopABuffer.Get().(*strings.Builder) - tbuf.WriteString("?timeout=") - tbuf.WriteString(sock.parent.GetServerTimeoutStr()) - tbuf.WriteString("s") - tout = tbuf.String() - pools.DiscardBuffer(tbuf) + buf.MustWriteString("?timeout=") + buf.MustWriteString(sock.parent.GetServerTimeoutStr()) + buf.MustWriteString("s") } - buf := pools.CopABuffer.Get().(*strings.Builder) - buf.WriteString(sock.GetProto().String()) - buf.WriteString("://") - buf.WriteString(sock.Endpoint) - if tout != "" { - buf.WriteString(tout) - } - out := buf.String() - pools.DiscardBuffer(buf) - return out + return buf.String() } diff --git a/socks5_server.go b/socks5_server.go index 214b129..1b749ed 100644 --- a/socks5_server.go +++ b/socks5_server.go @@ -1,13 +1,13 @@ package prox5 import ( - "strings" - "git.tcp.direct/kayos/go-socks5" - "git.tcp.direct/kayos/prox5/internal/pools" + "git.tcp.direct/kayos/common/pool" ) +var strs = pool.NewStringFactory() + type socksCreds struct { username string password string @@ -33,9 +33,9 @@ func (p5 *Swamp) StartSOCKS5Server(listen, username, password string) error { // Resolver: pe.MysteryResolver, } - buf := pools.CopABuffer.Get().(*strings.Builder) - buf.WriteString("listening for SOCKS5 connections on ") - buf.WriteString(listen) + buf := strs.Get() + buf.MustWriteString("listening for SOCKS5 connections on ") + buf.MustWriteString(listen) p5.dbgPrint(buf) server, err := socks5.New(conf) diff --git a/validator_engine.go b/validator_engine.go index 0decf38..40ec89d 100644 --- a/validator_engine.go +++ b/validator_engine.go @@ -14,8 +14,6 @@ import ( "git.tcp.direct/kayos/socks" "golang.org/x/net/proxy" - - "git.tcp.direct/kayos/prox5/internal/pools" ) func (p5 *Swamp) prepHTTP() (*http.Client, *http.Transport, *http.Request, error) { @@ -52,15 +50,15 @@ func (sock *Proxy) good() { } func (p5 *Swamp) bakeHTTP(hmd *HandMeDown) (client *http.Client, req *http.Request, err error) { - builder := pools.CopABuffer.Get().(*strings.Builder) - builder.WriteString(hmd.protoCheck.String()) - builder.WriteString("://") - builder.WriteString(hmd.sock.Endpoint) - builder.WriteString("/?timeout=") - builder.WriteString(p5.GetValidationTimeoutStr()) - builder.WriteString("s") + builder := strs.Get() + builder.MustWriteString(hmd.protoCheck.String()) + builder.MustWriteString("://") + builder.MustWriteString(hmd.sock.Endpoint) + builder.MustWriteString("/?timeout=") + builder.MustWriteString(p5.GetValidationTimeoutStr()) + builder.MustWriteString("s") dialSocks := socks.DialWithConn(builder.String(), hmd.conn) - pools.DiscardBuffer(builder) + strs.MustPut(builder) var ( purl *url.URL