package web import ( "fmt" "log/slog" "net/http" "time" "github.com/spf13/viper" ) type configObj struct { logger *slog.Logger port int imageDir string } var config = configObj{} // Run starts up the webserver part of hasshelper. It writes to exitch if // the webserver ends unexpectedly. Config values will be read from viper. func Run(rootLogger *slog.Logger, exitch chan bool) { rootLogger = rootLogger.With("component", "web") config.logger = rootLogger config.port = viper.GetInt("webserver_port") config.imageDir = viper.GetString("image_dir") http.Handle("/img/", http.StripPrefix("/img", imageHandler())) http.HandleFunc("/randimg/", randomImageFunc) var logger = config.logger logger.Info("Webserver startup", "port", config.port, "imageDir", config.imageDir) addr := fmt.Sprintf(":%d", config.port) if err := http.ListenAndServe(addr, middleware(http.DefaultServeMux)); err != nil { logger.Error("Webserver fatal error", "err", err) } else { logger.Info("Webserver shutting down") } exitch <- true } func middleware(next http.Handler) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { logger := config.logger. WithGroup("request"). With("method", r.Method, "url", r.URL, "remote", r.RemoteAddr) logger.Info("Starting web request") start := time.Now() next.ServeHTTP(w, r) elapsed := time.Now().Sub(start) logger.Info("Web request", "durationMS", elapsed.Milliseconds()) }) }