tailscale/tailscale · error

not found

Error message

not found

What it means

The eventbus debug HTTP server only serves embedded assets whose name ends in .css, .min.js.gz, or .js. Any other requested asset name falls through the Content-Type switch and gets a 404 before the embed FS is even consulted. The input at fault is the asset name passed to serveStatic.

Source

Thrown at util/eventbus/debughttp.go:71

})

//go:generate go run fetch-htmx.go

//go:embed assets/*.css assets/*.min.js.gz
var static embed.FS

func serveStatic(name string) http.Handler {
	return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
		switch {
		case strings.HasSuffix(name, ".css"):
			w.Header().Set("Content-Type", "text/css")
		case strings.HasSuffix(name, ".min.js.gz"):
			w.Header().Set("Content-Type", "text/javascript")
			w.Header().Set("Content-Encoding", "gzip")
		case strings.HasSuffix(name, ".js"):
			w.Header().Set("Content-Type", "text/javascript")
		default:
			http.Error(w, "not found", http.StatusNotFound)
			return
		}

		f, err := static.Open(filepath.Join("assets", name))
		if err != nil {
			http.Error(w, fmt.Sprintf("opening asset: %v", err), http.StatusInternalServerError)
			return
		}
		defer f.Close()
		if _, err := io.Copy(w, f); err != nil {
			http.Error(w, fmt.Sprintf("serving asset: %v", err), http.StatusInternalServerError)
			return
		}
	})
}

func render(w http.ResponseWriter, name string, data any) {
	err := templates().ExecuteTemplate(w, name+".html", data)

View on GitHub (pinned to 6e0912f979)

Solutions

  1. Request an existing debug asset path.
Defensive patterns

Strategy: validation

When it happens

Trigger: Thrown at util/eventbus/debughttp.go:71 when the library encounters an invalid state.

Common situations: See trigger scenarios.


AI-assisted analysis of tailscale/tailscale@6e0912f979 (2026-08-18). Data as JSON: /api/errors/0039eb382a5db50e. Report an issue: GitHub.