package main import ( "embed" "fmt" "net/http" ) //go:generate sh -c "sass ui/static/dark.scss ui/static/dark.css && sass ui/static/light.scss ui/static/light.css && tsc ui/static/index.ts" //go:embed ui/* var content embed.FS func serveWebUI(w http.ResponseWriter, r *http.Request) { fmt.Printf("serveWebUI: %s\n", r.URL.Path) w.Header().Set("Cache-Control", "no-cache, no-store, must-revalidate") w.Header().Set("Pragma", "no-cache") w.Header().Set("Expires", "0") w.Header().Set("X-Content-Type-Options", "nosniff") w.Header().Set("X-XSS-Protection", "1") w.Header().Set("X-Frame-Options", "DENY") http.ServeFileFS(w, r, content, "ui/index.html") } func serveStaticContent(w http.ResponseWriter, r *http.Request) { fmt.Printf("serveStaticContent: %s\n", r.URL.Path) switch r.URL.Path { case "/static/style.css": darkTheme := r.CookiesNamed("dark_theme") if len(darkTheme) > 0 && darkTheme[0].Value == "true" { http.ServeFileFS(w, r, content, "ui/static/dark.css") } else { http.ServeFileFS(w, r, content, "ui/static/light.css") } break case "/favicon.ico": http.ServeFileFS(w, r, content, "ui/static/favicon.ico") break case "/static/index.js": http.ServeFileFS(w, r, content, "ui/static/index.js") break default: http.NotFound(w, r) } } func serveAPI(w http.ResponseWriter, r *http.Request) { } func main() { http.HandleFunc("GET /{$}", serveWebUI) http.HandleFunc("GET /favicon.ico", serveStaticContent) http.HandleFunc("GET /static/", serveStaticContent) http.HandleFunc("GET /api/", serveAPI) http.ListenAndServe(":8067", nil) }