Use pool implementation from common package
This commit is contained in:
parent
aae6c2ece7
commit
a6969af053
12
daemons.go
12
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)
|
||||
}
|
||||
}
|
||||
|
|
91
debug.go
91
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)
|
||||
}
|
||||
|
||||
|
|
8
defs.go
8
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)
|
||||
}
|
||||
|
|
21
dispense.go
21
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
|
||||
|
|
|
@ -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)
|
||||
}
|
|
@ -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
|
||||
}
|
||||
|
||||
|
|
25
parse.go
25
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
|
||||
|
|
29
proxy.go
29
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()
|
||||
}
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue