ipn: convert ServeConfig Range methods to iterators

These were the last two Range funcs in this repo.

Updates #12912

Change-Id: I6ba0a911933cb5fc4e43697a9aac58a8035f9622
Signed-off-by: Brad Fitzpatrick <bradfitz@tailscale.com>
This commit is contained in:
Brad Fitzpatrick 2025-01-04 13:46:09 -08:00 committed by Brad Fitzpatrick
parent 4b56bf9039
commit 2b8f02b407
2 changed files with 32 additions and 30 deletions

View File

@ -5882,12 +5882,11 @@ func (b *LocalBackend) setTCPPortsInterceptedFromNetmapAndPrefsLocked(prefs ipn.
b.reloadServeConfigLocked(prefs) b.reloadServeConfigLocked(prefs)
if b.serveConfig.Valid() { if b.serveConfig.Valid() {
servePorts := make([]uint16, 0, 3) servePorts := make([]uint16, 0, 3)
b.serveConfig.RangeOverTCPs(func(port uint16, _ ipn.TCPPortHandlerView) bool { for port := range b.serveConfig.TCPs() {
if port > 0 { if port > 0 {
servePorts = append(servePorts, uint16(port)) servePorts = append(servePorts, uint16(port))
} }
return true }
})
handlePorts = append(handlePorts, servePorts...) handlePorts = append(handlePorts, servePorts...)
b.setServeProxyHandlersLocked() b.setServeProxyHandlersLocked()
@ -5915,7 +5914,7 @@ func (b *LocalBackend) setServeProxyHandlersLocked() {
return return
} }
var backends map[string]bool var backends map[string]bool
b.serveConfig.RangeOverWebs(func(_ ipn.HostPort, conf ipn.WebServerConfigView) (cont bool) { for _, conf := range b.serveConfig.Webs() {
for _, h := range conf.Handlers().All() { for _, h := range conf.Handlers().All() {
backend := h.Proxy() backend := h.Proxy()
if backend == "" { if backend == "" {
@ -5937,8 +5936,7 @@ func (b *LocalBackend) setServeProxyHandlersLocked() {
} }
b.serveProxyHandlers.Store(backend, p) b.serveProxyHandlers.Store(backend, p)
} }
return true }
})
// Clean up handlers for proxy backends that are no longer present // Clean up handlers for proxy backends that are no longer present
// in configuration. // in configuration.

View File

@ -6,6 +6,7 @@ package ipn
import ( import (
"errors" "errors"
"fmt" "fmt"
"iter"
"net" "net"
"net/netip" "net/netip"
"net/url" "net/url"
@ -564,40 +565,43 @@ func ExpandProxyTargetValue(target string, supportedSchemes []string, defaultSch
return u.String(), nil return u.String(), nil
} }
// RangeOverTCPs ranges over both background and foreground TCPs. // TCPs returns an iterator over both background and foreground TCP
// If the returned bool from the given f is false, then this function stops // listeners.
// iterating immediately and does not check other foreground configs. //
func (v ServeConfigView) RangeOverTCPs(f func(port uint16, _ TCPPortHandlerView) bool) { // The key is the port number.
func (v ServeConfigView) TCPs() iter.Seq2[uint16, TCPPortHandlerView] {
return func(yield func(uint16, TCPPortHandlerView) bool) {
for k, v := range v.TCP().All() { for k, v := range v.TCP().All() {
if !f(k, v) { if !yield(k, v) {
return return
} }
} }
for _, conf := range v.Foreground().All() { for _, conf := range v.Foreground().All() {
for k, v := range conf.TCP().All() { for k, v := range conf.TCP().All() {
if !f(k, v) { if !yield(k, v) {
return return
} }
} }
} }
}
} }
// RangeOverWebs ranges over both background and foreground Webs. // Webs returns an iterator over both background and foreground Web configurations.
// If the returned bool from the given f is false, then this function stops func (v ServeConfigView) Webs() iter.Seq2[HostPort, WebServerConfigView] {
// iterating immediately and does not check other foreground configs. return func(yield func(HostPort, WebServerConfigView) bool) {
func (v ServeConfigView) RangeOverWebs(f func(HostPort, WebServerConfigView) bool) {
for k, v := range v.Web().All() { for k, v := range v.Web().All() {
if !f(k, v) { if !yield(k, v) {
return return
} }
} }
for _, conf := range v.Foreground().All() { for _, conf := range v.Foreground().All() {
for k, v := range conf.Web().All() { for k, v := range conf.Web().All() {
if !f(k, v) { if !yield(k, v) {
return return
} }
} }
} }
}
} }
// FindTCP returns the first TCP that matches with the given port. It // FindTCP returns the first TCP that matches with the given port. It