diff --git a/predicates/forwarded/forwarded.go b/predicates/forwarded/forwarded.go index 6c1489c340..b10a451d71 100644 --- a/predicates/forwarded/forwarded.go +++ b/predicates/forwarded/forwarded.go @@ -133,8 +133,18 @@ func parseForwarded(fh string) *forwarded { f := &forwarded{} - for _, forwardedFull := range strings.Split(fh, ",") { - for _, forwardedPair := range strings.Split(strings.TrimSpace(forwardedFull), ";") { + // TODO: use range over func added in go1.23 like: + // for forwardedFull := range split(fh, ",") { + // for forwardedPair := range split(strings.TrimSpace(forwardedFull), ";") { + // // ... + // } + // } + // once go1.24 is released + // + // Also use strings.SplitSeq added in go1.24 once go1.25 is released. + + split(fh, ",")(func(forwardedFull string) bool { + split(strings.TrimSpace(forwardedFull), ";")(func(forwardedPair string) bool { token, value, found := strings.Cut(forwardedPair, "=") value = strings.Trim(value, `"`) if found && value != "" { @@ -145,8 +155,28 @@ func parseForwarded(fh string) *forwarded { f.host = value } } - } - } + return true + }) + return true + }) return f } + +// See strings.SplitSeq added in go1.24 +func split(s string, sep string) func(yield func(string) bool) { + return func(yield func(string) bool) { + for { + i := strings.Index(s, sep) + if i < 0 { + break + } + frag := s[:i] + if !yield(frag) { + return + } + s = s[i+len(sep):] + } + yield(s) + } +}