From a483e15a202c33f394dc576fc51dc0dc6e3042f8 Mon Sep 17 00:00:00 2001 From: yusing Date: Sat, 13 Sep 2025 22:33:21 +0800 Subject: [PATCH] refactor(middlewares): remove xsync wrapper and replace strutils.SplitLine with bytes.Line --- internal/net/gphttp/middleware/cidr_whitelist.go | 6 +++--- .../net/gphttp/middleware/cloudflare_real_ip.go | 8 +++++--- .../gphttp/middleware/errorpage/error_page.go | 16 ++++++++-------- 3 files changed, 16 insertions(+), 14 deletions(-) diff --git a/internal/net/gphttp/middleware/cidr_whitelist.go b/internal/net/gphttp/middleware/cidr_whitelist.go index 10da7a06..1a963632 100644 --- a/internal/net/gphttp/middleware/cidr_whitelist.go +++ b/internal/net/gphttp/middleware/cidr_whitelist.go @@ -5,16 +5,16 @@ import ( "net/http" "github.com/go-playground/validator/v10" + "github.com/puzpuzpuz/xsync/v4" gphttp "github.com/yusing/go-proxy/internal/net/gphttp" nettypes "github.com/yusing/go-proxy/internal/net/types" "github.com/yusing/go-proxy/internal/serialization" - F "github.com/yusing/go-proxy/internal/utils/functional" ) type ( cidrWhitelist struct { CIDRWhitelistOpts - cachedAddr F.Map[string, bool] // cache for trusted IPs + cachedAddr *xsync.Map[string, bool] // cache for trusted IPs } CIDRWhitelistOpts struct { Allow []*nettypes.CIDR `validate:"min=1"` @@ -42,7 +42,7 @@ func init() { // setup implements MiddlewareWithSetup. func (wl *cidrWhitelist) setup() { wl.CIDRWhitelistOpts = cidrWhitelistDefaults - wl.cachedAddr = F.NewMapOf[string, bool]() + wl.cachedAddr = xsync.NewMap[string, bool](xsync.WithPresize(100)) } // before implements RequestModifier. diff --git a/internal/net/gphttp/middleware/cloudflare_real_ip.go b/internal/net/gphttp/middleware/cloudflare_real_ip.go index 486bc24d..2214c987 100644 --- a/internal/net/gphttp/middleware/cloudflare_real_ip.go +++ b/internal/net/gphttp/middleware/cloudflare_real_ip.go @@ -1,6 +1,7 @@ package middleware import ( + "bytes" "context" "errors" "fmt" @@ -115,11 +116,12 @@ func fetchUpdateCFIPRange(endpoint string, cfCIDRs *[]*nettypes.CIDR) error { return err } - for _, line := range strutils.SplitLine(string(body)) { - if line == "" { + for line := range bytes.Lines(body) { + line = bytes.TrimSpace(line) + if len(line) == 0 { continue } - _, cidr, err := net.ParseCIDR(line) + _, cidr, err := net.ParseCIDR(string(line)) if err != nil { return fmt.Errorf("cloudflare responeded an invalid CIDR: %s", line) } diff --git a/internal/net/gphttp/middleware/errorpage/error_page.go b/internal/net/gphttp/middleware/errorpage/error_page.go index e63b65a3..36371653 100644 --- a/internal/net/gphttp/middleware/errorpage/error_page.go +++ b/internal/net/gphttp/middleware/errorpage/error_page.go @@ -6,13 +6,13 @@ import ( "path" "sync" + "github.com/puzpuzpuz/xsync/v4" "github.com/rs/zerolog/log" "github.com/yusing/go-proxy/internal/common" "github.com/yusing/go-proxy/internal/gperr" "github.com/yusing/go-proxy/internal/task" - U "github.com/yusing/go-proxy/internal/utils" - F "github.com/yusing/go-proxy/internal/utils/functional" - W "github.com/yusing/go-proxy/internal/watcher" + "github.com/yusing/go-proxy/internal/utils" + "github.com/yusing/go-proxy/internal/watcher" "github.com/yusing/go-proxy/internal/watcher/events" ) @@ -20,13 +20,13 @@ const errPagesBasePath = common.ErrorPagesBasePath var ( setupOnce sync.Once - dirWatcher W.Watcher - fileContentMap = F.NewMapOf[string, []byte]() + dirWatcher watcher.Watcher + fileContentMap = xsync.NewMap[string, []byte](xsync.WithGrowOnly()) ) func setup() { t := task.RootTask("error_page", false) - dirWatcher = W.NewDirectoryWatcher(t, errPagesBasePath) + dirWatcher = watcher.NewDirectoryWatcher(t, errPagesBasePath) loadContent() go watchDir() } @@ -46,13 +46,13 @@ func GetErrorPageByStatus(statusCode int) (content []byte, ok bool) { } func loadContent() { - files, err := U.ListFiles(errPagesBasePath, 0) + files, err := utils.ListFiles(errPagesBasePath, 0) if err != nil { log.Err(err).Msg("failed to list error page resources") return } for _, file := range files { - if fileContentMap.Has(file) { + if _, ok := fileContentMap.Load(file); ok { continue } content, err := os.ReadFile(file)