From 4bccc024135a0f8f1088102e43f5a04cfffca961 Mon Sep 17 00:00:00 2001 From: Brad Fitzpatrick Date: Wed, 9 Nov 2022 13:15:59 -0800 Subject: [PATCH] ipn/ipnlocal: use ServerConfig views internally Updates tailscale/corp#7515 Change-Id: Ica2bc44b92d281d5ce16cee55b7ca51c7910145c Signed-off-by: Brad Fitzpatrick --- ipn/ipnlocal/local.go | 19 ++++++++++++------- ipn/ipnlocal/serve.go | 24 +++++++++++++++--------- 2 files changed, 27 insertions(+), 16 deletions(-) diff --git a/ipn/ipnlocal/local.go b/ipn/ipnlocal/local.go index 66e15e12b..27b501c57 100644 --- a/ipn/ipnlocal/local.go +++ b/ipn/ipnlocal/local.go @@ -198,8 +198,8 @@ type LocalBackend struct { componentLogUntil map[string]componentLogState // ServeConfig fields. (also guarded by mu) - lastServeConfJSON mem.RO // last JSON that was parsed into serveConfig - serveConfig ipn.ServeConfig // only replaced wholesale; don't mutate in-place + lastServeConfJSON mem.RO // last JSON that was parsed into serveConfig + serveConfig ipn.ServeConfigView // or !Valid if none // statusLock must be held before calling statusChanged.Wait() or // statusChanged.Broadcast(). @@ -3514,13 +3514,18 @@ func (b *LocalBackend) setTCPPortsInterceptedFromNetmapAndPrefsLocked() { var conf ipn.ServeConfig if err := json.Unmarshal(confj, &conf); err != nil { b.logf("invalid ServeConfig %q in StateStore: %v", confKey, err) + b.serveConfig = ipn.ServeConfigView{} + } else { + b.serveConfig = conf.View() } - b.serveConfig = conf } - for p := range b.serveConfig.TCP { - if p > 0 && p <= math.MaxUint16 { - handlePorts = append(handlePorts, uint16(p)) - } + if b.serveConfig.Valid() { + b.serveConfig.TCP().Range(func(port int, _ ipn.TCPPortHandlerView) bool { + if port > 0 && port <= math.MaxUint16 { + handlePorts = append(handlePorts, uint16(port)) + } + return true + }) } } } diff --git a/ipn/ipnlocal/serve.go b/ipn/ipnlocal/serve.go index ff1cb1741..430ffb716 100644 --- a/ipn/ipnlocal/serve.go +++ b/ipn/ipnlocal/serve.go @@ -38,9 +38,11 @@ func (b *LocalBackend) HandleInterceptedTCPConn(c net.Conn) { hs.ServeTLS(netutil.NewOneConnListener(c, nil), "", "") } -func (b *LocalBackend) getServeHandler(r *http.Request) (_ *ipn.HTTPHandler, ok bool) { +func (b *LocalBackend) getServeHandler(r *http.Request) (_ ipn.HTTPHandlerView, ok bool) { + var z ipn.HTTPHandlerView // zero value + if r.TLS == nil { - return nil, false + return z, false } sni := r.TLS.ServerName @@ -50,17 +52,21 @@ func (b *LocalBackend) getServeHandler(r *http.Request) (_ *ipn.HTTPHandler, ok b.mu.Lock() defer b.mu.Unlock() - wsc, ok := b.serveConfig.Web[key] + if !b.serveConfig.Valid() { + return z, false + } + + wsc, ok := b.serveConfig.Web().GetOk(key) if !ok { - return nil, false + return z, false } path := r.URL.Path for { - if h, ok := wsc.Handlers[path]; ok { + if h, ok := wsc.Handlers().GetOk(path); ok { return h, true } if path == "/" { - return nil, false + return z, false } path = pathpkg.Dir(path) } @@ -72,16 +78,16 @@ func (b *LocalBackend) serveWebHandler(w http.ResponseWriter, r *http.Request) { http.NotFound(w, r) return } - if s := h.Text; s != "" { + if s := h.Text(); s != "" { w.Header().Set("Content-Type", "text/plain; charset=utf-8") io.WriteString(w, s) return } - if v := h.Path; v != "" { + if v := h.Path(); v != "" { io.WriteString(w, "TODO(bradfitz): serve file") return } - if v := h.Proxy; v != "" { + if v := h.Proxy(); v != "" { io.WriteString(w, "TODO(bradfitz): proxy") return }