diff options
Diffstat (limited to 'feature/appconnectors/ext_localapi.go')
| -rw-r--r-- | feature/appconnectors/ext_localapi.go | 44 |
1 files changed, 44 insertions, 0 deletions
diff --git a/feature/appconnectors/ext_localapi.go b/feature/appconnectors/ext_localapi.go new file mode 100644 index 000000000..d66ab2eff --- /dev/null +++ b/feature/appconnectors/ext_localapi.go @@ -0,0 +1,44 @@ +// Copyright (c) Tailscale Inc & contributors +// SPDX-License-Identifier: BSD-3-Clause + +package appconnectors + +import ( + "encoding/json" + "errors" + "net/http" + + "tailscale.com/feature" + "tailscale.com/ipn" + "tailscale.com/ipn/ipnlocal" + "tailscale.com/ipn/localapi" + "tailscale.com/types/appctype" + "tailscale.com/util/httpm" +) + +func init() { + localapi.Register("appc-route-info", serveGetAppcRouteInfo) +} + +func serveGetAppcRouteInfo(h *localapi.Handler, w http.ResponseWriter, r *http.Request) { + ext, ok := ipnlocal.GetExt[*extension](h.LocalBackend()) + if !ok { + http.Error(w, feature.ErrUnavailable.Error(), http.StatusNotImplemented) + return + } + if r.Method != httpm.GET { + http.Error(w, "only GET allowed", http.StatusMethodNotAllowed) + return + } + ri, err := ext.readRouteInfo() + if err != nil { + if errors.Is(err, ipn.ErrStateNotExist) { + ri = &appctype.RouteInfo{} + } else { + localapi.WriteErrorJSON(w, err) + return + } + } + w.Header().Set("Content-Type", "application/json") + json.NewEncoder(w).Encode(ri) +} |
