From 0eb6c1055058b288bdce66e0797db07e96a7fbf2 Mon Sep 17 00:00:00 2001 From: Mike Bloy Date: Sun, 8 May 2022 21:43:33 -0500 Subject: [PATCH] webserver with random image serving --- cmd/root.go | 1 - web/handlers.go | 47 +++++++++++++++++++++++++++++++++++++++++++++++ web/server.go | 12 ++++++++---- 3 files changed, 55 insertions(+), 5 deletions(-) create mode 100644 web/handlers.go diff --git a/cmd/root.go b/cmd/root.go index fbdbaf7..b3c9369 100644 --- a/cmd/root.go +++ b/cmd/root.go @@ -62,5 +62,4 @@ func initConfig() { os.Exit(1) } } - fmt.Println(viper.AllSettings()) } diff --git a/web/handlers.go b/web/handlers.go new file mode 100644 index 0000000..8077d16 --- /dev/null +++ b/web/handlers.go @@ -0,0 +1,47 @@ +package web + +import ( + "fmt" + "io/fs" + "math/rand" + "net/http" + "os" +) + +func imageHandler() http.Handler { + fs := http.FS(os.DirFS(config.imageDir)) + hfs := http.FileServer(fs) + return hfs +} + +func chooseRandomFile(imageDir string) (filepath string, err error) { + validEntries := make([]string, 0) + log := config.logger.Sugar() + err = fs.WalkDir(os.DirFS(imageDir), ".", func(path string, d fs.DirEntry, err error) error { + if err != nil { + log.Errorw("Error walking directory", "imageDir", imageDir, "error", err) + return err + } + if d.Type().IsRegular() { + validEntries = append(validEntries, fmt.Sprintf("%s/%s", imageDir, d.Name())) + } + return nil + }) + + chosen := rand.Intn(len(validEntries)) + filepath = validEntries[chosen] + return +} + +func randomImageFunc(w http.ResponseWriter, r *http.Request) { + log := config.logger.Sugar() + path, err := chooseRandomFile(config.imageDir) + if err != nil { + log.Errorw("Couldn't choose a random file", "error", err) + w.WriteHeader(http.StatusInternalServerError) + fmt.Fprint(w, "Error selecting a file.") + return + } + log.Infow("serving image file", "path", path) + http.ServeFile(w, r, path) +} diff --git a/web/server.go b/web/server.go index a066b6d..1c419f6 100644 --- a/web/server.go +++ b/web/server.go @@ -3,7 +3,6 @@ package web import ( "fmt" "net/http" - "os" "github.com/spf13/viper" "go.uber.org/zap" @@ -23,11 +22,16 @@ func Run(rootLogger *zap.Logger, exitch chan bool) { config.logger = rootLogger.Named("web") config.port = viper.GetInt("webserver_port") config.imageDir = viper.GetString("image_dir") - addr := fmt.Sprintf(":%d", config.port) - http.Handle("/", http.FileServer(http.FS(os.DirFS(".")))) + + http.Handle("/img/", http.StripPrefix("/img", imageHandler())) + http.HandleFunc("/randimg/", randomImageFunc) var logger = config.logger.Sugar() - logger.Infow("Webserver startup", "port", config.port) + logger.Infow("Webserver startup", + "port", config.port, + "imageDir", config.imageDir) + + addr := fmt.Sprintf(":%d", config.port) if err := http.ListenAndServe(addr, nil); err != nil { logger.Errorf("Webserver fatal error: %s", err)