package web import ( "fmt" "log/slog" "net" "net/http" "time" "github.com/spf13/viper" "golang.org/x/net/context" ) 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, ctx context.Context) { 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) go func() { server := http.Server{ Addr: fmt.Sprintf(":%d", config.port), Handler: middleware(http.DefaultServeMux), BaseContext: func(net.Listener) context.Context { return ctx }, } if err := server.ListenAndServe(); 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) logger.Info("Starting web request") start := time.Now() next.ServeHTTP(w, r) elapsed := time.Now().Sub(start) logger.Info("Web request", "durationMS", elapsed.Milliseconds()) }) }