package view import ( "embed" "errors" "mime" "net/http" "os" "path" "path/filepath" ) func ServeEmbedFS(fs embed.FS, dir string) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { file, err := fs.ReadFile(filepath.Join(dir, filepath.Clean(r.URL.Path))) if err != nil { http.NotFound(w, r) return } w.Header().Set("Content-Type", mime.TypeByExtension(path.Ext(r.URL.Path))) w.WriteHeader(http.StatusOK) w.Write(file) }) } func ServeFiles(directory string) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { info, err := os.Stat(filepath.Join(directory, filepath.Clean(r.URL.Path))) // does the file exist? if err != nil { if errors.Is(err, os.ErrNotExist) { http.NotFound(w, r) return } } // is thjs a directory? (forbidden) if info.IsDir() { http.NotFound(w, r) return } http.FileServer(http.Dir(directory)).ServeHTTP(w, r) }) }