package handlers import ( "encoding/json" "log" "net/http" "os" "path/filepath" ) type fsContext struct { err *log.Logger path string contentType string } func (ctx *fsContext) readdir(w http.ResponseWriter, r *http.Request) { entries, err := os.ReadDir(ctx.path) if err != nil { ctx.err.Print(err.Error()) http.Error(w, "Internal Server Error", 500) return } files := make([]string, len(entries)) for index, value := range entries { files[index] = value.Name() } w.Header().Set("Content-Type", "application/json") json.NewEncoder(w).Encode(files) } func (ctx *fsContext) get(w http.ResponseWriter, r *http.Request) { name := r.URL.Query().Get("file") file, err := os.ReadFile(ctx.path + "/" + name) if err != nil { ctx.err.Print(err.Error()) http.Error(w, "Internal Server Error", 500) return } if ctx.contentType != "" { w.Header().Set("Content-Type", ctx.contentType) } else { switch filepath.Ext(name) { case ".css": w.Header().Set("Content-Type", "text/css") case ".js": w.Header().Set("Content-Type", "text/javascript") case ".svg": w.Header().Set("Content-Type", "image/svg+xml") case ".png": w.Header().Set("Content-Type", "image/png") } } w.Write(file) }