From 7466211d5e4cf6a604d9bf911cac400f441b35d0 Mon Sep 17 00:00:00 2001 From: WaterLemons2k <62788816+WaterLemons2k@users.noreply.github.com> Date: Fri, 7 Jun 2024 11:01:53 +0800 Subject: [PATCH] perf(params): use `NewReplacer` to replace params (#1148) Compared to `ReplaceAll()`, `NewReplacer()` is probably a better choice, because you only need to maintain a list of old and new string pairs. --- config/webhook.go | 19 +++++++++---------- dns/callback.go | 27 ++++++++++++++++++++------- dns/namecheap.go | 11 ++++++----- dns/namesilo.go | 33 +++++++++++++++++++-------------- 4 files changed, 54 insertions(+), 36 deletions(-) diff --git a/config/webhook.go b/config/webhook.go index 6f9a8ac..e69f162 100644 --- a/config/webhook.go +++ b/config/webhook.go @@ -119,16 +119,15 @@ func getDomainsStatus(domains []*Domain) updateStatusType { } // replacePara 替换参数 -func replacePara(domains *Domains, orgPara string, ipv4Result updateStatusType, ipv6Result updateStatusType) (newPara string) { - orgPara = strings.ReplaceAll(orgPara, "#{ipv4Addr}", domains.Ipv4Addr) - orgPara = strings.ReplaceAll(orgPara, "#{ipv4Result}", util.LogStr(string(ipv4Result))) // i18n - orgPara = strings.ReplaceAll(orgPara, "#{ipv4Domains}", getDomainsStr(domains.Ipv4Domains)) - - orgPara = strings.ReplaceAll(orgPara, "#{ipv6Addr}", domains.Ipv6Addr) - orgPara = strings.ReplaceAll(orgPara, "#{ipv6Result}", util.LogStr(string(ipv6Result))) // i18n - orgPara = strings.ReplaceAll(orgPara, "#{ipv6Domains}", getDomainsStr(domains.Ipv6Domains)) - - return orgPara +func replacePara(domains *Domains, orgPara string, ipv4Result updateStatusType, ipv6Result updateStatusType) string { + return strings.NewReplacer( + "#{ipv4Addr}", domains.Ipv4Addr, + "#{ipv4Result}", util.LogStr(string(ipv4Result)), // i18n + "#{ipv4Domains}", getDomainsStr(domains.Ipv4Domains), + "#{ipv6Addr}", domains.Ipv6Addr, + "#{ipv6Result}", util.LogStr(string(ipv6Result)), // i18n + "#{ipv6Domains}", getDomainsStr(domains.Ipv6Domains), + ).Replace(orgPara) } // getDomainsStr 用逗号分割域名 diff --git a/dns/callback.go b/dns/callback.go index 2ac6fb0..775f778 100644 --- a/dns/callback.go +++ b/dns/callback.go @@ -2,6 +2,7 @@ package dns import ( "encoding/json" + "fmt" "net/http" "net/url" "strings" @@ -101,17 +102,29 @@ func (cb *Callback) addUpdateDomainRecords(recordType string) { } // replacePara 替换参数 -func replacePara(orgPara, ipAddr string, domain *config.Domain, recordType string, ttl string) (newPara string) { - orgPara = strings.ReplaceAll(orgPara, "#{ip}", ipAddr) - orgPara = strings.ReplaceAll(orgPara, "#{domain}", domain.String()) - orgPara = strings.ReplaceAll(orgPara, "#{recordType}", recordType) - orgPara = strings.ReplaceAll(orgPara, "#{ttl}", ttl) +func replacePara(orgPara, ipAddr string, domain *config.Domain, recordType string, ttl string) string { + // params 使用 map 以便添加更多参数 + params := map[string]string{ + "ip": ipAddr, + "domain": domain.String(), + "recordType": recordType, + "ttl": ttl, + } + // 也替换域名的自定义参数 for k, v := range domain.GetCustomParams() { if len(v) == 1 { - orgPara = strings.ReplaceAll(orgPara, "#{"+k+"}", v[0]) + params[k] = v[0] } } - return orgPara + // 将 map 转换为 [NewReplacer] 所需的参数 + // map 中的每个元素占用 2 个位置(kv),因此需要预留 2 倍的空间 + oldnew := make([]string, 0, len(params)*2) + for k, v := range params { + k = fmt.Sprintf("#{%s}", k) + oldnew = append(oldnew, k, v) + } + + return strings.NewReplacer(oldnew...).Replace(orgPara) } diff --git a/dns/namecheap.go b/dns/namecheap.go index d345ccb..e8284cc 100644 --- a/dns/namecheap.go +++ b/dns/namecheap.go @@ -92,11 +92,12 @@ func (nc *NameCheap) modify(domain *config.Domain, ipAddr string) { // request 统一请求接口 func (nc *NameCheap) request(result *NameCheapResp, ipAddr string, domain *config.Domain) (err error) { - var url string = nameCheapEndpoint - url = strings.ReplaceAll(url, "#{host}", domain.GetSubDomain()) - url = strings.ReplaceAll(url, "#{domain}", domain.DomainName) - url = strings.ReplaceAll(url, "#{password}", nc.DNS.Secret) - url = strings.ReplaceAll(url, "#{ip}", ipAddr) + url := strings.NewReplacer( + "#{host}", domain.GetSubDomain(), + "#{domain}", domain.DomainName, + "#{password}", nc.DNS.Secret, + "#{ip}", ipAddr, + ).Replace(nameCheapEndpoint) req, err := http.NewRequest( http.MethodGet, diff --git a/dns/namesilo.go b/dns/namesilo.go index acd2c86..ba1122c 100644 --- a/dns/namesilo.go +++ b/dns/namesilo.go @@ -145,25 +145,30 @@ func (ns *NameSilo) modify(domain *config.Domain, recordID, recordType, ipAddr s } } -func (ns *NameSilo) listRecords(domain *config.Domain) (resp NameSiloDNSListRecordResp, err error) { - //lint:ignore SA4006 false positive +func (ns *NameSilo) listRecords(domain *config.Domain) (*NameSiloDNSListRecordResp, error) { result, err := ns.request("", domain, "", "", nameSiloListRecordEndpoint) - err = xml.Unmarshal([]byte(result), &resp) - return + if err != nil { + return nil, err + } + + var resp NameSiloDNSListRecordResp + if err = xml.Unmarshal([]byte(result), &resp); err != nil { + return nil, err + } + + return &resp, nil } // request 统一请求接口 func (ns *NameSilo) request(ipAddr string, domain *config.Domain, recordID, recordType, url string) (result string, err error) { - if domain.SubDomain == "@" { - url = strings.ReplaceAll(url, "#{host}", "") - } else { - url = strings.ReplaceAll(url, "#{host}", domain.SubDomain) - } - url = strings.ReplaceAll(url, "#{domain}", domain.DomainName) - url = strings.ReplaceAll(url, "#{password}", ns.DNS.Secret) - url = strings.ReplaceAll(url, "#{recordID}", recordID) - url = strings.ReplaceAll(url, "#{recordType}", recordType) - url = strings.ReplaceAll(url, "#{ip}", ipAddr) + url = strings.NewReplacer( + "#{host}", domain.SubDomain, + "#{domain}", domain.DomainName, + "#{password}", ns.DNS.Secret, + "#{recordID}", recordID, + "#{recordType}", recordType, + "#{ip}", ipAddr, + ).Replace(url) req, err := http.NewRequest( http.MethodGet, url,