From 6bfcb2e1f551620dab108b2d893bd3dfad93425a Mon Sep 17 00:00:00 2001 From: Kawin Viriyaprasopsook Date: Mon, 22 Jul 2024 15:26:58 +0700 Subject: [PATCH] =?UTF-8?q?=E2=9A=A1=EF=B8=8F=20slices.SortFunc=20for=20up?= =?UTF-8?q?streams?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/mod/utils/utils.go | 52 ++++++++++++++++++++++++------------------ src/upstreams.go | 20 ++++++++-------- 2 files changed, 40 insertions(+), 32 deletions(-) diff --git a/src/mod/utils/utils.go b/src/mod/utils/utils.go index a61d5ed..21d2e40 100644 --- a/src/mod/utils/utils.go +++ b/src/mod/utils/utils.go @@ -41,12 +41,12 @@ func SendOK(w http.ResponseWriter) { // Get GET parameter func GetPara(r *http.Request, key string) (string, error) { - keys, ok := r.URL.Query()[key] - if !ok || len(keys[0]) < 1 { + // Get first value from the URL query + value := r.URL.Query().Get(key) + if len(value) == 0 { return "", errors.New("invalid " + key + " given") - } else { - return keys[0], nil } + return value, nil } // Get GET paramter as boolean, accept 1 or true @@ -56,26 +56,29 @@ func GetBool(r *http.Request, key string) (bool, error) { return false, err } - x = strings.TrimSpace(x) - - if x == "1" || strings.ToLower(x) == "true" || strings.ToLower(x) == "on" { + // Convert to lowercase and trim spaces just once to compare + switch strings.ToLower(strings.TrimSpace(x)) { + case "1", "true", "on": return true, nil - } else if x == "0" || strings.ToLower(x) == "false" || strings.ToLower(x) == "off" { + case "0", "false", "off": return false, nil } return false, errors.New("invalid boolean given") } -// Get POST paramter +// Get POST parameter func PostPara(r *http.Request, key string) (string, error) { - r.ParseForm() - x := r.Form.Get(key) - if x == "" { - return "", errors.New("invalid " + key + " given") - } else { - return x, nil + // Try to parse the form + if err := r.ParseForm(); err != nil { + return "", err } + // Get first value from the form + x := r.Form.Get(key) + if len(x) == 0 { + return "", errors.New("invalid " + key + " given") + } + return x, nil } // Get POST paramter as boolean, accept 1 or true @@ -85,11 +88,11 @@ func PostBool(r *http.Request, key string) (bool, error) { return false, err } - x = strings.TrimSpace(x) - - if x == "1" || strings.ToLower(x) == "true" || strings.ToLower(x) == "on" { + // Convert to lowercase and trim spaces just once to compare + switch strings.ToLower(strings.TrimSpace(x)) { + case "1", "true", "on": return true, nil - } else if x == "0" || strings.ToLower(x) == "false" || strings.ToLower(x) == "off" { + case "0", "false", "off": return false, nil } @@ -114,14 +117,19 @@ func PostInt(r *http.Request, key string) (int, error) { func FileExists(filename string) bool { _, err := os.Stat(filename) - if os.IsNotExist(err) { + if err == nil { + // File exists + return true + } else if errors.Is(err, os.ErrNotExist) { + // File does not exist return false } - return true + // Some other error + return false } func IsDir(path string) bool { - if FileExists(path) == false { + if !FileExists(path) { return false } fi, err := os.Stat(path) diff --git a/src/upstreams.go b/src/upstreams.go index 3ab2eab..c05e645 100644 --- a/src/upstreams.go +++ b/src/upstreams.go @@ -1,9 +1,10 @@ package main import ( + "cmp" "encoding/json" "net/http" - "sort" + "slices" "strings" "imuslab.com/zoraxy/mod/dynamicproxy/loadbalance" @@ -33,19 +34,18 @@ func ReverseProxyUpstreamList(w http.ResponseWriter, r *http.Request) { activeUpstreams := targetEndpoint.ActiveOrigins inactiveUpstreams := targetEndpoint.InactiveOrigins - // Sort the upstreams slice by weight, then by origin domain alphabetically - sort.Slice(activeUpstreams, func(i, j int) bool { - if activeUpstreams[i].Weight != activeUpstreams[j].Weight { - return activeUpstreams[i].Weight > activeUpstreams[j].Weight + slices.SortFunc(activeUpstreams, func(i, j *loadbalance.Upstream) int { + if i.Weight != j.Weight { + return cmp.Compare(j.Weight, i.Weight) } - return activeUpstreams[i].OriginIpOrDomain < activeUpstreams[j].OriginIpOrDomain + return cmp.Compare(i.OriginIpOrDomain, j.OriginIpOrDomain) }) - sort.Slice(inactiveUpstreams, func(i, j int) bool { - if inactiveUpstreams[i].Weight != inactiveUpstreams[j].Weight { - return inactiveUpstreams[i].Weight > inactiveUpstreams[j].Weight + slices.SortFunc(inactiveUpstreams, func(i, j *loadbalance.Upstream) int { + if i.Weight != j.Weight { + return cmp.Compare(j.Weight, i.Weight) } - return inactiveUpstreams[i].OriginIpOrDomain < inactiveUpstreams[j].OriginIpOrDomain + return cmp.Compare(i.OriginIpOrDomain, j.OriginIpOrDomain) }) type UpstreamCombinedList struct {