From 4b45d14c68794e2bf665f3ce73f1c7dda355a8e5 Mon Sep 17 00:00:00 2001 From: Stein Ivar Berghei Date: Tue, 22 Nov 2022 00:33:43 +0100 Subject: [PATCH] Serve files with servecontent so that ETags etc should work. --- routes.go | 30 +++++++++++++++++++++++++++--- tmpl/index.tmpl | 2 +- 2 files changed, 28 insertions(+), 4 deletions(-) diff --git a/routes.go b/routes.go index 4417393..190056a 100644 --- a/routes.go +++ b/routes.go @@ -3,6 +3,9 @@ package main import ( "log" "net/http" + "os" + "path" + "path/filepath" "text/template" "github.com/google/uuid" @@ -21,9 +24,8 @@ func init() { app.router.GET("/", app.Index) app.router.GET("/play/:playlist", app.Play) app.router.GET("/reset", app.Reset) - - app.router.ServeFiles("/js/*filepath", http.Dir("public")) - app.router.ServeFiles("/css/*filepath", http.Dir("css")) + app.router.GET("/public/*js", app.ServeFiles) + app.router.GET("/css/*css", app.ServeFiles) app.router.HandlerFunc("GET", "/ws", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { log.Printf("WS connection from %v\n", r.RemoteAddr) @@ -49,6 +51,28 @@ type IndexData struct { Ambiance []string } +func (app App) ServeFiles(w http.ResponseWriter, r *http.Request, _ httprouter.Params) { + filePath := filepath.Join(".", r.URL.Path) + + file, err := os.Open(filePath) + if err != nil { + log.Println(err) + http.Error(w, "no such file", http.StatusNotFound) + return + } + defer file.Close() + + fileStat, err := os.Stat(filePath) + if err != nil { + log.Println(err) + http.Error(w, "unable to get file stat", http.StatusInternalServerError) + } + + _, filename := path.Split(filePath) + t := fileStat.ModTime() + http.ServeContent(w, r, filename, t, file) +} + func (app App) Index(w http.ResponseWriter, r *http.Request, _ httprouter.Params) { playlists, err := app.GetPlaylists() if err != nil { diff --git a/tmpl/index.tmpl b/tmpl/index.tmpl index 8c436a7..e3ffd0f 100644 --- a/tmpl/index.tmpl +++ b/tmpl/index.tmpl @@ -74,6 +74,6 @@ - +